The vibe coding space is fiercely competitive. A recent roundup counted 82 different tools — and that number keeps growing.
Most of these tools, especially the ones targeting non-programmers, generate the same thing under the hood: JavaScript or TypeScript. The industry has converged on a default, and almost no one is questioning it.
I think that's a mistake — and not an abstract one. As long as vibe coding tools generate JavaScript, non-technical builders will always be second-class citizens. They may be able to ship prototypes, but they'll struggle with everything that comes after.
Here's why, and how it's built into the language itself.
The abstraction mismatch
Let's say you want your app to send a welcome email when a new user signs up. To you, that's one step — a single concept you could explain to a colleague in a sentence.
To JavaScript, it's a cascade of subtasks. Import an email-sending library. Configure authentication credentials. Construct an email object with the right field names and data types. Send it asynchronously. Wait for a response. Handle what happens if the email service is down. Handle what happens if the address is malformed.
You said one thing. JavaScript needs to say twenty. In other words, you’re thinking at a higher level, while JavaScript is breaking that thinking down to a lower level.
This is what I call the abstraction mismatch — the gap between the human-level concept and the JavaScript implementation. It's everywhere, not just in email sending. "Find every user whose name starts with 'A'" sounds like a complete instruction. But JavaScript needs to know the exact query language for your particular database, how to structure the results, what to do if the query takes too long, and what to do if there are ten thousand matches you can't load at once. "When this button is clicked" is a thought. JavaScript turns it into a chain of event listeners and callback functions.
The problem isn't that JavaScript is bad. It's that the gap between what you describe and what gets generated is wide — and someone has to manage that gap.
In traditional software development, that someone is a professional engineer. They write the code, they read it, they understand what it does. When something breaks, they trace the problem. When they want to change behavior, they edit the relevant lines.
When you code with AI, that someone is you. Except you can't bridge the gap on your own. And the abstraction mismatch of JavaScript makes it hard for AI to help you.
What this mismatch means for builders
Relying on AI to bridge the gap creates three compounding problems.
1. You’re reading a summary of your app, not the app itself
When you describe what you want to AI, it translates your thinking into JavaScript. If you don't know how to read it, you have to ask the AI to explain it back to you. It will then happily describe things to you or even make diagrams. But summaries are inherently imperfect. They compress the complex behavior of actual code into simpler concepts. The human reads the summary; the computer runs the code. That gap creates divergence between what you think your app does and what it actually does.
For traditional developers, this is manageable. They use the summary to orient themselves, then read the actual code when details matter — fixing a bug, auditing for security vulnerabilities. The summary is a map; the code is the territory. Experienced developers move between the two.
But if you can’t read the code, you’re 100% reliant on that summary. This is why it’s so common for non-coders to find themselves rephrasing the same request a dozen different ways — you're blocked by what gets lost in translation.
2. You can describe what you want. You just can't do it directly.
With JavaScript-based vibe coding, there are two paths to make changes: prompt the AI or edit the underlying code directly. Prompting can get you most of the way there quickly. But for precision work — nudging a margin, reordering steps in a process, tweaking the exact conditions under which something triggers — it's often faster to just make the change yourself rather than explain it to an AI and hope it understands.
The problem is that editing code is a clumsy, slow way to do this, whether you’re a programmer or not. It’s much faster to edit a layout by dragging things around, or to edit logic by rearranging workflow steps on a canvas. But this is where that abstraction mismatch comes in again. When the preview or canvas you’re trying to manipulate is actually an imperfect summary of dozens of lines of JavaScript, that process becomes unreliable. You drag something in the visual editor, but the change doesn't translate cleanly to the code. Or the AI modifies the JavaScript in a way the visual editor can't represent, and the two fall out of sync. Keeping a summary layer and an underlying code layer consistent, in real time, while both are being edited, is genuinely hard — especially as the code grows and drifts in ways the visual layer wasn't designed to handle.
This is playing out in the market. Leading vibe coding tools have been slow to give their users robust visual editing tools. Some small tweaks are possible visually — changing copy or button colors — but broader changes still require you to ask the AI for help. That's not a temporary limitation they'll engineer around; it's architectural.
3. Editing in JavaScript is inherently inefficient (and expensive)
The full JavaScript version of an app is far lengthier than a higher-level, human-friendly description of the same functionality. AI models charge by the token. More code means more tokens to read, more tokens to generate, and more tokens to keep in context while reasoning about changes. What takes 50 lines to express in a higher-level language might take 500 lines in JavaScript — and that's not just a 10x difference in file size, it's a 10x difference in what the AI has to process for every task.
AI capabilities are improving rapidly, and context windows are expanding. But no matter what model you’re using at what level, a concise codebase will always outperform a verbose one. That's not a temporary gap that closes as AI improves. Rather, it's a permanent tax on working with a language that relies on so much abstraction.
Add it up, and vibe-coded JavaScript becomes tech debt from day one. It's expensive to run, prone to bugs, and opaque to anyone who isn't a professional programmer. And these problems compound. By the time the codebase becomes unwieldy, you're already in too deep. Migrating away means starting over, so people just live with it.
The solution: Make the summary the codebase
Rather than generating JavaScript and then summarizing it for humans, Bubble works in a higher-level language designed specifically for building applications, where each human-understandable concept maps 1:1 to a line of code.
Remember the "send an email" example — how a single concept explodes into dozens of lines of JavaScript dealing with libraries, authentication, object construction, error handling, and async operations? In Bubble’s language, "send an email" is just one line of code. Bubble’s underlying infrastructure handles the implementation details: how to connect to the email service, how to structure the request, how to handle failures. The same applies to "find every user whose name starts with 'A'," or "when this button is clicked," or any other concept a builder might express.
In other words, with Bubble, the programmer — or the AI — specifies what should happen. The language already knows how. With JavaScript, every developer (or AI) has to figure out the how fresh each time.
That’s a fundamentally different architecture that eliminates the three problems I listed above at their root.
When the natural-language description is the code, there's no imperfect summarization. What you see is what runs. When something goes wrong, you can trace the problem directly. When you want to audit behavior, you're reading the real thing.
Editing visually becomes much more precise, reliable, and robust for the same reason. Because every visual element maps 1:1 to its underlying logic, you can drag a component, and the code changes exactly the way you'd expect. Rearrange steps in a workflow, and that's what the application does. There's no sync problem between layers because there's only one layer, represented two ways.
And finally, AI gets dramatically more efficient. A concise codebase means fewer tokens to process, which means faster responses and lower costs. When the AI is working on the what instead of the how, whole categories of errors — the ones that creep in when you build out the same functionality slightly differently each time — simply don't exist.
We've been building toward this for years, and we're not stopping now
AI coding companies are young, moving fast, and fighting for market share. They don't have time to invent a new programming language from scratch. And even if they wanted to, their investors would be unlikely to fund a multi-year detour. They chose JavaScript because it was the obvious choice: the most common web language, the richest ecosystem, the most abundant training data. No one gets fired for choosing JavaScript.
But we started Bubble because we believed — and still do — that defaulting to JavaScript is fundamentally wrong for app development. Instead, we've spent the last decade-plus building a language that describes web and mobile applications at a human level.
Teaching AI models to work fluently in a novel language is naturally going to take longer, and we're still early, but we’ve made good progress. Our AI app generator creates full-stack applications (UI, database, workflows, and logic) from a single prompt. The Bubble AI Agent lets builders make changes conversationally without sacrificing control. Every change the Agent makes is visible in our editor, not hidden in code, and users can step in to make changes manually — and visually — any time they want. There’s plenty of room to improve, and we're laser-focused on it.
It's going to be worth the effort, and soon: No matter how good the AI coding tools get, and no matter how smart the models get, a more concise, human-focused codebase will always outperform a clunky JavaScript one.
If JavaScript remains the default, builders who don’t know how to code will never be able to ship robust software. That's not the future we're building toward. Our mission has always been to make technology genuinely accessible — not "accessible with an asterisk." We want to give people real understanding of and control over the software they build, not just a faster way to generate code they can't read.
Build for as long as you want on the Free plan. Only upgrade when you're ready to launch.
Join Bubble