Build a Ktor Blog

Build Baltic Post with Ktor, FreeMarker, Simple.css, Exposed, sessions, owned post CRUD, search, password recovery, and a Railway deployment.

  • Difficulty Intermediate
  • Parts 12
  • Stack Kotlin, Ktor, FreeMarker, Simple.css, Exposed, PostgreSQL, sessions, bcrypt

How this project works

Baltic Post is an original teaching blog in twelve complete snapshots. Clone once and run any numbered folder without rebuilding earlier stages.

The path starts with Ktor and routing, adds FreeMarker and Simple.css, then introduces isolated Postgres databases. Later parts add sessions, media, ownership, pagination, search, reset tokens, and Railway deploy notes.

Snapshots 4–12 seed ada@example.com and grace@example.com with password123.

Local Postgres runs through Docker Compose on host port 5439 with databases baltic_01baltic_12.

Open GitHub repo →

Parts in order

Work through the parts in sequence. Each lesson explains the ideas, then points you to a runnable GitHub snapshot.