Thanks for helping improve Instatic. The project is pre-1.0, self-hosted, and intentionally moving quickly, so contributions should favor clean architecture over compatibility shims.
- Read README.md for product context and local setup.
- Read docs/README.md for the documentation map.
- Read docs/architecture.md before changing cross-cutting code.
- For deployment changes, read docs/deployment/README.md.
Use Bun for all project commands:
bun install
bun run devThe default local database is SQLite at .tmp/dev.db. Postgres mode is selected by setting DATABASE_URL.
Useful checks:
bun run build
bun test
bun run lintFor Docker changes:
docker build -t instatic:local .
docker compose -f compose.prod.yml -f compose.sqlite.yml -f compose.build.yml config- Keep PRs focused on one problem.
- Include tests for behavior changes.
- Update docs in the same PR when behavior, configuration, public APIs, or deployment instructions change.
- Use TypeBox at untyped boundaries.
- Use existing UI primitives in
src/ui/components/for admin UI controls. - Do not add provider SDKs,
zod, Tailwind,react-router-dom, or third-party icon packages.
Instatic is pre-release. Do not add deprecation shims or backwards-compatibility wrappers for old internal APIs. If a shape is wrong, update the source of truth and all callers in the same change.
Important rules live in:
- docs/reference/typebox-patterns.md
- docs/reference/database-dialects.md
- docs/reference/page-tree.md
- docs/reference/react-compiler.md
- docs/reference/ui-primitives.md
Do not report vulnerabilities in public issues. Follow SECURITY.md.