My Answer to Rebuilding
If you have read my introduction, you know my mantra: I hate rebuilding. Every time I started a new project from scratch — setting up authentication, JWT, Docker, user management, role guards — I was not building the product. I was rebuilding the scaffolding I had already built a dozen times before.
The RAD-System is my answer to that problem. It is a full-stack framework I built for myself, open source on GitHub, that eliminates everything I call "development background noise" — so that from minute zero, I can focus exclusively on business logic.
It is not meant to be the framework for everyone. It is built around the way I think and the patterns I trust after 40 years of building systems. If you share that approach, it might work for you too.
What It Is
RAD-System is a complete NestJS + Angular stack, containerised with Docker, opinionated by design. It is not a boilerplate you configure once and forget. It is a living architecture with two core abstractions that do most of the heavy lifting.
1. Backend: Two Abstractions That Do 90% of the Work
The entire backend philosophy rests on two abstract classes.
BaseEntity — every database entity extends this. It handles audit columns (createdAt, updatedAt, deletedAt) automatically via TypeORM, including native soft-delete. The primary key is left to the concrete entity so you can choose UUID or integer depending on the context.
BaseService — a generic class that implements all standard CRUD operations. The key design decision here is the abstract checkOwnership() method: every service that extends it must implement ownership validation. You cannot accidentally forget it. Security is not a layer you add later — it is built into the foundation.
2. Frontend: Angular Without the Ceremony
The frontend uses Angular standalone components — no NgModules, no boilerplate module declarations. State management is handled by a lightweight StoreService I wrote myself, backed by BehaviorSubject and browser storage. It replaces NgRx for the vast majority of applications without the overhead and learning curve.
A functional interceptor pattern manages JWT injection, the global loading spinner, and 401 token refresh in one place. Every HTTP call goes through a centralised ApiService that prepends the runtime API URL automatically.
3. Infrastructure: Docker-Native From Day One
The entire stack runs in Docker:
- PostgreSQL 16 — with custom
postgresql.conf, auto-initialisation scripts, and data persistence via named volumes - NestJS backend — compiled Node 22 image, running as a non-root user
- Angular frontend — served via Nginx with Gzip compression and security headers
The deployment strategy is artifact-based: I build a versioned tarball locally, extract it into the volume on the server, and restart the container. No Node.js on the production server. Instant rollback by unpacking the previous tarball.
The following articles go deep into each layer. Start with the backend if you want to understand the abstraction model, or jump to Docker if you want to see how deployment works in practice.