Blog

Notes from building software: experiments, debugging trails, product decisions, and the tools that make the work easier to understand.

Building an AI project intake with ChatGPT Sites

A prompt-to-production experiment with ChatGPT Sites, including the design pass, the missing-data mistake, durable submissions, and a private admin view.

BW / GI

Give Codex the tweet and let it run the claim to ground

A post-work audit of giving Codex an alarming SSD-wear tweet, letting it choose and run the diagnostics, and checking whether the conclusion was actually earned.

BW / BU

Building a force-directed graph one desire at a time

Build a readable graph by turning springs, flow, collision, and fringe behavior into small desires you can inspect one tick at a time.

Learning to zoom out a data-flow visualization

A visual log of the TSX Data Flow views that were too detailed, too flat, or too noisy—and the design rules emerging from a route-scoped topology view.

When static analysis invents a recursive component graph

A Suspense cycle exposed a component-identity problem in TSX Data Flow: merging render occurrences by name can manufacture paths that do not exist.

Tuning a force-directed graph with visible controls

A visual debugging log of turning a graph layout from a black box into a system I could step, inspect, reverse, and tune on screen.

Photographing hand-drawn comics for booklet printing

How I added photographed page layers, grayscale and black-and-white controls, and disk-backed image storage to a printable comic-book editor.

Introducing Coach Companion

A soccer rotation planner built around the actual coaching job: get a fair first draft, make the judgment calls visible, and carry one clear plan to the field.

What Coach Companion changed about my development workflow

How a dictated product plan, a long browser QA pass, and repeated development friction turned into better scripts, repository rules, domain invariants, and verification defaults.

BW / LE

Letting a starter repo learn from the projects cloned from it

A practical workflow for reviewing agent threads, finding reusable improvements in projects derived from a common starter, and feeding the useful parts back into the next project.

The invisible backdrop filter that blanked my code blocks

A one-line backdrop blur on an invisible copy button made Chrome intermittently stop painting code-heavy MDX articles. The DOM stayed correct; the compositor did not.

Making slow static analysis explain itself

How tsx-dataflow moved analysis into a worker thread and added real per-file progress over SSE, turning an apparently locked page into an inspectable workflow.

When a 5 MB Git push times out after the upload finishes

A GitHub HTTPS push returned HTTP 408 after every byte arrived. The useful clues were in the curl trace, and the practical fix was to push the image objects in smaller batches.

BW / RE

Review the product assumptions before the architecture

A practical way to review technical plans by asking product questions first, then letting the answers determine the architecture—especially when agents will write much of the implementation.

Testing OpenGraph images with a contact sheet

I built a small contact-sheet workflow for comparing real OpenGraph route renders and catching visual failures that were easy to miss one image at a time.

Rebuilding TSX Data Flow around TypeScript and SolidJS

How I used a concrete Codex goal, a written migration plan, typed API contracts, and visual comparison to replace a mixed JavaScript and generated-HTML architecture with a smaller TypeScript and SolidJS application.

BW / CA

Canvas interactivity basics

An interactive guide to scene models, hit testing, hover overlays, and drag-pan camera math for canvas-based interfaces.

BW / US

Using Codex as a bridge between browser apps

A lightweight workflow for turning information from one browser app into calendar entries and reference notes in another, using Codex and appshots as the coordination layer.

Encoding time on the canvas to debug Pluck inventory panning

A Pluck debugging note about turning pan-and-zoom viewport history into a visual overlay: the canvas stays spatial, while time becomes a trace.

Forcing Suspense boundaries from a tiny debug overlay

A Pluck debugging note about wrapping Solid Suspense boundaries with dev-only controls so loading states can be inspected on demand.

Iterating a comic-book app icon with contact sheets

A short walkthrough of turning a generated PNG into SVG app icons by using a contact sheet to compare every iteration.

BW / OP

OpenAI prompt caching with prompt_cache_key and cached_tokens

How Video to Context structures repeated OpenAI Responses API calls so long transcript context can hit the prompt cache, report cached tokens, and make cost visible.

Breaking top-level Suspense into component-level Suspense

How a SolidJS loading state got smoother by keeping the page shell mounted and moving resource reads behind local Suspense boundaries.

BW / UN

Understanding SolidJS resources

An interactive guide to how SolidJS resources interact with Suspense, resource.latest, derived accessors, and memoized reads.

Building a review UI for LLM-processed voice memos

How Video to Context grew from a transcription CLI into a local review workspace with sectioned transcripts, inline extracted evidence, and cost-aware LLM processing.

BW / PA

Packaging llmly for PyPI with a publish script

What it took to turn a local Flask usage viewer into a PyPI package, and why a small publish script makes versioning and token-based uploads much less error-prone.

BW / MA

Making Pluck capture faster by making the timings harder to ignore

I optimized Pluck's Chrome extension capture loop by adding detailed timing traces and a repeatable diagnostic batch that made every speed experiment measurable.

BW / TU

Turning voice memos into Codex-ready analysis

How I pushed Video to Context from transcription toward a Codex-backed analysis pipeline while keeping the CLI aimed at one command that just works.

BW / AD

Adding voice memo support to Video to Context

How I expanded a local screen-recording transcription CLI so one flag can process Apple Voice Memos into a reusable context folder.

Debugging background removal on a carpet-colored stuffed animal

A practical walkthrough of tuning rembg for a stuffed-animal zoo: threshold sweeps, mask repair, visual contact sheets, and a regeneration path for production images.

Expanding webpage tables when copy is the real feature

I added an Alt-click table viewer to my Chrome extension after needing exact DNS record values from a page that made table text hard to copy.

A small shared expense splitter for family trips

A quick static browser tool for importing shared expenses, tracking payments, and turning the final balance into a simple settlement plan.

BW / SP

Speeding up Pluck's full-page Chrome extension capture loop

Notes from optimizing Pluck's real Chrome extension full-page capture path from slow scroll-settle loops to sub-four-second captures on recent sites.

Why I made a pan-and-zoom viewer for webpage images

I wanted a faster way to inspect ChatGPT image generations, so I built a Chrome extension for browsing page images with pan, zoom, grids, and saved folders.

BW / RU

Running LibreChat on Coolify (and actually keeping it updated)

Notes from getting LibreChat running on Coolify: the env vars that matter, why the API serves the UI, and how to force upgrades to pull :latest.

BW / CO

Coming soon - building a threaded comments interface with React

I've built a good interface for viewing threaded comments on mobile interfaces.