Blog

Thoughts on software engineering, web development, and technology

S
Sam Lee

When the CI Job Ended but the Migration Kept Running

Failing, cancelling or timing out a GitHub Actions job doesn't stop the ECS task it started. Now a cleanup step stops the task, and a guard refuses to start a second migration while one is still alive.

Sep 14, 2026·GitHub Actions
S
Sam Lee

The Session Cleanup That Crashed Every 15 Minutes

An Etherpad upgrade added a session cleanup that loads every session key at once, and it crashed our dev instance about every 15 minutes. Etherpad already ships a setting to turn it off, as long as the value ends up a real boolean false.

Sep 10, 2026·Etherpad
S
Sam Lee

When a Failed Lookup Looks Like 'No Access'

Our app's boot code merged "the backend says you have no organization" and "the lookup failed" into one boolean, so a backend brownout told healthy users their access was gone. Carrying the reason with the decision fixed it.

Sep 07, 2026·TypeScript
S
Sam Lee

When an Imported Metric Has to Forget Its Source

Deleting an imported metric could reuse an existing archive feature. Turning it into a manual metric meant keeping its history but clearing every trace of where it came from.

Aug 24, 2026·sync
S
Sam Lee

Keeping Form Entries Alive With sessionStorage

A sign-up form only caught a taken email at the very last step. A Back button and a small, safe sessionStorage helper let users fix it without retyping.

Aug 17, 2026·sessionStorage
S
Sam Lee

When Frequency Became Part of a Metric's Identity

Changing how often an imported metric is measured can't be a simple edit. So frequency became part of what makes a metric unique, and a change became a fresh import.

Aug 10, 2026·Data Modeling
S
Sam Lee

Connected, Expired, Disconnected, Available: Four States, No Migration

A single yes/no field couldn't tell an expired authorization from a user who disconnected. The imported metrics already knew the difference, so the new state came from existing data, not a schema change.

Aug 03, 2026·OAuth
S
Sam Lee

When Your Feature Flag Only Covers the Frontend

We shipped a new page in small pieces behind a frontend feature flag. The flag hid the page, not the backend, so every backend piece had to be safe in production.

Jul 27, 2026·Feature Flags
S
Sam Lee

When Every Funnel Visit Needs Exactly One Ending

Adding analytics events to a setup flow took one line each. The real work was making sure every visit ends in exactly one way.

Jul 20, 2026·PostHog
S
Sam Lee

Warning Users Before They Leave a Half-Finished Flow

A leave warning for a three-step import flow. The modal was simple; deciding when not to show it was the real work.

Jul 13, 2026·React

Built by Sam Lee with

 ♥