Josh Estrada
Back to work
Personal · Web App · Solo Designer & Developer

Paste a chess game, get a narrated story. Most shared chess games are just move lists. KibitzShare adds position analysis and plain-language narration so the recipient actually follows what happened.

Live Demo

See a narrated replay

Step through the story. Every move has context, every phase has narration.

Client-side analysis, server-side narration

Stockfish WASM runs in the browser, so position evaluation has zero server cost. Only narration hits the server. Adding users does not add compute load for analysis.

Hybrid LLM + template fallback

If the LLM fails, template-based narration takes over. The sequence is: first attempt, retry, then template fallback. Something always renders.

UX over AI-feeling

Main challenge: making it feel polished, not like generic AI output. Custom typography, real chess iconography, and narration that reads like commentary rather than a summary.

System Architecture

Designing the analysis engine

How a chess game goes from raw notation to narrated story. The heavy computation runs in the browser, narration happens on the server, and templates catch failures.

Raw PGN
1. e4 e5 2. Nf3 Nc6
12. Bxf7+ Kxf7
27. Qd7# 1-0
40+ moves of notation,
zero context or story
analyzes
Analysis Engine
Client-Side Stockfish
WASM in browser — zero server cost
Every position evaluated locally
browser
stockfish.wasm
eval[]
Server Narration
Claude Haiku — fast, cheap
Detects arc: comeback, tactical, grind
Hybrid Fallback
1
LLM attempt
2
retry on parse failure
3
template fallback — always renders
generates
Narrated Replay
Interactive board + story
No chess knowledge required
PGN hash dedup (instant)
Shareable link — the game
as a guided narrative
Component anatomy

From notation to narrated replay

The pipeline has three stages. First the PGN is parsed and validated. Then Stockfish evaluates every position. Finally, the narration layer writes commentary for the key moments.

Sender
Game Notation
https://lichess.org/K4rGzEBe
Auto-detect Comeback Tactic Trap
Create Replay
42 moves parsed
# Hash: a7f3c2
"What game is this?"
PARSING
PGN or game link to structured move data

Users paste raw PGN or a game link from Lichess or Chess.com. The parser extracts headers and validates each move, then generates a hash for deduplication. If that hash already exists, the cached narration is served instead of re-running the pipeline.

Design decision PGN hash deduplication means the same game never costs a second API call. Paste the same notation twice, get the cached narration instantly.
Pipeline
Client
Stockfish WASM
Position evaluation — $0 server cost
Server
Claude Haiku
Narration generation — fast, cheap
Fallback
Template engine
Always renders — no blank screens
"What happened in this game?"
ARCHITECTURE
3-tier analysis pipeline

Analysis is split across three tiers. Stockfish WASM handles position evaluation entirely in the browser, which is the most compute-heavy step. Narration goes to Claude Haiku on the server. If Haiku is down or slow, a template engine writes the commentary instead so the user never sees an empty page.

Cost architecture Position evaluation is the expensive part, and it runs on the user's machine. The server only handles narration, which is a single LLM call per game.
Replay
The Rook Sacrifice
White castles queenside and sacrifices a full rook to rip open the position.
The rook crashes into d7, daring Black to take back.
Move 13 of 34
kibitzshare.com/r/a7f3c2
"What's the story of this game?"
OUTPUT
Interactive narrated replay

The output is a shareable replay with an interactive board and move-by-move narration. The game is divided into story arc phases — opening, tension, turning point, resolution — so even non-chess-players can follow the drama.

UX decision Story arc labels replace engine evaluation scores. The recipient doesn't need to understand centipawns — they see a narrative structure with dramatic context.