I recently opened up DevInHyderabad, a free coding-course site with 300+ chapters across 7 courses. I built it solo, part-time, entirely on free tiers. Here's the architecture — the interesting decisions, not the boilerplate.
The stack
Angular 21 (SSR + Signals) on the frontend, Node/Express + Supabase (Postgres) on the backend. Frontend deploys to Vercel, backend to Render. Zero infra cost.
Decision 1: One dynamic route instead of 150+
With 7 courses and 300+ chapters, hardcoding a route per chapter was a non-starter. Instead, a single dynamic route handles everything:
typescript
{ path: 'courses/:course/:chapter', component: GenericChapterComponent }
GenericChapterComponent reads the params, loads the right chapter data from per-course TypeScript map files, and renders. Adding a chapter = adding a data entry, not a route. This one choice kept the whole thing maintainable as a solo dev.
Decision 2: SSR was non-negotiable for SEO
A course site that Google can't read is pointless. Angular SSR renders every chapter server-side, so the content is in the raw HTML — not hydrated in later by JS. That's the difference between ranking and being invisible.
The SSR gotchas that bit me:
No direct localStorage — it doesn't exist on the server. I wrapped it in getStoredLang()/setStoredLang() helpers that check the platform first.
overflow-x: hidden broke position: fixed — switched to overflow-x: clip and it behaved.
A dynamic sitemap generated at build time (via a tsx prebuild hook) keeps all 376 URLs fresh for crawlers.
Decision 3: Supabase for auth + data
Supabase gave me Postgres + Google OAuth + email auth on the free tier. One auth bug worth sharing: my register component called signUp() directly, bypassing my service layer — so the emailRedirectTo config never applied and confirmation links broke. Consolidating all auth calls into a single SupabaseService that returns { success, sessionCreated } fixed it and made the flow testable.
On SEO (the part most devs skip)
Building it was half the work. Making Google understand it was the other half:
Self-referencing canonical tags (consistent www vs non-www — a split here quietly halves your ranking)
Course + EducationalOrganization JSON-LD schema
Keyword-aligned titles and meta on every page
noindex on /login, /dashboard, etc. so utility pages don't pollute results
Takeaway
You can ship a genuinely large, SEO-solid platform solo on free tiers if you make a few structural bets early — one dynamic route, SSR from day one, and a single service layer for auth. The content is free and open if you want to see how it turned out: devinhyderabad.com.
Happy to answer anything about the SSR setup or the sitemap generation in the comments.
Top comments (0)