Skip to content

DevBlog

Build DevBlog, a headless CMS and public blog, from an empty repo to a running Docker Compose stack. Along the way you'll work with Node/NestJS, MongoDB, code-first GraphQL, and Next.js (App Router) with SSR/ISR.

Introduction

Why DevBlog, how the course is structured, and what you’ll have built by the end. Open →

Setup & Tooling

Install Node, Docker, and the rest of the toolchain, and scaffold the project. Open →

Data Modeling

Model posts, tags, comments, and users in MongoDB with Mongoose schemas. Open →

Backend Foundations

Stand up the NestJS server, modules, config, and error handling. Open →

Authentication

Add password hashing, login, and JWT sessions so the admin belongs to real users. Open →

GraphQL API

Serve posts and tags through a code-first GraphQL API with resolvers and DTOs. Open →

Content Workflow

Turn Markdown into published posts with slugs, validation, and draft states. Open →

Comments

Let readers comment, and give the admin moderation over what goes live. Open →

Frontend Foundations

Set up the Next.js App Router, layout, and GraphQL data layer for the blog. Open →

Public Blog

Render the home list, post pages, and tag pages with SSR and ISR. Open →

Admin Dashboard

Build the authenticated admin UI to write, publish, and moderate content. Open →

Testing

Cover the backend and frontend with automated tests you can trust. Open →

Docker & Compose

Containerize every service and bring the whole stack up with one command. Open →

Wrap-up

Review what you built and where to take DevBlog next. Open →

Real, copy-pasteable code

Every snippet is real, runnable code you can copy straight into your project — no pseudo-code.

Adapts the Learn Hub courses

Built on patterns from the Learn Hub NestJS and Next.js courses, applied to one real project end to end.

Bilingual EN / ไทย

Available in English and ไทย — switch anytime from the top bar.

You build it by following along

This is a build-along guide: you write the code yourself, step by step, not just read about it.