diff --git a/docs/img/AppIcon.png b/docs/img/AppIcon.png new file mode 100644 index 00000000..f4ebf552 Binary files /dev/null and b/docs/img/AppIcon.png differ diff --git a/docs/img/og/og-01-dyslexic.png b/docs/img/og/og-01-dyslexic.png new file mode 100644 index 00000000..f6b150be Binary files /dev/null and b/docs/img/og/og-01-dyslexic.png differ diff --git a/docs/img/og/og-01.png b/docs/img/og/og-01.png new file mode 100644 index 00000000..c8f92e97 Binary files /dev/null and b/docs/img/og/og-01.png differ diff --git a/docs/img/og/og-02.png b/docs/img/og/og-02.png new file mode 100644 index 00000000..7332744e Binary files /dev/null and b/docs/img/og/og-02.png differ diff --git a/docs/img/og/og-03.png b/docs/img/og/og-03.png new file mode 100644 index 00000000..f66614c1 Binary files /dev/null and b/docs/img/og/og-03.png differ diff --git a/docs/img/og/og-04.png b/docs/img/og/og-04.png new file mode 100644 index 00000000..7b51890f Binary files /dev/null and b/docs/img/og/og-04.png differ diff --git a/docs/img/og/og-05.png b/docs/img/og/og-05.png new file mode 100644 index 00000000..d4b05dda Binary files /dev/null and b/docs/img/og/og-05.png differ diff --git a/docs/img/og/og-06.png b/docs/img/og/og-06.png new file mode 100644 index 00000000..e37a5362 Binary files /dev/null and b/docs/img/og/og-06.png differ diff --git a/docs/index.html b/docs/index.html index 7442a25f..c3a75bcb 100644 --- a/docs/index.html +++ b/docs/index.html @@ -10,9 +10,14 @@ - + + + + + + diff --git a/docs/og.html b/docs/og.html new file mode 100644 index 00000000..92ca7221 --- /dev/null +++ b/docs/og.html @@ -0,0 +1,1487 @@ + + + + +Mora · 16:9 Cover Art Gallery + + + + + + + + + + + + +
+ + +
+
+ 01 +

Overture · Editorial cover

+

Paper-cream wordmark hero with floating yokai card stack. Magazine-cover register.

+ Open native +
+
+
+
+ On-device only + Built with Opus 4.7 + 5 days · 100+ PRs + Orton-Gillingham phonics + CoreML wav2vec2 + L1-Japanese aware +
+ +
Built with Opus 4.7 — Anthropic × Cerebral Valley · April 2026
+ +
00Overture
+
+
github.com/youtalk/mora
+
v0.1 · MPL-2.0 · Apr 2026
+
+ +

Mora.

+

A different door into reading — for kids who learn differently.

+ +
+ Built with Opus 4.7 + iPad-first + On-device + L1-Japanese aware + CoreML · wav2vec2 +
+ +
+ INFERENCE · 16 kHz · CoreML · INT8 +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /ʃ/ matched · 0.92 + posterior · 41 frames + /v/ → /b/ flagged +
+
+ +
+
+ /r/ + +
Mentor 02/r/
+
+
+ /ʃ/ + +
Mentor 01/sh/
+
+
+ /æ/ + +
Mentor 03/æ/
+
+
+ +
+
+
+
+ + +
+
+ 02 +

Substitution slab · Dark phoneme math

+

Ink ground with three giant L1-Japanese substitutions. The pitch in one glance.

+ Open native +
+
+
+
+
04L1-Aware Coaching
+
+
Mora · A different door into reading
+
github.com/youtalk/mora · MPL-2.0
+
+ +

What L1-Japanese sounds like, mathematically.

+ +
+
+ b + heardtarget + v + No /v/ in JP — defaults to bilabial +
+
+ r + heardtarget + l + JP ら-row → English /l/, /ɹ/, or tap +
+
+ s + heardtarget + th + /θ/ absent — alveolar fricative substitutes +
+
+ +
+
+

Mora.

+
On-device dyslexia + ESL tutor
+
+
+ Built with Opus 4.7 + CoreML · wav2vec2 + iPad-first · MPL-2.0 +
+
+
+
+
+ + +
+
+ 03 +

The Numbers · Hackathon stats

+

Editorial stat slab — five days, one hundred PRs, zero cloud calls.

