Release notes
What changed and when. 18 versions since the public launch of sumofans.com. Machine-readable Atom feed at /releases.xml - drop it into any feed reader to get pings when new versions ship. Email subscribe coming soon.
-
v1.17.0 Wrestler comparison
Side-by-side comparison for any two of sumo's top-rank wrestlers.
Highlights
/rikishi/[a]/vs/[b]— 2,701 statically-generated comparison pages over the Ozeki+ roster (every wrestler to reach Ozeki or Yokozuna since 1958, crossed). Each page: paired headers with a leader-highlighted stat table (record, win%, yusho, sansho, height/weight, career length), overlaid career arcs on a shared timeline, head-to-head with per-direction kimarite, full-career fighting-style bars, and top-10 common opponents./compare— a picker (in the People rail) that builds the canonical comparison URL for any two of those wrestlers.- Display orders the more-accomplished wrestler left (peak rank tier → yusho → wins); cross-era pairs that never met fall back to a career-style comparison.
Methodology
- Roadmap table refreshed: origins / kimarite / basho / kabu marked Shipped, comparison capability added.
Closes SUMO-56.
-
v1.16.0 Brand identity: the 大 mark
The visual face of the atlas, made real (SUMO-7).
- New brand mark - a reversed serif 大 (the first character of 大相撲) knocked out of a sumi-ink tile, with a small east-red hanko seal. Replaces the placeholder ring-and-dot favicon. Outlined, so it's font-independent (no tofu on machines without a Japanese font), with monochrome + full-bleed maskable variants, PNG exports, and a web manifest.
- Wordmark lockup - an outlined mark + 大相撲 + SumoFans master.
- Refreshed share card - the Open Graph image now wears the new mark.
- docs/brand.md - codifies the colour tokens with names + intent;
npm run gen:iconsregenerates the icon family from the baked 大 path. - Footer fix - the data-range arrow now sits centred against the mono digits.
-
v1.15.0 Historical lineage to 1789 + email/kimarite polish
Extends the historical depth back two centuries, plus polish across emails and the technique glossary.
Shipped
- Yokozuna lineage to 1789 (SUMO-98) — parsed the full 75-deep yokozuna lineage from Wikipedia (CC BY-SA) and merged the 37 pre-1958 grand champions into the
/historyreigns chart. The Gantt now spans Tanikaze (1789) to today as a true time-scale you scroll horizontally, with names pinned left, the decade axis pinned top, and a synced row hover. Added two all-time records boards beneath it — longest reigns and most championships across the whole lineage. Coverage-tiers flipped Tier 3 to "lineage shipped". (Tier-2 pre-war bout records still pending a data-source request; champions backfill deferred to a follow-up.) - HTML release emails (SUMO-70) — release notifications now render bold, lists, headings, and links instead of raw markdown, via the same pipeline the /releases archive uses. Plain-text fallback retained.
- Kimarite descriptions (SUMO-79) — authored mechanical "how it works" prose for the 34 remaining winning techniques, so every kimarite page now reads cleanly instead of a fallback.
Notes
- Pre-1958 lineage entries are rankings/lineage only (promotion + retirement years, retroactive championship counts) — clearly flagged in the chart.
- Builds read the committed historical snapshot; no upstream fetch at deploy.
- Yokozuna lineage to 1789 (SUMO-98) — parsed the full 75-deep yokozuna lineage from Wikipedia (CC BY-SA) and merged the 37 pre-1958 grand champions into the
-
v1.14.0 DevOps: resilient builds + automated live-basho refresh
First real DevOps phase: builds no longer depend on upstream availability, and live-basho freshness is fully automated.
Shipped
- Committed raw snapshot (SUMO-31) — the core sumo-api inputs (rikishis, sekitori stats, current-cycle basho + banzuke) are now tracked in the repo. Builds read from the committed snapshot instead of re-crawling sumo-api ~50x each build, so the site no longer goes stale if upstream is down, and the pipeline runs from sandboxed environments. Added a stage-only
data:refreshhelper. - Automated live-basho refresh (SUMO-38) — a daily GitHub Actions cron (21:00 JST, after bouts finish) plus on-demand trigger. Fetches a fresh snapshot; commits + pushes when bout data changed (production auto-deploys), otherwise pings a deploy hook so date-derived fields (basho status, ages, timelines) still refresh between tournaments. Replaces the by-hand refresh cadence.
Notes
- Production now builds from the committed snapshot; only the cron (or a manual refresh) fetches new data.
- The committed derived data intentionally drifts from production between refreshes — production is always freshest via the build.
- Committed raw snapshot (SUMO-31) — the core sumo-api inputs (rikishis, sekitori stats, current-cycle basho + banzuke) are now tracked in the repo. Builds read from the committed snapshot instead of re-crawling sumo-api ~50x each build, so the site no longer goes stale if upstream is down, and the pipeline runs from sandboxed environments. Added a stage-only
-
v1.13.0 Dark mode
Dark mode arrives. A persistent theme picker in the top bar offers four palettes, applied site-wide with no flash and remembered across visits.
Themes
- Paper - the default sumi-on-parchment dossier
- Sumi - warm charcoal + bone ink
- Night - cool slate, indigo-leaning
- Inverse - near-black, maximum contrast
The whole atlas reflows from a single set of colour tokens, so every chart, table, and page picks up the active theme. Dark palettes keep the red live-banner and the win/loss bout glyphs legible, and frame borders are tuned per-theme so they recede on dark instead of glowing.
Also in this release
- Top-bar brand/nav alignment fix
- Basho board W-L column no longer clips at the edge
- Removed leftover prototype scaffolding that had been publicly reachable
Detail: SUMO-4.
-
v1.12.0 AtlasShell theme + entity chrome + mobile
Eighth wave: a full chrome standardization on the new AtlasShell, a Tournaments restructure, unified entity-page navigation, and a mobile-readiness pass.
Chrome (Theme v2)
- AtlasShell is now the single chrome across the whole site: kanji top bar + bucket tabs, Stripe-Docs-style left rail, shared footer, and a mobile hamburger drawer.
- Per-bucket section numbering (F/T/P/W/H/M); Foundations gains a "Start here" intro.
- Display font is latin-only Noto Serif JP with system-mincho fallback for kanji (dropped the ~4MB JP webfont and the load-in font wiggle).
Tournaments
- Restructured to Current basho (adaptive: live board or the latest completed, with the outcome sankey folded in) + a Winners page (yusho, sansho, milestones). Old routes redirect.
Entity navigation
- Shared breadcrumb (SumoFans / bucket / page) + consistent footers across all 12 directory and detail pages, replacing the legacy "Dashboard / History" pager.
- Unified link styling: quiet nav links vs the universal red-dotted profile marker.
- Top-of-content alignment normalized so the rail, the main column's first line, and the right TOC top-align on every page type.
Mobile
- No horizontal overflow 360-414px; dense tables scroll, verbose tables stack; previously-blank sections now render; drawer QA passed.
Issues: SUMO-83, SUMO-84, SUMO-85, SUMO-86. Follow-ups filed: SUMO-89 (shared PageMast), SUMO-90 (board sticky column).
-
v1.11.0 Seventh entity wave: /origin + /kimarite
Two new profileable entities ship in this wave, doubling down on the entity-microsite pattern established by /heya, /basho, /kabu.
/origin/[slug] — 61 birthplace pages (SUMO-46)
Every wrestler's birthplace, aggregated across the historical-Makuuchi cohort (1958-present):
- 47 Japanese prefectures + 14 foreign countries (Mongolia, U.S.A., Russia, Georgia, Brazil, Egypt, Philippines, ...)
- Cohort-aware directory: filter Japan / Foreign-born, sort by roster size, championships, era
- Per-origin page: header tiles, continuous decade-debut chart (opacity-encoded intensity), full Makuuchi roster sorted by peak rank
- Cross-linked from the dashboard Origins section and every
/rikishi/[id]infobox shusshin line
Top counts: Tokyo 35, Mongolia 33, Hokkaido ~33, Hyogo ~27, U.S.A. 6 (all Hawaiian).
/kimarite/[technique] — 84 winning-technique pages (SUMO-47)
Every kimarite (deciding technique) that has finished at least one Makuuchi bout 1958-present:
- 84 distinct kimarite spanning ~56,578 decisive bouts
KIMARITE_GLOSSextended with 28 previously unmapped techniques (kirikaeshi, ketaguri, makiotoshi, ...)- Per-technique page: family + style badge, authored mechanical detail (when present), continuous opacity-encoded decade-frequency chart, top 50 practitioners by wins
- Sortable + filterable directory across name / English label / family
- Cross-linked from the dashboard Kimarite section and every
/rikishi/[id]winning + losing kimarite table
Top techniques: yorikiri (29.6%), oshidashi (16.8%), hatakikomi (7.0%), uwatenage (6.1%), yoritaoshi (5.0%).
Marker coverage
The universal red-dotted profile-link marker now resolves for 7 entity types: rikishi, heya, basho, kabu, origin, kimarite, plus glossary.
What's next
SUMO-29 (Astro Fonts API migration) is the next perf-focused candidate now that SUMO-32 has shipped the caching + content-visibility wins.
-
v1.10.0 Kabu entity
Adds
/kabuand 104 per-kabu lineage pages as the fifth profileable entity on sumofans, alongside Rikishi, Heya, Basho, and the dashboard.Shipped
/kabudirectory — 5-column ichimon layout with an SVG ichimon × lineage-depth heatmap on top. Cards sorted deepest-first to mirror the heatmap; each card surfaces kanji + romaji, current holder (with /rikishi link where matched), JSA role + stable-master mention, andN gen · Xydepth/age signal./kabu/[slug]× 104 — hero with kanji + romaji + tiles (Holders/Heya/Span/Status), current-holder spotlight, vertical generational timeline (node size + color by peak rank), etymology paragraph drawn from the source article.- Bidirectional cross-links —
PostActiveBlockterminal block on/rikishi/[id](99 active oyakata matched)Nowrow in the rikishi infobox showing kabu held + JSA roleRun by …hero line on/heya/[id](15 of 69 heya) closing the heya ↔ kabu loop
- Holder enrichment — Hepburn furigana scrape lifts current-holder match from 0 → 99/104 (95%); a third scrape stage extracts each holder's JSA role (Chairman / Director / Auditor / Committee Member / Chief, 88/104 resolved) and stable-master status (20/104 confirmed).
- Universal
KabuLinkdecorates kabu mentions sitewide with the standard red-dotted-underline profile marker. /methodology/data— new section + live match-quality numbers documenting the data layer honestly.
Data sourcing
sumo-api has no kabu data and English Wikipedia mostly doesn't either (kabu kanji URLs resolve to the current holder's rikishi bio, not the institution). ja.wikipedia.org has dedicated articles at
/wiki/<kanji>with structured 6-column lineage tables (代目 / 引退時しこ名 / 最高位 / 所属部屋 / 襲名期間 / 備考). The年寄名跡page on ja-wiki organizes the 104 active kabu by their five ichimon affiliations (出羽海 / 二所ノ関 / 時津風 / 高砂 / 伊勢ヶ濱).A second-stage scrape fetches each current holder's ja-wiki article and extracts furigana from the lede; a third-stage scrape extracts JSA role + stable-master status. Holder names romanize through Hepburn with long-vowel collapse so "Kakuryuu" matches the roster's "Kakuryu". Source URLs + fetch dates surface on each per-kabu page.
Under the hood
- New scraper:
scripts/fetch-kabu.ts(three stages: seed list, per-kabu detail, holder enrichment). Committed cache atdata/raw/kabu/. - New library:
src/lib/kabu-profile.ts(listKabuSlugs/listKabuSummaries/buildKabuProfile/kabuMatchStats/rikishiKabuEntries/depthOpacity). - New components:
KabuLink,KabuTimeline,KabuMatrix,KabuDirectory,PostActiveBlock. - Override hooks for the long tail:
data/kabu-wiki-urls.json(irregular URLs),data/kabu-overrides.json(manual holder→rikishi rescues).
Honest gaps
- Historical lineage holders (pre-1958) render as kanji-only — they're not in our 1958-present roster regardless. The methodology page calls this out.
- 5 active oyakata still don't auto-match (out-of-cache name forms); fixable later via the override file.
- A handful of kabu (e.g., Miyagino post-2024-scandal) have stale ja-wiki content reflected in our data.
What's next (v1.11.0 candidates)
/kimarite/[slug]per-technique pages (SUMO-47)/compare?a=X&b=Ytwo-rikishi compare (SUMO-56)- Manual override pass for the 5 unmatched current oyakata + selective lineage-holder overrides for the headline kabu
Read the archive: https://sumofans.com/releases/
-
v1.8.0 Historical portrait coverage
Until this release, only the 42 currently-active Makuuchi sekitori had real portraits — every retired wrestler's profile page (~485 historical Makuuchi rikishi) rendered the silhouette card. This release backfills the corpus.
Shipped
- Full-corpus photo backfill — the
fetch-photos.tspipeline now reads from both sumo-api's current roster and the 558-strong historical Makuuchi bio set indata/raw/historical/. Profile-page portrait coverage jumped from 73/558 (13%) to 306/558 (55%). Famous retired yokozuna (Takanohana Kōji, Kitanoumi Toshimitsu, Chiyonofuji Mitsugu, Taihō Kōki, et al.) now show real photos on their/rikishi/[id]pages. - Wikipedia search quality guards — broadening the target set exposed false-positive matches on short or ambiguous shikona (e.g. shikona "Mudoho" was returning Taihō's article because Wikipedia's fuzzy search just took the closest famous-wrestler hit). Three new guards keep the cache clean:
- Title gate — shikonaEn must start the matched Wikipedia page title.
- Description filter — rejects list pages, "X stable", manga/anime, fictional characters with "sumo wrestler" descriptions.
- Cross-ID dedupe — a Wikipedia URL claimed by one rikishi can't be reclaimed by another id with a similar shikona.
- Cleaner fallback semantics — when no authoritative source resolves, the rikishi falls through to the silhouette card. Better than a wrong photo.
What's not covered
The 252 remaining silhouettes are low-rank one-tournament Makuuchi wrestlers (mostly pre-2000) with no Wikipedia article and no current JSA profile. Closing this trail further would need sumodb scraping or manual curation — separate work.
What's next (v1.9.0 candidates)
- Row avatars on the
/rikishidirectory (SUMO-73) - Hover-preview thumbnails on shikona links across the site (SUMO-74)
/kimarite/[slug]per-technique pages (SUMO-47)
Read the archive: https://sumofans.com/releases/
- Full-corpus photo backfill — the
-
v1.9.0 Directory avatars & shikona hover-preview
Two small follow-ups to v1.8.0's photo coverage, both about surfacing those portraits earlier in the user's path.
Shipped
- Avatar column on
/rikishi/— every row representing a currently-active rikishi now carries a small 24px headshot in the leftmost column. Retired rows leave an empty cell so the visual rhythm stays even. (SUMO-73) - Site-wide shikona hover-preview — hovering any name link with a cached portrait shows a 128×168 floating thumbnail card next to the cursor after a brief delay. Works on the directory, per-rikishi head-to-head tables, banzuke, leaders, basho pages — anywhere
RikishiLinkis used. Touch devices opt out viamatchMedia('(hover: none)'). (SUMO-74)
How they relate
The inline avatar is small, always-visible, and active-only — answers "do I know this person?" at a glance. The hover-preview is larger, on-demand, and includes retired wrestlers — answers "show me this person" without leaving the row. Together they fill the same gap from two sides.
Under the hood
RikishiLink.astronow writes adata-photoattribute onto each linked shikona when the photo cache has a real entry. A single floating preview lives on<body>(set up inBase.astro);pointer-events: noneso the cursor never lands on it. The marker affordance (red dotted underline) and the hover-preview compose cleanly — both are entity-agnostic and apply whereverRikishiLinkis used.What's next (v1.10.0 candidates)
/kimarite/[slug]per-technique pages (SUMO-47)/compare?a=X&b=Ytwo-rikishi compare (SUMO-56)/kabuelder-name lineage (SUMO-57)
Read the archive: https://sumofans.com/releases/
- Avatar column on
-
v1.7.0 Subscribe form & release notifications
This is a meta-release: the site itself learned how to tell you about its own releases.
Shipped
- Subscribe form — the footer "Get basho updates" card is no longer a stub. Submitting an email kicks off a double opt-in: confirm in your inbox within 24h to start the subscription.
/releasesarchive — every past version of sumofans.com, deep-linkable per release (e.g./releases/#1.6.0). Also available as an Atom/RSS feed at/releases.xmlfor feed-reader users who prefer no email at all.- Release-notification pipeline — when a new version ships (~6× a year, roughly once per basho), confirmed subscribers automatically get a plain-text email with the notes. No tracking pixels, no link wrapping, no analytics. One-click unsubscribe in every email.
- Author-anonymity scrubbing — all release-note content is sanitized of identifying URLs (GitHub user handles, Linear workspace names) at render time, both on the public archive and in outbound email.
How it works under the hood
Fully owned, no third-party SaaS in the path: Cloudflare Pages Functions handle the subscribe / confirm / unsubscribe endpoints; a small Cloudflare D1 database holds the subscriber list; Resend handles SMTP from
[email protected]. Cost: $0/year at this cadence. Source for everything lives in the repo, same as the rest of the atlas.What's next (v1.8.0 candidates)
/kimarite/[slug]per-technique pages (SUMO-47)/compare?a=X&b=Ytwo-rikishi compare (SUMO-56)/kabuelder-name lineage (SUMO-57)- Email polish pass — render markdown as HTML in the release email (SUMO-70)
Read the archive: https://sumofans.com/releases/
-
v1.6.0 Atlas depth pass (partial)
Atlas depth pass triggered by a sumostats.com competitive analysis. Five PRs merged in one session.
Shipped
- #31
docs(data): scraping ethics policy in docs/data.md (sumodb robots.txt + JSA + email-the-maintainer-first principle for any new HTML-scrape source) - #32 SUMO-54
feat(rikishi): four cheap profile-enrichment blocks - fighting-style badge, win-rate-by-opponent-tier table, first-promotion milestone row, similar-rikishi by cosine kimarite similarity - #33 SUMO-55
feat(glossary): new/glossaryroute with 37 terms across 6 cohorts, per-term romaji-slug anchors, DefinedTermSet JSON-LD - #34
fix(glossary): footer scoped-style drop hotfix - #35 SUMO-48
feat(basho):/basho/[id]× 404 +/bashodirectory with decade buckets; identity-classical header with columnar Dates + Tournament dls; East-West paired banzuke; yusho callout; sansho cards; top kimarite bars; prev/next pager
Also folded into #35 (microsite polish wave)
- Rikishi page rewrite to left-rail dossier + main column - Vital statistics + Career record + chronologically-ordered Career timeline with CSS-drawn nodes (Yokozuna disc, gold ★ for first yusho, smaller gold dots for repeat yusho, hollow outline for Intai)
- EntityNav bilingual brand mark (
大相撲 SumoFansin sumi-red) + Glossary refGap entry sitting visibly apart from entity directories - Sibling directory pages (
/rikishi/heya/basho/glossary) unified on header rhythm (left rule + 2.2rem title + 0.86rem dek + 1100px max-width)
Process
Two UI prototype passes:
- Basho header (3 variants): Result-first / Identity-classical / Temporal-led → picked B (Identity-classical) after considering yusho-callout-below redundancy
- Rikishi page (5 variants built by parallel Sonnet agents): Career-arc-as-hero / Vertical timeline / Wikipedia infobox / Newspaper masthead / Dossier card → picked C (Wikipedia infobox) with LEFT rail, folded B's vertical career timeline into C's left-rail bottom
Remaining in the v1.6 atlas depth pass (SUMO-53)
- SUMO-47
/kimarite/[slug]per-technique pages - SUMO-56
/comparetwo-rikishi page - SUMO-57
/kabuelder-name lineage (requires scrape; see #31 ethics policy)
3 follow-ups filed from the SUMO-54 audit:
- SUMO-60 Juryo banzuke ingestion (restores the dropped Juryo-debut cell)
- SUMO-61 opponent-tier table gate bump 10 → 30 bouts
- SUMO-62 lower fighting-style secondary co-tag threshold
3 more atlas-depth-pass follow-ups from the data analysis:
- SUMO-58 JSA heya metadata scrape
- SUMO-59 JSA portrait fallback after Wikipedia miss
- #31
-
v1.5.0 Heya pages & the multi-entity microsite
Second entity in the SUMO-44 microsite family, on the shared build-time cache.
- 69 /heya/[slug] stable dossiers + /heya directory — roster (RikishiLink members), all-time yusho/sansho/yokozuna-ozeki produced, active span; sortable/filterable index; SportsTeam JSON-LD. Honest single-stable framing (latest recorded stable per wrestler — explicit caveat; no per-basho/lineage data).
- HeyaLink marker (shares the universal a.profile-link); HeyaBars + rikishi-profile heya field wired.
- Multi-entity nav — EntityNav goes live for Heya; baseline-aligned; labels standardized to Japanese-primary romaji with English gloss on hover (Rikishi/Heya/Shusshin/Kimarite/Basho). Two-tier nav (entity bar + back-link), standardized 0.7rem chrome rhythm.
- IA decisions locked on SUMO-49: flat entity URLs (no /item/ prefix), label voice, nav model.
Closes SUMO-45. Built on loadHistoricalCache() — no client JSON, no /rikishi or dashboard regression (634 pages clean).
-
v1.4.0 Athlete profiles & the entity-profile epic
Athlete-profile feature family (SUMO-17 + SUMO-50), the reference implementation of the entity-profile epic (SUMO-44).
- 558 /rikishi/[id] profile pages - dense career dossier: honest career-arc SVG (gold ★ yusho / ◆ sansho), record tiles, top-24 head-to-head, kimarite preferences, honors timeline, schema.org Person JSON-LD.
- /rikishi directory - sortable table of all 558 with combined free-text filter + faceted Status / Peak / Era selects.
- Universal profile-link marker - one
primitive applied to every shikona site-wide (red dotted underline). - Shared build-time cache - loadHistoricalCache() reused by the whole SUMO-44 family; no client JSON.
- Two gold-accent directory CTAs; docs across data.md / AGENTS.md / styleguide / methodology.
Closes SUMO-17, SUMO-39-43. Partial SUMO-50 (/rikishi index shipped; /heya, /origin, /kimarite, /basho indexes gate on their detail issues).
-
v1.3.0 Rank River + /history hardening
Phase: /history gets its dense centerpiece, and a live stub-copy bug is fixed.
Highlights
Rank River (SUMO-35) - New scrollable showpiece on /history: every sanyaku+ career since 1958 as a per-basho banzuke-position track. A faint per-tier field of 246 careers + 8 data-derived hero lines (top career-yusho) in distinct signature colors with labels, on a 3436px horizontal-scroll canvas with sticky left axis and decade ticks. New rankRiver aggregation in build-historical.ts using true full-Makuuchi position (not the tier-banded rankValue).
Stale stub disclaimer removed - Coverage.astro had a hardcoded note (live on prod) claiming the real 67-year corpus was placeholder estimates. Gone.
Note - The Tier-1 historical pipeline + /history were discovered to be already shipped (PR #8); SUMO-34 was closed as already-delivered and the genuinely-new work (Rank River + the stub fix) tracked under SUMO-35.
Past releases:
-
v1.2.0 Live basho analysis + Lighthouse cleanup
Phase: first live tournament (Natsu 2026) running on the site, plus performance/accessibility hardening.
Highlights
Live field-strength analysis (basho banner) - A computed editorial read above the yusho race: which yokozuna/ozeki are sidelined and why, what it means for the title, the leader, who's chasing, and days remaining. Plain-language scaffolding for newcomers; every name/record/count derives from the banzuke and self-suppresses on a full-strength basho.
Lighthouse cleanup (SUMO-27) - Self-hosted fonts via @fontsource (was render-blocking Google Fonts CDN), eliminated a forced-reflow via matchMedia, removed user-scalable=no, added
landmark + progressbar aria-label, darkened --ink-3 for WCAG AA. Accessibility 88 -> 97, Best Practices 100. Remaining font-perf work tracked in SUMO-29. Data accuracy - Corrected the foreign-born share dek (40% -> 24%, now matches the live banzuke). Ongoing day-by-day data refreshes for basho 202605.
Follow-up: SUMO-29 (font subsetting / async loading for Performance 95+).
-
v1.1.0 Historical depth + visualization polish
First post-launch milestone. Captures the SUMO-1 / SUMO-3 / SUMO-20 / SUMO-21 / SUMO-23 / SUMO-24 / SUMO-26 batch as a coherent "historical depth + scoreboard polish" phase.
Highlights
- SUMO-1 - Tier 1 historical ingest (1958-present, ~67 years, 112,956 bouts).
historical.jsonshipped alongsidederived.jsonso the dashboard reads career-relative context without bloating the live snapshot. - SUMO-3 - Career-relative historical anchors sprinkled into the Now page (Athletes, Leaders, Stables, Origins, Bodies, last-basho board).
- SUMO-20 - Section 03 paired banzuke view rebuilt: one-line wrestler cards with cumulative-wins sparkline of the previous basho, rank-movement indicators (↑/↓ with in-family slot delta), tier-colored shikona, gold yusho sparkline + ★.
- SUMO-21 - Opponent IDs lifted into derived data; sansho (special-prize) winners surfaced.
- SUMO-23 - Yokozuna lineage Gantt + foreign-born share sparkline on /history.
- SUMO-24 - Four-section viz upgrade:
- §14 Origins long-tail collapsed behind
+N more - §16 Lens 2 rebuilt as a 60-day basho-cycle strip (×6 = a year)
- §17 Kimarite rebuilt as a 7-family card grid
- §19 Moves got a per-tier belt-vs-strike split bar
- §14 Origins long-tail collapsed behind
- SUMO-26 - Coverage + pipeline stat strips on /methodology, Stack section regrouped into Core vs Tooling.
- Footer tagline refreshed: "Apple silicon. American ingenuity. Irrational optimism. The clankers wrote it. We argued about it."
Under the hood
BanzukeEntry.prevBashoschema extended with rank/rankFamily/rankNumber/rankValue- Astro scoped-styles drop pattern: default to
<style is:global>for components with >5 distinct class names (codified in AGENTS.md gotchas) derived.jsonmerge conflict pattern: regenerate viagit checkout --theirs && npm run data:build(codified in AGENTS.md gotchas)package.jsonVersioning section + SemVer heuristic table added to AGENTS.md
Live: https://sumofans.com
- SUMO-1 - Tier 1 historical ingest (1958-present, ~67 years, 112,956 bouts).
-
v1.0.0 Sumofans.com public launch
First public launch of sumofans.com — a static, opinionated atlas of Makuuchi (professional sumo's top division). Built in Astro, deployed via Cloudflare Pages.
What's in v1
Dashboard (single page, 19 sections)
Foundations — Glossary, Rules, Reading the rankings, Six divisions, The year (schedule), Garb & gear Tournaments — Live basho board with yusho-race banner, Previous basho 15-day grid, Outcome sankey, Recent champions People & places — Athletes (42 sekitori cards), Career leaders, Stables (heya bars), Origins, Bodies (weight distribution), Math of a year Techniques — Kimarite, Sunburst, Moves by rank
Methodology
/methodology— How it works (sources, pipeline, architecture, stack)/methodology/data— schema + calculations with Stripe/Anthropic-style API docs (real-value examples sliced from the live derived.json)/methodology/caveats— approximations & known limitations
Navigation
- Collapsible left sidebar with 4 thematic groups + per-context persistence
- Sticky right-side TOC on methodology pages (auto-builds from h2 + section-level h3)
- Mobile sticky top bar with hamburger + auto-hide-on-scroll
- Live-basho indicator (pulsing red dot + LIVE chip) in the sidebar when a basho is running
Brand
- Sumi-ink-on-parchment palette (no
#fff— pure white was rejected on visual grounds) - Chapter-rhythm section backgrounds (
--paperfor group-starts,--paper-2inside groups) - Consistent bout-result iconography (○ win, ● loss, ▢ absent, dotted unplayed)
- Hand-rolled SVG visualizations (sankey, sunburst, weight distribution) — no chart libs
- Anonymized build footer (git hash + sanitized branch + dirty flag)
Infra
- Static-only deploy: every byte read from
src/data/derived.jsonat build time - Cloudflare Pages with PR previews at unique
<hash>.sumofans-com.pages.devURLs - Apex
sumofans.com(HTTPS, HSTS, Full-Strict),www301-redirects to apex - SEO basics: full OG tags, Twitter cards, sitemap, robots.txt, distinct page titles + descriptions
Mobile guardrails (SUMO-18/19)
overflow-x: hidden+touch-action: pan-yat the html/body level- Comprehensive
minmax(0, 1fr)sweep across all grid templates (Safari/WebKit min-content propagation) - Seven dense desktop sections (live basho, last basho, schedule, recent yusho, stables, year breakdown, moves by rank) hidden at ≤700px via
data-mobile-hide="true"with a single banner explaining: "Optimized for desktop" - Real mobile redesign deferred to v2
v1 issues closed
Issue Title SUMO-2 Provision sumofans.com on Cloudflare and wire up Pages deploy SUMO-5 SEO basics: titles, meta, OG tags, robots, sitemap SUMO-9 Improve navigation SUMO-10 Reorder tournaments section SUMO-11 Expand aperture of methodology & data sources SUMO-12 Refactor sidebar numbering and ordering SUMO-13 Drop "methodology →" link in top-right header SUMO-14 Bodies & life group expanded on methodology pages SUMO-16 Enrich Live tournament section header SUMO-18 Refactor for responsive experience SUMO-19 Remove white space below section 19 Deferred to v2
- SUMO-1 — Live-basho data refresh automation (CF cron +
gh workflow run) - SUMO-6 — Real subscribe form (Resend or Buttondown)
- Historical data ingest (1958–present via sumo-api)
- Real mobile pass for the seven hidden desktop sections
Stack
Astro 5 (static SSG) · TypeScript · plain CSS with custom-property design tokens · vanilla TS for interactivity · hand-rolled SVG for all visualizations ·
tsxfor pipeline scripts ·@resvg/resvg-jsfor OG image rendering ·@astrojs/sitemap· Node 22 · Cloudflare Pages