Skip to content
大相撲 SumoFans
夏場所 Natsu (Summer)

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.

  1. 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.

  2. 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:icons regenerates the icon family from the baked 大 path.
    • Footer fix - the data-range arrow now sits centred against the mono digits.
  3. 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 /history reigns 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.
  4. 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:refresh helper.
    • 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.
  5. 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.

  6. 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).

  7. 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_GLOSS extended 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.

  8. v1.10.0

    Kabu entity

    Adds /kabu and 104 per-kabu lineage pages as the fifth profileable entity on sumofans, alongside Rikishi, Heya, Basho, and the dashboard.

    Shipped

    • /kabu directory — 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, and N gen · Xy depth/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
      • PostActiveBlock terminal block on /rikishi/[id] (99 active oyakata matched)
      • Now row in the rikishi infobox showing kabu held + JSA role
      • Run 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 KabuLink decorates 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 at data/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=Y two-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/

  9. 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.ts pipeline now reads from both sumo-api's current roster and the 558-strong historical Makuuchi bio set in data/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 /rikishi directory (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/

  10. 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 RikishiLink is used. Touch devices opt out via matchMedia('(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.astro now writes a data-photo attribute onto each linked shikona when the photo cache has a real entry. A single floating preview lives on <body> (set up in Base.astro); pointer-events: none so the cursor never lands on it. The marker affordance (red dotted underline) and the hover-preview compose cleanly — both are entity-agnostic and apply wherever RikishiLink is used.

    What's next (v1.10.0 candidates)

    • /kimarite/[slug] per-technique pages (SUMO-47)
    • /compare?a=X&b=Y two-rikishi compare (SUMO-56)
    • /kabu elder-name lineage (SUMO-57)

    Read the archive: https://sumofans.com/releases/

  11. 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.
    • /releases archive — 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.xml for 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=Y two-rikishi compare (SUMO-56)
    • /kabu elder-name lineage (SUMO-57)
    • Email polish pass — render markdown as HTML in the release email (SUMO-70)

    Read the archive: https://sumofans.com/releases/

  12. 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 /glossary route 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 + /basho directory 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 (大相撲 SumoFans in 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 /compare two-rikishi page
    • SUMO-57 /kabu elder-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
  13. 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).

  14. 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).

  15. 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:

  16. 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+).

  17. 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.json shipped alongside derived.json so 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
    • 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.prevBasho schema 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.json merge conflict pattern: regenerate via git checkout --theirs && npm run data:build (codified in AGENTS.md gotchas)
    • package.json Versioning section + SemVer heuristic table added to AGENTS.md

    Live: https://sumofans.com

  18. 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 (--paper for group-starts, --paper-2 inside 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.json at build time
    • Cloudflare Pages with PR previews at unique <hash>.sumofans-com.pages.dev URLs
    • Apex sumofans.com (HTTPS, HSTS, Full-Strict), www 301-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-y at 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 · tsx for pipeline scripts · @resvg/resvg-js for OG image rendering · @astrojs/sitemap · Node 22 · Cloudflare Pages