This starter is designed for me by me with all the shiny new things! (as of now)
To finish setup, run Replace All to replace startername with name of your project.
Also, make sure to customize AGENTS.md with a description of your project
so that agentic tools work efficiently.
Both GitHub Copilot and Claude Code (or any AGENTS.md-aware agent) read from the same skill library under .agents/skills/*/SKILL.md:
.github/copilot-instructions.mdand.github/agents/*.md(Copilot custom agents) point into.agents/skills/.AGENTS.md(withCLAUDE.mdsymlinked to it) is the always-on guide for Claude Code and other AGENTS.md-aware tools, and points into the same.agents/skills/directory..claude/settings.jsonconfigures default tool permissions for Claude Code.
Update .agents/skills/ once and both flows pick up the change.
- Contract-first development. API endpoints start as shared
zodschemas inpackages/server-contract, ensuring server and client stay type-safe. - Real-time challenge lifecycle. Hono-based routes expose public and authenticated procedures, backed by PostgreSQL via Drizzle ORM.
- Typed React client. The web app consumes the generated oRPC client, TanStack Router, and Query utilities for fully typed data interactions.
- Developer-focused tooling. Node.js 24, pnpm workspaces, and Husky hooks enable quick local feedback loops and consistent commits.
- Runtime & Tooling: Node.js 24, pnpm workspaces, Commitizen, Husky
- Backend: TypeScript, Hono, oRPC, Drizzle ORM/PostgreSQL, Better Auth, Zod, Vitest
- Frontend: React 19, Vite, TanStack Stack/Query/Form, Tailwind CSS, Vitest
- Server Contracts:
@startername/server-contractwith oRPC + OpenAPI generation
apps/server– Node.js + Hono API, oRPC routers, Drizzle schema, Better Auth setupapps/web– React 19 client, TanStack Router tree, authentication flows, Tailwind configpackages/server-contract– API contract definitions and schema exportspackages/common– Shared utilities, types, constants, and helpersdocs– Product requirements, roadmap, risk registers, and supporting documentationpostgres-data– Docker-managed PostgreSQL volume (keep uncommitted)tsconfig*.json– TypeScript project references
- Git ≥ 2.40
- Docker Desktop (required for the PostgreSQL container)
- Node.js exactly v24 (use nvm or similar)
- pnpm 11.5.0
Using nvm:
nvm install 24
nvm use 24Or using the .nvmrc file in the repo:
nvm usecorepack enable
corepack prepare pnpm@11.5.0 --activateOr via npm:
npm install -g pnpm@11.5.0git clone https://github.com/CatOfJupit3r/startername.git
cd startername
pnpm install- Copy environment templates: duplicate
.env.exampleto.envin bothapps/serverandapps/web. - Start Docker Desktop so PostgreSQL can launch.
- Boot everything with
pnpm run dev:- Web client:
http://localhost:3030 - API + Better Auth:
http://localhost:5050 - PostgreSQL starts via
docker compose -f docker-compose.dev.yml --profile postgres up -d --wait
- Web client:
pnpm run dev– start API, web app, and PostgreSQLpnpm run db:generate– generate a Drizzle migration from the schemapnpm run db:migrate– apply Drizzle migrations to PostgreSQLpnpm run db:push– push the schema directly during local developmentpnpm run check-types– TypeScript project references (server + shared)pnpm run lint– ESLint across the monorepopnpm run prettify– format workspace source filespnpm run prepare– reinstall Husky hooks if they go missingpnpm test– run all tests with Vitest
- Create a GitHub issue describing the work.
- Branch off
mainas<issue-number>-<short-slug>(e.g.,42-improve-login-flow). - Stage changes and run
git cz(orpnpm commit) for conventional commits. - Push the branch and open a PR targeting
main; request review from@CatOfJupit3r.
- Husky runs
pnpm exec lint-stagedon commit to format, lint, and type-check staged files. - Re-run failed checks locally with:
pnpm exec lint-staged --no-stash - Typical fixes:
- Missing deps:
pnpm install - Formatting issues:
pnpm run prettierthen re-stage - Lint errors:
pnpm run lint - Type errors:
pnpm run check-types
- Missing deps:
- Keep
pnpm run devactive regularly to keep local PostgreSQL available. - Avoid rebasing on
main; prefer merging. - Use the shared contract utilities (
tanstackRPChelpers, shared schemas) instead of duplicating types or query keys. - When extending the API, register new routes in
apps/server/src/routers/index.tsand add error codes toapps/server/src/enums/errors.ts.