Skip to content

Launch readiness: attribution, landing page, try-it, share cards, README - #11

Merged
aminghuf merged 5 commits into
mainfrom
launch-readiness
Oct 8, 2026
Merged

aminghuf merged 5 commits into
mainfrom
launch-readiness

Conversation

@aminghuf

@aminghuf aminghuf commented Oct 8, 2026

Copy link
Copy Markdown
Owner

Gets chesspirit.app ready for a public launch: attribution fixes, a landing page, a review flow that needs no account, shareable review links with PNG cards, and a README written for a Show HN post.

Attribution and repo hygiene

  • LICENSE puts back Copyright (c) 2026 the Patzer contributors above the Chesspirit line. MIT requires the original notice to be kept.
  • README (EN and FA) has a new Origins & credits section. The FAQ answer about Patzer now credits SikamikanikoBG.
  • The Docker examples, docker-compose.yml, the bug template and the FAQ use the chesspirit container and the chesspirit-data volume. The FAQ explains how an existing install keeps its patzer-data volume.
  • I left docker-compose.deploy.yml's patzer-data volume, /root/patzer and the Docker Hub …/patzer image name alone. Renaming them would orphan the live database or stop updates for anyone pulling that image.

Public site (opt-in: PUBLIC_SITE=true)

  • Landing page at / for logged-out visitors:
    • States "Free" and "Unlimited reviews" plainly.
    • Hero board replays the Opera Game with real grades.
    • Inline "try with your username" form.
    • Comparison strip against Chess.com's free plan: 1 review a day, per the Chess.com Help Center, checked 2026-10-08.
    • Four ways in: Register / Log in, docker run, curl … install.sh | sh, or from source.
    • GitHub link and a language switcher in all 6 languages.
  • /try reviews a public Chess.com or Lichess game without an account:
    • One analysis at a time, a queue of 5, 5 analyses per hour per address, TRY_DEPTH (default 14), games capped at 240 plies.
    • A game someone already reviewed opens instantly.
  • Household servers are unchanged. With the flag off, / goes to /login and /api/try returns 404.

Shareable reviews

  • Share review on an analysed game creates /r/:slug?utm_source=share plus a 1200×630 PNG card. The card shows accuracy, the !! moment (or Great move), the move you missed, move-class counts and a small chesspirit.app watermark.
  • The link unfurls with that card through Open Graph tags injected by the server.
  • The public page replays the game, and Find the better move turns the worst mistake into a puzzle.
  • Stop sharing deletes the link. The share stores a snapshot; it never exposes user_id or game_id.

Analytics

  • When UMAMI_WEBSITE_ID is set, the server adds the requested cloud.umami.is tag to index.html and opens the CSP to it. Unset (every self-hosted server), nothing changes.
  • Merging this turns on the public site, absolute share links and Umami for chesspirit.app: docker-compose.deploy.yml sets PUBLIC_SITE, PUBLIC_BASE_URL and UMAMI_WEBSITE_ID, and main auto-deploys.

README and demo

  • The README now opens with: a 3-line pitch, the demo GIF, the Try it link, one-command Docker, "What works without an LLM", share cards, the architecture diagram, Origins & credits, and the roadmap.
  • docs/demo/record-demo.mjs records the ≤15 s GIF and a captioned 60–90 s MP4 with Playwright and ffmpeg. The committed GIF was recorded on a local instance with historical games; re-record it on chesspirit.app with a real username.

Not done

  • Read-only demo account: the username try-it covers the "before sign-up" goal.
  • Capped demo coach: added to ROADMAP.md instead.

Tests

  • npm run typecheck and npx vitest run pass: 477 tests, including the new server/test/share.test.ts.
  • npm run build passes.
  • Checked end to end in Chromium against a local server with a mocked Chess.com API: landing (desktop, mobile, Persian dark), try → queue → review, puzzle solve, share dialog, logged-out share link, and household-mode redirects.
  • I did not build the Docker image locally (no Docker in this environment); CI builds it.

🤖 Generated with Claude Code

https://claude.ai/code/session_01BANAeunr22J7BzgopZzgWs


Generated by Claude Code

claude added 5 commits October 8, 2026 23:59
MIT requires the original notice, so LICENSE carries the Patzer line next to
Chesspirit's. The docker run / compose examples, issue template and FAQ now
use the chesspirit container and chesspirit-data volume; the FAQ explains
how an existing install keeps its patzer-data volume. Production deploy
files keep their names so the live data volume isn't orphaned.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BANAeunr22J7BzgopZzgWs
- /api/share: share/unshare an analysed game, public read by slug, and a
  1200x630 PNG card rendered with resvg and bundled Inter fonts.
- /api/try (PUBLIC_SITE only): list a public Chess.com/Lichess user's last
  games and analyse one without an account; single worker, short queue,
  per-address limits, TRY_DEPTH.
- index.html gets Open Graph tags on /r/:slug, and the Umami tag plus CSP
  allowance only when UMAMI_WEBSITE_ID is set.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BANAeunr22J7BzgopZzgWs
Landing (public sites only): free/unlimited pitch, live-graded hero board,
dated comparison with Chess.com's free plan, log in / register, and install
via docker run, curl or source, plus a language switcher. /try reviews a
public game without an account; /r/:slug replays a shared review with the
worst mistake as a puzzle. Share review button on the analyzer. Strings in
all six languages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BANAeunr22J7BzgopZzgWs
install.sh wraps the README's docker run with checks. The deploy compose
sets PUBLIC_SITE, PUBLIC_BASE_URL and UMAMI_WEBSITE_ID.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BANAeunr22J7BzgopZzgWs
Three-line pitch, demo GIF, Try it link, one-command Docker, what works
without an LLM, share cards, architecture, Origins & credits and roadmap.
docs/demo/record-demo.mjs records the GIF and a captioned 60-90 s video
with Playwright and ffmpeg.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BANAeunr22J7BzgopZzgWs
@aminghuf
aminghuf merged commit 4183c36 into main Oct 8, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants