Guides

Do you own the code an AI app builder writes for you?

Copyright, export rights, and the lock-in nobody puts on the pricing page

People ask this as one question. It is two. The legal question is whether copyright subsists in AI-generated output and who holds it. The practical question is whether you can download the source, push it to your own git remote, and keep running it somewhere the vendor does not control. The answers are unrelated, and the second one is the one that costs money.

Author
By Fabricate Team
Last updated
Updated October 13, 2026
Reading time
21 min read
Key takeaways
  • In the US, purely AI-generated material is not copyrightable and prompting alone does not make you the author. Your own creative contributions, arrangement, and modifications are protectable.
  • Almost every vendor disclaims ownership of the output and assigns whatever rights exist to you. That clause is close to universal and tells you nothing about whether you can obtain the code.
  • Ownership and portability are separate. Bubble tells you plainly that you own your app design and data while its own docs say there is no way to export your application as code. Both are true.
  • The five questions that actually decide lock-in: source download, git remote, self-host without the vendor runtime, proprietary runtime dependencies, and what happens to a live app when you stop paying.
  • On Fabricate, ZIP export, GitHub sync and git clone are all gated to paid plans, enforced server-side. So is publishing: the free tier builds and previews, and a paid plan puts an app online.
  • Exporting the code does not export the coupling: managed runtime bindings, live data, third-party accounts and DNS all stay where they are.
  • Test portability on day one, not on the day you want to leave. Export, install, build and deploy the app somewhere else before you have anything to lose.
Table of contents

Two questions hide inside "do I own it"

Short answer: in the United States you own the parts of the output that reflect your own creative contribution, the vendor almost certainly disclaims ownership of the output in its terms and assigns whatever rights exist to you, and neither of those facts tells you whether you can actually get the code out of the tool.

The first question is legal. Who holds copyright in code a model wrote? The real answer is more restrictive than most vendor marketing implies.

The second question is operational. Can you download the source, push it to a git remote you control, run it on infrastructure the vendor does not own, and keep your deployed app alive if you stop paying? This is what determines your position in eighteen months when pricing changes, the roadmap moves, or the company gets acquired.

These two questions have almost nothing to do with each other. A platform can grant you every right it holds in the output and still leave you with no mechanism to obtain a copy of it. Bubble is the cleanest illustration in the market: its own documentation says you own your app design and your user data, and in the same breath says Bubble apps can only be run on the Bubble platform and there is no way of exporting your application as code. Both statements are true simultaneously. Ownership without portability is a receipt for something you cannot pick up.

What vendor terms actually give you

Almost every AI app builder disclaims ownership of the generated output and assigns whatever rights exist to the customer. That clause is close to universal across the category, and on its own it means very little.

Vercel states it plainly in the v0 FAQs: "Vercel doesn't own the code generated based on your queries and prompts." The same FAQ then notes that output "may be the same or similar to other users' output or third party's IP, be incomplete or contain bugs," and puts the burden of evaluating it on you.

Read that second half carefully, because it is the half that does work. The standard shape of these terms is: we do not claim ownership, and we do not warrant that the output is original, non-infringing or correct. You receive whatever rights exist, and you also receive the risk.

Bubble draws the other line in the same category more explicitly than anyone. Its manual says you own your app's design and user data, while "Bubble retains ownership of the underlying code that powers your app," and compares this to Microsoft owning Word while you own your documents. It also commits that in the unlikely event of discontinuation, Bubble's source code will be made available under an open-source license so an app can be maintained on a self-hosted Bubble server.

Most platforms leave the same distinction implicit, so Bubble deserves credit for stating it. The pattern to look for is the split between the output and the machine: the vendor gives you the output and keeps the machine. That is entirely reasonable as a business model. It only becomes your problem when the output is inert without the machine.

Ready to build?

Describe your app in a few sentences and Fabricate builds it. Build free, go live on Pro.

Start building free

Portability is the question that costs money

Legal ownership is a question you answer once. Portability is a question you answer every month you keep paying, and there are exactly five things worth checking.

1. Can you download the source? Not a preview, not a public share link, not a screenshot of the file tree -- a complete archive of the files on disk. Check whether this is gated behind a plan, because on several platforms it is.

