Migrations
Move an existing app to Farm with a source-specific guide. This section covers every framework in the homepage comparison: Next.js, SvelteKit, Nuxt, and TanStack Start.
Choose a source
Two sources have dry-run-first CLI migrators. Nuxt and SvelteKit require a manual migration because their Vue and Svelte components must be rewritten as React components.
| Source | Migration type | Coverage |
|---|---|---|
| Next.js | Automated | App Router files, common imports, middleware location, scripts, and Farm setup. |
| SvelteKit | Manual | Route structure, layouts, load functions, endpoints, hooks, environment, and adapters. |
| Nuxt | Manual | Pages, layouts, server routes, data composables, middleware, runtime config, and Nitro. |
| TanStack Start | Automated | File-based Router routes, route paths, default page exports, scripts, and Farm setup. |
Each source has its own guide because the automatic changes and manual review items are framework-specific.
Automated workflow
For Next.js and TanStack Start, run inspection from the source project's root:
farm migrate inspect
Inspection reports each supported source it detects, its confidence, and the evidence it found.
Choose the matching source and run it without --write to review the plan:
farm migrate next# orfarm migrate tanstack
The dry run prints planned file operations, skipped targets, warnings, and manual review items. Apply the reviewed plan, install the updated dependencies, and verify the migrated app:
farm migrate next --writepnpm installpnpm devpnpm build
Replace next with tanstack when migrating a TanStack app.
Manual workflow
For Nuxt and SvelteKit, use the source guide as a checklist:
- Create a minimal Farm shell next to the existing source.
- Reproduce the route tree with Farm page, layout, and API route files.
- Move one vertical feature at a time, including its data access and mutations.
- Rewrite Vue or Svelte components as React components instead of mechanically renaming files.
- Verify routing, server rendering, forms, APIs, middleware, environment variables, and deployment.
- Remove the previous framework only after the Farm build behaves the same in production.
The manual guides preserve URLs and server contracts where possible, but UI state and framework-specific modules require application-level decisions.
Command migrations
farm migrate without a framework source has a separate purpose: it runs one-shot commands from
migrations.commands in farm.config.ts.
import { defineConfig } from "@farm.js/core";export default defineConfig({ migrations: { commands: [ { name: "database", command: "pnpm prisma migrate deploy", }, { name: "integration schema", command: "farm generate --orm postgres --output ./schema/farm.sql", }, ], },});
Use command migrations for app-owned database migrations, integration schema setup, provider
bootstrap commands, and CI steps that should run before farm build. See
Configuration for the complete configuration shape.
Safety model
- Automated migrations never delete source files.
- Automated migrations default to dry-run and require
--write. - Automated migrations skip existing target files unless
--forceis passed. - Automated migrations leave previous framework dependencies in place until the app owner removes them.
- Unsupported APIs are reported as manual review items instead of being guessed.
- Manual migrations should keep the old application runnable until the Farm replacement is verified.
- Run the migration on a clean branch so its changes are easy to inspect or revert.