+ Open native +
+
+
+ + + +
+
+ +
05The Numbers
+
+
Built with Opus 4.7 · Anthropic × Cerebral Valley
+
April 21 — 28, 2026 · Kitchen-table edition
+
+ +

Five days. A working app.

+

Hackathon constraints met head-on. Every number measured, not estimated — across one hundred merged pull requests on a single iPad.

+ +
+
+ 100+ + Merged PRs
Apr 21 – 26
+
+
+ 5 + SPM packages
Core ← Engines ← UI
+
+
+ 25.84 + MB CoreML
INT8 wav2vec2
+
+
+ 0 + Cloud calls
at runtime
+
+
+ +
+

Mora.

+

A different door into reading — for kids who learn differently, in a language that isn't home yet.github.com/youtalk/mora · MPL-2.0

+
+
+
+
+ + +
+
+ 04 +

Pull quote · The why

+

Personal centerpiece with chop seal. The emotional thread of the project in one sentence.

+ Open native +
+
+
+
+ +
01The Ask
+
+
Mora · An on-device dyslexia + ESL tutor
+
Built in 5 days with Opus 4.7
+
+ + +

I built Mora for one kid I love.

+ +
+ Yutaka Kondoh· author · @y_kondoh +
+

+ A child close to me lives with dyslexia. Last year, our family moved across an ocean, and English became the second language they'd learn to read. So I built the tool I wished existed. +

+ +
+ + MORA +
+ +
Mora.
+
+
+
+ + +
+
+ 05 +

Yokai triumvirate · Mentor showcase

+

Three illustrated mentor cards on washi. Yokai-forward, illustration-first.

+ Open native +
+
+
+
03What It Does
+
+
Mora · iPad-first · on-device only
+
github.com/youtalk/mora
+
+ +

Mentors, not graders.

+

Phonics that listens for L1-Japanese — not against it.

+ +
+
+ /ʃ/ + 01 +
+
+

Shira-uoh

+

Mentor 01 · /sh/ · Week one

+
+
+
+ /r/ + 02 +
+
+

Raiju

+

Mentor 02 · /r/ · Week two

+
+
+
+ /æ/ + 03 +
+
+

Appuru-oni

+

Mentor 03 · /æ/ · Week three

+
+
+
+ +
+
Mora.
+
Built with Opus 4.7 · Anthropic × Cerebral Valley · April 2026
+
+
+
+
+ + +
+
+ 06 +

Terminal · Built with Opus 4.7

+

Dev-aimed thumbnail with terminal trace and live phoneme posterior. For the AI builder audience.

+ Open native +
+
+
+
+
06Built with Opus 4.7
+
+
Mora · github.com/youtalk/mora
+
Anthropic × Cerebral Valley · 5-day hackathon
+
+ +

The model isn't a coworker. It's a workshop.

+ + + +
+ PHONEME · POSTERIOR · LIVE +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /ʃ/ · 0.92 + 16 kHz · 41 fr + /v/ → /b/ +
+
+ +
+
+

Mora.

+
A different door into reading
+
+
+
100+ PRs · 5 days · 1 kid
+
spec → plan → execute · parallel sub-agents on worktrees
+
oslog → claude · live debug
+
+
+
+
+
+ + +
+
+ 07 +

Overture · OpenDyslexic title

+

Same composition as Pattern 01, but the "Mora." wordmark is set in OpenDyslexic — the dyslexia-friendly typeface this product is built around.

+ Open native +
+
+
+
+ On-device only + Built with Opus 4.7 + 5 days · 100+ PRs + Orton-Gillingham phonics + CoreML wav2vec2 + L1-Japanese aware +
+ +
Built with Opus 4.7 — Anthropic × Cerebral Valley · April 2026
+ +
00Overture
+
+
github.com/youtalk/mora
+
v0.1 · MPL-2.0 · Apr 2026
+
+ +

Mora.

+

A different door into reading — for kids who learn differently.