2. Is there a git remote or a GitHub sync? A ZIP is a snapshot; a git remote is continuity. Two-way sync is meaningfully better than one-way push, because it means you can edit locally and the platform will accept your changes back rather than silently overwriting them.

3. Can you run it without the vendor's runtime? Some generated apps are ordinary Node or Vite projects that boot anywhere. Some are ordinary projects that happen to target one specific cloud. Some are not projects at all, just configuration inside a proprietary engine. These are three very different outcomes and the marketing word for all three is "export".

4. Are there proprietary runtime dependencies you cannot replicate? A hosted database with no export path, a bespoke auth service, a managed function runtime with no local equivalent. If the code compiles but cannot serve a request without the vendor's infrastructure, the export is a reference implementation, not an escape hatch.

5. What happens to your deployed app when you stop paying? This is the cell nobody puts on a pricing page and the one that decides whether leaving is a migration or an outage. In our research for the matrix below, it was also by far the hardest thing to verify from any vendor's own documentation, including our own.

Portability matrix, verified 26 July 2026

Every cell below was checked against the vendor's own current documentation on 26 July 2026, or, for Fabricate, against the code in the repository that runs the product. Where a vendor's public documentation does not answer the question, the cell says "Not verified". That is not a negative finding about the vendor -- it means the answer is not published where a customer can read it before buying.

We would rather ship a table with gaps in it than a table where every cell is filled and some of them are invented. If you need certainty on a "Not verified" cell, ask that vendor's support directly and get the answer in writing before you commit.

Note

Read the first two columns together. Bolt.new, Replit and v0 all appear to let you download your source with no plan gate stated in their docs. Fabricate and Lovable both put source download behind a paid plan. On that specific row, three competitors are more generous than we are.

PlatformDownload sourceGit remote / syncRun off vendor runtimeProprietary runtime dependencyIf you stop paying
FabricateOur PickYes, full ZIP -- paid plans onlyGitHub export and git clone -- paid plans only; apps built on the current engine cannot yet pull changes back from GitHubYes, on your own Cloudflare accountNone in the exported files; Cloudflare Workers requiredThe app and its data stay in the account; its live link goes offline after notice; private apps stay private
LovableYes -- "Download codebase" is paid plansTwo-way GitHub sync; github.com on all plansDocs say export lets you deploy outside LovableNot verifiedNot verified
Bolt.newYes, Export then Download; no tier limit statedGitHub integration for version controlYes -- docs describe running it locally with Node.jsNot verifiedNot verified
ReplitYes, Download as zip; no tier limit statedGitHub connect with auto-sync for two-wayNot verifiedNot verifiedNot verified
v0 (Vercel)Yes -- export the code to work locallyBi-directional GitHub integrationNot verifiedNot verifiedNot verified
BubbleNo -- no way to export the application as codeNoNo -- Bubble platform onlyYes -- the Bubble runtime itselfNot verified

Sources: each vendor's own documentation, checked 26 July 2026, plus the Fabricate repository for the Fabricate row. "Not verified" means the vendor's public docs did not answer the question.

Where Fabricate sits, including the worse parts

Fabricate generates a real repository -- a React 19 and TypeScript app with hand-written CSS, published as its own Cloudflare Worker and backed by a Durable Object that stores the app's data in its built-in SQLite database -- and you can take all of it. Every app built today starts from the same scaffold: src/index.ts for the server, src/client.tsx for the React client, and public/ for the page and its stylesheet. User accounts and login are written into the app when it needs them, and for payments the AI can write Stripe code against your own keys. No separate database, key-value namespace or storage bucket is provisioned on your behalf; the data lives in the app's Durable Object. Apps built on our earlier engine used a different template set -- Vite, Tailwind CSS, and a Hono backend with a D1 database through Drizzle ORM -- and their exports keep that shape. Three separate paths out exist, and all three are gated to paid plans, enforced server-side rather than hidden in the UI.

