Articles, side projects, and stories, filterable by tag. Select multiple tags to narrow to posts that match all of them.
Aug 2026
Learning LangGraph by building a clinical guideline assistant.
This project was an opportunity to experiment with LangChain and LangGraph by building a grounded Q&A tool over clinical guidelines. It uses guardrails, retrieval,...
Aug 2026
A feature request for the Brooklyn Public Library hold shelf.
I use the Brooklyn Public Library a lot. When you request an item and it becomes available, it gets pulled and held on a...
Aug 2026
Agentic Workflow Builder: Test Bench
An LLM call doesn’t always return the same output twice, so you can’t assert on specific outputs like in traditional software testing. As a...
Aug 2026
Agentic Workflow Builder: Questionnaire
Before a workflow gets built, someone has to decide it’s worth building. This is a look at a short, structured intake for that decision,...
Aug 2026
Sharing Claude Code skills across projects.
Copy-pasting a skill into a second repo is the same DRY problem as copy-pasting code
Aug 2026
Agentic Workflow Builder: Canvas Prototype
Agentic workflows are showing up everywhere, but most companies that want one don’t have the in-house expertise to build it. This is an early...
Aug 2026
Software factory built from Claude Skills.
The “software factory” idea going around the industry right now, described well here, is many harnessed loops fed by a queue of work and...
Jul 2026
Async refinement replaces the requirements meeting.
The requirements meeting has a cost
Jul 2026
DoggieDo: A Dog Owner Discovery App
Crystal and I built DoggieDo, an app for dog owners to find dog-friendly places nearby and keep a profile for their dog. We shelved...
Jun 2026
Work Blocks: A Pomodoro Scheduler
Early in covid, a lot of people were suddenly working remote with a workday that had bookends but no structure in between. Crystal and...
Jun 2026
A New Cove at Bushwick Inlet Park
Recently, Crystal and I went to the new cove section of Bushwick Inlet Park with Jupiter. It sits on Franklin between N 12th and...
Jun 2026
Fractional engineering work after a startup's venture-scale plan falters.
A venture-scale plan can falter without the business dying
May 2026
We're out of dog food
There was almost always something they needed to solve in the morning. Sometimes, they ran out of coffee and it was off to the...
May 2026
Sunny day
The radio was on low. The kids were at the counter in their pajamas, eating Cheerios. She rinsed her bowl.
May 2026
Train to Train
A subway trivia game I built with Crystal. She came up with the concept and did the UI; I wrote the data layer and...
May 2026
FHIR and BCDA.
At work, we built an ingest pipeline against CMS’s Beneficiary Claims Data API (BCDA), pulling ExplanationOfBenefit, Claim, and Patient data to give downstream systems...
May 2026
Each integration gets its own role.
The team runs a fleet of vendor integrations: two flat-file vendors it pulls from over SFTP, a third that pushes files into an SFTP...
May 2026
Modular design decision docs.
Alignment lives at the facet level
May 2026
Apache Iceberg internals: snapshots, manifests, and time travel.
A scheduled merge into dim_members overwrote the member_id for a few hundred rows. The job had run the same way every day for months....
May 2026
Testing your data contracts with dbt: schema tests, custom tests, and CI.
In the last post, we built out the model structure: staging, intermediate, marts. This post is about testing it: asserting that what those models...
May 2026
Misty Turns Thirty
This past weekend my dad and I flew down to Atlanta, rented a car, and drove out to our hometown of Cartersville, Georgia for...
May 2026
dbt models, refs, and sources — a practical intro.
In the last post, we talked about the ownership problem: the transformation layer had grown into logic copied between notebooks and SQL duplicated across...
May 2026
Treating the transformation layer as a product.
A transformation layer accumulates duplicate logic fast. An analyst needs a number, writes a script, and pushes the result to a table in Postgres....