Thanks for your interest in GitShipt. Read CLAUDE.md and AGENTS.md before non-trivial work — they bind every decision.
git clone <repo>
cd gitshipt
bun install
cp .env.example .env.local # populate secrets
bun run db:migrate # apply latest schema
bun run dev # http://localhost:3000Before opening a PR, run:
bun install --frozen-lockfile
bun run typecheck
bun run lint
bun run theme:lint
bun run test
bun run e2e # local: install browsers via `bun run e2e:install`
bun run buildCI runs the same pipeline on every PR via .github/workflows/ci.yml plus
bun audit.
- One logical change per commit.
- Imperative mood: "Add", "Fix", "Refactor".
- Reference an issue or audit finding in the body when applicable.
- TypeScript strict;
noUncheckedIndexedAccessis on. - Prefer Server Components; mark
"use client"only when required. - No raw hex colours in components — use semantic tokens.
- Mono fonts (
text-mono-*) for SOL, USD, BPS, scores, timestamps, and tx signatures only. Body copy is never mono. proxy.tsis redirects only — auth must be revalidated inside every protected route handler and Server Component.- Mutations must: revalidate the session →
requirePermission→ Zod-validate input → respectIdempotency-Key→ write an audit row → revalidate cache tags. - Use
validateClientKeyfrom@/lib/idempotencyon any client-supplied idempotency key.
- Unit and integration tests live under
apps/web/lib/**/*.test.tsandapps/web/workflows/**/*.test.ts. - E2E specs live under
apps/web/e2e/. - Run a single file:
cd apps/web && bun run vitest run path/to.test.ts. - Run a single Playwright spec:
cd apps/web && bun run playwright test e2e/file.spec.ts.
Do not file security findings as public issues. See SECURITY.md for the disclosure process.
By contributing, you agree your contributions are licenced under the MIT licence as described in LICENSE.