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 article

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.