hearth

Hearth

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.

Layout

Run the player

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.

Check the content

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.

Run the iOS app on a Mac

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.

Look at the mockups

https://nabil144.github.io/hearth/design/today-a.html. The strip at the top switches between screens.