Skip to content

The Map Redrawn: an explorable map of Japan 1868–1878 - #38

Merged
DozenTwelve merged 35 commits into
DozenTwelve:mainfrom
yuyays:feat/meiji-map-redrawn
Nov 4, 2026
Merged

DozenTwelve merged 35 commits into
DozenTwelve:mainfrom
yuyays:feat/meiji-map-redrawn

Conversation

@yuyays

@yuyays yuyays commented Nov 3, 2026

Copy link
Copy Markdown
Contributor

Summary

A new explorable map in the style of Time of the Magicians: Japan from 1868 to 1878, as the domains become prefectures and the map is redrawn twice. Four lives walk it a year at a time: Fukuzawa, Itō, Saigō and Tsuda Umeko.

site/
├── index.html                  # + shelf card on Documentaries, beside Time of the Magicians
├── assets/covers/meiji.webp    # + cover (440×470, the 1868 domain map)
└── meiji/                      # + the page, static, no build step
    ├── lib/app.js              # playback adapted from time-of-the-magicians (MIT, see LICENSE-engine.txt)
    ├── lib/states.js           # 5 map states: domains 1868 → Tokugawa land → Aug 1871 → 3 fu 72 ken → 3 fu 35 ken (1876)
    ├── data/                   # 872 pieces, 2.1 MB TopoJSON; CC BY-SA 4.0 (data/LICENSE-map.txt)
    ├── notes/                  # county tables for 1871 and 1876, story sources and confidence
    ├── audio/en/               # 79 narration clips (Edge TTS)
    ├── audio/bgm/              # 2 koto tracks: 1868–71 and 1872–78, crossfaded at the year change
    └── img/                    # event prints (PD/CC0, img/SOURCES.md), portraits, 4 painted figures

The map is not drawn by hand. Each of 66,581 villages carries its 1868 lord, from Kyudaka_agrivillage v2.01 (Honda, Natsume and Nemoto; CC BY-SA 4.0), joined to the MAFF 2015 census community boundaries (CC BY; 99.18 % matched by area). The 1871 and 1876 prefectures then follow the decrees county by county (notes/ken-1871.csv, notes/ken-1876.csv); the inferred and rule-split counties are listed in the credits.

Evidence

  • Page checks (playwright, desktop 1280×800, phone 390×844, landscape 844×390): all pass. That covers each year's film, rapid stepping, layout with no text overlap, events, keyboard, assets and the three redrawn map states. The 1871 state draws 1,632 boundary lines for 76 groups and 1876 draws 1,067 for 39. First load to playable takes 0.3 s; the camera runs at 58–59 fps and the follow-walk at 59 fps.
  • Repo CI, run locally:
    • check_site.py: 15 books linted, 455 scripts and 196 inline scripts checked, 0 failed.
    • check_skill.py: 0 problems in 26 docs.
    • check_tts_text.py: ok.
  • Music switch: stepping 1868 → 1873 → 1871 in a browser plays era1 through 1871, switches to era2 at 1872 and back to era1 at 1871, with no console errors. The music is ducked to 30 % under narration, through Web Audio as in Time of the Magicians.

Merge Danger

Door: two-way

Removing it means deleting site/meiji/, the cover and the four lines on the shelf; nothing else depends on them.

Blast Radius: contained

  • The page touches no shared code. engine/ is unchanged and so are the other books; the only shared file edited is the shelf in site/index.html.
  • Size: site/meiji/ is 23 MB (5.5 MB narration, 11.7 MB music, 2.1 MB map).
  • Licences to agree to before merging:
    • The map data is CC BY-SA 4.0, not MIT, and is marked in data/LICENSE-map.txt.
    • The source's database terms (Rekihaku) allow non-profit use only, with credit and one copy of the published result sent to them.
    • The four walking figures were painted by an image model (OpenAI gpt-image-2.5-flare), and the credits say so.
    • The music is our own synthesised koto playing public-domain scores from Nagai and Obata's 1895 collection, typeset for the Mutopia Project.
  • Not verified: nobody has listened to the narration's pronunciation of Japanese names, or to the synthesised music, and nothing has been tested on a real phone. Some dates in notes/sources.md are marked as from memory, still to be checked against a printed chronology.

🤖 Generated with Claude Code

