Constellation, manuscript, groove and tapestry now use the embed runtime (resize: size, eager mount, ctx.animate, ctx.colors, ctx.describe, labelColor for caption text) instead of their own bootstrap, observers and D3 loader. The hero box no longer forces an aspect ratio: the banner root sets it, as the banners skill and check:embed expect. The /banners gallery loads the runtime and shows the default banner too.
chore: import local WIP (embed runtime, check:embed, skills)
Imported from the uncommitted work of the main tree: Embed.mount runtime (public/scripts/embed-runtime.js), check:embed script, embeds migrated to the runtime, write-mdx-content and design-dataviz skills, create-html-embed skill rewrite, agent docs. The old TableOfContents.astro tweak is dropped since the component was replaced.
chore: move banned-books experiments to exp/banned-books
PEN America's index has no theme or reason column, so the infographic gains
a "what and why" section built from three separately labeled sources:
- PEN America's own thematic findings per school year (2021-22, 2022-23,
2023-24 reports), each with its own base (titles or ban instances)
- reasons cited by ALA for its most challenged books of 2021 to 2023,
grouped into tags by keyword and linked to each title's PEN ban count
- Open Library subject headings for the 1,000 most banned titles (893
matched, 59% of bans), grouped into themes by keyword, cached on disk
The section leads with the contrast between "sexually explicit" claims
(30 of 33 ALA listings) and PEN's finding that 13% of 2023-24 banned
titles describe sex on the page.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add three-banned-books.html, a three.js (r170, jsDelivr) tile map of US
states where each state is a pile of books, one book per 100 school book
bans from PEN America's index. Books are colored by ban status or by
school year and drop in at a constant rate, so the tallest piles keep
growing after the others stop.
- orthographic camera so equal counts have equal on-screen heights,
a ruler every 1,000 bans next to Florida and one scale for all years
- direct labels on the three tallest piles, hover, tap and keyboard
tooltips, year buttons, play, reset view and a text summary
- instanced meshes, DPR capped at 2, rendering paused offscreen or when
the tab is hidden, no motion under prefers-reduced-motion
- build script now exports ban status per state and school year
- /infographic-3d dev-only preview (redirects to / in production)
Co-authored-by: Cursor <cursoragent@cursor.com>
Add d3-banned-books.html, an infographic of US school book bans built from
PEN America's Index of School Book Bans (2021-22, 2022-23 and 2023-24
school years, 15,940 bans): headline figures with a school-year filter,
monthly timeline with data-driven annotations, tile-grid state map, most
banned titles, authors and districts, and ban status / origin shares.
- scripts/build-banned-books-data.mjs downloads the public PEN sheets,
harmonizes their labels across years and writes a 21 KB aggregate
- /infographic is a dev-only preview at article and wide width, in both
themes (redirects to / in production)
Co-authored-by: Cursor <cursoragent@cursor.com>
feat(banner): three data-driven banners built from the article's own anatomy
Add scripts/generate-article-anatomy.mjs (run as prebuild and via npm run banner:data) which tokenizes article.mdx and its chapters into article-anatomy.json: per-word kind and length, chapters, headings, component instances, citations and internal links.
New canvas embeds reading that file:
- banner-constellation: chapters, sections, components and citations as a star graph in reading order, every word as dust around its section
- banner-ridges: one ridgeline per section showing its word-length distribution
- banner-manuscript: the whole article typeset in microscopic columns, one bar per word colored by kind
All three are DPR-aware, theme-aware, use the primary-based palette, animate a slow reading cursor, pause offscreen and render a static frame under prefers-reduced-motion.
Co-authored-by: Cursor <cursoragent@cursor.com>
feat: fingerprint OG image URL with content hash to bust social cache
Social platforms (X/Twitter, LinkedIn, Slack) cache share previews by image
URL and rarely re-fetch on their own. index.astro now appends a short sha256
hash of article.mdx to the og:image/twitter:image URL at build time, so the
app-page preview refreshes automatically whenever the article changes.
A new `npm run og:sync` script mirrors the same hash into the README
`thumbnail:` field (the source for the huggingface.co Space card, which is
what X scrapes when the Space URL is shared), and the deploy CLI sets it on
first deploy. Documented in the deploy-to-hf-spaces skill.
Co-authored-by: Cursor <cursoragent@cursor.com>
fix: auto-generate OG thumbnail in screen mode and fix HF Space card
- Move thumbnail generation before print mode switch in export-pdf.mjs
(was generating in print media, showing wrong visual)
- Add --thumbnail-only flag to export-pdf for lightweight thumb generation
- Fix README.md thumbnail URL (was pointing to wrong Space)
- Remove thumb.* from .dockerignore so pre-generated thumbs are included
- CLI: auto-set thumbnail URL in README.md when deploying to HF Spaces
- Increase article template title size to match paper template (clamp 34-54px)
Made-with: Cursor
perf: optimize Docker build with lighter base, parallelized exports, and .dockerignore
- Switch from playwright:v1.55.0-jammy (2GB) to node:20-slim (200MB)
- Add .dockerignore to exclude .git, screenshots, node_modules (~650MB)
- Use npm ci instead of npm install for faster, deterministic installs
- Make PDF, LaTeX, and Notion exports configurable via build args
- Parallelize Chromium download with Astro build (~20s saved)
- Parallelize PDF and LaTeX exports after build (~15s saved)
- Parallelize D3/Plotly/images waits in export-pdf with Promise.all (~15s saved)
- Reduce embed screenshot delay from 100ms to 30ms (~2.5s saved)
- Update entrypoint to check Playwright availability before PDF export
Made-with: Cursor
feat: improve PDF export with screenshot-based embed rendering and cover page layout
- Remove sync-template.mjs from PRESERVE_PATHS so the script can
self-update (fixes chicken-and-egg problem where the merge fix
could never reach existing users)
- Add PRESERVE_PATTERNS for app/public/thumb* files so user thumbnails
are never overwritten during sync
- Add Seo.astro to SENSITIVE_FILES (skip unless --force) so user
SEO customizations are preserved
- Add yarn.lock to PRESERVE_PATHS
Co-authored-by: Cursor <cursoragent@cursor.com>
fix: merge package.json dependencies during template sync
The sync script now intelligently merges dependencies, devDependencies,
and scripts from the template into the local package.json instead of
skipping it entirely. This prevents missing dependency errors (e.g.
@zumer/snapdom) when components are updated but package.json is not.
Co-authored-by: Cursor <cursoragent@cursor.com>
feat: backport dataviz page, embed export, and visual extraction from smol-training-playbook