The ZIP export is GET /api/apps/:id/source/archive, registered owner-only in worker/api/routes/appRoutes.ts and re-checked with requirePaidTier inside the controller. GitHub export returns a 403 to free accounts with the message "GitHub export is available on paid plans (Pro or Max)" in worker/api/controllers/githubExporter/controller.ts, and GitHub sync returns "GitHub sync is available on paid plans (Pro or Max)" in worker/api/controllers/githubSync/controller.ts. One limit to state plainly: apps built on the current generation engine push to GitHub but cannot yet pull changes back, so for them it is an export, not a two-way sync. Apps built on the original engine keep the pull direction. Cloning over HTTPS needs a short-lived token from POST /api/apps/:id/git/token, which is also paid-tier gated.

So the honest summary of the free tier: you can build and preview, but you cannot put an app online or take the code with you. getAccountPublishedProjectLimit in worker/config/billing.ts gives a free account no published projects, and evaluatePublishGate in worker/agents/services/implementations/publishGate.ts enforces it at deploy time. Free gets a monthly credit allowance, plus a daily ceiling and a per-generation cap; Pro and Max raise the allowance. The current prices, allowances and caps are on the pricing page -- they are tuned periodically, so this article does not restate them. Annual billing exists on Pro and Max. Unused paid plan credits carry over for one month. There is no free trial and there is no Team or Enterprise tier.

The second honest limitation is the runtime. Generated apps target Cloudflare. Once you add the Worker entry, Durable Object binding and client bundling that Fabricate otherwise supplies at publish time, you can deploy the exported project to your own Cloudflare account with your own wrangler credentials, and nothing in the code phones home -- but "portable" here means portable to Cloudflare, not portable to any host. If you export an app built around a Cloudflare Durable Object and try to run it on a generic Node box, you have a port to do. That is a real constraint, and it is the price of the integration.

The third thing worth knowing before you need it: if a paid subscription lapses and the account drops to free, Fabricate does not delete your app, but it does take it offline. Keeping an app online is a paid feature, so we email you, and at least 14 days later the live link shows an offline page instead of the app until you choose a paid plan again; the app, its data and its address stay where they were. Private apps stay private. If you are running something that has to stay online, that is the behaviour to plan around.

Ready to build?

Describe your app in a few sentences and Fabricate builds it. Build free, go live on Pro.

Start building free

What is actually inside the export

The archive is the generated file set, unmodified. The export handler reads the project files straight from the agent, filters anything that fails a path-safety check, and zips them. It does not inject a licence header, a phone-home script, or a Fabricate dependency -- there is no fabricate package in the generated package.json.

What you get is the app's own source with a small Cloudflare config. package.json lists the runtime dependencies -- React 19 and whatever the app added -- and wrangler.json names src/index.ts as the server entry, src/client.tsx as the client entry and public/ as the static assets. There are no build scripts, because the platform bundles the client and wires the Durable Object when it publishes. Apps built on our earlier engine export as an ordinary Vite project instead, with the scripts dev, build, typecheck, lint, preview, deploy and cf-typegen and worker/index.ts as the Worker entry.

One detail worth stating: the Fabricate badge is applied to the served HTTP response by worker/utils/watermark-injector.ts, not written into your source files. Your exported HTML is not carrying a hidden script you have to hunt for.

Today's exports have no resource IDs to fill in: wrangler.json is the same small file for every app, because the data lives in the Durable Object rather than in a provisioned database. The earlier engine needed a pre-deploy check for this. It ran an AST-based safety gate before every deploy -- worker/agents/validators/preDeploySafetyGate.ts, which enforces 28 named rules -- and one of those rules, unresolved_resource_placeholder, failed the build if wrangler.jsonc still contained raw {{KV_*_ID}} or {{D1_*_ID}} placeholders. Production rejects those outright; a sandbox will happily run with a binding that never resolves, which is the worse failure. Gating on it meant the config that shipped in those exports was a real one.

Outline: moving a Fabricate export to your own Cloudflare account
unzip my-app-source.zip && cd my-app
npm install   # React 19 plus anything the app added

# An unmodified export does NOT deploy as-is. Fabricate
# adds these three pieces when it publishes; you add them:
# 1. a Worker entry with a default fetch handler that
#    forwards requests to the exported App class
# 2. a durable_objects binding and migration for App
#    in wrangler.json
# 3. a bundling step for src/client.tsx into public/

