Back to projects
WebSource available

Case study

Reveal Decks

A local-first TypeScript workspace for creating, organizing, and presenting independent reveal.js decks from one searchable library.

Reveal Decks library showing presentation cards, search, tag filters, and the new-deck command

Project overview

Category
Web

Technology

  • TypeScript
  • Vite
  • reveal.js
  • Vitest
  • GitHub

Project links

Inside the project

Context

Presentation repositories tend to become a collection of disconnected HTML files with repeated setup and no useful overview. I built Reveal Decks as a single source-controlled workspace where every presentation owns its slides, theme, and assets while remaining easy to discover and launch from a shared library.

Role

I designed and built the product end to end: the authoring convention, typed deck contract, Vite-based discovery, searchable library, deck generator, validation layer, documentation, tests, and release workflow.

Constraints

The application had to remain static and local-first, with no database or backend. Deck styles needed to stay isolated, local assets had to survive production fingerprinting, and routing had to work under a GitHub Pages repository subpath. Authors also needed to retain direct access to reveal.js HTML instead of learning a custom slide format.

Approach

Vite discovers deck definitions with `import.meta.glob`, then a typed contract and runtime validation turn them into a reliable catalogue. Each deck lives in its own folder, and a guarded `pnpm create:deck` command generates its metadata, slides, theme, and cover from a kebab-case slug. The library adds search and tag filters, while deck controls cover keyboard, touch, fullscreen, and reduced-motion use. Heavy reveal.js core, notes, and syntax-highlighting modules are loaded only when a presentation opens.

Outcome

The result is a polished library with two example decks, one-command scaffolding, runtime metadata checks, and 12 automated tests alongside lint, type-check, and production-build gates. Lazy-loading the presentation runtime reduced the library entry bundle from roughly 1.14 MB to 29 KB. The repository is public under the MIT license and documented for straightforward personal use.

Lessons

A small convention becomes durable when it is reinforced by generation and validation instead of documentation alone. The project also confirmed the value of deferring specialist dependencies until they are needed and of testing static-hosting paths as a first-class production concern.

A local-first TypeScript workspace for creating, organizing, and presenting independent reveal.js decks from one searchable library.

Explore all projects