Thanks for contributing! Here's how we work.
We use two long-lived branches:
main— Production. Always deployable. Never push directly.dev— Development. All work lands here first.
- Create a feature branch from
dev - Open a PR targeting
dev(nevermain) - Get 1 approval + CI green → squash merge into
dev - Periodically,
devis promoted tomain(merge, not squash)
Both main and dev are protected:
- Pull request required (no direct pushes)
- 1 approval required
buildCI check must pass- No force pushes
- No branch deletion
- Framework: Next.js (App Router)
- API: Hono
- Database: Neon (Postgres) + Drizzle ORM
- Migrations: Atlas (not drizzle-kit)
- Hosting: Vercel
- Styling: Tailwind CSS
- Package manager: Bun (not npm)
- Linting/Formatting: Biome (not eslint + prettier)
- Testing: Bun test
bun install # Install dependencies
bun run dev # Start dev server
bun run build # Production build
bun run lint # Lint + format check
bun test # Run tests- Keep PRs focused — one feature or fix per PR
- Write a clear summary of what changed and why
- Ensure CI is green before requesting review
- Squash merge is preferred