Skip to content

Projects · Study project · 2026

System Design Practice

A Go + HTMX app for interview practice: a question bank with answer frameworks, flashcards and quizzes, a progress tracker and timed mock interviews with self-rating. Server-rendered, no JS build step.

Go · chi · PostgreSQL · Redis · HTMX

Source

Problem

Reading theory does not stick; practising with a timer and a rubric does. I wanted a personal tool for that without paying for a course.

What I built

A single-user web app: 15 practice problems with framework hints, 12 flashcard/quiz topics, a topic checklist and a timed mock mode. Content is original YAML loaded into Postgres at startup; pages are Go templates enhanced with HTMX.

Architecture

  • cmd/serverentrypoint and route wiring with chi
  • internal/storePostgres queries, Redis cache, embedded SQL migrations
  • internal/seedYAML curriculum loaded on startup, so adding content needs no code change
  • internal/webembedded templates and static assets
  • docker composePostgres, Redis and the app for local runs

Decisions and trade-offs

  1. 01

    Server-rendered HTML with HTMX instead of a SPA

    The interaction model is forms and partial updates, so HTMX keeps the whole app in Go with one deploy artefact and no frontend build. The trade-off is less client-side richness, which this tool does not need.

  2. 02

    Single-user auth, by design

    One admin account from env variables. Multi-tenancy would add accounts, authorisation and data isolation for a tool that only I use; leaving it out keeps the surface small and honest about its scope.

  3. 03

    Cache the read-heavy list, not everything

    The curriculum/problem list is read on every page and rarely changes, so it is cached in Redis. Per-user progress is written often and read once, so it stays in Postgres.

Evidence

  • Runs with `docker compose up --build`; migrations are embedded and applied on start.
  • README describes the 6-step answer structure and the rubric used in mock mode.

Status · Working; content grows via YAML