Skip to content

Homepage: make the case for Close Read, readings grouped by what they show - #10

Merged
EliezerIsrael merged 2 commits into
mainfrom
claude/homepage-marketing-redesign-a15fed
Oct 12, 2026
Merged

EliezerIsrael merged 2 commits into
mainfrom
claude/homepage-marketing-redesign-a15fed

Conversation

@EliezerIsrael

@EliezerIsrael EliezerIsrael commented Oct 12, 2026 •

Copy link
Copy Markdown
Member

Summary

The homepage was a flat list of every experiment. It now makes a two-sided case to decision makers.

  • Hero (learners): "The pull of video, at the learner's pace," with a 45-second video of the live Bereshit reading. It chooses Creation, then 1963, then shows the Leningrad Codex with the scribe's day breaks and Va-yekhullu highlighted. A button links to the same path.
  • For learners: engaging like video but paced like reading; every branch is a complete lesson; you can't get lost (breadcrumb, pinned text, Back).
  • For teachers: "The teacher brings the Torah. We make it compelling." AI builds the readings in hours, the teacher's words stay intact (Bereshit's quotes are verbatim and cited), and teachers reach students in a new medium.
  • The readings: six compact tiles tagged by what each one shows (branching, one sheet, other texts and teachers), sized to fit one desktop screen.

Hero video

scripts/record_hero.py renders the video frame by frame from the real engine: a steady, wheel-like scroll for each frame, then a screenshot. Real-time screen recording dropped frames and juddered. The page's own CSS and GSAP animations are slowed to match capture, so highlights and manuscript zooms play at normal speed. Re-run it when Bereshit or the engine changes (needs ffmpeg).

Retired from the homepage ("listed": false; they still load by URL and stay under test)

  • shemini-5731, kedoshim-5731: early single-gilayon prototypes; Yitro covers the format.
  • cain-abel-birth-records: narration-only, and Bereshit's Cain leaves cover the passage. Veto if the Pardes relationship matters; Minhag still carries Pardes material.
  • examples/nasso-skeleton: engine prototype.

Code

  • The homepage moves out of engine.js into js/home.js. The category and shows line live in data/index.json.
  • test_index_page_lists_every_sheet now checks that every listed sheet is linked, no retired one is, every listed sheet has a category, and the page doesn't scroll horizontally.

Test plan

  • python3 -m pytest: full suite passed on the first commit; data and homepage tests re-run after the rework
  • Checked by hand at 1440×900 (the hero fits above the fold; the readings fit one screen) and at 390px (no horizontal scroll)
  • Video checked frame by frame: scrolling is even and the manuscript zooms animate. Autoplay checked by hand; CI runs with reduced motion, so it sees the poster and controls

🤖 Generated with Claude Code

EliezerIsrael and others added 2 commits October 12, 2026 15:04
…ey show

The homepage was a flat list of every experiment. It now argues for the
method to decision makers:

- Hero: a 33-second screen recording of the live Bereshit reading (choose a
  passage, choose a year, then the Leningrad Codex with the scribe's breaks
  lit), with a link to walk the same path. scripts/record_hero.py re-records
  it from the real engine, so it never shows a mock.
- Three points on what a source sheet can't do, then the readings grouped by
  what each one demonstrates (branching, a single sheet, range across texts
  and teachers), each with a "what it shows" line and, for the gardens, a
  deep link into a leaf.
- A short "why it can scale" block, limited to claims the repo backs.

Shemini, Kedoshim, Cain & Abel and the Nasso skeleton are retired from the
homepage with "listed": false; they still load by URL and stay under test.
The homepage moves out of engine.js into js/home.js.

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

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

Copy link
Copy Markdown

📊 Code Quality Score: 41/100

Base Score 41 (S12 + A6 + I10 + R5 + Q7 + P1) × ESF 1.0 (816 effective lines, Extra Large; 8 files, no breadth bump) = 41

