To install all dependencies, run:
yarnStart the development server:
yarn devThe dev server proxies /api/v1 to http://localhost. Point it at another
backend with NODE_IP, which may include a port:
NODE_IP=my-backend.example.com:3000 yarn devWhen the dev server is reached through a hostname other than localhost — a
tunnel, a cloud sandbox, or a LAN hostname — Vite's DNS-rebinding protection
answers 403 Forbidden. List those hostnames in VITE_ALLOWED_HOSTS (comma
separated) to allow them:
VITE_ALLOWED_HOSTS=my-preview.example.dev yarn dev --host 0.0.0.0Leave VITE_ALLOWED_HOSTS unset for local development; the protection stays on
by default.
Build the project for production:
yarn buildRun tests:
yarn testLint your code:
yarn lintThe pre-commit hook and the Test CI workflow run the same checks: lint, typecheck, layer
boundaries, unused exports, unit tests, and two i18n gates.
One of the i18n gates fires on changes that have nothing to do with copy, so it is worth knowing
about up front. tools/i18n-tracker.cjs hashes every .ts and .tsx file in the repository —
build configs such as vite.config.ts included — and fails whenever a file's content differs
from .i18n-tracker.lock. After editing any TypeScript file, record its new hash and commit the
lock with it:
node tools/i18n-tracker.cjs update vite.config.ts
git add vite.config.ts .i18n-tracker.lockFull rules, exclusions, and failure recipes: contributing/i18n-guide.md.