Notes on building software with intent.
Longer-form thinking on the craft of engineering — clarity, systems, performance, and the decisions that quietly shape a product.
Backend & data systems
APIs, analytical data, migrations, and the performance decisions underneath a product.
-
01 How to Build Conversion Data Everyone Can Reproduce
Build reliable conversion data with clear event contracts, stable IDs, observable deduplication, and end-to-end validation.
6 min Read more -
02 What scaling an ASP.NET Core backend actually requires
Learn how to scale ASP.NET Core backends with explicit boundaries, caching, database discipline, timeouts, retries, and observable failure handling.
13 min Read more -
03 Designing real-time analytics with ClickHouse
Design ClickHouse real-time analytics with event schemas, tenant scope, query performance, aggregation, freshness, and late-event handling.
13 min Read more -
04 Database migrations should have a road back
Design reversible database migrations with expand-migrate-contract, safe backfills, compatibility windows, rollback plans, and observability.
11 min Read more -
05 Dashboard performance is a product problem
Improve dashboard performance through useful paint, data readiness, stable loading states, efficient queries, caching, and honest freshness.
12 min Read more
AI systems
Reliable AI applications built around evidence, boundaries, evaluation, and recovery.
-
01 When AI can approve a pull request
What AI pull request approval changes about governance, ownership, permissions, evidence, and safe software delivery.
15 min Read more -
02 AI-assisted code analysis you can actually trust
Design AI-assisted code analysis with repository scope, evidence links, calibrated confidence, reproducible results, and human review.
13 min Read more -
03 Designing reliable AI agents
Design reliable AI agents with tool contracts, durable state, idempotency, approvals, loop prevention, recovery, and observability.
14 min Read more -
04 Why long context does not equal understanding
Understand why long context fails: context dilution, irrelevant retrieval, ordering, chunking, provenance, and context budgeting.
12 min Read more -
05 Model routing is a product decision, not only a cost optimization
Optimize LLM model routing with workload classes, quality gates, fallback, caching, latency budgets, and cost observability.
12 min Read more -
06 AI-assisted developer tools need a smaller promise
Build trustworthy AI developer tools with bounded tasks, evidence, structured output, privacy controls, evaluation, and human review.
13 min Read more
Engineering practice
Testing, observability, API design, and system boundaries for systems that keep changing.
-
01 Testing is a boundary design problem
Design backend tests around contracts, scope boundaries, failure paths, and observable behavior instead of only testing individual methods.
12 min Read more -
02 Observability is a product contract
Design observability around the decisions people need to make, connecting logs, metrics, traces, freshness, and user-visible failure states.
12 min Read more -
03 API design that survives change
Design APIs that can evolve safely through explicit contracts, stable errors, scoped inputs, compatibility windows, and honest response states.
13 min Read more -
04 System boundaries are design decisions
Make software systems easier to change by designing explicit boundaries for ownership, data, failure, authorization, and deployment.
12 min Read more