Feature #187: landing page with animated GIFs #188
No reviewers
Labels
No labels
actions
bug
cli
duplicate
enhancement
fork
forum
git storage
help wanted
insights
invalid
issues
moderation
oidc
ownership transfer
packages
pr/merge protection rules
projects
pull requests
question
releases
sponsorships
tags
webhooks
wiki
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
crueber/walhub!188
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/issue-187"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Implements Forgejo issue #187 per the plan + R1 (R1 normative on conflict) + review findings.
What changed
Backend (
internal/server, doc 06 §§3.1/3.3 + Decisions):GET /explore(explorePage) next toGET /(spaHome, now shell-only). Chi static-beats-wildcard ordering; without it/explorefalls into the/*wildcard's single-segment owner shape.?format=text(or text/plain Accept w/o text/html) MOVED/→/explore(S1; pre-1.0 no-alias — one canonical home, no silent alias, no 308)./answers the shell unconditionally.explorejoins the reserved single-segment UI names (owner literally namedexploreloses only its/:ownerUI page; N2 self-link loop named in the note).uiAsset:concepts/<name>.gif→dist/concepts/,image/gifMIME, no-cache + ETag (never immutable — B1, served prefix pinned/_ui/concepts/).compressbypassesimage/*(B2; notes the pre-existing doc/code drift — 12 §3 implied a content-type gate the code never had).Frontend (doc 12 §§2.3/2.3.0 + Decisions):
/→ newLanding.jsx(hero in README L3–5 language + 3 CTAs + walgit compat line, 4 alternating concept sections,#quickstartstrip with the README push block + auth/SSH one-liners). Zero API calls (nouseData/SDK/fetch— pinned by test)./explore→Owners.jsx(logic unchanged — caps/order/stars/activity/overflow; intro slimmed to one-liner + "What is walhub? → /"). Navowners → /becomesexplore → /explore(brand stays/);*fallback renders Landing.ConceptGif.jsx: still-first (-still.gifrenders immediately +<noscript>), animated swap only whenprefers-reduced-motiondoes NOT match (change listener),loading="lazy"+decoding="async"+ 640×360, plainimg altonly (N1).Generator (
internal/devtools/landinggif/, stdlib only, no new Go modules / no new npm deps):font.go(hand-drawn full-ASCII 5x7, typed shape literals — N5),draw.go(rects/outlines/arrows/2× text/captions),main.go(collab-first scenes, S3),main_test.go(full-ASCII + scene-text coverage — the missing-3class fails loudly; determinism; timing floors; golden freshness; byte budgets).make landing-gifsis MANUAL (B3 — not amake webprerequisite); 8 checked-in files inweb/public/concepts/(vite copiespublic/→dist/verbatim; zero embed changes).Frame timings (storyboard acceptance)
push
200 50 50 60 180 180 200(~8.0s) · bucket200 60 200 60 50 50 220(~8.4s) · fetch200 60 150 50 200 200(~7.1s) · collab200 60 150 150 150 200 200(~9.1s). Key holds ≥ 1.8s, motion steps ≥ 0.5s (floor 40, N4), ≤ 3 moving elements/frame, numbered captions on every frame. Sizes: push 16,773 · bucket 17,793 · fetch 15,874 · collab 22,912 · stills ~2–2.5 KB each · total 82,618 bytes (budgets ≤ 30/30/30/40 KB, total ≤ 150 KB — see EVIDENCE.md E12).Verification
make fmt && make vetclean;go test -race ./internal/server/ok;make cover48 packages ≥ 95% (server 95.6%);go test ./internal/devtools/landinggif/green (incl. golden freshness).node --test web/test/unit/*.test.js: 386 pass (incl. newlanding.test.js: routes/nav/CTA+alt pins,/_ui/prefix, zero-API-call rule, owners move).git diff go.mod go.sum package.json pnpm-lock.yamlempty — no new deps either ecosystem./o/r/badsub→ 404 plain text (S2 — never reaches the SPA; Solid nested router keeps shell-with-empty-outlet for matched repo paths);/explore?format=text→ owner list;/?format=text→ HTML shell; GIF servesimage/gif200 uncompressed underAccept-Encoding: gzipwhile hashed JS still gzips.walgit.localhost:8089):/dark+light (H1 renders, 4 animated GIFs 640 wide),/reduced-motion (4 stills),/exploredark (Owners + slimmed intro) — 4/4 clean, zero console errors. Screenshots: seegifcheck/cdp-*.png(attached from the drive below; CDP script kept outside the repo).Deviations from plan + R1
None material. One nit-level judgment call:
bucket.gifships 7 frames (the "2 sub-frames ×50" read-highlight split from the storyboard) rather than 6 — inside the 6–7 budget row and the 30 KB ceiling.