Technologies
These tools give us consistency, strong community support, predictable performance, and sustainable long-term maintenance.
| Area | Standard | Why |
|---|---|---|
| Runtime | Node.js LTS | Stable, high-performance async runtime. |
| Language | TypeScript (strict mode) | Safer code, fewer runtime surprises. |
| Backend Framework | NestJS | Structured, modular architecture suitable for large-scale services. Frequent security updates. |
| Package Manager | pnpm | Fast, efficient, reliable dependency isolation. |
| Database | PostgreSQL | Mature, powerful, cloud-friendly. |
| ORM | Prisma/Kysely (TBD) | To be defined |
| Cache Store | Valkey | Low-latency, high-throughput data access. |
| Containerisation | Docker everywhere | Environment consistency from dev to production. Dockerfile and Devcontainers. |
| Task Runner / Runtimes | Mise en Place | It supports both runtime version management and task management, and also includes a plugin system. |
| Frontend Framework | TBD | Try to avoid building SPA unless absolutely necessary. Astro with small components sprinkled in is preferred. Framework is under evaluation. |
| UI Component Library | TBD | Framework-agnostic component library is under evaluation. |
| Static Sites | Astro | Fast, flexible static site generator with built-in component support and the Starlight documentation framework. |
| API Docs | Swagger Spec & UI | NestJS offers libraries that automatically generate documentation from the codebase. We want to avoid maintaining API docs manually, as that approach is error-prone. |
| Multirepo | Frontend / Backend / Types | TBD |
These choices eliminate fragmentation and ensure that tools, documentation, and deployment pipelines work consistently across teams.
IMPORTANT
Rendering strategy: SSG > SSR > Client JS. Prefer static generation over server-side rendering, and SSR over client-side JavaScript. Ship the least amount of client-side JS that is technically possible. Pages that can be pre-built at deploy time should be. Use interactive islands only where user interaction genuinely requires it.