The freedom you don't want: why infinite customization is a tax, not a feature
The hard part was never writing the code
In 2023, at the No Code Summit in Paris, I gave a talk that our blog later turned into a deep dive. Its central claim sounds wrong: the hardest part of building a feature is not writing its code. Fifteen years of building an app platform taught me that. Itâs also the reason the total freedom everyone sells right now - raw code, vibe-coding, build anything - arrives with a bill nobody itemizes. Let me itemize it.
Take any feature you consider simple. A list of items, say. Now formalize it: name the states:
- the loading
- the empty
- the error
- the stale
Decide what happens when the network dies halfway through a fetch. Decide what two options do when someone combines them in a way nobody asked about. That work - naming states and finding edges - is where the effort lives. The code that comes after is the transcription.
I didnât learn this from a book. I learned it feature after feature, for fifteen years, building the platform where that formalization is my teamâs actual job. And once youâve seen it, you canât unsee what the current tooling debate is really about. It isnât about who types the code, you or an AI. Itâs about who does the formalizing.
What âtotal freedomâ actually invoices
Raw code and vibe-coding sell total freedom: nothing decided for you, no ceilings. Mechanically, that means every formalization is yours. Authentication strategy, state management, caching policy, error conventions, navigation architecture, build pipeline. None of it is your product, and all of it is now your problem. Not once, continuously. A decision in software isnât an event, itâs a subscription. It has to be remembered, documented, defended in code review, revisited at every OS release, re-explained to everyone who joins. And the invoice is dated year two.
Day one feels free: you move fast, everything is possible, nothing has broken yet. The bill arrives when the framework you hand-rolled needs an update nobody budgeted, when the clever caching layer outlives the person who understood it. Vibe-coding sharpens this, it doesnât soften it. AI collapsed the cost of producing decisions and left the cost of owning them intact. You can now generate architecture debt faster than at any point in the history of this industry.
None of this is new. The canonical version is ten years old: in Choose Boring Technology, Dan McKinley argued that every team gets about three âinnovation tokensâ to spend on non-standard choices, because every exotic decision is a long-term maintenance commitment. The industry keeps rediscovering his invoice, most recently in the wave of posts on vibe-codingâs technical debt. The diagnosis isnât whatâs missing. Whatâs missing is the view from the other side of the fence: what it looks like when a framework does the formalizing for you, at scale, for years. From that side, McKinleyâs freedom budget isnât a metaphor. It has a number.
The engineered middle
First, a word on âframeworkâ, because I use it broadly, on purpose: any tool that made decisions before you arrived. That covers two very different families: code frameworks - Rails for example (Devopedia describes that philosophy well) - and full app platforms like the one I work on. Different technologies, zero shared code, same economics.
On our platform, the patterns that repeat across thousands of apps have been formalized once, by us. The parameters combine into more than a billion possibilities. And for the genuinely custom remainder, we apply what I call the 10% rule: about 90% of a real project is patterns the framework has already formalized. The last 10% is yours, and the frameworkâs job is to hand you escape hatches for it, rather than pretending the 10% doesnât exist.
Thatâs the design position the usual binary hides. The dominant story says code and AI equal freedom, no-code equals limits. The real spectrum is: who formalizes what. Opinionated defaults for everything that is not your product, reversible trapdoors for everything that is. You enter complexity when your project requires it, by choice, with a map. Fast where youâre ordinary, open where youâre special.
AI has made this position stronger, not weaker. Whatever youâre building, most of it already exists somewhere in formalized form: lists, accounts, search, push, payments. Features that have been studied, optimized and debugged against years of production. Rebuilding them is the worst possible use of a freedom budget. The rational split is to inherit that 90% as-is and spend your tokens on the one part that is genuinely yours - the part no platform could have anticipated - and that part you can now vibe-code in a dedicated section, inside the frame. Thatâs what escape hatches become in the AI era. And the frame keeps the bill bounded: if your custom part turns out to be a bad idea, the blast radius is one section, not the app.
Seen that way, adopting a framework isnât renouncing freedom. Itâs acquiring a decade of formalization you wonât have to do yourself.
A line held for fifteen years
One last thing, because âthe middleâ can sound like the position you hold when you donât have one. The platform I build has defended this line since 2011: opinionated where projects are alike, open where they arenât. Fifteen years, through every wave that was supposed to invalidate it. The most persistent one is hybrid frameworks - theyâve been announced as our replacement for as long as the company has existed, under a new name every few years, and each time we made the same call: native. And now AI generation, the strongest freedom narrative so far.
Each wave moved the how. The economics never moved: someone pays for every formalization. The only real choice is whether you pay for the ones that make your product yours, or for all of them.
Comments
No comments yet. Start the discussion.