A one-player journal RPG that turns a year of daily habits into a story
Overview
Journal RPG: The Road to the Far City is a solo role-playing game built to grow five things over one year — journaling, habits, scripture, marriage, and friendship — each tracked as a stat (Quill, Discipline, Lore, Hearth, Fellowship). Play happens in two short turns a day, one Inn rest a week, and four 13-week Books a year, with sixteen titles to earn along the way. The writing can happen on printed sheets or in the companion app, which keeps the score, rolls the tables, and unlocks the next chapter of the story as your hero levels up. The tone is grace, not guilt: no streak-loss shaming, no red failure states, and XP is never taken away.
Features
- Today tab for morning and evening turns — gratitude, intention, rolled prompts, rituals, Inner Foe, deeds, and the week's quests
- Searchable, editable in-app journal; writing is optional, so paper and app journals are interchangeable
- Story reader with chapters that unlock by Hero level, plus a hand-drawn trail map for each Book with unvisited stops in fog
- Weekly Inn stepper for the Week's Tale, chapter answers, and the Book's Tale
- Character sheet, party roster, scrolls, and a gallery of all sixteen titles
- A lantern emblem whose flame grows every Hero level, with new metal each Book and a rivet for every Book finished
- Optional Firebase sign-in to sync one game across a phone and a browser; everything stays on-device otherwise
- Printable starter pack with rules, roll tables, character sheet, maps, and daily pages — generated from the same data as the app
Technical details
The companion app is built with Expo SDK 58, Expo Router, and strict TypeScript, running on the web today with the same code targeting iOS and Android. Game rules live in JSON as the single source of truth for both the app and a Python/ReportLab pipeline that generates the printable PDFs. State is an append-only log of game events: a pure engine replays the log to derive everything on screen, so undo is just deleting an event and a rules change re-derives all history. Data is stored in localStorage on the web and SQLite on device, with optional Firebase Auth + Firestore sync. Deployed to Vercel as a static Expo web export.
Engineering challenge
Syncing an offline-first event log across devices without losing anything was the hardest part. Events merge as a union by id, journal entries keep the most recent edit, and deletions are recorded as tombstones that win everywhere — so a phone that was offline for a week can sign back in and merge both ways cleanly. Keeping the merge logic pure made it fully unit-testable, alongside engine tests that cover the rulebook's edge cases.