Writing
Notes from the hard parts.
Essays on the product and engineering decisions behind reliable tools: trust boundaries, local-first storage, hidden infrastructure, and interface restraint.
Featured note
May 9, 2026
The hard part of Island Watch wasn't the map
Designing a trust layer for Vancouver Island public updates.
Island Watch looks like a map dashboard, but the harder work is source freshness, alert normalization, route relevance, official handoff, and spatial trust.
Read articleIsland Watch
Public data, source trust, regional status, and civic product boundaries.
ChessIQ
Browser-native engine analysis, training generation, local storage, and trust in move labels.
Archive (12)
May 17, 2026
Building a Chess Coach That Shows Its Work
ChessIQ's Patterns page was rebuilt around a simple trust rule: if the app says something keeps happening, it has to show the games, moves, confidence, and training path behind the claim.
May 15, 2026
How ChessIQ Turns Statistics Into a Player Portrait
ChessIQ's statistics surface turns local reviewed-game history into a living five-factor player portrait while keeping confidence, sample size, and visual restraint part of the contract.
May 2, 2026
How ChessIQ Generates Training Positions
Training positions in ChessIQ come from your reviewed games, not scraped databases, with engine-verified proof and scheduling logic that surfaces what you actually need to learn.
April 30, 2026
ChessIQ's Analysis Engine Just Got More Honest
ChessIQ fixed a series of small but critical analysis bugs so labels, accuracy, and puzzle generation now reflect finished engine output, not unfinished guesses.
April 27, 2026
Why I Built Island Watch
Island Watch started from a practical regional problem: Vancouver Island status information is fragmented across public feeds, agency pages, and source-specific tools.
April 7, 2026
Designing Mobile-First Analysis UX for Serious Study
Serious mobile analysis worked once the board became a hard layout constraint, navigation was optimized for fast scrubbing, and advanced controls moved out of the primary study path.
March 31, 2026
How I Validate Move Classification Quality
Move labels became more trustworthy once harsh judgments had to pass depth, stability, mate context, ambiguity, and regression checks.
March 24, 2026
Why I Stopped Trusting Browser Multithreading Checks
Feature detection can say multithreading is supported, but only runtime validation, fallback paths, and recovery logic make browser-native analysis reliable.
March 17, 2026
Running a Chess Engine in the Browser Isn’t the Hard Part
Browser Stockfish integration was straightforward; designing stable, trustworthy continuous analysis required explicit promotion rules.
March 10, 2026
How I Escaped the localStorage Limit Without Rewriting My App
A storage migration that kept the app feeling synchronous while moving heavy PGN and engine-analysis data into IndexedDB.
February 24, 2026
How I Designed ChessIQ Around Repeated Real Use
Repeated use shaped ChessIQ more than planning did: weak features got cut, study flow stayed central, and analysis quality became the product constraint.
February 10, 2026
Why I Built ChessIQ
ChessIQ started as a focused answer to one product problem: make post-game review dependable enough to become a real study habit.