Skip to content

P/N 01Case studyPersonal startup

Three HERISAGA app screens on phones, a multiple-choice question, the Road and a completed lesson, in front of an old Albanian hillside town

HERISAGA — History as Playable Stories

A bilingual mobile app that turns Albanian history into playable stories, with interactive lessons, review sessions and progress tracking. I co-founded HERISAGA, and we are building it toward a production release and in the near future expanding with global history.

Role
Co-Founder, Full-Stack Software Engineer
Team
Co-founding team (2)
Duration
4 Months
Year
2026
Stack
Flutter · Dart · Riverpod · go_router · Drift/SQLite · Lottie · TypeScript · Node.js · NestJS · Kysely · Zod · PostgreSQL · Supabase Auth · OpenAPI · JSON Schema · Docker · GitHub Actions · Sentry · PostHog

Outcomes

  • 2438

    Mobile tests passing

  • 501

    API checks passing across integration, security, end-to-end and smoke suites

  • 4

    Interactive question formats

  • 2

    Languages: English and Albanian

Problem

History often reaches learners as a wall of dates and names. HERISAGA turns it into a journey: short narratives, interactive questions and review sessions that help learners connect events and understand why they matter. It starts with Albanian history, for students, heritage learners and curious readers in English and Albanian.

Constraints

Lessons must feel instant on a phone, yet rewards must be trustworthy: retries, flaky connections and interrupted sessions can never lose progress or award XP twice. Content keeps evolving after release, and the interface has to handle longer Albanian text across both themes.

Architecture

A Flutter app, built with Riverpod, go_router and a local Drift/SQLite store, talks to a NestJS API over HTTP/JSON, with Supabase handling authentication. Published episodes arrive as immutable content from a CDN, while answer bundles come from a separate API endpoint. The API grades answers, schedules reviews and records XP, streaks and progress in PostgreSQL through restricted database roles. Shared OpenAPI and JSON Schema contracts keep the app and API aligned.

Flutter app loading immutable episodes from a CDN, while the NestJS API grades answers and records progress in PostgreSQL, with Supabase for authentication.

5 parts, 4 connections.

  • N01 — Episode CDN
  • N02 — Supabase Auth
  • N03 — Flutter app
  • N04 — NestJS API
  • N05 — PostgreSQL
  • Episode CDN to Flutter app, episodes
  • Supabase Auth to Flutter app, sign-in
  • Flutter app to NestJS API, HTTP/JSON
  • NestJS API to PostgreSQL, progress

Key decisions

Separate instant feedback from reward authority. Answers are checked locally, so lessons feel instant, but the server re-grades every submission and alone decides XP, streaks and progression.

Pin each session to a content revision. A lesson in progress never changes under the learner, even when editors publish a new version.

Idempotent events and atomic transactions for progress. A repeated or interrupted request can never duplicate rewards or corrupt a streak.

Three HERISAGA app screens on phones, a multiple-choice question, the Road and a completed lesson, in front of an old Albanian hillside town
The Road: every chapter of Albanian history laid out as a path to play.

Results

The app and API are implemented and in integration and release validation, ahead of a production launch. In the latest recorded local verification, 2,438 mobile tests and 501 API checks passed across integration, security, end-to-end and smoke suites.

The screens below are the real app, every flow in light and dark and in English and Albanian. Swipe a strip, or use its arrows.

The Road

6 screens
  • The Road in the light theme: History of Albanians, chapter 2 Illyrians, with a start flag on a path of locked lessons

    Light · English

  • The Road in the light theme, in Albanian: Historia e shqiptarëve, kapitulli 2 Iliret, with the flag labelled Fillo

    Light · Albanian

  • The Road in the dark theme, in English, with the start flag on a path of locked lessons

    Dark · English

  • The Road in the dark theme, in Albanian

    Dark · Albanian

  • The Road in the light theme with a sheet offering to continue the lesson The Queen, the Sea, and the Roman Envoys, worth up to 128 XP

    Continue a lesson · light

  • The same continue-lesson sheet on the Road in the dark theme

    Continue a lesson · dark

The Road: every chapter of Albanian history as a path to play, in both themes and both languages.

Episode: Who counts as Illyrian?

7 screens
  • A lesson passage titled A regional name is not the whole story, with the key place name highlighted and a Continue button

    Read the passage

  • A multiple-choice question about what Appian's statement establishes, with four options and the Check answer button still disabled

    A question

  • The same question with one option chosen and Check answer enabled

    An answer chosen

  • The same question answered correctly, with a green Correct banner and a short explanation of why

    Correct, and why

  • A true-or-false question answered wrongly, with a Not quite banner and an explanation

    True or false, missed

  • The next lesson passage, One region, several named groups, with the dates of the events in blue

    The next passage

  • Lesson completed: a 7 of 8 ring marked Perfect lesson, 102 XP earned and a one-day streak

    Lesson completed

One episode played through: read a short passage, answer, learn why, finish with XP.

Episode: Silver under the mountains

6 screens
  • A dark-theme lesson passage, Damastion: What Can Coins Tell Us?, about silver coins and the location of a city

    Read the passage

  • A dark-theme multiple-choice question about why scholars compare Damastion's coins with Paionian coins

    A question

  • The same question with one option chosen

    An answer chosen

  • The same question answered wrongly: the wrong option in red, the right one in green and a Not quite banner

    Not quite, and why

  • A dark-theme true-or-false question answered correctly, with a Correct banner

    True or false, correct

  • Lesson completed in the dark theme: a 5 of 8 ring marked Great job and 74 XP earned

    Lesson completed

A second episode, in the dark theme: evidence from coins, then questions that grade the reasoning.

Review

4 screens
  • The Review tab in the dark theme: one lesson ready, topic filters and a Start review session button

    Dark · a lesson ready

  • The Review list scrolled, with lessons grouped by chapter and each question marked Needs practice or Scheduled

    Dark · by lesson

  • The Review tab in the light theme with its topic filters and the Start review session button

    Light · a lesson ready

  • The Review list in the light theme, scrolled to the questions that need practice

    Light · by lesson

Review sessions bring earlier questions back, grouped by lesson and marked by how well they are known.

Profile and settings

6 screens
  • The Profile screen in the dark theme: avatar, name, streak, XP, lessons completed and the Chronicle of artifacts and achievements

    Profile · dark

  • The Profile screen in the light theme

    Profile · light

  • Settings in the light theme: daily goal, reminders, sound effects, haptic feedback and the appearance switch

    Settings · light

  • Settings in the dark theme

    Settings · dark

  • Edit profile in the light theme: name, handle, English or Albanian, what brings you to HERISAGA and the daily goal

    Edit profile · light

  • Edit profile in the dark theme

    Edit profile · dark

Progress, preferences and the learner's own account, in both themes.

Reflection

I would take one real episode through the full journey, from publication to playback, grading and progress recovery, earlier in the project, and grow the features around that proven path. I would keep the strict split between fast local feedback and server-side authority.