+ +
+ Built with Opus 4.7 + iPad-first + On-device + L1-Japanese aware + CoreML · wav2vec2 +
+ +
+ INFERENCE · 16 kHz · CoreML · INT8 +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /ʃ/ matched · 0.92 + posterior · 41 frames + /v/ → /b/ flagged +
+
+ +
+
+ /r/ + +
Mentor 02/r/
+
+
+ /ʃ/ + +
Mentor 01/sh/
+
+
+ /æ/ + +
Mentor 03/æ/
+
+
+ +
+
+
+
+ +
+ + + diff --git a/tools/og/render-og.sh b/tools/og/render-og.sh new file mode 100755 index 00000000..f5da7559 --- /dev/null +++ b/tools/og/render-og.sh @@ -0,0 +1,102 @@ +#!/usr/bin/env bash +# Render every 1920×1080 board in docs/og.html to a PNG under docs/img/og/. +# +# Each board lives at the URL fragment #native-XX. The gallery page uses +# :has(.thumb:target) to swap into a fullscreen, native-size view of just +# that board, which lets headless Chrome capture a pixel-perfect 1920×1080 +# screenshot per pattern. +# +# Usage: tools/og/render-og.sh [pattern_number...] +# tools/og/render-og.sh # render 01..06 +# tools/og/render-og.sh 03 05 # render only those + +set -euo pipefail + +CHROME="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" +REPO="$(cd "$(dirname "$0")/../.." && pwd)" +SRC="file://${REPO}/docs/og.html" +OUT="${REPO}/docs/img/og" + +if [[ ! -x "$CHROME" ]]; then + echo "Could not find Chrome at: $CHROME" >&2 + exit 1 +fi + +mkdir -p "$OUT" + +patterns=("$@") +if [[ ${#patterns[@]} -eq 0 ]]; then + patterns=(01 02 03 04 05 06 01-dyslexic) +fi + +# Resolve `01-dyslexic` (and similar aliases) to the gallery anchor that +# actually carries that variant. `01-dyslexic` lives under #native-07 and +# is rendered to docs/img/og/og-01-dyslexic.png. +resolve_anchor() { + case "$1" in + 01-dyslexic) echo 07 ;; + *) echo "$1" ;; + esac +} + +# Headless Chrome reserves ~90px at the bottom of the screenshot for browser +# chrome that isn't actually rendered. Render at 1920×1170 then crop the top +# 1080 to get a clean 1920×1080 image with no body-bg band at the bottom. +WIN_W=1920 +WIN_H=1170 +CROP_H=1080 + +pids=() +for p in "${patterns[@]}"; do + anchor="$(resolve_anchor "$p")" + out_file="${OUT}/og-${p}.png" + echo "→ rendering ${SRC}#native-${anchor} to ${out_file}" + "$CHROME" \ + --headless=new --disable-gpu --no-sandbox \ + --hide-scrollbars \ + --window-size=${WIN_W},${WIN_H} \ + --force-device-scale-factor=1 \ + --virtual-time-budget=4000 \ + --screenshot="$out_file" \ + "${SRC}#native-${anchor}" >/dev/null 2>&1 & + pids+=($!) +done + +for pid in "${pids[@]}"; do + wait "$pid" +done + +# Crop the top 1920×1080 from each rendered PNG via Python. +# Headless Chrome's screenshot includes ~90px of reserved chrome at the bottom +# that isn't actually rendered, so the bottom of the screenshot is body-bg. +# sips --cropToHeightWidth crops from CENTER (not top), so use Python instead. +PY_BIN="${PY_BIN:-/tmp/og-venv/bin/python3}" +if [[ ! -x "$PY_BIN" ]]; then + PY_BIN="$(command -v python3 || true)" +fi +if [[ -x "$PY_BIN" ]]; then + "$PY_BIN" - "$CROP_H" "$WIN_W" "${patterns[@]/#/${OUT}/og-}" <<'PY' || true +import sys +try: + from PIL import Image +except ModuleNotFoundError: + print("Pillow not available — skipping crop. Install with: /tmp/og-venv/bin/pip install Pillow", file=sys.stderr) + sys.exit(0) +crop_h = int(sys.argv[1]); crop_w = int(sys.argv[2]) +for path in sys.argv[3:]: + if not path.endswith('.png'): + path = path + '.png' + try: + img = Image.open(path) + except FileNotFoundError: + continue + cropped = img.crop((0, 0, crop_w, crop_h)) + cropped.save(path) +PY +fi + +echo +echo "Rendered ${#patterns[@]} pattern(s) to ${OUT}:" +for p in "${patterns[@]}"; do + ls -lh "${OUT}/og-${p}.png" 2>/dev/null || true +done