Self-hosting
Feedbacks is a Bun monorepo — a Next.js web app, a Hono API, and Postgres + Drizzle. It deploys as a Docker Compose stack.
Local development
bun install # install all workspaces
cp .env.example .env # then fill in
bun infra:up # Postgres + MinIO via Docker
bun db:push # apply the schema to the dev DB
bun dev # web (:3000) + api (:3001)
Other scripts: bun typecheck, bun db:generate, bun db:migrate,
bun db:studio, bun infra:down.
What you need to configure
The .env (see .env.example) wires up:
- Database —
DATABASE_URL(Postgres). - Storage — S3-compatible object storage (
S3_*); MinIO locally. - Auth —
AUTH_SECRET, plus optional Google / GitHub OAuth. - Email — Resend, for notifications and transactional mail.
- Billing — Lemon Squeezy (optional; absence just means everyone is on Free).
Database migrations
Schema changes are Drizzle migrations under packages/db/drizzle/.
- Dev:
bun db:pushsyncs your local DB to the current schema. - Generating:
bun db:generatewrites a migration from schema changes;bun db:migrateapplies pending migrations.
Production: migrations run automatically on deploy. A one-shot
migrateservice applies pending migrations before the API starts, so you never serve on a stale schema — just commit the generated migration and deploy.
Production deploy
scripts/deploy.sh rsyncs the repo to the server, ships .env.prod as the
remote .env, then builds and brings up docker-compose.prod.yml. On startup a
one-shot migrate service applies pending Drizzle migrations, and the API waits
for it to finish before serving. Caddy terminates TLS and forwards /api/* to
the API (so /api/mcp is reachable at your domain with no extra wiring).