grep, sed, and awk: a practical introduction for Mac users

You export a report from some web app and it hands you a 40,000-line CSV. You need three columns out of it, only the rows from last Tuesday, with one misspelled city name fixed throughout. You could open it in a spreadsheet, wait for the beachball, scroll, sort, find-and-replace, and export again. Or you could describe the whole job in one line of text and get the answer before the spreadsheet finishes loading. ...

August 8, 2026 · 10 min · Omar Crosby

Skills vs MCP: what we're actually arguing about

Three voices argue about how to extend a Claude agent — skills-first, MCP-anchored, complementary. The debate dissolves once you separate procedural knowledge from live reach.

August 7, 2026 · 14 min · Omar Crosby

The anatomy of an SDK, in Go

A walkthrough of the surface an SDK exposes, in seven parts, with idiomatic Go for every piece: the client constructor with functional options, resource groupings that mirror the caller’s mental model, typed requests and responses, typed errors with request IDs and errors.As, first-class pagination via iter.Seq2, streaming and retries and instrumentation, and the docs/samples/changelog trio that finishes the surface. Companion to the SDK fundamentals post.

August 7, 2026 · 8 min · Omar Crosby

What makes a good SDK

An eight-point rubric for judging whether an SDK is any good, each criterion paired with a real currently-shipping SDK that gets it right — Stripe (idiomatic hand-crafted per language, typed errors with request IDs, exceptional docs), AWS SDK for Go v2 (boring auth via the credential-provider chain, paginators as a distinct type), Anthropic and OpenAI (sensible retry defaults, streaming), Stainless-generated SDKs (types from a single spec), GitHub Octokit (honest versioning). Followed by the two-sided value proposition — what building on those axes actually buys for the vendor and the caller.

August 7, 2026 · 15 min · Omar Crosby

Capability-first SDK design, and where new work belongs

The question is almost never ‘how do we add this method to the SDK?’ — it’s ‘where should this capability live?’ A companion to the SDK fundamentals post, covering capability-first SDK design (with the caller-sketch discipline as the practice), the five-way routing framework for new capability requests (pure SDK / additive API change / new endpoint / new API service / push down for generation), signals for extending an existing API vs. creating a new one (with Stripe Terminal and AWS Lambda as named examples), and the version-coordination process when a capability requires changes on both sides.

August 7, 2026 · 17 min · Omar Crosby