heydevTalk to founders

Startup TechMigrations

Base44 Export Code: What You Actually Get, and How to Move Off It

Akshit Ahuja

Akshit Ahuja

Co-founder, Chief Speed Officer

Published
An open cardboard box on a dark desk holding stacked UI component cards, with a thick cable running from the box to a server rack where its plug glows orange

A Base44 code export gives you a real React frontend, the source of your backend functions and a schema file for your data. It does not give you the backend those pieces run on. Every data read, login, file upload and AI call still goes through the @base44/sdk to Base44's servers, so the export is a starting point for a migration, not a copy of your app you can host anywhere.

That is the whole answer in one paragraph. This post is for founders and developers with a Base44 app on the Builder plan or higher who want to own their stack. The rest of it is what to do about it. It covers what is in the box, why it breaks the moment it runs on its own, how to size the job in ten minutes with four grep commands, and a staged Base44 migration that keeps your app live while each piece moves.

How to export your Base44 code

Base44 offers three routes, and all of them need the Builder plan or higher, per Base44's developer tools docs:

  1. ZIP download. In the editor, open Code and choose Export project as ZIP. You get a snapshot of the current saved code.
  2. GitHub sync. Connect a repository and Base44 commits your changes to it automatically. The sync is two-way: commits pushed to GitHub flow back into Base44.
  3. API. GET /api/apps/{app_id}/coding/export-to-zip with a personal access token returns the same ZIP, per the export endpoint reference. Useful for a nightly backup.

If you are planning to leave, use GitHub. A ZIP is one moment in time; a repo gives you history, diffs and a place for a developer to work while you keep building in Base44.

What you actually get

In the exportNot in the export
React frontend: components, pages, routing, Tailwind stylesThe database and its rows
A preconfigured SDK client (`@/api/base44Client`)User accounts and their passwords
Backend function source (Deno TypeScript)The runtime that executes those functions
Entity schema definitionsThe access rules enforced on the server
`package.json`, Vite and Tailwind configUploaded files in Base44 storage
The AI, email and file services behind `integrations.Core`
What a Base44 code export contains, and what stays on Base44's servers. Sources: Base44 docs and the @base44/sdk README.

The left column is genuinely yours and genuinely portable. React is React. The right column is what your app actually does all day.

A common assumption is that the SDK is proprietary. It is not a black box. `@base44/sdk` is open source under the MIT license. You can read every line. What you cannot take with you is the service it talks to.

Why the export fails when you run it

Open any page in the export and you will find calls like these, adapted from the SDK README and the integrations docs:

import { base44 } from "@/api/base44Client";

const tasks = await base44.entities.Task.list();
await base44.auth.loginViaEmailPassword(email, password);
const { url } = await base44.integrations.Core.UploadFile({ file });

Each line is a network call to Base44. npm install succeeds, the dev server starts, the login screen renders, and then the first screen that needs data fails. Founders read this as "the export is broken". It is not broken. It is a frontend that needs its backend.

The SDK covers eight modules: entities, auth, functions, integrations, agents, connectors, analytics and app-logs. Each one you use is a service you will either keep renting from Base44 or replace.

Size the job before anyone quotes you

Migration cost scales with how many places your code touches Base44, not with how many pages the app has. Clone the repo and run these from its root:

grep -rn "base44.entities" src | wc -l        # data reads and writes
grep -rn "base44.auth" src | wc -l            # login, session, current user
grep -rn "base44.integrations" src | wc -l    # AI, email, file uploads
grep -rl "npm:@base44/sdk" . --exclude-dir=node_modules | wc -l   # backend functions

Backend functions import the SDK as npm:@base44/sdk, which is why the last line counts them that way regardless of folder names.

Write the four numbers down. They are the most useful thing you can bring to a call with any developer.

Disclosure: HeyDev runs Base44 migrations as a paid service. Everything in this post works without hiring us. A dozen entity calls and no functions is a short job. Hundreds of entity calls, ten functions and heavy use of InvokeLLM is a real project, and anyone who quotes it without asking for these numbers is guessing.

The staged way off Base44

The mistake is treating this as one rewrite. The SDK is already split into modules, so the migration can be too. Your app stays live through every stage.

Stage 0: get everything out

Before any code changes, take a full copy of what you would lose if your account closed tomorrow.

  • Code: connect GitHub.
  • Data: in Dashboard, Data, export each table to CSV, per Base44's data docs. The SDK caps a single list() or filter() request at 5,000 items, so for large tables use the CSV export or a script that pages through.
  • Users: export the user list from the users table.
  • Files: list every file URL stored in your entities. You will copy these to your own storage in Stage 3.

Stage 1: host the frontend yourself

Deploy the exported React app to Vercel or Netlify, still pointed at Base44. The SDK README documents exactly this setup: an external app using Base44 as its backend through createClient({ appId }). Test login, uploads and every role on the new domain before you send real users there.

You now own your hosting, your domain and your deploys, and nothing about the backend has changed yet.

Stage 2: move the data and rebuild the access rules

