feathers-baas scaffolds a production Feathers.js v5 backend in one command. Add your database, plug in your storage and email provider and deploy anywhere.
Database-agnostic (support PostgreSQL, MySQL, SQLite, and MongoDB out-of-the-box), self-hosted and extensible with production defaults on day one.
argon2id passwords, short-lived JWTs with cookie-based refresh. No token rotation code to write. Transparent re-auth with the official Feathers client.
RBAC with { service, methods[] } grants stored as JSONB. LRU-cached lookups, seeded admin/user roles, email verification and password reset, all wired up.
Streaming multipart uploads via busboy. Pluggable drivers: local disk for dev, AWS S3 (or MinIO) and Google Cloud Storage for prod. Metadata lives with your data.
Auth events (verify, reset, change) dispatched via SMTP, Resend, SendGrid or Brevo. Direct mode out of the box. Add Redis and BullMQ takes over with retries and backoff.
Pick your database and storage at init. Everything generated runs standalone. The CLI is a scaffolder, not a runtime dependency.
Interactive prompts pick the database, storage and email drivers.
$ npx feathers-baas init \
my-api --install
Update env variables and run Knex migrations (SQL) and seed the default roles + admin from .env.
$ cd my-api $ pnpm migrate $ pnpm seed
Hot reload in dev. OpenAPI docs at /docs. Ship the generated Dockerfile to prod or hand the project to Claude Code.
$ pnpm dev → http://localhost:3030 → /docs /health /openapi.json
TypeBox schema, class, hooks, migration, wired into the app via AST-safe patching.
$ feathers-baas generate \
service --name posts \
--fields "title:string"
Every service is a single typed file. Every endpoint is introspectable via JSON. Claude Code, Codex, Cursor, and Copilot can add a resource in one prompt, no framework docs required.
Run feathers-baas describe and your agent sees every service, method,
hook, and migration in a machine-readable format. No guessing, no grepping.
Generated projects include AGENTS.md with conventions the agent should follow.
{
"services": [
{
"name": "users",
"path": "/users",
"methods": ["find","get","create","patch","remove"]
},
{
"name": "posts",
"path": "/posts",
"methods": ["find","get","create","patch","remove"]
}
],
"hooks": ["authenticate", "permission-check"],
"database": "postgresql"
}
Unlike Supabase, it works with any database. Unlike Firebase, you own your infra. Unlike Pocketbase, your codebase is TypeScript that agents can extend.
| Supabase | Firebase | Pocketbase | feathers-baas | |
|---|---|---|---|---|
| Self-hosted | ||||
| Database-agnostic | ||||
| CLI-first | ||||
| Agent-friendly | ||||
| Pluggable storage | ||||
| Realtime | ||||
| No lock-in |
A standalone Feathers.js v5 app with swappable adapters. Nothing calls home.
my-api/ ├── src/ │ ├── services/ │ │ ├── users/ ← schema · class · hooks · service │ │ ├── roles/ ← RBAC with { service, methods[] } │ │ └── posts/ ← your generated service │ ├── auth/ ← JWT + argon2id + refresh tokens │ ├── hooks/ ← checkPermissions · logError │ └── db/ ← Knex (pg/mysql/sqlite) or Mongo ├── migrations/ ← auto-generated per service ├── Dockerfile ← multi-stage, non-root, ready to deploy ├── docker-compose.yml ← app + postgres + redis ├── AGENTS.md ← conventions for Claude Code / Cursor └── .env.example ← 12-factor config