# Only then, against your own Cloudflare account:
npx wrangler login
npx wrangler deploy
This is an outline, not a runnable script: the three numbered steps are real code and config you write, because Fabricate supplies them at publish time rather than in the export. No Fabricate CLI, no account, no API key. There is no database ID to replace: the app's data lives in its Durable Object's built-in SQLite, which your own deployment starts empty, so bring the data across separately. Exports of apps built on our earlier engine are Vite projects instead: their deploy script runs the build through bun, and you create your own D1 database, plus any KV namespaces the app uses, and put their IDs in wrangler.jsonc.

The lock-in that survives a code export

Getting the source out solves one of the five lock-in questions. The other four are about everything the code depends on, and they do not fit in a ZIP.

Runtime coupling is the big one, and it applies to every platform in this category, not just ours. An app written against Cloudflare Workers and a Durable Object's built-in SQLite assumes a specific request model, a specific storage API and specific binding semantics. An app written against a vendor's managed Postgres and edge functions assumes a different set. Moving between them is a port with a real cost, and the cost is proportional to how much of the app touches the platform rather than how many files there are.

Data is the second. Your source code is a few megabytes. Your production database is the thing your users care about. Before you believe you can leave, confirm you can get a full dump of the data, not a CSV of one table through an admin UI, and confirm you can restore it somewhere else.

Third-party accounts are the third, and they are the one piece of good news. If your app takes payments through Stripe or calls any other external API, those are your accounts, with your keys, held in your own environment variables. They move because they were never the platform's to hold. That is a genuine argument for builders that wire up real third-party services instead of proprietary in-house equivalents: a Stripe account is portable by construction.

Then there is the part nobody lists: the agent. Whatever tool built the app also knows how to change it. Fabricate's phasic pipeline -- worker/agents/execution/phasicStateMachine.ts -- plans a milestone, implements it, deploys, validates and repeats, and the models behind it are routed per step from AUTO_PRESET_MODELS_BY_ACTION in worker/agents/inferutils/config.ts. Take the export and you keep the code and lose that loop. That is a fair trade and it is not really lock-in, but it is the thing people are surprised by when they leave: the app still works, and changing it is suddenly a different job.

How to test portability before you commit

Do this in the first week, while the app is worth nothing and you have no users to disappoint. Portability is trivially testable, and almost nobody tests it until the day they need it.

Build something small and real -- a login, one database table, one write path. Not a static landing page, because a static page will export cleanly from anything and prove nothing about the parts that bind you.

Export the source. Note whether you had to pay to do it and how long it took. Unzip it and read the dependency list for anything with the vendor's name on it.

Install and boot it locally. This is the step that separates real exports from decorative ones. If npm install and a dev command do not get you a running app, you have learned something important for the price of an afternoon.

Deploy it somewhere that is not the vendor. Your own cloud account, your own credentials. You will hit the resource-provisioning wall here: databases and storage that exist under the vendor's account need recreating under yours. Finding out how tall that wall is now is much cheaper than finding out later.

Finally, export the data and restore it into a fresh database. If every one of those five steps works, you have a genuine exit. If step three or five fails, you do not have portability, whatever the marketing page says.

Tip

Write down what the export cost you in time and money and keep it somewhere you will find it. That number, not the terms of service, is your actual switching cost -- and it is the only honest input into a decision about whether a price increase is worth absorbing.

Ready to build?

Describe your app in a few sentences and Fabricate builds it. Build free, go live on Pro.

Start building free

The bottom line

You own what you contributed and the vendor almost certainly is not claiming the rest. In US law, purely AI-generated material is not copyrightable and prompting alone does not confer authorship, but your selection, arrangement and modification of the output can be. That answer is stable enough to plan around and narrow enough that you should not sign a sole-authorship warranty without thinking.

The question that will actually affect you is the other one. Can you leave? Judge that on five things -- source download, git remote, off-platform runtime, proprietary dependencies, and what happens to a live app when the payments stop -- and get the answers before you build, in writing, from the vendor.