yuyays and others added 30 commits November 3, 2026 17:29
Japan from the eve of the Restoration to Okubo's death: the domains in
1868 village by village, the prefectures of August 1871, the 3 fu 72 ken
of 1871-72 and the 3 fu 35 ken of 1876, with Fukuzawa, Ito, Saigo and
Tsuda walking the map a year at a time. The playback is adapted from
Time of the Magicians (MIT); the map data is CC BY-SA 4.0 from
Kyudaka_agrivillage v2.01 joined to MAFF 2015 census boundaries. Adds
the cover and a place on the documentaries shelf.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ture-book stop stays out of the video

engine.md and the four style.json templates still named engine-v2.8, which has no
findWords or beds; engine.py's DEFAULT and the engine/ folder are engine-v2.9.
The picture-book template's find stop gets video: PRE1 + TIMINGS.scene1.dur, as LRRH
does, and export.py warns about a findWords beat with no video slot instead of
holding its waiting picture in silence. stories.md's sfx.py line makes the room bed
that scene1.js plays.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…levels at -18 for a cast; MathJax after math.js

SKILL.md and stories.md named only LRRH and the Joke Collection as the picture-book bar,
though Little Horse is the newest approved book and the source of the kit's beast rig and
listen-and-find. stories.md said a picture book's clips sit at -18 LUFS but not that
eleven.py levels to -14 unless given --lufs -18, as Little Horse's audio script does.
lessons.md said mathjax.js loads right after engine.js; engine.md says after math.js when
a chapter loads it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ader

A film's ask (a listen-and-find stop) stops playback as a lesson's question does; the run
said only that it did not reach the --to beat. It now names the beat it stopped in, says
the page waits there, and gives the --from that plays on. review.md says so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ssons and documentaries block

The guide is drawn only on a lesson's cover and question cards, so its note moves from
core/publish.md to lessons/cover.md (rule 4). style.md listed pacing as in every tier; the
picture-book and shorts templates have none.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…picture books are voiced with it

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
films.md gave lengths in minutes with no way to reach them in words (rule 5); the Tulip
Mania cold run's first script ran 3:19 for a 3:00 brief. The figure is from that run's
own timings: about 2.4 words a second of film for the kit's Edge voice, holds included.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…; films.md says the series page has no credits yet

