Jul 20, 2026 | 4 min read
Rethinking TypeScript Checks for Agentic Development
What changed when agents started writing most of the code, and why that made an always-on TypeScript checker a poor use of local memory.
Notes from work that taught me something concrete: integrations, backend systems, and the awkward details that only show up once the product is live.
Jul 20, 2026 | 4 min read
What changed when agents started writing most of the code, and why that made an always-on TypeScript checker a poor use of local memory.
May 03, 2026 | 5 min read
A practical way to share agent guidance across tools without turning one global file into an instruction dump.
Apr 19, 2026 | 7 min read
When a scheduled job can be invoked more than once at the same time, the reliable fix is not a distributed lock. It is one UPDATE … RETURNING that claims a row by flipping its status, plus a lease that recovers work if a run stalls.
Mar 31, 2026 | 6 min read
What helped while building a Teams integration for a real product, without pretending it is just one API and one happy path.
Jan 19, 2026 | 6 min read
The confusing part about shared channels in Teams is that your bot setup can be correct, reads can work, and regular message events can still fail unless the bot is explicitly mentioned.
May 05, 2025 | ClearFeed
A practical guide I wrote at ClearFeed on how engineering teams can test Slack apps without stepping on each other.
Apr 28, 2025 | 5 min read
We had logs in CloudWatch, but not in a form CloudWatch could really use. This is the pattern that split local and production formatting, preserved structure, and made Sentry point back to the right logs.
Aug 22, 2024 | 4 min read
How a deployment process with too many AWS-specific paths turned into one Slack-first release flow that people could actually use.
Nov 17, 2023 | 4 min read
A debugging story about a poller that looked healthy for years, then started hanging forever when the network dropped at exactly the wrong moment.
Nov 14, 2023 | 7 min read
In a Slack Connect channel, installing the same app on both workspaces does not mean you will receive two Events API deliveries. The fix starts with the event envelope, not the business logic.
Apr 19, 2023 | 7 min read
Once scheduled work runs across multiple app instances and tenant data, the hard part stops being cron syntax and starts being coordination.
Feb 01, 2023 | 7 min read
Default Sentry alerts for outbound HTTP failures were too generic to act on quickly. This is a pattern that works well: group by method, URL, and status, carry over the useful response body, and scrub the sensitive parts before the event leaves the process.
Dec 14, 2022 | 6 min read
We wanted logs to carry business identifiers automatically, not just request IDs. The useful lesson was that async context propagation is also a lifecycle problem, and a naive map-based store can quietly turn observability code into a memory leak.
Sep 14, 2022 | 4 min read
A practical pattern for dangerous cron jobs: do not trust staging alone, start with a tiny allowlist, and widen the blast radius in phases.
Mar 18, 2021 | 4 min read
What it took to build a manufacturing quote flow that looked beyond the outer shape of a 3D model and priced the harder details too.