Search Destack

Search pages, sections and commands

↑↓Navigate↵OpenEscClose

Introducing Destack

The final stack for personal software (for real this time).

Florian

Software is entering its Cambrian Explosion, and - it is worth remembering - that means most specimen will go extinct, and the survivors will look rather different. Both products and processes will undergo intense evolutionary pressure, with fast migrations enabling the full exploration of the space of all possible software until a new optimum emerges.

Illustration of a Cambrian ecosystem, with Kylinxia, trilobites, worms, and colourful sponges beneath deep blue water.
Figure 1Cambrian marine life — Huang Diying, Chinese Academy of Sciences.

The contemporary stack is structurally broken: The "stack" is a thousand little silos, each with their own slightly incompatible slice of software, each demanding its own terms and standards and formats. It was never designed as one whole; it evolved as a mosaic of different technologies and services where nothing quite fits together.

Now, the technical debt accumulated over decades of organic software growth is coming due. Probabilistic computing is finally here and we could infuse intelligence into all software, but we can't, because we're stuck on an opaque stack that rejects integration and modification at every layer. Instead, we got "APIs" and now "MCPs".

To put it quite bluntly: as long as there were no machines, programming was no problem at all; when we had a few weak computers, programming became a mild problem, and now we have gigantic computers, programming has become an equally gigantic problem.

— Edsger Dijkstra, The Humble Programmer (1972)

The familiar features that make modern software "modern" - SaaS, multiplayer, multi-vendor, multi-cloud, heterogeneity - also make it hostile to agents. Fragmenting context and siloing control as widely as embodied by the old stack is exactly the opposite of what personalised, malleable, intelligence-infused software needs.

So, half a century after the last software crisis, the computing stack is once again buckling under the weight, volume and speed of a more powerful machine. Once again, we get to retrace from the beginning, reconsider what programming even means, and reshape what 21st century software should look like.

Higher Order Programming

The history of programming is one of monotonically increasing levels of abstraction in specifying mechanically repeatable behavior: from handcrafting mechanical gears, to wiring up vacuum tubes, to punching paper cards, to coding assembly, to writing C, to programming Java, to scripting Python, to asking an LLM.

Climbing the ladder of abstraction yields more output for every (human) bit of input. We gradually remove ourselves from the cumbersome burden of having to spell out exactly what we want the machine to be doing: which gears? which wires? which bits? which registers? what memory? what computer? where computer? when computer?

The 1832 demonstration portion of Babbage’s Difference Engine No. 1, with its columns of brass gears and hand crank.
Figure 2Difference Engine No. 1, 1832 — Sebastian Wallroth, public domain.

Programming, then, is just reified problem solving: iterating, thinking, working to understand the shape of a problem and specifying its solution in some mechanically repeatable form. We used to solve software-shaped problems with artisanal next-character-prediction of symbolic code, but, really, programming doesn't have to be any formal language at all.

Indeed, there was programming before code, there is programming after code - and programming alongside code already has rich prior art! Game developers have iterated on multimodal software production over decades: early game development was a schlep where only a tiny guild of brilliant nerds managed to produce presentable commercial games.

To build a game, everyone had to write their own graphics, networking, scripting, asset pipelines, editors - a whole engine for every game, on top of the actual game! Then, we figured out how to package the hard bits into reusable components and more complete, higher level packages of reusable software components we call a "game engine".

IBM’s 1951 advertisement, 150 Extra Engineers, showing rows of engineers doing calculations.
Figure 3150 Extra Engineers, 1951 — IBM.

Crucially, modern game engines go far beyond traditional "software frameworks" like Django or Rails or some blend of cloud services. The best game engines are integrated software platforms: a runtime, an editor, tools, VCS integrations, netcode, deployment platform, and myriad affordances for prototyping, iterating, refining, and shipping games.

Like most new abstractions, game engines initially didn't provide quite the same level of control as their underlying substrate. Over time, however, building with a game engine became so much more productive that it enabled a new scale of project, and empowered a new type of contributor - designers, writers, and artists, could now contribute directly.

