-
Day#9 Installing Forgejo and native Forgejo Runner
Today I installed Forgejo and configured its native runner from scratch. Initially I also installed Woodpecker CI, but it turned out unnecessary.
-
Day#8 Designing a Scalable Permission Model
I’ve implemented a structured permission model that allows for precise access control across the system. Instead of hardcoding logic for each route, I rely on a table-driven model that supports dynamic evaluation at runtime.
-
Day#7: 24 Test Suites, 153 Tests Passing — Scaling Confidence with Every Assertion
After several days of shaping a growing service architecture, I’ve finally reached a point where 24 test suites and 153 individual tests are green. This isn’t just a number — it’s a signal that the foundations are holding as complexity grows.
-
Day#6: Building a Flexible Group Structure with NestJS and TypeORM
I introduced a generic group model into the backend to handle dynamic user-to-organization assignments and relationships. Users can now belong to multiple groups with typed roles, and groups themselves can be structured hierarchically.
-
Day#5: Continuation: Securing Routes with JWT and Role-Based Access Control
Continuing development on the backend platform — this time focusing on securing routes with JWT, implementing @Roles decorators, handling role propagation from the database, and creating a custom @Public annotation for open endpoints.
-
Day#4: Releasing the First Version — Lessons in Developer-Facing Documentation
After a week or so of bootstrapping a modular backend platform using NestJS, TypeORM, and Turborepo, I finally reached a point where I could tag and release the very first version of one of the internal APIs. It wasn’t just a matter of bumping a version and pushing a commit. I wanted this release to…
-
Day#3: Behind the Scenes: Challenges in Building a Modular, Scalable Platform
Over the past few days, I’ve been developing a backend system from scratch that’s designed to scale with a complex, multi-tenant structure. While the exact business context remains confidential, the technical journey offers plenty of insight. This post summarizes key challenges I encountered and the approaches I used to solve them — especially around structure,…
-
Day#2: Designing a Reliable Backend: Lessons from Early Infrastructure Work
Building new software from scratch means making foundational decisions early — decisions that shape how maintainable, scalable, and consistent the system will be. In this post, I’ll walk through two technical areas that caused friction in my early backend work — and how I resolved them.
-
Day#1: Building Clean, Breaking Things: The Unexpected Cost of a Global Exception Filter
The goal seemed trivial: create a global ExceptionFilter to unify error responses across the backend. A quick win. A small boost in DX. What followed instead was a full day of debugging TypeScript build issues, resolving unexpected behavior in ESM mode, and untangling the consequences of mixing modern monorepo tooling with legacy compiler features. This…
-

Day#0: Building a Modular System from Scratch
Starting a new software project from the ground up is always an exercise in balancing ambition with reality. Over the past two days, I’ve been laying the foundations of a modular monorepo architecture using Next.js for the frontend and NestJS for the backend — and, as always, theory quickly collided with the stubbornness of actual…