Category Score Factors
🔭 Scope 12/20 Eight files change across one homepage subsystem: new js/home.js, new scripts/record_hero.py, a large rewrite of the index section in css/close-read.css, data/index.json restructured with category, shows, demoPath and listed fields, index.html, js/engine.js, CLAUDE.md and tests/test_render.py. Three binary hero assets are added under assets/hero/.
🏗️ Architecture 6/20 buildIndex is deleted from js/engine.js and replaced by buildHome in js/home.js, which engine.js calls as a global. Readings are now driven by a category field in data/index.json, with the category definitions held in HOME_CATEGORIES inside home.js. index.html loads home.js before engine.js, so script order carries the dependency.
⚙️ Implementation 10/20 buildHome writes the hero, points and proof sections as template strings and switches the video between autoplay and controls on prefers-reduced-motion. renderReadings filters out listed === false, groups by category and appends uncategorized entries in a trailing grid. record_hero.py starts a local http.server, drives Playwright with an injected cursor and eased scroll, trims the lead-in, encodes MP4 and WebM with ffmpeg, and extracts a poster frame at a computed timestamp.
⚠️ Risk 5/20 Changes what visitors see at /, and a reversible revert restores the old index. Sheet pages are unaffected except that home.js now loads on them and adds top-level globals. A wrong demoPath in data/index.json sends the reader to the sheet root instead of the intended branch.
✅ Quality 7/15 test_index_page_lists_every_sheet now asserts listed sheets appear, retired sheets do not, every listed sheet has a category, and the page has no horizontal scroll. CLAUDE.md documents the new index fields and the recorder, and record_hero.py has a module docstring. No test covers the .home-error fetch-failure branch, the uncategorized fallback grid in renderReadings, demoPath validity or record_hero.py.
🔒 Perf / Security 1/5 The hero video uses preload="none" under reduced motion and preload="auto" otherwise, with a poster image and both WebM and MP4 sources encoded at CRF 28 and 40. buildReadingCard and the fetch error handler insert JSON fields and err.message into innerHTML without escaping. No size budget is enforced on the video assets.

Was this score accurate? 👍 Yes · 👎 No

How this was scored →

Scored by GitVelocity · How are scores calculated?

@EliezerIsrael
EliezerIsrael merged commit 699d533 into main Oct 12, 2026
1 check passed
@gitvelocity-reviewer

Copy link
Copy Markdown

📊 Code Quality Score: 40/100

Base Score 40 (S 11 + A 7 + I 9 + R 5 + Q 7 + P 1) × ESF 1.0 (816 effective lines, Extra Large; 8 files, no bump) = 40.

Category Score Factors
🔭 Scope 11/20 Touches 8 files in one front-end subsystem: new js/home.js (188 lines), new scripts/record_hero.py (164 lines), about 250 lines of homepage CSS replacing the .index-* rules, data/index.json restructured, index.html cache-bust and script tag, CLAUDE.md guidance, and one test. Adds three binary hero assets (.mp4, .webm, .jpg). CLAUDE.md is the one AI artifact file, and its change is a prose update of the add-a-sheet instructions.
🏗️ Architecture 7/20 Moves index rendering out of engine.js (buildIndex deleted) into js/home.js, which engine.js calls as buildHome() when no ?sheet= is given. data/index.json gains the fields category, shows, demoPath, demoLabel, listed and retired, and the homepage filters on listed !== false. home.js keeps its copy in HOME_CATEGORIES, HOME_POINTS and HOME_PROOF constants. No new dependency enters the runtime.
⚙️ Implementation 9/20 buildHome writes the hero, points and proof sections through template strings and swaps autoplay for controls and preload when prefers-reduced-motion is set. renderReadings groups sheets by category and appends listed sheets with an unknown category in a trailing grid. record_hero.py starts a local http.server on a free port and drives Playwright through the two branch choices and four scroll glides. It injects a cursor overlay with eased requestAnimationFrame movement, trims the lead-in, encodes mp4 and webm through ffmpeg, and picks the poster frame from a recorded timestamp.
⚠️ Risk 5/20 Changes what visitors see at /. Sheet pages with ?sheet= still go through the unchanged engine path, so existing readings are not affected. buildHome inserts index.json fields via innerHTML, and that file is repo-controlled. Revert is a single commit; the hero video is committed as binary files, so they would stay in history.
✅ Quality 7/15 test_index_page_lists_every_sheet in tests/test_render.py now asserts that every listed sheet is linked, no retired sheet is linked, no listed sheet lacks a category, and the page has no horizontal scroll. load_index is imported from sheetmodel, and its definition is not in this diff. CLAUDE.md documents the category, shows and listed: false conventions and the record_hero.py workflow, and record_hero.py has a docstring with usage. No test covers renderReadings ordering, the reduced-motion branch, the error path, or record_hero.py.
🔒 Perf / Security 1/5 The video is encoded at crf 28 (mp4) and crf 40 (webm) with a poster image, and preload is none under reduced motion. No input sanitization is added for the innerHTML templates.

Was this score accurate? 👍 Yes · 👎 No

How this was scored →

Scored by GitVelocity · How are scores calculated?

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.

1 participant