Document Work and To-do as the two product concepts, synchronize every shipped locale, publish the six-tool and typed-image contracts, and keep static web generation offline while live GitHub chrome refreshes after deployment.
The wire exists to put the people behind the repository on the front page. dependabot[bot] dependency bumps and github-actions[bot] close sweeps were spending slots that belong to human contributors — the same crowding-out the draft filter already addressed.
Decision handed to me by the ticker work: filter by GitHub's own [bot] login suffix (its verdict, not our inference). Bot-authored issues and pulls stay off entirely; a published release keeps its slot no matter who pushed the button, but a bot publisher's byline is dropped instead of named.
Two new tests pin the filter and the byline-less release.
The ticker printed `ISS #1234 title · 3h` for whatever the issues and pulls
endpoints last touched. It proved the repo was awake and nothing else: no
merges, no releases, no names, and English chrome on nine translated pages.
It now reports events, in the reader's language, with the person who did the
work named:
- Merged pull requests carry the contributor's handle. `merged_at`,
`author_association`, and the login all arrive in the list payload we
already fetch, so naming @bistack or @shenjackyuanjie beside their merge
costs nothing extra.
- Opened and closed issues carry who filed them.
- Releases appear. That is the one added endpoint — `/releases?per_page=5`,
cached an hour, ~1 request/hour. Three cached calls total, ~13 req/h
unauthenticated against GitHub's 60/h/IP, and no per-item follow-ups.
- GitHub's own FIRST_TIME_CONTRIBUTOR verdict marks a newcomer's
contribution. Copied verbatim, never inferred from the size of the window
we happened to fetch, and it stops on its own as GitHub recomputes it.
Two honesty fixes the live render forced:
Each verb is now dated by its own event — `merged_at`, `closed_at`,
`published_at` — not by `updatedAt`. An issue opened in March and commented
on this morning was reading as "opened, 12 minutes ago".
Drafts are gone from the strip. A draft is its author's own not-ready
marker, and on this repo agents open them in batches: five of the twenty
items in the first live check were draft PRs from one bot, crowding out the
merges. They return the moment they are opened or merged.
A busy week could also bury the newest release entirely, so a release
published in the last sixty days keeps a slot — carrying its real date, so a
quiet quarter still reads as a quiet quarter rather than pinning an old tag
beside today's merges.
Verbs, the by-line, the first-contribution mark, and the strip's aria-label
are dictionary keys in all ten locales; titles, tags, and handles are the
repository's own record and stay verbatim. Ages format through CLDR off the
locale's existing `dateLocale`, the same way the masthead already sets its
date, with the compact English form as fallback where Intl data is missing.
Empty stays empty: an unreachable or fully-filtered feed removes the strip
rather than rendering a skeleton. Reduced motion now lets the frozen track
scroll instead of clipping every entry past the fold.
Verified: tsc, check:locales, check:facts, check:docs, 248 tests, lint, and a
288-page production build all clean. Live `next dev` against the real repo
rendered 15 entries on /en and /zh — merges by @Inference1 and @h3c-hexin,
issues by @vFONGv, @bistack, @shenjackyuanjie, @rafaelcavalheri, the v0.9.3
release, Chinese verbs and relative times throughout. Pointed at an
unreachable repo, both locales render fully with no ticker and no leaked
dictionary tokens.
Show a live GitHub star count in the nav ("* 39.3k" style) via the
already-cached fetchRepoStats path, with a plain "GitHub" fallback when
the API is unreachable at build time. The "Issue YYYY-MM-DD" date strip
now reads the real version from lib/facts.generated.ts (FACTS.version)
instead of the hardcoded "v0.8.x". formatStars lives in lib/github.ts
so the homepage can reuse it.
Top nav trims to Install / Docs / Community / FAQ; Community points at
the existing /feed page (no new pages this phase). Runtime and
Community Digest move into the footer columns (en and zh) so
Roadmap/Digest/Contribute/Runtime all stay reachable.
Tests: cd web && npm run lint (pass); npm test (3 files, 23 tests
passed); npm run check:facts (OK — matches workspace); npm run build
(pass, all locale routes SSG). Run on the full phase-1 tree.
* test(web): add unit tests for pure helper functions
Add vitest configuration and tests for:
- relativeTime: time formatting (just now, minutes, hours, days, months, years)
- lastPageFromLink: GitHub Link header pagination parsing
These are the first tests for the web frontend. The test framework
(vitest) was already in package.json but had no config or test files.
* test(web): exercise real GitHub helpers
---------
Co-authored-by: Hu Qiantao <huqiantao@HudeMacBook-Air.local>
Co-authored-by: Hunter B <hmbown@gmail.com>
First commit of the Next.js community site that powers
deepseek-tui.com, deployed via Cloudflare Workers / OpenNext.
This commit lands the scaffold and applies the visual + correctness
pass requested by community feedback:
- Palette: drop the cream/Anthropic-feel paper (#F4F1E8) for a
DeepSeek-aligned cool white + soft gray (#FFFFFF / #F4F6FB), with
indigo accents kept. Soften default hairlines so a pure-white
background reads clean instead of harsh.
- Mobile: add a hamburger menu (mobile-menu.tsx) so phones can reach
Install / Docs / Activity / Roadmap / Contribute — previously the
link list was hidden on phones with no replacement. Tighter hero,
flexible button row, viewport-safe code blocks, columnar grids
collapse cleanly under 768px, and the printed-almanac center rule
is desktop-only now (it sliced through narrow viewports).
- "How it works" diagram: replace the hand-rolled ASCII art (which
misaligned under CJK monospace because Han characters take 2
columns vs Latin's 1, per dhh's note in WeChat) with a real
mermaid diagram rendered client-side via dynamic import. Uses the
mermaid.live standard syntax 庄表伟 recommended.
- Issue #1104: the docs listed a `deepseek-cn` provider that the
v0.8.16 binary doesn't accept (`ProviderArg` in crates/cli only
has 9 variants; the 10th lives only in the legacy tui/config.rs).
derive-facts.mjs now omits `deepseek-cn` until that variant is
wired through the shared ProviderKind, and the install page's
China-network recipe uses `base_url` / `DEEPSEEK_BASE_URL` (which
actually works on v0.8.16) instead of the unsupported provider.
Auto-deploys via .github/workflows/deploy-web.yml on push to main.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>