Full source ownership (no platform lock-in)
Stripe → Payrexx (CHF, TWINT)
US hosting → Exoscale (CH)
nFADP compliant out of the box

Why leave Base44?

Base44 is a hosted no-code/low-code builder. It's quick at the start but the moment you need to own your code, swap a payment processor, or honour a Swiss customer's nFADP data-residency request, you hit a wall — because there is no codebase to inspect, and the data sits on US infrastructure you don't control.

Already CH is the opposite philosophy. You own the Next.js source. The database runs on Exoscale in Geneva or Zurich. Billing is Payrexx, not Stripe. Analytics is Matomo, not PostHog. nFADP is a built-in admin panel, not a checkbox you fake.

What you'll need to extract from Base44

  • User list. Export your Base44 users as CSV. Already CH's pnpm Already CH import:users ingests them into Supabase Auth with one-time password-reset emails.
  • Data schema. Base44 stores entities in a proprietary schema. Export each entity as CSV/JSON. You'll re-model them as Drizzle schema files in db/schema/.
  • Page structure. Map your Base44 pages to Already CH's app/(public), app/(app), app/(billing) route groups.
  • Stripe → Payrexx. If you were using Base44's Stripe integration, you'll recreate those plans inside Payrexx with unique CHF amounts so the webhook can derive the plan key.
  • Custom logic. Any "actions" or "workflows" you built in Base44 become server actions or background jobs in Already CH (lib/jobs/handlers/).

Stack mapping

Base44                          Already CH (Swiss-sovereign)
Hosted runtime (US)        →    Next.js 15 on Exoscale (CH)
Proprietary DB             →    Supabase Postgres + Drizzle ORM
Built-in auth              →    Supabase Auth (TOTP, passkeys, MFA mandate)
Stripe billing             →    Payrexx (CHF, TWINT, PostFinance)
Built-in email             →    Infomaniak SMTP (CH) + React Email
Platform analytics         →    Matomo (self-hosted, cookie-free)
Workflows                  →    Background jobs (supercronic + Postgres queue)
No nFADP support           →    /admin/data-register (Art. 12 compliant)

Step-by-step migration

01
Export everything from Base44

Use Base44's export feature to download all entities (CSV/JSON) and user list. Save these to an imports/ folder in your new Already CH project.

02
Stand up self-hosted Supabase on Exoscale

Already CH ships an Exoscale Marketplace QCOW2 image and a Coolify service seed. Spin up Supabase in Geneva or Zurich. Your database is now Swiss-resident from boot one.

03
Model your entities as Drizzle schemas

For each Base44 entity, create a file in db/schema/ with a Drizzle table definition. Add RLS policies and (org_id, created_at) indexes. The included CLAUDE.md is wired so Claude Code can do this from your CSV exports.

04
Import users into Supabase Auth

Run pnpm Already CH import:users imports/users.csv. Each user gets a row in auth.users and a one-time password-reset email via Infomaniak SMTP.

05
Import entity data

Run pnpm Already CH import:entities imports/ to load your exports into the Drizzle tables you just created. The importer is idempotent — safe to re-run.

06
Recreate billing in Payrexx

Create one gateway per plan in Payrexx with unique CHF amounts (the plan key is derived from amount). Wire the webhook URL to /api/webhooks/payrexx. Idempotency is handled via the payment_events table.

07
Fill the nFADP register

Go to /admin/data-register and add one processing activity row per data type you collect (users, projects, payments, etc.). This satisfies Art. 12 nFADP and gives you a defensible audit trail from day one.

Common questions

Can I keep my Base44 app running during the migration?

Yes. Run both in parallel. Point a subset of users at Already CH via a beta flag in lib/flags/server.ts, then cut over fully when you're ready.

What about Base44's AI features?

Already CH ships a Mistral AI integration (FR-based, EU data residency) as the default provider with optional Anthropic/OpenAI/Google fallbacks. Per-org credits ledger, usage tracking, rate limits — all wired.

How long does it take?

A simple app with 3–5 entities: a day. Anything with custom workflows or heavy Stripe usage: 2–4 days. The included scripts cover the mechanical work.