A chapter's const BGM (the Tulip Mania cold run's) shadows window.BGM, which export.py mixes
from, and lint said nothing; it now warns for sfx, music, SFX, SFX_BED, BGM, MUSIC_OFF and
MUSIC_UP_IN_PRE (a warning, since older books such as the Joke Collection keep their own
player on purpose). films.md said a documentary's index has a credits section; the page
new_book.py copies is the picture book's light page without one, so it now says to add it,
from both SOURCES.tsv files, after The Pandemic's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
new_book.py --lang ar named narration.ar.json and audio/ar/, but left the copied
chapter and cover at <html lang="en">, CHAPTER.language 'en' and
audio/en/timings.js. Following its printed next step (tts.py into audio/ar/), the
pilot chapter 404s on audio/en/timings.js and stops with "Cannot read properties
of undefined (reading 'dur')", in English, left to right. Seen by running
new_book.py lesson|documentary|shorts|picture --lang ar into a scratch root and
opening each page headless. Now the cover/series page and the pilot chapter's
html/js get the language in all three places; with --lang ar the lesson kit plays,
right to left, with no console error. publish.md's rule (narration, audio folder,
CHAPTER.language and <html lang> agree) is unchanged and now true from the start.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A region name that matches nothing lights nothing, without a word (the Tulip Mania cold
run's 'Noord-Holland'; Natural Earth has 'North Holland'). region() is a function, so
map.js cannot tell; geo.py now prints each country's region names as it writes them, and
map.js's header says where the names come from.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…2.9, find stop video, tools that say what they skip)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…into the pages

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…book's own pictures; cut.js moves them

- lift.py: silhouettes with the paper inside kept, parts on pivots with caps,
  page sets with lettering erased and holes inpainted or patched, layers,
  ink-only lettering pieces, a contact sheet, a grid to read coordinates;
  one baked shadow per figure; sets lie on a sheet of their paper colour.
- lib/cut.js in the picture-book kit: cutPuppet, pagePos, cutWalk, trot,
  lettering, CUT_FACE mouths.
- paper.js: cam.layer(name); a set's paper colour fills past its edges.
- eleven.py: a run stopped partway (402 for credit) still writes timings.js
  for the beats it finished and names the rest.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…gures as sets and paper puppets

The whole 1928 book as one narrated film (17 scenes, 7.1 min): her pages
are the sets, her drawings lifted off them with lift.py and moved on pins
(lib/cut.js), her hand lettering stamped in word by word for every refrain,
one listen-and-find stop (find the kitten). ElevenLabs voices to scene 9;
scenes 10-16 have Edge placeholder voices until OpenRouter credit is back.
An original waltz and synthesized effects. Not on the bookshelf; first cut
for the owner's viewing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eo, the pond in order, refrains whole, cats build

Director round 1 fixes: the find beat's video keeps its story lines; the
kitten is taken up clean; the pond is drunk dry to bare paper; refrains
sit whole on clear paper; the 'I am!' shouts build; the hill of cats turns
on its own line; cats stay in the vignettes; page turns shortened; a
lighter vignette; no Georgia end card. lift.py: parts overlap their cut
lines (no seams); per-part shadows drawn under all parts; cut.js pagePos
handles spreads. Holes trimmed: the video is 7:04.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…refrain in order, the run home framed on the page

Director round 2 fixes: the clean kitten sits in the high grass and is the
find stop's target; the pick-up close shows no page rectangles; kitten
close-ups stay within the scan; scene16's refrain stamps each word on its
own spoken word; the run into the house fills the frame with Gág's page;
two-shots at the door; the 'I am!' run never stands still and follows its
clips.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ar at the door

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pipe and chimney smoke as curling ink ribbons, cats split into legs, tail and head
(walking with the ground, swishing, twitching), heads and hands for the speakers,
swaying flowers and tufts, drifting clouds, the pond and grass going, a seething
quarrel, a shivering kitten, bath steam, lapping, a lamp flame and knitting needles.
The refrain's stamp no longer runs two words together ("Catshere"); the old man's
head stays in frame on p13.

Kit: catLife, inkSmoke, pose sk/w (cut.js), catCrowd walk/seethe, paperCam.move;
lift.py frac parts, faces, a run lock and stale-picture cleanup; still.py --hold-cam
and --tsv.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rds, the kitten kept on its mound until it is taken, runs that plant their feet

Director m1 must-fixes: p20's grass stays whole until "Each cat ate a mouthful"; the
kitten acts its own lines and is picked up last; the runs in scene11 and scene13 step
on the ground and go in at the door; the old woman's hands move on her lines; the
two-shot keeps the old man whole; the hills spread joined without its gutter; the
refrain's last line kept clear of cats; a parade of big cats under the third refrain;
the last refrain on cream paper; the thought bubble cream with an ink rim.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…out of frame, the run down the ridge in planted steps, the last refrain in full ink

Director m2 must-fixes: scene2's shots each stay on one page of the out-of-register
p06/p07 spread and follow the old man along the road; scene13's run lands each step
on the ridge's edge and holds it two frames; scene16's last refrain cuts to clean
paper with full-ink cats walking under the letters; the old woman's gesture kept
small enough not to open her bodice. Should-fixes: the pond pulls back to a third,
refrain cats stamp in, the picked-up kitten held before the cut, smudges inked over.
lift.py: a part's "under": "fill" (body inpainted behind it).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…mbers, the pond drying in Gág's strokes

Director m3 must-fix: scene6's five jump cuts on "hundreds … trillions" are one
continuous pull-back. Should-fixes: the pond dries from the bank in hand-drawn
strokes as they sip; the last refrain cuts back to the room; the refrain slip's
feather narrowed so no cat looks faded.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n/woman" tags dropped

The owner kept five tags: "sighed the very old woman", "asked the very old man" (who is
who), and the three that carry an action ("and he did", "and he called to the cats",
"and he pointed"). The other eleven went without re-voicing: eight whole clips removed
(n01d n01e n09 n11 n12b n12c n14 n14b) and the tag cut off the head of n04f, n06c and
n07b, their marks, cues and word times moved back; the scene clips re-joined.

Scenes 1, 4, 7, 8, 10, 13, 14 and 16 retimed. The shots that only held a tag are gone
(her second close-ups in scenes 14 and 16, the wide in scene4, a two-shot in scene10);
scene13's follow shot stays on her through "It's too bad!"; scene1's walk off keeps
2.6 s of its own. Film 7:04 to 6:45.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…opens on its speaker

Director c1 must-fixes: scene13's follow shot is keyed to her size, so she is about a
quarter of the frame from "I think they must have eaten…"; scene16 cuts to her as
"And it is a very pretty cat" begins; scene4 cuts to him on "It would be a shame".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The join put scene2's 0.8 s hole 10.3 s into n02, inside "last" (10.18-10.73 s), so step 3 played "and at la- [0.8 s]
-st he came", heard as the sound cutting out and sticking. The hole now sits in the clip's own pause after "time,"
(9.75 s). scene7's and scene8's holes moved into their pauses too (n06c 1.76 -> 1.8, n07b 1.94 -> 2.05; they clipped
word tails by 20 and 70 ms). Clip lengths are unchanged, so no scene time moves.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… without live masks

Firefox redrew a masked or clipped large image in software every frame: scene8's grass under its bite mask ran
55 ms a frame (perf.py), scene14's close shot with clip-paths on two body images 99 ms with 400 ms frames.
scene8 now draws the bites as paper over the grass, clipped by the grass's grown silhouette traced once into a path;
the clip stays put while its path, the bites and the stubble take the grass's sway (16.8 ms). scene14 swaps in body
images cut once (img/cut/*-c14.webp) on the close shot (19.6 ms). Frames match the old ones (pixel diff <= 0.14 %).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s holes painted

- Scenes 10-16 and the find stop's asks: the Edge placeholders replaced by ElevenLabs takes in the
  cast and settings of scenes 0-9 (eleven.py --only, 51 lines), levelled, re-joined; every gesture,
  cut and effect moved through the old and new takes' word times.
- The holes behind lifted figures on 11 pages (p18-p29, p33, the hills spread) are now painted
  patches in Gág's ink, pasted inside the holes only; the sets rebuilt with lift.py.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…p edge papered, the fifth "I am!" held

- p22: the painted leg hole carried his coat hem's hatching into its top, and the patch file's own
  coat ink bled through the mask's blur as a hairline; both now paper.
- scene10: the close-ups on the fifth "I am!" hold 1.05 s again (0.5 s after the re-voice), and the
  cut to him lands on the start of "Oh yes!" instead of inside "yes".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ure book cut from the 1928 pages; lift.py and cut.js in the picture-book kit

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

# Conflicts:
#	.claude/skills/papermorph/SKILL.md
#	.claude/skills/papermorph/references/core/review.md
…tle Pigs and Tulip Mania to the Archive as spines

Cover cut from the book's own art (960x540). Tulip Mania is the 2026-11-04 cold-run benchmark,
copied from the build with its unused passe.webp left out. Spines keep their titles on one
line; narrower than the desktop shelf they lie flat in a stack. The archive's placeholder note
goes, and the cats page gets a real description.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
DozenTwelve and others added 5 commits November 4, 2026 23:43
…1928 book to read

How it was made: pages lifted with lift.py, puppets cut into parts, ink smoke and walking
cats in Gág's line, the image model only for the holes (21 low-quality pictures, $0.43),
eight ElevenLabs voices by role, one listen-and-find, ~$0.85 in all; two scan/film pairs.
Read the book: the 32 pages of the 1928 book (cover, title page, story) as 1600 px webp,
lazy-loaded, each with its text as alt; the later printing's pages and the joined
p06+p07 spread left out. Scan credited to the Internet Archive (millionsofcatsgg).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e Little Pigs and Tulip Mania in the Archive; the cats page says how it was made and holds the 1928 book

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s and The Map Redrawn

The Documentaries row is back to four cards: the two map cards become one,
"Explorable maps", linking to the new series page /maps/, and Shooting an
Elephant has its fourth slot again. The series page lists each map as a
card in a two-column grid, so a third or fourth map starts the next row.
Its cover is cut from the two map covers (Europe left, Japan right) with
ffmpeg. The Magicians intro now points back to /maps/ instead of the shelf;
The Map Redrawn has no back link, so it is unchanged. The map pages keep
their URLs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@DozenTwelve
DozenTwelve merged commit 22731b2 into DozenTwelve:main Nov 4, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants