A mythology learning habit. One chapter a night, five minutes, a voice over a sequence of pictures, from the actual texts. When Hesiod and Homer disagree, you hear both. When you get a recall card wrong, you see the line, not “Oops”.
The repo holds the plan, the mockups, a web player, and a SwiftUI iOS shell that reads the same content/greek.json. Three Greek chapters are written. It is a POC, not a store listing.
docs/plan.md why this and not game lore, who already sits here, the money, the phases. Written first.docs/spec.md one page. What phase 1 is and is not.docs/screens-and-flows.md five screens, the first night, a normal night, Sunday.docs/build-plan.md what this borrows from life-is-a-game and the order of work.design/ static HTML mockups. Three Tonight layouts behind a switcher, plus Lesson, Family, Battle, and Mythologies.content/greek.json the data. Traditions, sources with locators, entities with parents, claims, variants, recall cards, and twelve chapters. Chapters 3, 4, and 5 have their spoken beats written.content/stills.json which Met Open Access object illustrates which beat.content/check.mjs proves every claim has a source, every check asks only what its chapter said, every written lesson ends in recall, and no do-not-ship tradition has a lesson.tools/stills.mjs downloads the CC0 pictures from the Met and writes their credits into greek.json.tools/tts.mjs generates one MP3 per beat with Cartesia. Idempotent by text hash.web/ the player. Vanilla HTML, CSS, and JS. Reads content/greek.json, plays web/audio/, keeps progress in local storage.Engine/ pure Swift package. Decodes the corpus and owns progress and recall rules. Tests run on Linux.ios/ SwiftUI shell. Tonight, Lesson, Done. Separate from web/ because a Mac disk treats App and app as the same folder.project.yml XcodeGen definition. xcodegen generate produces the Xcode project.docs/ios-poc/ how the iOS shell is sequenced.DECISIONS.md why things are the way they are.On the web: https://nabil144.github.io/hearth/web/
Locally:
cd ~/hearth && python3 -m http.server 8000
Then open http://localhost:8000/web/ in a phone-width window. ?lesson=greek-04&beat=5 opens a beat directly.
Without audio files the player shows “no audio yet” and you tap through. To generate the audio:
export CARTESIA_API_KEY=sk_car_...
node tools/tts.mjs --voices # pick a voice id
CARTESIA_VOICE_ID=<id> node tools/tts.mjs # all written chapters
node tools/tts.mjs greek-04 # one chapter
Re-running only regenerates beats whose text, voice, or model changed.
node content/check.mjs
Prints the counts and exits 0, or lists every unbound id and exits 1. GitHub Actions runs it on every push.
If you already cloned when the folder was called App, delete that clone. A Mac will not rename App to app. Start from a fresh directory.
git clone git@github-personal:nabil144/hearth.git
cd hearth
brew install xcodegen
xcodegen generate
open Hearth.xcodeproj
In Xcode, pick your development team under Signing, then Run on the Simulator or a plugged-in iPhone. The first launch should show Tonight with “The father who ate”.
Engine tests on this Linux laptop:
cd Engine && ../swift.sh test
Cloud build on push to main uploads Hearth-unsigned-ipa. Download with gh run download --name Hearth-unsigned-ipa --dir artifacts/. splice install if login works that day. If Splice 503s, use Xcode on the Mac.
https://nabil144.github.io/hearth/design/today-a.html. The strip at the top switches between screens.