10 ms·
Reactive Clojure: A web language
- zubairq 5y agoHi Very interesting read. What would be the possible business models for this to make money?
- intrasight 5y agoIt had me at the title "You don't need a web framework, you need a web language" but then it immediately dived into arbitrary syntax instead of exploring in abstract what a modern web language would entail.
- isuckatcoding 5y agoYeah I had a really hard time understanding even with the backend frontend highlighting
- balloneij 5y agoI think the misunderstandings are because they are targeting a specific audience. They aren't trying to teach you Clojure, Datomic, and Reagent because they assume you are already knowledgeable about it. Clojure and Clojurescript are the same language (more or less). They just target the JVM or Javascript. The author is mixing the frontend (Clojurescript and Reagent) code with the backend (Clojure and Datomic) code in the same expression. Then through their magical system and the beauty of lisp, they pull the frontend and backend parts out to serve them separately.
- gdsdfe 5y agoI'm a bit confused, is this a product or a project?
- danpalmer 5y agoYes.
- danpalmer 5y agoTo expand on the snarky response, or explain my thinking... I think more and more the lines are blurred between open source projects, and products. This is good and bad. It's good because people making money out of open source projects probably means more open source projects, more support available, and a healthier tech industry. It's bad because as someone with no intention of turning a few open source libraries into a full time job, there's still an expectation of a certain level of polish to them that makes more sense for products. Open source projects with clever names, logos, mission statements, a domain name and marketing site/landing page, marketing copy, flashy documentation, a live preview environment, etc. These are all a lot of work for an open source project, but the stakes are raised to this level by the productised open source projects that can afford to fund this sort of thing.
- gdsdfe 5y agoI get that and I agree with you but then if it's a project why do I need to ask for early access, if it's a product then why launch a web tech on notion? one would expect to build the website with the so called web language and have the proof in the pudding like they say.
- mjburgess 5y agoFinally the problem which PHP solved more than two decades ago has been solved again. How do we include server-side code in client-side code? Do we build the client-side on the sever, and render? Why no, that would be PHP. Let's build the client-side in the browser, and rig a series of complex code-generating primitives disguised by the beauty of a language, to AJAX our way to a presumably good-enough solution. I think its a serious question whether apps built with this are more performant, easier to use, (and so on) than the equivalent PHP-approach.
- InitialBP 5y agoRegardless of whether PHP solved this particular problem, it also caused a lot of its own due to numerous security issues and documentation that encouraged unsafe use of libraries, until recently.
- mjburgess 5y agoThe pragmatism of rasmus, and how bemused he was that people were using his language to program (vs. template), meant that the BDFL was not a great advocate of the PHP model. The model is this: run-once-and-die + build-it-on-the-server. Those two ideas are extremely powerful, a little like immutability, in that they rule out a huge number of issues. The issue with PHP wasn't this model which became associated with the morass of amateurs using the language. A shame.
- Zelphyr 5y agoI really love Clojure--it's a joy to use but, you're right. Maybe I'm misunderstanding this project but it seems like abstractions on top of abstractions and has little to do with being a "web language". That was PHP, for better or for worse.
- weavejester 5y agoYou're misunderstanding. The project is proposing writing client-side code and server-side code in the same expression, then having a compiler automatically separate the two parts out and determine how they should communicate.
- BiteCode_dev 5y agoWe did that, it was called PHP, and it turns out DSL are pretty limited outside of their sweat spot. Also they don't evolve as fast as libs and framework. Case in point: PHP worked well, but framework like Rails and Django became very attractive because their offered more, and used languages that could be good outside of their niche. And what did the PHP community to stay relevant ? They developed great frameworks, and improved the non web language capabilities. Turns out the web moves fast, and coding a web app is more than web programming anyway.
- marstall 5y agoAs a web developer with 25 years of experience and (I thought) up to the minute skills ... I have no idea what any of that means but it sounds cool and important and I want to try it.
- pjlegato 5y agoIt allows you to define a GUI / DOM specification, with transparently embedded serverside commands that do things like "query the database for the list of users who meet criteria X." No annotation or other special action required. The runtime figures out an efficient and reactive way of parceling out work to the server as needed, and refreshing it only when necessary.
- hungryforcodes 5y agoMore work and learning basically in "front end" land, before you can do anything practical -- as usual.
- Kaze404 5y agoBecause software engineers are known for being people who are averse to learning and trying new things out.
- hungryforcodes 5y agoAs opposed to actually spending their time building useful practical things?
- deleted 5y ago[deleted]
- wrnr 5y agoPremature compositionally in the root of all evil, or something like that. I've looking for better ways to do document.createElement and addEventListener ever since the days of DHTML. Anyone looked into diagram theory already? The only productivity gain I've found is being fluent enough in your stack of choice to do the work to solve a problem and nothing more. And sure, spend the rest of your time researching diagram theory, but try to be honest about why you do it.
- Kinrany 5y agoPremature compositionality? If something didn't need to be decomposed, it can be recomposed.
- wrnr 5y agoAs in function composition, a great idea from math but one that is hard to use for anything that isn't a functions with domain and range in R or N.
- wrnr 5y agoWould any of the 3+ people that dislike what I said like to explain why or is it more, like, "THE WAY YOU SAID IT", that is rubbing you faggots the wrong way :P.
- disease 5y agoMy arrow and page up/down keys do not work on this website. Very annoying.
- jack_riminton 5y agoCan someone translate this for a relative web dev noob? or can anyone? which may be a better question
- aidenn0 5y agoA web app includes code that runs on the client and code that runs on the server. For example, code that manipulates the view runs on the client and code that accesses the database runs on the server. This lets you write a function where some of the code runs on the client, some of the code runs on the server, and the compiler figures out which and emits the network RPC calls for you.
- buryat 5y agolooks very overcomplicated for generating an html table, building something more powerful would result in even more complex code. There's a reason why these things get decoupled
- paulgb 5y ago> There's a reason why these things get decoupled This is true, but I also think it's worth evaluating whether the lines along which we've been decoupling applications is the right one. Typically, the line of demarcation has been the client/server boundary, for a bunch of reasons: security considerations (it's also a trust boundary); different computational environment. This split has reinforced itself with the organization of companies into frontend/backend teams. But there are a bunch of things that it makes a pain-in-the-ass. I've encountered this most with data-heavy apps, where I want to do some analysis on the server (e.g. Python/Pandas), but I want low-latency recalculations on the client in cases where the data is small enough. Doing it “right” requires implementing the same data-level logic in both Python and Javascript. Nobody has time for that, so we end up in our current world of laggy janky SaaS that needs to run off to the server every time you click a button. Which is to say, I'm excited that people are looking at alternatives (not just this; LiveView was on HN yesterday as well).
- pbiggar 5y agoI'd love to know why any time I read something about clojure, it's inevitably cluttered with big words that the author (or some other clojurian) invented that have a lot of deep and important meaning, that make it impenetrable to anyone else.
- oaguy1 5y agoHugged to death and I’m afraid there is no wayback archive right now.
- fny 5y agoI think I fail to see the advantage in the example given. Is the point that there's a server side call attached to the UI component directly? How is this any different than what can already be done with old school full stack like Rails or even smaller libraries like Sinatra/Flask.
- delegate 5y agoThis is not reinvention of PHP as some are commenting. In fact I think this is extremely cool. If I understand it correctly, it allows you to achieve reactive data flow in a single page app without any boilerplate. Meaning - you update the database on the server and all the relevant UI(s) will automatically receive the updated data and re-render only the parts of the UI that display that data. This would require a ton of PHP and Javascript dealing with networking, websockets, routing, serializing data and so on. Haven't tried it yet, but very curious to see if it works.
- pizzeriafrida 5y agoThis is where I'm at with it. "Develop apps like you do now, with a centralized app db, but now the app db (in the browser, most likely a giant Map) is an actual database with a sophisticated query language, an upgrade!"
- giancarlostoro 5y agoSo more like Liveview for Phoenix / Elixir is what this kind of sounds like to me, and less so back-end mainly language like PHP.
- Diggsey 5y ago> Imagine a programming language runtime whose runtime state (i.e. lexical scope) is partially broadcast over network as it happens, kind of like a remote debugger. This sounds absolutely terrifying from a security perspective... What's to stop a malicious client from broadcasting code that deletes my entire database?
- outworlder 5y ago> runtime state > code Some overlap, but these are essentially two different things. > What's to stop a malicious client from broadcasting code that deletes my entire database? Your backend.
- Diggsey 5y agoDeleting a database is probably a bad example, but my point still stands: even if you are not trasferring code back and forth, runtime state is enough to be a problem. What if your runtime state includes an `is_authorized` flag or similar? How do you guarantee that this state remains server-side when the entire language conflates server/client side code? For this to work, there needs to be language-level support for distinguishing untrusted inputs from trusted ones, or else it's a recipe for disaster.
- Fellshard 5y agoQuite a few comments that are dishonest or didn't focus on what the author focused on, but rather on auxiliary things. There are concrete similarities to PHP, which is effectively what this server/client macro setup gives you at a superficial level. However, from what I'm seeing, this will behave more like a LiveView or Hotwire, with the focus being on optimizing network requests in an automated manner. My big question with the tool is this: if you're passing environments back and forth, how secure can this feasibly be? Is there an automated limit on what will be considered based on the generated code? How do you handle malicious environments?
- deleted 5y ago[deleted]
- softfalcon 5y agoThis syntax is insanely hard to read, is non-standard, and is unclear what is server side and what is client side processed without purple and red highlighting. Maybe I’ve been in Node.js land too long, but I don’t get why this is better for my productivity or my ability to create efficient web apps.
- mrtnpwn 5y agoIt's not hard to read, but it's just that you aren't used to it. Try Clojure without this "hard to read" mindset and see how great Lisp as tools are!
- softfalcon 5y agoDefinitely will give it a go when I have some free time! Also, I can’t edit it right now, but would like to apologize for saying it’s “insanely hard to read”. That was rather harsh and uncalled for.
- zaksingh 5y agoSo from what I can tell this is conceptually similar to the LiveView model, except that the problem is approached from the perspective of the SPA/client stack instead of the SSR stack. It’s a refreshing idea that I’ve never seen executed like this before. However I think it’s missing the point of de-coupling. Security would be very hard to reason about, as would handling of intermittent network connections when the real structure of the client and server are abstracted away from you. Ultimately I think GraphQL with live queries is the best model for this type of reactive work. You get a decoupled client/server, reactivity, support for mobile clients as you have an API, as well as full type-safety on the client. Nonetheless I applaud the creativity on display here and I hope I’m proven wrong. Maybe this will be the next paradigm shift? Who knows
- zero_iq 5y agoMr first thought reading the article was security. After a quick ctrl-f, it was a little disconcerting to find that the only mention of security is in a tacked-on bullet list under the heading "risks"...
- pkage 5y agoThis reminds me of Meteor.js[0] from back in the day (2014?), which had a very similar approach—you wrote code that ran on both the frontend and the backend, and database updates were propagated automatically. It suffered from a pretty hard reliance on Mongodb and its own package manager (Atmosphere), and it was at odds with the rest of the JS ecosystem which was settling on NPM. This project looks very cool! I like the focus on composition, Meteor was lacking that (and really, most other frameworks do as well). [0] https://www.meteor.com/ https://www.meteor.com/
- leetrout 5y agoI feel like Meteor lost a lot of ground to Firebase. I think what we are seeing with these tools to make data synchronization in the frontend more invisible will continue to proliferate. I am looking forward to the next, rich landscape of interactivity on the web powered by WASM, WebGL, etc.
- FractalHQ 5y ago> I am looking forward to the next, rich landscape of interactivity on the web powered by WASM, WebGL, etc. All of which will likely be a broken mess on iOS thanks to Apple
- aroman 5y agoi think you mean WebGPU rather than WebGL. also WebTransport will play a big part for truly real-time interactive web apps
- leetrout 5y agoSure thing. Thanks.
- strictfp 5y agoAnother big problem was that you rarely want exactly the same code on client and server.
- basch 5y ago
- pizzeriafrida 5y agoIt does seem a bit convoluted after going through it a couple of times, but I'm down to try it if my reagent React interop still works, e.g. `[:> MyJsComponent {...}]`. I would say that I am very happy with the FE stack of reagent / reframe at the core. I have long chased the dragon of co-located queries ala GraphQL instead of basic re-frame subscriptions, or redux.connect and pulling fields off a map. Obviously having the ability to be more expressive with data queries is great, but in reality I have come to settle on basic subscriptions into maps, syncing data into my db via events. It's not super pretty but it scales! This seems like it's trying to push the needle, and I will it.
- pgt 5y agoThe Web After Tomorrow beckons: https://tonsky.me/blog/the-web-after-tomorrow/ https://tonsky.me/blog/the-web-after-tomorrow/ Well done, @dustingetz!
- peter-m80 5y agoThanks. I hate it.
- jspaetzel 5y agoLoving this for you... )))))))))))
- askonomm 5y agoFound the one person who uses Notepad.exe because no actual Lisper even notices the indents due to structural editing capabilities of IDE's, much like {} in C-based languages.
- lewisjoe 5y agoThis is beautiful. I used to think about this problem deeply. The best imaginary system I did imagine was: - A system that starts with our database schema - a language in the front-end that abstracts away server connection and db access - this imaginary language should allow defining react-like components but treat the db as a local datastore - Most clients are UI stricture interpolated with that user’s data queried from the central db. So this imaginary front-end language should allow querying from user-level views from the db Most of what I read from the post, looks like a realization of this dream.
- FpUser 5y ago>"- A system that starts with our database schema - a language in the front-end that abstracts away server connection and db access" Optimal data layout for storage and for processing / presentation can be quite different. Automatically mapping one to another I think can not be efficiently implemented in automatic fashion. I've tried different frameworks that claim to achieve it but at some point you always hit the wall. As a result I've long abandoned all those attempts and do manual transformation in code that are optimal for my particular situations
- hatch_q 5y agoYou need to treat clients as zero-trust. Your db is just a vector for DOS attack if you don't.
- tambourine_man 5y agoIf you are trying to allure front end devs, maybe don't use tables in you example. To my taste, all of that is way too overcomplicated. I don't know why we need to make writing and maintaining web pages more complex with every year that goes by. To my mind, this industry looks completely derailed.
- specialp 5y agoWhat would you use to represent tabular data like a list of T-shirt orders as in the example? That should be an HTML table. Using tables for positioning is bad in front end. Using HTML tables/sections/headers for document data structure is exactly what HTML is for.
- tambourine_man 5y agoUnless it's two columnns only, tables don't work well on mobile. You end up having to undo in CSS a lot of properties that TD, TH bring by default.
- Datsundere 5y agoI think people are overlooking the fact that javascript and css is a hot mess to deal with. We need something like flutter that makes maintaining these easier.
- rowland66 5y agoI think that several of the fallacies of distributed computing are being ignored here. https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing https://en.wikipedia.org/wiki/Fallacies_of_distributed_compu...
- telekid 5y agoWhich ones? And ignored (and potentially irreconcilable) or deferred?
- athenot 5y agoThis reminds me a lot of imba[1], which mixes the front end and the back end. Though ReactiveClojure seems to be more about reasoning in terms of a lisp for all parts of the app, whereas imba is more focused on reducing syntax noise as much as possible. [1] https://imba.io https://imba.io
- nbardy 5y agoThis is great. It's the dream that was promised 4-5 years ago of with om and reagent fully realized.
- awinter-py 5y ago'compiler managed network' in here is a useful concept buildsystems are increasingly doing the heavy lifting of telling backend how to deliver a pre-hydrated frontend, and telling frontend how to speak backend's language would be nicer if this was just types and schemas, so you didn't have to use a full-stack framework to get full-stack accelerations and linting
- throwawayswede 5y agoNot related, but is Notion becoming new Medium?
- doteka 5y agoOne thing I admire about the Clojure community is audacious projects like this. While a ton of these seem to run out of steam, they certainly shoot for the stars and tend to come pretty dang close for a while. For those working in Typescript, Blitz.js seems to do a great job at drastically decreasing the plumbing you have to write to shuttle data between Postgres and React. There’s also a ton of goodies like auth built in. From my first impression it’s the closest the JS community has ever come to a Django, and that’s very high praise in my book.
- trutannus 5y agoSadly the running out of steam effect hits the tooling for the community too. It's really hard to find good, stable clojure tools on the level of those available for Java.
- heyzk 5y agoDefinitely take a look at Cursive, it may be what you're looking for along the lines of stability and out-of-the-box features you'd see in a Java IDE: https://cursive-ide.com/ https://cursive-ide.com/
- LandR 5y agoOr Calva for VS Code. It's the best dev environment I've used for any language. It's brilliant.
- j45 5y agoAm I missing something or is reactive clojure a web framework for a language too? I don’t recall Clojure being a web centric language like PHP, ASP, etc.
- askonomm 5y agoClojureScript (JS target) is as web-centric as you can think, with what you can write front-end apps, Node.js apps, React and React Native apps, using Clojure. Clojure (JVM target) can do back-end web as well as Java can, as well as anything else that Java can. Clojure is a general-purpose programming language, so it can do pretty much anything.
- haskellandchill 5y agoThis is nice but it doesn't give you a reasoning system for making assertions about components. I'd rather work backwards from that point to a web language but playing around with things dynamically is the most natural and explored model.
- turtlebits 5y agoOff topic, but please don't use Notion for static sites. The page is 1.8MB (9.4MB uncompressed) - 1.6MB of that is javascript.
- taikahessu 5y agoThis is exactly what I've been thinking of lately. I started web development in 1998 and in 2000 I got searching for some way to store data. At first I tried Macromedia Coldfusion, later acquired by Adobe. Now that I checked on it, it seems to be going strong, to my surprise. It was too hard for me. And it was closed software. There was no way for me to learn it without spending money on it. And it wasn't what I was really looking for. But I just needed something simple. Something to tinker with. So I found PHP. It was exactly what I needed at the time. Later I also found MySQL. The amount of garbage required to build a single website is enormous. So enormous that we have gone a full circle and people start using static site generators to create pure HTML sites. Because of speed and few other reasons. So I got to thinking, why is it that we're building webshops with all these open source technologies, with a huge amount of overhead and "bloat", when all you really need is a few simple things. Well, as the creator said it, there are a lot of unknowns. Huge learning curve etc. But that's how Linux got started, as a tinkering platform. I really think this is the right path to take. Making an open source web programming language, that handles all the needs directly built-in. I totally agree with the philosophy and if you will, proposed abstraction, of the problem at hand. But also, it makes me shiver to look at the code and not understand it. So much to learn. But it gives me hope to see, that other's have come to the same conclusions. Looking forward to hearing more!
- Zelphyr 5y agoClojure (and Lisps in general) really aren't hard to learn. It just takes those of us that come from C-influenced languages like PHP a little longer to be able to read them at a glance because the syntax is slightly different and usually simpler. Once that lightbulb of the power of a Lisp goes off, there's no turning back. As Eric S. Raymond said, "Lisp is worth learning for the profound enlightenment experience you will have when you finally get it; that experience will make you a better programmer for the rest of your days, even if you never actually use Lisp itself a lot."
- iainctduncan 5y agoIf there was one and only one thing I could tell myself from 15 years to do sooner it's LEARN SCHEME. Man I wish I'd stated a decade ago.
- baby 5y agoThey chose a parenthesis-language, interesting choice. I don’t think the syntax is going to attract many web devs.
- metalrain 5y agoI like how client and server code is separated, but I do wonder how changes in expressions are evaluated. I'm thinking about autocomplete that on new user input (needle='ad') filters previous result from server (needle='a') in the client before server returns a new response from new input (needle='ad'). Essentially can inner parts of expression update even when they are somewhat dependent on reactive data from server that comes from their parent expression?
- tosh 5y agogreat to see hyperfiddle here, delightful surprise, deserves the attention, kudos @dustingetz, ty for the writeup
- mamcx 5y agoThis is tangential but also a validation. FoxPro (& dBase) is a realization of the concept: To deal with databases, you need a database language. Exist a lot of minor things that our apparent "general-purpose" languages lack in the moment you need to deal with certain niches. From very small stuff as not-even available decimals, dates, currencies, units types, to lack of simple way to transform data, to ad-hoc queries, to ad-hoc data validations, to lack of relationship modeling, etc. Even if you say "linq!, ActiveRecord!, functional!, lisp!, pandas!..." and others all that are a shadow of what the dBase family provides. How far? I was not in worry about all the stuff everyone worry about today (injection? orms? impedance mismatch? reactivity? <- an over-complicated patch on top of unfit languages for it, so kudos for this idea!). That is what make me put some time aside in build a language in the spirit of it, because is so much details that are not available if the languages is not designed with data(as of the kind of business) in mind. So, in short, most languages, even php, python, ruby, ... are not that good for web programming (and worse for database programming!), just that are not that terrible, either.
- rlili 5y agoCoincidentally, Alephjs (https://github.com/alephjs/aleph.js https://github.com/alephjs/aleph.js) added a commit hours ago that also seems to solve this particular problem for React. So now there's a React hook (useDeno) that takes a callback that is only executed on the server-side, and the returned value is sent back to the client side transparently.
- cies 5y agoI think no-code/low-code backend is here to stay. Products like Hasura put authorization/ratelimiting/graphql/api-GW on top of trusted postgres. Now BE and no serialization up and down. Simply generate a client based on the graphql schema and off you go.
- jtolmar 5y agoI've thought of doing this several times, and always shied away at the complexity and nuance that goes into it. Kudos to the devs for having the skill and determination needed to actually make this real. Very impressive work, and I hope it works great in practice.
- avanai 5y agoWhen the framework does so much for you, I always worry about what it looks like at scale when you need to start optimizing. Can you instrument all the plumbing, if something breaks can you get at it to fix it? How will you add caches at various different layers? On the browser, http cache, db cache, CDN, etc.? If the generated JavaScript that’s ultimately running on the browser has a bug, how many layers of library do I have to sift through to fix it? When I want to simulate the network for testing or deal with intermittent connection failures on the frontend how hard it is to plug in? What do schema migrations look like? What do deployments across a fleet of servers look like (there’s some point in time when some servers are old and some servers are new…)? These are problems with any framework, but the more all-in-one a framework attempts to be the harder it is to get in between the joints with your glue gun to fix things up. That said, this is Clojure and usually you have pretty easy access to all the intermediate bits and bobs and macros so maybe it’ll be great.
- bennyp101 5y agoLots of people saying it’s like PHP or liveview with elixir. We kinda have that with livewire[1] and inertia[2] and as awesome as they are (no separate api etc) they also suffer from the “magic” [1] https://laravel-livewire.com/ https://laravel-livewire.com/ [2] https://inertiajs.com/ https://inertiajs.com/
- sadieenward 5y ago((((((((((((Dom))))))))))))
- atroche 5y agoHow does the reactivity work with Datomic? Is it polling those queries? Or I’d it listening to the log of transactions and figuring out when relevant parts have changed?
- throwamon 5y agoInteresting how no one has mentioned Fulcro. There seems to be a lot of overlap between the two. Anyone who has used both and mind comparing them? https://fulcro.fulcrologic.com/ https://fulcro.fulcrologic.com/
- sooheon 5y agoYeah Fulcro has been building up their implementation of these ideas for ages, and used in anger, I think most famously by nubank. From https://book.fulcrologic.com https://book.fulcrologic.com: "The core ideas are as follows: Graphs and Graph Queries are a great way to generalize data models. UI trees are directed graphs that can easily be "fed" from graph queries. User-driven operations are modeled as transactions whose values are simply data (that look like calls). Arbitrary graphs of data from the server need to be normalized (as in database normalization): UI trees often repeat parts of the graph. Local Manipulation of data obtained from a graph needs to be de-duped. Composition is King. Seamless composition is a key component of software sustainability."
- ziftface 5y agoAm I wrong or is fulcro frontend only though? You wouldn’t get access to any server resources so you still need to manage syncing state with the server. Or am I wrong about that?
- sooheon 5y agoYeah you were mistaken, it's a full stack design. They recommend https://github.com/wilkerlucio/pathom https://github.com/wilkerlucio/pathom for the connection. It's GraphQL done right, you write data "resolvers" on the backend, you declare very flexible graph queries on the front end -> this populates client DB and then fulcro uses that to render frontend. Highly recommend reading through this section: https://book.fulcrologic.com/#FullStack https://book.fulcrologic.com/#FullStack
- cutler 5y ago"Photon will likely be technical alpha for all of 2022 or longer". Wake me up in a couple of years then.
- amw-zero 5y agoI’m very into stuff like this, and I really can’t make heads or tails of what this post is about. There’s a ton of hand waving, and a ton of words, but why not use them to explain exactly what this thing is doing?
- nephanth 5y agoHow does this compare to frameworks that abstracts over network calls such as ocsigen/eliom [1] ? [1]: https://ocsigen.org/tuto/latest/manual/application https://ocsigen.org/tuto/latest/manual/application
- terracottage 5y agoThis is very cool, and ambitious, but i have one major objection: the claim that web apps are an about unidirectional data flow from a managed data store to a consuming front end. That's not the kind of apps I want to build. I want workspaces where I can make and edit and work freely. I don't care to be online to do it, and conserving bandwidth is not a constraint that should define how I use it. The DAG goes from me to me.