// 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

  1. 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.
  2. To keep syncing, click the More actions icon, select GitHub connection and follow the setup steps to connect a repository on GitHub.
  3. 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.
  4. 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.
  5. Open Schema from the same menu for any table whose fields you need to check.
  6. 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

  1. Code

    1. Push the code from the ZIP to a new GitHub repository, or use the repository Base44 created for you.
    2. 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.
    3. 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.
    4. Run npm install and npm run dev locally until the app works with no calls to Base44.
    5. 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.
  2. Database

    1. Create a new Supabase project.
    2. 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.
    3. Import each CSV through the Table Editor, then check row counts against Base44.
    4. Turn on row-level security for each table and write policies that match the data permissions you set in Base44.
    5. 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.
    6. Recreate automations: schedules with the pg_cron extension and record triggers with database webhooks, then deploy with npx supabase functions deploy.
  3. Sign-in and file storage

    1. 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.
    2. Invite your existing users from a server-side script with supabase.auth.admin.inviteUserByEmail, so each one sets a new password.
    3. Set the Site URL and Redirect URLs under Authentication > URL Configuration to your Vercel and production URLs.
    4. 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.
    5. 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.
  4. Domain

    1. Test everything on the vercel.app address: sign up, sign in, password reset, uploads, and each function.
    2. In Vercel, open Settings > Domains, click Add Domain and enter your domain.
    3. At your registrar, replace the DNS records that point to Base44 with the records Vercel shows.
    4. 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.

Sources