Skip to content

~/projects / quiz-forge

Quiz Forge

Full-stack quiz app: users browse and play quizzes, admins manage content in a dashboard. A TypeScript monorepo with Nuxt 4 and NestJS.

role
full stack: NestJS API, Nuxt frontend, auth, tests
time
Mar 2026
type
personal
stack
Nuxt 4 · NestJS · TypeORM · PostgreSQL · Turborepo · Docker
demo.mp4
[demo video: screen recording, 1–3 min]

01 / problem

Quizzes need a player side and an admin side

A quiz app has two audiences: players who browse, play and submit answers, and admins who create the question sets. Each needs its own access rules and its own screens.

02 / solution

A role-based quiz platform

Users sign in with JWT access and refresh tokens kept in HTTP-only cookies. Admins create quizzes with questions and answer options; players pick a quiz, play it and submit their responses. Server-side guards enforce the admin and user roles, quiz listings are paginated and Swagger documents the API. The interface has a Polish locale.

  • [screenshot 1]

    [caption]

  • [screenshot 2]

    [caption]

03 / architecture

How it works

A Turborepo + pnpm monorepo. apps/backend is a NestJS REST API on TypeORM and PostgreSQL 15 with auth, quiz and user modules; apps/frontend is a layer-based Nuxt 4 app (core, base, auth) with Tailwind and Pinia. Shared DTOs live in a shared-types package. Vitest covers units, Playwright covers end-to-end flows and Docker Compose runs the database.

04 / results

Outcome

05 / lessons

What I learned

  • Shared TypeScript DTOs in one package keep the frontend and backend contracts in sync.
  • Splitting the Nuxt app into core, base and auth layers keeps layouts and i18n apart from the feature pages.

gallery

  • [photo]

    [caption]

  • [photo]

    [caption]

  • [photo]

    [caption]