Your vibe-coded app is not sustainable

When I say sustainable, I don't mean "still loads in 2031", though it is definitely part of it. I mean: can someone, you in eight months, or a stranger who found a bug, opens this repository, form a correct mental model of it in an afternoon, and change one behaviour or fix one bug without breaking three other functions?

Before we continue, let me be clear. I’m not against the use of large language models to get a little speed boost or helping hand while developing apps. However, I’d say use it only if you understand it. Don’t lease knowledge that you don’t have. I'm also not criticising your LLM-generated script to rename a few files in a dataset or tiny dashboard used by your team to get the data you need. I'm talking about apps that you are pushing to production and expect to be public.

That said, if you decide to vibe-code an app and share it with the world, say so, so people know what they are reading and can check the code. Maybe they give you suggestions, maybe they open a PR fixing something that AI hallucinated or they decide it isn't a fit for them. Never say your app is sustainable because your prompt included “write it in a plain javascript” or "make it static" if you didn't govern decisions along the way and built the mental model of the app with it.

How do you know that the large language model didn't invent hand-rolled code that brings more overhead to your code than relying on a well-maintained third-party library? How do you know that the script or CSS file it is liking and you didn't consider danger is pinned to correct version and loads from trusty CDN? Because a script or link tag pointing at an unpinned CDN URL is a bet on someone else's uptime. Plain JavaScript fetched from infrastructure you don't control is a dependency like any other.

Furthermore, by mental model I mean you can predict what a change will do before you make it, and you can only predict that if you made the decision yourself. Not "make this button blue", but things like "where does state live?" If the user's filter selection lives in the URL, the app is shareable, back-button-correct, and reloadable. If it lives in a module-scoped variable that three components read directly, you've bought yourself a class of bugs you'll be debugging at 2 a.m. Almost nobody prompts for that distinction. A model will happily give you either, and both "work" in the demo... and if you prompt it at the beginning, it can shift as the context grows beyond models context window.

You might say: "I don't need that. I can always ask the AI to rewrite it or fix it." Maybe. But the terms of that deal keep moving. GitHub started metering Copilot premium requests in June 2025 and from June 2026 switched individual plans to usage-based credits.0 The use of large language models is getting more expensive,0 and lots of the companies are still not exactly profitable.0

Reading generated code is reading someone else's code with none of the usual compensations. No commit history explaining why. No author to ask. No consistent set of habits to learn once and reuse. Human code rots too. But when a person writes something strange, there is often a reason or traces – commit message, a blame line pointing at an issue, etc. Generated code has the shape of decisions and nothing behind it. You can't ask the model for a reason; it will just come up with something. And if the model code contains reimplementations that didn't need to exist, written to satisfy a prompt rather than a design, you may end up fighting it harder than you'd have fought the complicated, boring thing you were replacing.

So all your sustainability claims don’t necessarily break on the dependency tree, but on the fact that nobody will be able to touch it. Including you.