Thank you for your interest in contributing! This guide will help you get set up and understand our workflow.
- Fork and clone the repository
- Install dependencies with
bun install - Copy environment variables —
cp .env.example .envand fill in required values - Set up the database —
bun db:generate && bun db:migrate - Start developing —
bun dev
This project uses Ultracite for automated code quality enforcement via oxlint and oxfmt.
Before committing, run:
bun fix # Auto-fix lint and formatting issues
bun check # Verify everything passesPre-commit hooks are managed by Lefthook and run automatically on commit.
- TypeScript — Use explicit types where they enhance clarity. Prefer
unknownoverany. - React — Function components only. Follow the Rules of Hooks.
- Styling — Tailwind CSS v4 with shadcn/ui components. Reuse existing UI primitives from
src/components/ui/. - Imports — Use the
@/path alias for project imports. - Constants — Use
constby default,letonly when reassignment is needed. - Error handling — Throw
Errorobjects with descriptive messages. Prefer early returns.
See CLAUDE.md for the full code standards reference.
Use descriptive branch names:
feat/add-date-picker-fieldfix/submission-count-mismatchrefactor/editor-plugin-loading
Write concise commit messages that focus on why rather than what:
feat: add password protection for shared forms
fix: resolve race condition in real-time sync
refactor: lazy-load editor plugins for faster initial load
- Create a feature branch from
main - Make your changes with clear, focused commits
- Ensure all checks pass (
bun checkandbun test) - Open a PR with:
- A short title (under 70 characters)
- A summary of what changed and why
- Testing steps if applicable
src/routes/— File-based routing (TanStack Router). Authenticated routes live under_authenticated/.src/components/editor/— Plate.js editor configuration and plugins.src/components/form-builder/— Form builder UI components.src/components/ui/— Shared UI primitives (shadcn/ui based).src/db/— Database schema definitions (Drizzle ORM).src/db-collections/— TanStack DB collection definitions for local-first sync.src/lib/— Core utilities — auth, email, config, and helpers.
When modifying the database schema in src/db/schema.ts:
- Make your schema changes
- Generate a migration —
bun db:generate - Apply the migration —
bun db:migrate - Include the generated migration files in your PR
Run the test suite with:
bun testTests use Vitest with Testing Library.
If you run into issues or have questions, open a GitHub issue and we'll be happy to help.