Case studyLive
Postgradia
A coaching platform where coaches, students and parents work from the same weekly plan.
- Role
- Co-founder & CTO — backend & DevOps lead
- When
- 2024 → now
- Backend
- DevOps
- Full-stack
The source is private — happy to walk through the code and the pipeline in an interview.

Who it’s for
- Education coaches and teachers who plan weekly homework for dozens of students — and were doing it in spreadsheets and chat groups.
- Students who need one clear list of what to do this week, on the web or on their phone.
- Parents who want to see progress without chasing the coach, and institutions that run many coaches under one account.
What I built
- I co-founded Bitnodia and lead engineering as CTO in a three-person founding team. I own the backend and the delivery platform; the product is a team effort.
- On the NestJS API: the student module, notifications and push, the partner & referral programme, authentication, i18n, config validation, e-mail templates and the bulk-homework planner.
- On the platform: the API’s Docker image, the Jenkins pipeline end to end and the GitHub Actions deploys to Azure.
- Hands-on in the React web app and the Expo mobile app wherever the API work needed it.
How it works
1Set up students
A coach (or an institution) adds students and parents to the organisation and starts on a card-less free trial.
2Plan the week
Homework goes onto a drag-and-drop weekly planner — from templates, for one student or a whole group at once.
3Students work
Students see their week on the web or in the mobile app, get reminders, and tick tasks off as they go.
4Track exams & goals
Practice-exam results, books and goals roll up into per-student analytics the coach can act on.
5Parents follow
A parent view shows progress; notifications go out by push, SMS or e-mail.
Key decisions
01
A modular monolith, not microservices
Instead of: A service per domain (students, homework, billing…).
Why: A three-person team ships faster with one deployable, one database and one transaction boundary. NestJS modules keep the seams in place, so a part can move out later if it ever earns it.
02
Authorisation as policy, scoped to the organisation
Instead of: Role checks scattered through controllers.
Why: Coaches, students, parents and institution admins see different slices of the same data. CASL policies in global guards make multi-tenancy a rule the API enforces, not a convention every endpoint has to remember — and they are testable.
03
Billing webhooks that are idempotent and order-safe
Instead of: Trust the latest webhook that arrives.
Why: Subscription webhooks arrive twice and out of order. A small state machine (trial, active, past-due grace, paused, paywall) that remembers which events it has applied means a retry never downgrades a paying coach.
04
Kubernetes with Helm, secrets outside Git
Instead of: A single VM running containers by hand.
Why: The API runs on AKS behind ingress-nginx and cert-manager; one chart with staging and production values, secrets pulled from a key vault by External Secrets. Rollouts are repeatable and no credential lives in the repo or in CI variables.
Architecture
Redrawn and simplified — no hostnames or IDs. Highlighted boxes are the parts I built or own.
Numbers
- teachers using it (postgradia.com)
- 1,000+
- apps: API, web, mobile, landing, docs
- 5
- domain entities in the API
- 40+
- API test files — unit + e2e on a seeded DB
- ≈ 45
Tech stack
Backend
- NestJS
- TypeScript
- MikroORM
- PostgreSQL
- CASL
- Passport · JWT
- Swagger
- React Email
Clients
- React Router 7
- TanStack Query
- shadcn/ui
- Expo
- React Native
- Next.js
Platform
- Azure AKS
- Helm
- ingress-nginx
- cert-manager
- External Secrets
- Static Web Apps
- GitHub Actions
- Jenkins
- Docker
Integrations
- LemonSqueezy
- AWS S3
- Expo push
- SMS & e-mail providers
- Sentry
Gallery

Homework, notifications and resource tracking — the core loop. 
Feedback, motivation and the parent view. 
Plans and the free trial — driven by the subscription state machine. 
Plan comparison: student limits and features per plan.
Want the longer version — the code, the pipeline, the trade-offs?
Email me