Create tables in Postgres from the entity schema (an entity is Base44's word for a data table). Supabase is the usual choice because it gives you Postgres, auth and storage in one place. Import the CSVs and keep Base44's id values so relationships survive.

Then rebuild the access rules. Base44 enforces per-entity permissions on its servers: per the entities docs, anonymous users see only public entities and regular users can only read and update their own User record. In Postgres, none of that exists until you write it as Row Level Security policies, the per-row access rules Postgres checks on every query. This is where migrations quietly create data leaks, and it is the step we check first in every vibe-coded app audit. Supabase's own defaults changed in October 2026 too; see Supabase stops auto-exposing new tables.

Finally, write a small data layer with the same shape as the SDK (Task.list(), Task.create(), Task.update()) so the page code barely changes. Swap the import, not every call site.

Stage 3: replace auth, functions and integrations

  • Auth. Import users by email into Supabase Auth or your provider of choice. We have not found a documented way to export password hashes from Base44, so plan a password reset or magic-link sign-in on cutover day, and email users first.
  • Functions. Base44 backend functions run on Deno, per the functions docs. Supabase Edge Functions also run on Deno, so most of the logic ports almost line for line. Rewrite the base44.entities calls inside them to use your database client, and keep the Supabase service-role key server-side only. Base44's asServiceRole only works inside Base44-hosted functions, so any function that uses it has to move together with the data it touches.
  • Integrations. Map each integrations.Core call to a provider you own: InvokeLLM and GenerateImage to OpenAI or Anthropic, SendEmail to Resend or Postmark, UploadFile and UploadPrivateFile to Supabase Storage or S3 with signed URLs.
  • Files. Copy every stored file to your bucket and rewrite the URLs in your tables.

Stage 4: cut over

Freeze writes in the Base44 app, run a final data export and import, switch the frontend's data layer to the new backend, and send the password-reset email. Keep the Base44 app on its plan for a few weeks, read-only, as your rollback.

Should you move to Next.js while you are at it?

Only if you have a reason Next.js solves: server-rendered pages for SEO, API keys that must never reach the browser, or webhooks and scheduled jobs. If none apply, keep the exported Vite app and move only the backend. The same rule appears in our Lovable fix-or-migrate guide, and the reasoning is identical: change the parts that are holding you back, not the parts that work.

What we did not verify

We built this from Base44's documentation, its API reference and the open-source SDK, as of October 2026. Folder names inside exports vary by app age, so the grep paths above may need adjusting. We have not run these commands against every export layout, and we have not confirmed whether Base44 offers password-hash export on request or on enterprise plans; ask their support before you plan the reset email. Base44 ships changes fast, so check the linked docs for anything that moved after this date.

Getting it done

If the four numbers came out small, you can do this yourself with this post as the checklist. If they came out large, or the app holds data you cannot afford to leak, we can run the migration in the stages above with the app live the whole time. Send us the four counts and we return a fixed-price quote within 48 hours of the call.

Book a 30-minute call or email mahima@heydev.us with your counts and what the app does.

FAQ

Frequently asked questions

Can I export my code from Base44 on the free plan?
No. Base44's documentation says downloading a ZIP and connecting to GitHub both require the Builder plan or higher. If you plan to leave, upgrade for the month you migrate, connect GitHub so every change is versioned, and export your data as CSV in the same session.
Why does my exported Base44 app show a blank page or login error when I run it?
The exported frontend calls Base44's backend through the @base44/sdk client, configured with your app ID. Run it without a valid connection to your Base44 app and every entity, auth and integration call fails. The React code is fine; the backend it points at is missing or refusing the request.
Can I keep Base44 as the backend and host the frontend on Vercel?
Yes, as a first stage. The @base44/sdk is open source under MIT and its README documents using Base44 as a backend for external apps with createClient and your app ID. Test login and file uploads on the new domain before you move real users, then replace the backend modules one at a time.
Will my users have to reset their passwords after leaving Base44?
Plan for it. Base44 lets you export your user list, but we have not found a documented way to export password hashes. The clean path is to import users into the new auth system by email and send a one-time password reset or magic-link sign-in on cutover day, with a clear email explaining why.
How much does it cost to migrate off Base44?
It depends on how many SDK calls the app makes and how many backend functions and integrations it uses, not on how many pages it has. Run the four counts in this post, then ask for a fixed quote. HeyDev sends a fixed-price quote within 48 hours of a call.

Sources

  1. 01Base44 docs: Developer tools (ZIP export and GitHub, Builder plan or higher)
  2. 02Base44 API reference: Export app source code
  3. 03Base44 JavaScript SDK on GitHub (MIT)
  4. 04Base44 docs: Entities module (5,000 items per request, access rules, service role)
  5. 05Base44 docs: Core integrations
  6. 06Base44 docs: Managing your app data (CSV export)
  7. 07Base44 docs: Backend functions overview (Deno)

#Base44 #vibe coding #code export #Supabase #Next.js migration #app rescue #React #founders

Written by

Akshit Ahuja

Akshit Ahuja

Co-founder, Chief Speed Officer

Ex-Spinny, a $1B+ startup / Backend and AI systems

Backend systems specialist who thrives on building reliable, scalable infrastructure. Akshit handles everything from API design to third-party integrations, ensuring every product HeyDev ships is production-ready.

Keep reading

Related articles