Fabricate's position, stated plainly: you get a complete standard repository with no proprietary dependency, GitHub export, git clone and ZIP export, and an app that is not deleted if you stop paying, though its live link goes offline after notice. All three export paths are paid-plan features enforced server-side, so is publishing, and the generated apps target Cloudflare rather than any host. Three of the competitors in the matrix above state no plan gate on source download in their docs. If code export or publishing on a free plan is your requirement, we are not currently the right answer, and we would rather you find that out here than after you have built something.

Ready to build?

Describe your app in a few sentences and Fabricate builds it. Build free, go live on Pro.

Start building free

Frequently Asked Questions

Do you own the code an AI app builder writes for you?
You own whatever legal rights exist in the output, because virtually every vendor in this category disclaims ownership and assigns those rights to the customer. But in US law, purely AI-generated material is not copyrightable at all and prompting alone does not make you the author, so "ownership" covers your own human contributions -- your creative selection, arrangement and modification of the output -- rather than every generated line. Separately, and more importantly in practice, ownership does not imply access: some platforms grant you full rights to output you have no mechanism to download.
Can AI-generated code be copyrighted in the United States?
Not on its own. In Part 2 of its Report on Copyright and Artificial Intelligence, released 29 January 2025, the US Copyright Office concluded that prompts alone do not give a human sufficient control over the expression for the output to be that human's work of authorship. Human-authored material perceptible in the output, and the creative selection, coordination, arrangement or modification of AI-generated material, remain protectable. On 2 March 2026 the Supreme Court denied certiorari in Thaler v. Perlmutter (No. 25-449), leaving the human-authorship requirement in place. This is general information, not legal advice.
Does the law work the same way outside the United States?
No. The United Kingdom still has section 9(3) of the Copyright, Designs and Patents Act 1988, which grants copyright in computer-generated works that have no human author and treats the person who made the arrangements for their creation as the author. In its Report on Copyright and Artificial Intelligence, published 18 March 2026, the UK government said its preferred option is to repeal that provision, noting that most consultation respondents took the view that works created solely by AI should not attract copyright. The report is not binding and no legislation had been introduced as of July 2026. The same generated output can have a different copyright status depending on jurisdiction.
Can I export my code from Fabricate?
Yes, on a paid plan. There are three routes: a full ZIP via GET /api/apps/:id/source/archive, export to your own GitHub repository, and git clone over HTTPS using a short-lived token. All three are gated to Pro and Max and enforced server-side, not just hidden in the interface. Free accounts can build and preview but cannot publish or download the source. The export is the generated file set unmodified, with no Fabricate dependency in package.json.
What happens to my published Fabricate app if I cancel?
The app is not deleted, but it goes offline. Keeping an app online is a paid feature, so when an account drops to the free tier we email the owner, and at least 14 days later the live link shows an offline page until a paid plan is chosen again; the app, its data and its address stay in the account. Private apps stay private. You also lose the export paths, since ZIP download, GitHub export and git clone are paid-plan features. If you plan to cancel, export first.
Which AI app builders do not let you export code?
Bubble is the clearest case: its own manual states that Bubble apps can only be run on the Bubble platform and there is no way of exporting your application as code, and that Bubble retains ownership of the underlying code powering your app. It does commit to releasing its source under an open-source license if the service is ever discontinued. As of 26 July 2026, Lovable, Bolt.new, Replit, v0 and Fabricate all document a way to get your source out, though the plan requirements differ -- Lovable and Fabricate gate source download behind paid plans while Bolt.new, Replit and v0 state no tier limit in their docs.
Is GitHub sync better than a ZIP download?
For anything you intend to maintain, yes. A ZIP is a point-in-time snapshot that goes stale the moment you make another change in the builder. A git remote gives you continuity, history and a place your own tooling can attach to. Two-way sync is better still, because it lets you edit locally and push back rather than choosing between the platform and your editor. If you can only have one, take the git remote.
If I can export the code, does that mean there is no vendor lock-in?
No. Code export solves one of five lock-in dimensions. The others are runtime coupling (an app written against a specific serverless platform, SQL dialect and binding model does not simply move), data portability (getting a full restorable dump, not a CSV), third-party accounts (a Stripe account or any external API key is yours and moves cleanly; a vendor's proprietary equivalent does not), and what happens to a live deployment when you stop paying. Test all five with a small real app in week one rather than assuming the ZIP button is the whole answer.