Blog post
Blog posts
August 24, 2026
Backfills without double-counting
Loading history is easy; not corrupting what's already there is the skill. Idempotent loads, resumable batches, frozen snapshots, and the checks that…
ExploreAugust 20, 2026
Evals before autonomy: how to know your agent is ready
Before an agent runs unsupervised, build a golden set of 50–100 real historical cases, score agreement, read every mismatch honestly, and set…
ExploreAugust 17, 2026
The real cost of a WordPress plugin
Each plugin is third-party code with database access, an update treadmill, a performance tax, and attack surface. How sites hit 20 plugins, the…
ExploreAugust 13, 2026
What a $200-a-month data stack looks like
An itemized ledger — dlt, object storage, DuckDB, Dagster, Metabase — landing at $100–300 a month, what the $2k enterprise quote buys instead, and…
ExploreAugust 10, 2026
Prompt injection for operators: what your agent reads can hurt you
Instructions hidden in a ticket or email can steer your agent. Why filters can’t fully stop it, and the tool-layer defenses that shrink a hijack from…
ExploreAugust 6, 2026
Why every website change should be versioned (and how to demand it)
Your website is production software: every content change deserves history, a field-level diff, and one-click revert. The failure stories, what…
ExploreAugust 3, 2026
Metric definitions are code: how to end dashboard arguments
Same metric, three defensible numbers. Why every metric that matters belongs in version-controlled SQL with an owner, a description, and tests — and…
ExploreJuly 30, 2026
Propose-then-approve: trust patterns for agent writes
Agents that write to real data need a specific shape: draft, diff, human approval, enforced apply. How our own edit queue works — and why…
ExploreJuly 27, 2026
Core Web Vitals for founders: what actually moves the needle
LCP, INP, and CLS in operator terms: why the thresholds matter for rankings and conversion, the four causes behind most failures, and how to check…
ExploreJuly 23, 2026
Postgres read replica vs. warehouse: an honest decision guide
When a read replica is genuinely enough, the four signals you’ve outgrown it, the DuckDB middle path, and the migration cost nobody scopes:…
ExploreJuly 20, 2026
Your first agent should be boring too
How to pick a first AI automation that can’t hurt you: the selection criteria, the earn-autonomy ladder, a worked invoice-intake example, and when a…
ExploreJuly 16, 2026
Your marketing site is a sales asset, not an art project
The site’s job is to make the next sales conversation easier. Which changes actually move pipeline, what site rot costs you, and when a one-page…
ExploreJuly 13, 2026
The five queries every founder should be able to run
A cheap diagnostic for your data stack: five queries that should take minutes each. What each one catches, what it looks like when the answer is…
ExploreJuly 5, 2026
Why your data stack should be boring
Most startups don’t have a big-data problem — they have a trust problem. Here is the small, boring stack we deploy, what it costs, and when you don’t…
ExploreJune 28, 2026
A website that (almost) edits itself
The expensive part of a marketing site isn’t the build — it’s every change after launch. Here is the structured-content platform this site runs on,…
ExploreJune 20, 2026
MCP is the API layer for your agents
The gap between an AI demo and AI that runs your ops is the interface to your systems. What we’ve learned building MCP servers: tool design, the…
Explore