Games never "superseded" code, even as a lot of code was abstracted away for use cases that previously required it. Code is still there, it's still relevant, but - thanks to game engines - you can build and ship commercial games without thinking in code.

The Software Engine

General purpose software is now hitting the same issues that game developers have long solved. The principal components of modern software have ossified, but they're scattered and reconstituted a thousand different ways. General software needs its own "software engine": integrated "platform software" with building blocks for a new level of "userland software".

It is insufficient to accelerate the software production process, not just because of Amdahl's law, but because missing any part of software is to lose the shape of the whole product - and software that doesn't solve any reality-shaped problem is pointless. In frighteningly short order, steering only through the peephole of a chatbox makes it almost impossible to figure out where to go next and how to get there.

Oddly, the primary objective of "software factories" seems to be removing oneself from all production processes without any new higher order specification to anchor this higher level of programming. In other words, the software factory requires a software engine, because the precise industrial-scale manufacture of quality software must be built on new integrated processes that span the entire lifecycle.

A full-size Wright Flyer replica mounted on a test stand inside the Ames wind tunnel, with two engineers standing beside it.
Figure 4Wright Flyer replica in the Ames wind tunnel — NASA, public domain.

Despite half a century of development, our tools for building and understanding software systems are surprisingly primitive. We still struggle with "works on my machine", and reproducing observed issues in the "laboratory" is virtually impossible. If software is going to run everything, faster than anyone can verify, how do we make sure it's the right software?

Fundamentally, there is not a single test, certificate, proof, or magic gate that you can run to convince me that some non-trivial general software program is correct. The correctness of any complex software systems spans many granularities, and mathematical "proof", green tests, smoke tests, and passing gates all mean nothing if it's not what I actually meant.

The only way to ensure correctness for general purpose software - that is: does it do what it should? - is to look, to see the software in motion under many different angles and granularities. Notably, this is not an intelligence problem at all - it's a human problem, and a real world integration problem. I just don't know what I want until I see it.

Figure 5Building in Tiny Glade — Pounce Light, release date trailer excerpt.

The continuous and iterative process of shaping is critical not just for "malleable" software but - because programming is just reified problem solving - for all software. Software development - from databases to web apps to spreadsheets - spans one continuous spectrum of reified program solving that has been separated into rigid planes only by historical happenstance.

Until now, the cardinal sins of "malleable software" has been that "userland software" like spreadsheets are too limited, while "general software" is annoying to build and maintain. Now, the equation has flipped: building is cheap, and the lack of integration is expensive. How do you join "reminders in Notion" with "leads in Salesforce" and "events in Outlook"?

There are amazing new probabilistic computing capabilities to embed deep and wide into all software, and the lack of integration is why we just have MCPs with chatboxes in the sidebar. Forms don't even prefill, software is not adaptive, apps are not magic - where is all the automation? If we truly have higher order programming, where is the higher order software?

The Destack

Higher order programming requires higher order processes with higher order specifications, the necessary control for which can only be achieved by integrating and standardising the full stack. Thus, we need a complete software engine that provides both the fundamental building blocks for development and the platform services for deployment.

That is Destack: an open source, hackable, software engine and platform. In product terms, think of Destack as an integrated system of software production with the principal building blocks for modern software and a ready-to-wear suite of common applications built on top of them, ready to deploy, remix, and adopt.

Eleven versions of Picasso's bull, progressing from a detailed animal to a few essential lines.
Figure 6The Bull, 1945–46 — Pablo Picasso, reproduction via Draw Paint Academy.

Destack does not require everyone to "own their stack" literally - that would be too annoying, and give up all the nice benefits of modern cloud-based software. Rather, the standardised Destack users to actually own their data, makes deep integration and customisation table stakes, and reduces app switching to just a single click.

In technical terms, think of Destack as a unified GitHub + NPM + SQlite + Durable Object with all the boring integration like auth, schemas, migration, sync, triggers, workflows, telemetry, infra. It's all standardised to enable a higher level of abstraction.