> …
> However most of our existing examples of pluggable software are local software: AI agents, developer IDEs, mods for video games, Blender add-ons, CAD extensions. These tend to be professional tools with a high barrier to entry. The web is the most successful software distribution system in the world. It shouldn’t be left behind. My hypothesis is that there is a new opportunity for Extensible Software on the web.
I don't follow. If this is really supposed to be "software for one", why would it need to be on the Internet? Why does it need a client/server model? Why do I care about "distribution"? People develop for web because native development gets painful when there are many flavours of "native". But you only use one of them yourself, and the LLM isn't bothered by its quirks.
Why not just work on designing pluggable local software that isn't so "professional"?
It's very rare that I reach for local software these days.
I’m keen to build up a better local stack for building local programs more easily, running them over the internet without installing and syncing data.
I don’t want to need the cloud to make my computer work.
People also shared Hypercard apps.
I think it is less about client/server and more about how ideas can be shared. Sometimes, data might be shared.
No huge company, no huge PR department, just one hobbyist/professional selling a ugly, rough around the edges tooling to other hobbyist/professionals.
And I had "software only for the home" way before coding with LLMs were a thing and... It's just convenient when it's in a browser. Especially now with technologies like SSE push (where I hardly need any JavaScript anymore).
Also "software for one" can be "software for the home" but also "software for the SME" and the home has Linux PCs, an iOS tablet, an Android tablet, Android phones and the wife is on a Mac Mini.
Also even if it was really "just for me", something has to be said about an app one can access when not at home (which is easy to do when it's a webapp).
> Why does it need a client/server model?
I just use SSE push now: hardly any JavaScript and it works totally fine. Sure it's technically client/server but it's not crazy complicated either.
I've worked on medium-sized desktop Java apps (a few hundreds of thousands of lines of code) that were running on the three usual suspects: Linux, OS X and Windows.
Well... I much prefer to write webapps.
Wife and I have got a SME we run together and we use a Webapp I made to do so (now with the help of LLMs too, but I made the app before LLMs).
Don't get me wrong: I consider JavaScript to be one of the suckiest language ever invented and the amateurism of its ecosystem makes me want to vomit. It's not a love-letter to JavaScript: but browsers are very convenient.
Every tech company is scrambling to be the stable foundation for people in enterprise to build cute little one-off apps safely. It's a perfectly fine pattern, but it's hard to imagine a world where Cloudflare becomes the default. Much easier to imagine Google or Microsoft adopting whatever UI/UX patterns work well and tying into enterprise data natively.
Unless I’ve missed something obvious in my research, Dynamic Workers are the main product implementing this pattern today, but I expect there will be others for all the reasons I laid out in the article.
[0] - https://spritely.institute/
DeepSeek is taking on the "OS" (double quoted cuz of a dumb comment in this thread) role with DSH (deepseek harness) for the apps with plugin architectures.
We have reached the point where people want to create frameworks/infrastructures as it was all the rage (actually that comes up ever other year).
By only providing the ideas here, people want to take credits for later is my take on docs like this. - they can only say, "I was wrong".
I hate that they called it that. I hope they change the name, to me an OS implies... an OS. I don't want to hear marketing excuses about that, I don't need every other company copying CloudFlare butcher a useful descriptor and now we have a bunch of "AI OS" type apps out there. Just call it what it is... an Agent Workspace. They could have called it CloudFlare Agents or something to that effect?
plebian-os.com
I am the lead engineer on Cloudflare OS (and Cloudflare Workers).
I am also the creator of Sandstorm.io.
And I'm the one calling it a successor. Wasn't some marketing decision -- that's directly from me.
Honestly really interested to know why you feel this isn't accurate.
FWIW, I didn't choose the name Cloudflare OS -- but I did frequently describe Sandstorm as being an OS, back in the day. Sure, it layers on top of Linux, but it's an environment where you install apps and run them, with the platform managing the execution environment, permissions, resource management, etc. That's sort of what an OS does. Cloudflare OS does all that as well.
As for the name, yeah, not really a fan as I noted above.
Maybe it won't be a program, but just some LLM context as some data dump.
This program or context will take up the role of a PM. Developers will refer to the program, or ask context for clarifications and the developer will build the actual program with or without the help from LLMs.
Code too messy to be editable by an LLM is already too horrible for humans to touch. Fixing vibecoded software as a service will boil down to reverse-engineering requirements from the messed up program, and prompting a better model to design it properly and rewrite.
Eventually models will be trained to do this themselves, so it won't be a service you ask a dev for, it will be an extra charge on your AI subscription.
That is what I wonder. Two things.
1. Is there enough training data in that format, to do it?
2. Is there enough incentive for the LLM companies to do it? I mean they got to charge the client for the tokens upto that point..so..
2. Yes, because the most capable model is the only one that can charge a premium. The rest is a commodity.
They can, but I don't think they will be of sufficient quality. It is a fundamental thing. You can't generate new information from existing information. It has to come from the real world.
Generating training data using existing models will only help the model to capture the exiting patterns more thourly.
Clients come and show me their proof of concept, fully vibecoded, because they do not know / do not have the time to take it to prod. Other comments saying this will be automated in the future... may be. But even if that is the case, time and attention are still needed to make things happen.
With the extendended capabilities IA brings, having an IT person in-house makes more sense than ever, even for small shops.
That's not gonna happen :-/ I've already had clients tell me they only want it modified, and their expectation is that it's only a days worth of work to make it work.
This LLM stuff is still quite new; I wouldn’t be surprised if people are still asking for your help wrong.
Who knows. I don't take on any dev work anymore that involves modifying existing applications, anyway. Too many have been of the form "Look, we did 99% of it, we just need you to do the 1% remaining" with the expectation that finding and fixing bugs in a vibed 90kSloC application is only a few minutes to a few hours of human labour.
In reality, if you bring me something that Claude Code itself can't make changes to without breaking, it's going to be at least a week of billable hours before I know where to start.
what's important is the spec. the poc isn't a spec because the dev is being hired exactly because that software doesn't solve the problem fully - whatever it has missing is the important bits
this spec will probably be generated by a llm, but there is some noise added. if the client can send their prompt, alongside the whole llm session (maybe with sensitive tool calls redacted), the dev would have everything
For a lot of end users, this may be enough, no programmers will be needed to get software built and shipped. For the rest, it lets programmers fill the remaining gaps, doing the manual testing to make sure the system works correctly, test for regressions and make sure the LLMs add those to the test suite, and then manage monitoring the rollouts. The bulk of development work going forward is manual verification that the LLM understood the user request correctly.
I'm not as sure that this idea of plugins will pan out; AI will want to make changes to support what it produces.
Even if each user gets their own sandbox, they will still want to configure different access rules for different kinds of data which they host.
That said the idea that each user could control and host their own data is interesting and could work. I imagine you could have apps which link data from many different user sandboxes via remote foreign keys.
You could have a centralized data schema controlled by the application owner but the data itself would be held/scattered across a large number of sandboxes.
Passing code only the things it’s allowed to use works on the server because you start from zero, so our generated code holds no credentials at all and its only way out is a proxy that allows exact origins and methods.
You can’t really do that in the browser. CSP only restricts which origins the code can reach, not the method or the path, so approving one destination means anything the code can read can go anywhere there. The difficult part is that if we're writing an honest consent prompt to our users then it has to say that, and it sounds a lot worse than "allow network access?". This is hard especially when our target users are non/less-technical. There are other versions of the same problem everywhere, like revoking an origin not actually taking effect until a refresh.
And Cloudflare OS does some fancy things with iframes + capnweb iirc
Or at least, ideally. Unfortunately, content-security-policy today has a few exotic holes. WebRTC, for instance, cannot be blocked; the standard simply doesn't cover it.
So it's not suitable as a sandbox against malicious code trying to leak data by any means possible. Instead it's protection against the AI doing something stupid, perhaps prompted by a user who doesn't know better.
(We would love to get those CSP holes plugged, though...)
I've been using it for the last three months for basically all my computing. I always wanted a Smalltalk type environment, and this finally scratches this itch.
Creating an endpoint is just defining a lisp function.
There's still a billion things to clean up but it works really well.
My LLMs say that if you followed this same pattern in pure clojure or racket it would be comfortably <10k lines of code.
That said, I do enjoy implementing my own lisp and I think the OCaml core gives it some stability and security.
Because of end-to-end-encryption and privacy/ownership concerns, we can't run plugin code on a server node somewhere. But for some types of apps, server-side extensions alone also feel too restrictive. An advantage of a malleable app over just one-shotting a completely custom app (and to be clear I think both will be popular!) is that extending and customizing something is often exactly what you want vs starting over, but you can't really do that when you can't do things like deeply customizing the UI. So you can just ask a (local) agent "add me this functionality" and it will likely be possible.
It's still sandboxed inside the browser though, so this way you can do things like permissions, allowing admins to restrict who installs team plugins and so on (which is also important for malleable multiplayer apps).
The cool part is a move to capabilities composed in code brings back everything great about software itself: composability, encapsulation, type systems.
I've been working on this for SQL: instead of giving clients a handle to endpoints, you give them scoped query builders they can compose with (e.g., hand out a scoped `users` object and client can do `users.where(u => u.isActive()).orderBy(u => u.createdAt)`).
The result is you define a data-model (schema, computed columns, relations) and expose that instead of an endpoint per desired client query.
(if interesting: https://typegres.com/)
This is quite funny, actually. When I wanted something similar (just play MP3s, without playlists, special indexes, etc), it also took me 30 minutes.
In 2002.
I still use it daily - a wish application displays entries matching the filter using the locatedb to get a list of all MP3s to find them and mpg123 to play them. This is the application that I have used the longest in my life, unchanged and unmodified from day 1, and it still tickles me that it took 30m.
I'm pretty certain, had LLMs not existed, that I can make an application finder using locatedb (perhaps store a private index as well) and a GUI in about 30m using wish as the front-end.
(Just for reference, here's my no-frills MP3 player) ---------------------------------------------
#!/usr/bin/wish
# Copyright Lelanthran K. Manickum 2002, provided under BSD license
#
set version "1.0"
proc playSong {songname} {
set rc [catch { exec killall -9 mpg123 }]
if {$songname=="\[Stop Playback]"} {
.midFrame.lblPlaying configure -text "Stopped"
return 0;
}
set rc [catch { exec mpg123 --loop -1 "$songname" & }]
if {$rc==0} {
.midFrame.lblPlaying configure -text "Playing: $songname"
}
}
proc locateSongs {pattern} {
.lstResults delete 0 999999999
set tmpvar [split [exec locate -i "*$pattern*.mp3"] "\n"]
.lstResults insert 0 "\[Stop Playback]"
foreach title $tmpvar {
.lstResults insert 1 $title
}
}
frame .topFrame
frame .midFrame
entry .topFrame.entSearchString -text "Search String"
button .topFrame.btnSearch -text "Search" -command {locateSongs [.topFrame.entSearchString get]}
listbox .lstResults -yscrollcommand {.sby set} -xscrollcommand {.sbx set}
scrollbar .sby -orien vert -command {.lstResults yview}
scrollbar .sbx -orien horiz -command {.lstResults xview}
label .midFrame.lblPlaying -text "Stopped"
locateSongs ""
focus .topFrame.entSearchString
bind .topFrame.entSearchString <Return> ".topFrame.btnSearch invoke"
bind .lstResults <Double-B1-ButtonRelease> {playSong [.lstResults get active]}
bind .lstResults <Return> {playSong [.lstResults get active]}
grid .topFrame -row 0 -column 0 -sticky nsew
grid .topFrame.entSearchString -column 0 -row 0 -sticky nsew
grid .topFrame.btnSearch -column 1 -row 0 -sticky nsew
grid .midFrame -column 0 -row 1 -sticky nsew
grid .midFrame.lblPlaying -column 0 -row 0 -sticky nsew
grid .lstResults -column 0 -row 2 -sticky nsew
grid .sby -column 1 -row 2 -sticky nsew
grid .sbx -column 0 -row 3 -sticky nsew
grid rowconfigure .topFrame 0 -weight 1
grid columnconfigure .topFrame 0 -weight 1
grid rowconfigure . 2 -weight 2
grid columnconfigure . 0 -weight 2
wm protocol . WM_DELETE_WINDOW {
set rc [catch { exec killall -9 mpg123 } ]
destroy .
}
wm title . "Simple Music Player - v$version"
wm geometry . 700x500There are tons of apps I could build in 30 minutes using a development environment I'm familiar and productive with already, but LLMs don't have that restriction.
>
> There are tons of apps I could build in 30 minutes using a development environment I'm familiar and productive with already, but LLMs don't have that restriction.
Here's the thing - if you never learned to use $FOO, it is closed off as an option to you forever, even with LLM help.
I'm going to be a lot better at designing personal-use software via an LLM than someone who doesn't have 30 years of experience writing software for money, because I learned things (like wish) which can be leveraged via LLMs to produce the output artefact faster and more reliably.
For personal-use software, if all you know is HTML, CSS and Javascript, then all you can produce is electron-based crap as the smallest unit of software. Someone like me, OTOH, can produce small and tight software because I programmed in Delphi (now Lazarus), Qt, Tcl/Tk, etc in the past, and they are still viable.
I recall seeing an electron-based vibed app recently on a ShowHN that, I thought at the time, could have be completed using a small bash script calling Zenity.
The problem is what happens when people like myself (and yourself, too) are no longer around?
All the software is going to converge towards being crap; if there is no one telling the LLM that a specific task can be completed using Lazarus with zero 3rd party deps, all tasks are going to get completed using Rust with a few thousand create deps talking to an electron-based app that has a few thousand JS deps (and maybe some CSS frameworks thrown in for good measure).
The two camps both speak as if the other side can't possibly exist. I think they've both always existed, it's just that LLMs have made the distinction plain as day.
And these gigabytes get used up really quickly when the LLM goes brrrr. And with this 500% surge in RAM prices, I don't think it's still enough to just buy more.
...
> LLMs can write Zenity bash scripts just fine, it's up to the person driving it to ask for that instead.
You don't think we're on the same page here?
I don’t want to necessarily argue about merit or quality, but I have seen that custom software can be accessible to a general audience.
But how does that contradicts the idea of extendable software? If anything, extendable software will better do what the user wants it to do.
It's just right now we think of extending the software as if it's a complex operation. It looks to me like the article envisions a future, where extending your software is as simple as, say, creating a new google doc or opening a link.
It is doubtable, however, that such level of ease of extendibility can be achieved at all. There might be enough essential complexity, like answering lots of questions, which, I agree, most users won't be doing.
Write completely separate small apps, and it's a different result. You get reliable functionality without an increase in complexity. Don't add a "file search extension" to your application (consider that if any other application wants this functionality, now they have to implement their own extension). Instead you make one completely separate app, called 'grep'. You then call that one 'grep' app, from any application.
It's a very old-fashioned idea to programmers who have only ever known custom-integrated REST APIs and microservices and giant monolithic frameworks. But this old-fashioned idea is the reason AI agents are even useful at all. They call those old-fashioned single-purpose external tools, and suddenly the agent has useful features, no custom extension needed.
Another thing you don't need: "a platform for platforms". There's already a platform designed to run interoperable applications. It's called an Operating System. It runs these little independent things called applications. They all have data object storage input-output access. Even internal communication between processes. And they're all compatible.
In fact, the options available are outdated in terms of frameworks and bloated with features to please all kinds of customers. They try to do everything but end up doing everything poorly.