Repository navigation
Migrating From Node Drizzle
Status: not executed end to end. No Node/Drizzle app has been cut over by following this page yet; it flips to executed on evidence from an adopter's measured run.
The concept map for a Node app on Drizzle ORM — Express, Fastify, Hono or Next.js route handlers in
front. The runbook — phases, exit conditions, stop conditions — is
Migrating an existing app; this page says what each term becomes.
As of 2026-11 (orm.drizzle.team).
| Node / Drizzle | Ultimate |
|---|---|
| an Express / Fastify / Hono route that renders | a route file: Routes and render modes |
| a route handler that writes, a tRPC mutation | an action: Actions
|
| a tRPC query, a GET handler | a query: Queries and live queries
|
a pgTable() declaration |
an entity(): Entities and migrations
|
drizzle-kit generate, migrate
|
x db gen "<name>", then x db migrate
|
| a Zod schema on a handler | the action's input: Actions
|
| BullMQ, pg-boss | a job: Jobs and workflows
|
node-cron, a repeatable job |
a task: Scheduled tasks
|
| Passport, Auth.js, Lucia | Auth |
| CASL, hand-written middleware checks | a policy: Policies and authz
|
Socket.IO, ws
|
a live query: Realtime |
| Nodemailer | |
| S3 SDK calls | Storage and uploads |
| Vitest, Jest |
bun test through Testing
|
node server.js, next dev
|
x dev |
| Node / Drizzle | Why |
|---|---|
| Node-only APIs and native addons | Bun only: check each against Bun's own list, bun.sh/docs/runtime/nodejs-apis |
MySQL, SQLite (mysqlTable, sqliteTable) |
Postgres only, by design: Home |
| React components | pages render with SolidJS; interactive parts are islands. No converter |
| a serverless or edge deploy target | containers only: Deployment |
Drizzle already declares tables in TypeScript, so the shape carries over column by column; ids are
whatever the app chose. Phase 1 of the runbook declares the existing tables with the physical-name
overrides and type map it gives, then x db gen until x verify --only drift agrees:
Migrating an existing app.
| The app stores | Branch |
|---|---|
bcrypt / bcryptjs hashes ($2a$, $2b$) |
proceed: verified natively, rewritten as argon2id on first login (Migrating an existing app) |
argon2 hashes ($argon2id$) |
proceed: rehashed when weaker than the policy |
| scrypt, PBKDF2, anything else | ⛔ stop: no verifier ships. Keep the old login as a bridge, or force a reset |
| a JWT or a session table | bridge it with your own verifier behind configureAuthenticator() (Auth) |
Ultimate — v30.9.0 As of 2026-10. The full-stack framework where the primary developer is an AI agent: bunx create-ultimate myapp → Getting started · live demo. MIT licensed. What npm serves is npm view @ultimat3/core version, never this line, and this footer is the only page that stamps a version.
Repository · Issues · Changelog · llms.txt
Edits to these pages are synced from wiki/ in the repository — change the file there, not the wiki, or the next sync overwrites it.
Start
- Getting started
- Installation
- Shapes
- Bare VM
- Project layout
- Migrating an existing app
- Compared to other stacks
Tutorials
- 1 · First app
- 2 · First feature
- 3 · Auth and admin
- 4 · Jobs and realtime
- 5 · Deploy free
- 6 · Growing up
Primitives
- The eight primitives
- Building your own base
- Actions
- Entities and migrations
- Policies and authz
- Queries and live queries
- Client data
- Jobs and workflows
- Scheduled tasks
- Routes and render modes
Capabilities
- Realtime
- Caching and invalidation
- Batching and preloading
- N+1 detection
- PWA and offline
- Client navigation
- MCP and AI
- Agents
- Admin dashboard
- Scraping
- Auth
- Notify
- Storage and uploads
- Feature flags
- SEO
- Static assets
Cross-cutting
- I18n
- Theming
- UI components
- Interface rules
- Timezones and dates
- Money
- Outbound HTTP
- Resource management
- Migrations and backfills
- Testing
- CI: the gate across parallel jobs
Reference