// move out
Move your app out of Base44
Where this guide moves it
Other homes work too (GitLab for code, Netlify or Cloudflare for hosting, another Postgres host for data); the order of moves stays the same.
What you own and can take
- Your app's frontend code. Base44 apps are standard React apps built with Vite, with pages in src/pages and reusable components in src/components.
- Your backend functions, which are TypeScript files that run on Deno.
- Your entity schemas, the JSON files that define each table's fields.
- The records in your tables, which you can export as CSV files.
What cannot leave
- Base44's data layer is a NoSQL store run by Base44, and the only documented export is a CSV file per table. There is no database dump, so you rebuild the tables in Supabase.
- Sign-in. Authentication is built into Base44, and its docs describe no export of passwords or sessions, so users set a new password after the move.
- Built-in integrations (email, file uploads, image and LLM calls) and connectors. They always run on Base44 infrastructure, so each needs a replacement service.
- Secret values. Functions read them at runtime from Base44, and they are not in the code.
- Uploaded files stay on Base44 storage. Your records only hold links to them, so the files must be downloaded and uploaded again.
- On the Free plan you can view your code but not download it or connect GitHub. Both need the Builder plan or higher.
How to export it
- On the Builder plan or higher, click the More actions icon in the editor and select Export project as ZIP to download all the code.
- To keep syncing, click the More actions icon, select GitHub connection and follow the setup steps to connect a repository on GitHub.
- Keep the ZIP even if you use GitHub. With two-way GitHub sync, entity schemas are managed in Base44 and are not included in the repository.
- For each table, click Dashboard, then Data, select the table, click the More actions icon and choose Export. Clear any search or filter first, or only matching records export.
- Open Schema from the same menu for any table whose fields you need to check.
- List every secret your backend functions read, and every built-in integration your app calls, such as email, file uploads or LLM calls.
The order of moves
-
Code
- Push the code from the ZIP to a new GitHub repository, or use the repository Base44 created for you.
- Find every place the frontend uses the Base44 SDK. The client is configured in src/api, the integration code is in src/lib, and package.json lists @base44/sdk.
- Replace those calls with the Supabase JavaScript client: queries for entities, Supabase Auth for sign-in, and Storage for uploads. Remove the Base44 plugin from vite.config.js.
- Run npm install and npm run dev locally until the app works with no calls to Base44.
- In Vercel, choose Add New > Project, import the repository and deploy. Add a vercel.json rewrite to /index.html so routes like /settings load directly.
-
Database
- Create a new Supabase project.
- For each entity, create a table in Supabase with columns matching the fields in its JSON schema. Keep an id column so links between records still match.
- Import each CSV through the Table Editor, then check row counts against Base44.
- Turn on row-level security for each table and write policies that match the data permissions you set in Base44.
- Port each backend function to a Supabase Edge Function. Both run on Deno, but replace Base44 SDK calls and read secrets with Deno.env.get instead of secrets.get.
- Recreate automations: schedules with the pg_cron extension and record triggers with database webhooks, then deploy with npx supabase functions deploy.
-
Sign-in and file storage
- In Supabase, enable the sign-in methods you used in Base44 under Authentication > Sign In / Providers, and set up Google or other OAuth clients with the Supabase callback URL.
- Invite your existing users from a server-side script with supabase.auth.admin.inviteUserByEmail, so each one sets a new password.
- Set the Site URL and Redirect URLs under Authentication > URL Configuration to your Vercel and production URLs.
- Create Storage buckets, download each file from the link stored in your records, upload it to Supabase Storage and update the record with the new path.
- Add every secret to Edge Function Secrets in Supabase. Add only public values, such as the Supabase URL and publishable key, as VITE_ variables in Vercel.
-
Domain
- Test everything on the vercel.app address: sign up, sign in, password reset, uploads, and each function.
- In Vercel, open Settings > Domains, click Add Domain and enter your domain.
- At your registrar, replace the DNS records that point to Base44 with the records Vercel shows.
- Add the domain to the Supabase Site URL and Redirect URLs, and send your users the password reset or invite emails.
What usually breaks after the move
- Pages load but show no data, because some components still call the Base44 SDK.
- Sign-in redirects to the wrong address or fails, because the new domain is not in the Supabase Redirect URLs or the OAuth client. Read the fix
- Code that reads process.env in the browser crashes in a Vite build. Vite exposes only VITE_ prefixed values through import.meta.env. Read the fix
- An API key that used to live in a Base44 function ends up in a VITE_ variable and ships to every visitor's browser. Read the fix
- Imported tables have row-level security off, so the anon key can read every row. Read the fix
- Images and attachments break once Base44 is turned off, because records still link to files on Base44 storage.