<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Joan Ayebola — Technical writing</title><description>Field notes on developer tooling, APIs, infrastructure, data systems, and the documentation that makes them usable.</description><link>https://joanayebola.vercel.app/</link><language>en</language><item><title>Giving an AI Agent a Memory: Patterns, Storage, and What to Forget</title><link>https://joanayebola.vercel.app/blog/agent-memory-patterns/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/agent-memory-patterns/</guid><description>Build a practical memory layer for an AI agent, choose where each kind of memory lives, and design retrieval and forgetting that you can trust.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>ai-developer-tooling</category><category>tutorial</category><category>ai-agents</category><category>memory</category><category>vector-search</category><category>system-design</category><category>python</category></item><item><title>From API Keys to Scoped Tokens: Upgrading a Public API&apos;s Auth Without Breaking Clients</title><link>https://joanayebola.vercel.app/blog/api-keys-to-scoped-tokens/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/api-keys-to-scoped-tokens/</guid><description>Migrate a public API from all-powerful API keys to scoped, expiring tokens: design the scopes, run both systems in parallel, and deprecate keys without breaking clients.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>apis-developer-platforms</category><category>migration-guide</category><category>api-security</category><category>authentication</category><category>oauth</category><category>migration</category><category>api-design</category></item><item><title>Designing Rate Limits Developers Won&apos;t Hate: Quotas, Headers, and Graceful 429s</title><link>https://joanayebola.vercel.app/blog/api-rate-limiting-design/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/api-rate-limiting-design/</guid><description>Design rate limits that protect your API without punishing good clients: fair quotas, honest headers, and 429 responses developers can act on.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>apis-developer-platforms</category><category>tutorial</category><category>rate-limiting</category><category>api-design</category><category>reliability</category><category>developer-experience</category></item><item><title>Designing an API Reference Developers Actually Read: Examples, Errors, and Auth Up Front</title><link>https://joanayebola.vercel.app/blog/api-reference-design/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/api-reference-design/</guid><description>An API reference is read under pressure, mid-debug. Design it that way: auth before endpoints, a worked example per operation, and errors documented like features.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>documentation-dx</category><category>tutorial</category><category>api-documentation</category><category>api-reference</category><category>developer-experience</category><category>technical-writing</category></item><item><title>API Versioning Without Regret: URLs, Headers, and Sunset Policies Compared</title><link>https://joanayebola.vercel.app/blog/api-versioning-strategies/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/api-versioning-strategies/</guid><description>Compare URL, header, and media-type versioning on real tradeoffs, and design a sunset policy that retires old versions without breaking clients.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>apis-developer-platforms</category><category>comparison</category><category>api-versioning</category><category>api-design</category><category>rest</category><category>developer-experience</category></item><item><title>BigQuery Partitioning and Clustering: The Cost Decisions You Make at Table-Creation Time</title><link>https://joanayebola.vercel.app/blog/bigquery-partitioning-clustering/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/bigquery-partitioning-clustering/</guid><description>Partition and cluster BigQuery tables with intent: how pruning actually works, where each feature stops helping, and the decisions that are painful to reverse later.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>data-engineering</category><category>tutorial</category><category>bigquery</category><category>data-warehousing</category><category>cost-optimization</category><category>sql</category></item><item><title>Changelogs Are Product Writing: Entries Users Read and Releases That Earn Trust</title><link>https://joanayebola.vercel.app/blog/changelog-writing/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/changelog-writing/</guid><description>Why the changelog is product writing, not a commit digest, and how to write entries that users actually read and act on.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>documentation-dx</category><category>opinion</category><category>changelogs</category><category>product-writing</category><category>release-notes</category><category>developer-experience</category></item><item><title>Chunking Strategies for Embeddings: What Actually Changes Retrieval Quality</title><link>https://joanayebola.vercel.app/blog/chunking-strategies-embeddings/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/chunking-strategies-embeddings/</guid><description>Compare fixed-size, recursive, semantic, and structure-aware chunking so you can choose a strategy that improves retrieval instead of quietly breaking it.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>ai-developer-tooling</category><category>comparison</category><category>embeddings</category><category>rag</category><category>chunking</category><category>vector-search</category><category>retrieval</category></item><item><title>CI That Stops Rebuilding the World: Caching, Matrix Builds, and Flaky-Test Quarantine</title><link>https://joanayebola.vercel.app/blog/ci-pipeline-caching/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/ci-pipeline-caching/</guid><description>Cut CI time with dependency and build caching that actually invalidates correctly, matrix builds that parallelise honestly, and a quarantine lane for flaky tests.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>devops-observability</category><category>tutorial</category><category>ci-cd</category><category>github-actions</category><category>caching</category><category>testing</category></item><item><title>Cursor Pagination for Real APIs: Ordering Guarantees, Opaque Tokens, and Edge Cases</title><link>https://joanayebola.vercel.app/blog/cursor-pagination-api-design/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/cursor-pagination-api-design/</guid><description>Implement cursor pagination that stays correct under inserts and deletes, with stable ordering, opaque tokens, and honest handling of filters.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>apis-developer-platforms</category><category>tutorial</category><category>pagination</category><category>api-design</category><category>databases</category><category>rest</category></item><item><title>Dagster vs Airflow for a New Data Platform: Assets, Sensors, and Day-Two Operations</title><link>https://joanayebola.vercel.app/blog/dagster-vs-airflow/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/dagster-vs-airflow/</guid><description>Dagster and Airflow compared on assets, sensors, partitions, backfills, retries, and observability, so you can choose the right core for a new platform.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>data-engineering</category><category>comparison</category><category>dagster</category><category>airflow</category><category>data-orchestration</category><category>data-engineering</category></item><item><title>Data Quality Gates with Great Expectations: Expectations, Checkpoints, and CI</title><link>https://joanayebola.vercel.app/blog/data-quality-great-expectations/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/data-quality-great-expectations/</guid><description>Build a working data quality gate with Great Expectations: define an Expectation Suite, run it as a Checkpoint, store the results, and fail CI on bad data.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>data-engineering</category><category>tutorial</category><category>data-quality</category><category>great-expectations</category><category>data-engineering</category><category>ci</category><category>python</category></item><item><title>Incremental Models in dbt: Merge Strategies, Late Data, and Full-Refresh Discipline</title><link>https://joanayebola.vercel.app/blog/dbt-incremental-models/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/dbt-incremental-models/</guid><description>Choose the right dbt incremental strategy, handle late-arriving data with lookback windows, and build the full-refresh habits that keep incremental models trustworthy.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>data-engineering</category><category>tutorial</category><category>dbt</category><category>incremental-models</category><category>data-modeling</category><category>analytics-engineering</category></item><item><title>dbt Tests and Data Contracts: Catching Upstream Breakage Before Your Stakeholders Do</title><link>https://joanayebola.vercel.app/blog/dbt-tests-data-contracts/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/dbt-tests-data-contracts/</guid><description>Layer dbt generic, singular, and unit tests with enforced data contracts so upstream schema and logic changes fail in CI, not in a stakeholder&apos;s dashboard.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>data-engineering</category><category>tutorial</category><category>dbt</category><category>data-quality</category><category>data-contracts</category><category>analytics-engineering</category></item><item><title>Change Data Capture with Debezium: From Postgres WAL to a Consumer That Keeps Up</title><link>https://joanayebola.vercel.app/blog/debezium-cdc-postgres/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/debezium-cdc-postgres/</guid><description>Stand up Debezium on Postgres logical decoding, protect the replication slot, and write a consumer that handles snapshots, deletes, and schema changes without losing rows.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>data-engineering</category><category>tutorial</category><category>debezium</category><category>cdc</category><category>postgres</category><category>kafka-connect</category></item><item><title>Auditing a Developer Onboarding Funnel: Signup to First API Call, Timed and Scored</title><link>https://joanayebola.vercel.app/blog/developer-onboarding-audit/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/developer-onboarding-audit/</guid><description>A repeatable audit method for the developer onboarding funnel, with a scoring rubric and a clearly labelled illustrative walkthrough.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>documentation-dx</category><category>docs-teardown</category><category>onboarding</category><category>developer-experience</category><category>documentation-audit</category><category>api</category></item><item><title>Diátaxis, Applied: Reorganising a Real Docs Site Without a Six-Month Rewrite</title><link>https://joanayebola.vercel.app/blog/diataxis-applied/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/diataxis-applied/</guid><description>A field guide to applying the Diátaxis framework incrementally: audit what you have, split the pages that do two jobs, and move content in slices readers never notice.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>documentation-dx</category><category>tutorial</category><category>diataxis</category><category>information-architecture</category><category>documentation</category><category>technical-writing</category></item><item><title>Multi-Stage Docker Builds for Node and Python: Smaller Images, Fewer Surprises</title><link>https://joanayebola.vercel.app/blog/docker-multistage-builds/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/docker-multistage-builds/</guid><description>Learn multi-stage Docker builds for Node and Python with cache mounts, slim runtime images, non-root users, and digest pinning to cut bloat and build risk.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>devops-observability</category><category>tutorial</category><category>docker</category><category>nodejs</category><category>python</category><category>containers</category><category>devops</category></item><item><title>Docs as Code, With Teeth: Linting, Link Checks, and Preview Builds in CI</title><link>https://joanayebola.vercel.app/blog/docs-as-code-ci/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/docs-as-code-ci/</guid><description>Wire documentation into CI so quality is enforced, not hoped for: prose linting that respects writers, link checking without false alarms, and previews on every pull request.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>documentation-dx</category><category>tutorial</category><category>docs-as-code</category><category>ci-cd</category><category>documentation</category><category>vale</category><category>developer-experience</category></item><item><title>Error Messages Are Documentation: A Field Guide to Writing Failures Users Can Fix</title><link>https://joanayebola.vercel.app/blog/error-message-writing/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/error-message-writing/</guid><description>A practical method for writing error messages that name the problem, state the cause, and hand the user a fix they can actually perform.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>documentation-dx</category><category>tutorial</category><category>error-messages</category><category>ux-writing</category><category>documentation</category><category>api-design</category></item><item><title>Function Calling That Survives Bad Arguments: Validation, Retries, and Repair</title><link>https://joanayebola.vercel.app/blog/function-calling-error-handling/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/function-calling-error-handling/</guid><description>Build a validation, retry, and repair layer for LLM function calling that rejects bad arguments, returns useful errors, and protects side effects.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>ai-developer-tooling</category><category>tutorial</category><category>function-calling</category><category>typescript</category><category>zod</category><category>json-schema</category><category>llm-tool-use</category></item><item><title>Grafana Dashboards That Answer Questions Instead of Displaying Data</title><link>https://joanayebola.vercel.app/blog/grafana-dashboards/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/grafana-dashboards/</guid><description>Design Grafana dashboards around the questions operators actually ask: symptom-first layout, RED and USE panels, honest thresholds, and variables that narrow scope.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>devops-observability</category><category>tutorial</category><category>grafana</category><category>dashboards</category><category>prometheus</category><category>observability</category></item><item><title>gRPC vs REST vs GraphQL for Internal APIs: A Decision Guide with Working Examples</title><link>https://joanayebola.vercel.app/blog/grpc-vs-rest-vs-graphql/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/grpc-vs-rest-vs-graphql/</guid><description>The same internal service built three ways: compare gRPC, REST, and GraphQL on contracts, payloads, streaming, and operability, then decide with a framework you can reuse.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>apis-developer-platforms</category><category>comparison</category><category>grpc</category><category>rest</category><category>graphql</category><category>api-design</category><category>microservices</category></item><item><title>Runbooks That Get Used at 3 a.m.: Structure, Triggers, and the Last Verified Step</title><link>https://joanayebola.vercel.app/blog/incident-runbooks/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/incident-runbooks/</guid><description>Write runbooks an exhausted engineer can execute at 3 a.m.: symptom-based triggers, numbered verifiable steps, explicit stop conditions, and a maintenance loop.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>devops-observability</category><category>opinion</category><category>incident-response</category><category>runbooks</category><category>on-call</category><category>sre</category></item><item><title>Kafka Delivery Semantics in Practice: What Exactly-Once Actually Buys You</title><link>https://joanayebola.vercel.app/blog/kafka-delivery-semantics/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/kafka-delivery-semantics/</guid><description>At-most-once, at-least-once, and exactly-once in Kafka, precisely: which configurations deliver which guarantee, where exactly-once stops, and what to build instead.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>data-engineering</category><category>tutorial</category><category>kafka</category><category>streaming</category><category>distributed-systems</category><category>exactly-once</category></item><item><title>Kubernetes Probes Aren&apos;t Interchangeable: Liveness, Readiness, and Startup in Production</title><link>https://joanayebola.vercel.app/blog/kubernetes-probes-explained/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/kubernetes-probes-explained/</guid><description>Learn what liveness, readiness, and startup probes actually control, how they fail in production, and how to configure all three correctly.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>devops-observability</category><category>tutorial</category><category>kubernetes</category><category>devops</category><category>reliability</category><category>containers</category></item><item><title>Cache LLM Responses Without Serving Stale Answers</title><link>https://joanayebola.vercel.app/blog/llm-response-caching/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/llm-response-caching/</guid><description>Design an LLM response cache that actually saves money: exact-match keys, versioned prompts, tenant isolation, and the strict rules for when semantic caching is safe.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>ai-developer-tooling</category><category>tutorial</category><category>caching</category><category>llm</category><category>performance</category><category>python</category></item><item><title>Run LLMs Locally with Ollama and Wire Them into Your Existing Tooling</title><link>https://joanayebola.vercel.app/blog/local-llm-ollama-tooling/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/local-llm-ollama-tooling/</guid><description>Install Ollama, serve models over its native and OpenAI-compatible APIs, tune context and quantization, and connect editors, CLIs, and scripts.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>ai-developer-tooling</category><category>tutorial</category><category>ollama</category><category>local-llm</category><category>openai-compatible</category><category>developer-tooling</category></item><item><title>Beyond Tools: MCP Resources, Prompts, and Sampling, Explained by Building</title><link>https://joanayebola.vercel.app/blog/mcp-resources-prompts-sampling/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/mcp-resources-prompts-sampling/</guid><description>Tools get all the attention, but MCP&apos;s resources, prompts, and sampling are what make a server feel native. Build a small server that uses all three.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>ai-developer-tooling</category><category>tutorial</category><category>mcp</category><category>typescript</category><category>ai-tooling</category><category>protocol</category></item><item><title>OAuth 2.0 with PKCE, Step by Step: The Flow Your SPA Actually Runs</title><link>https://joanayebola.vercel.app/blog/oauth-pkce-flow-explained/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/oauth-pkce-flow-explained/</guid><description>Walk the authorization code flow with PKCE exactly as a browser app runs it, including the verifier math, state checks, and token storage decisions.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>apis-developer-platforms</category><category>tutorial</category><category>oauth</category><category>pkce</category><category>authentication</category><category>spa</category><category>security</category></item><item><title>Generate Clients from OpenAPI and Stop Hand-Writing Fetch Wrappers</title><link>https://joanayebola.vercel.app/blog/openapi-code-generation/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/openapi-code-generation/</guid><description>Turn your OpenAPI document into typed clients: pick a generator, wire it into CI so drift fails the build, and handle auth, errors, and versioning without hand-written wrappers.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>apis-developer-platforms</category><category>tutorial</category><category>openapi</category><category>code-generation</category><category>typescript</category><category>api-clients</category><category>dx</category></item><item><title>Prometheus Metrics That Don&apos;t Explode: Cardinality, Naming, and the Queries You&apos;ll Actually Run</title><link>https://joanayebola.vercel.app/blog/prometheus-metric-design/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/prometheus-metric-design/</guid><description>Design Prometheus metrics that stay queryable under load: naming, label discipline, histograms, and the PromQL for errors, latency, and saturation.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>devops-observability</category><category>tutorial</category><category>prometheus</category><category>promql</category><category>observability</category><category>metrics</category><category>sre</category></item><item><title>Prompt Injection Is a Data Problem: Defending LLM Features in Production</title><link>https://joanayebola.vercel.app/blog/prompt-injection-defense/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/prompt-injection-defense/</guid><description>Prompt injection works because models cannot tell instructions from data. Defend in depth: separate the two, constrain tools, validate actions, and assume breach.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>ai-developer-tooling</category><category>tutorial</category><category>prompt-injection</category><category>security</category><category>llm</category><category>production</category></item><item><title>Rewriting a Quickstart Live: From Feature Tour to First Success in Five Steps</title><link>https://joanayebola.vercel.app/blog/quickstart-rewrite-walkthrough/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/quickstart-rewrite-walkthrough/</guid><description>A step-by-step rewrite method that turns a feature-tour quickstart into a task-first guide ending in a verifiable first success.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>documentation-dx</category><category>tutorial</category><category>quickstarts</category><category>developer-experience</category><category>technical-writing</category><category>onboarding</category></item><item><title>Evaluate a RAG Pipeline Before Your Users Do</title><link>https://joanayebola.vercel.app/blog/rag-pipeline-evaluation/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/rag-pipeline-evaluation/</guid><description>Build a repeatable evaluation harness for your retrieval-augmented generation pipeline: golden datasets, retrieval metrics, faithfulness checks, and CI gates.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>ai-developer-tooling</category><category>tutorial</category><category>rag</category><category>evaluation</category><category>llm</category><category>python</category></item><item><title>The README Is Your Landing Page: Structure for Open-Source Projects That Want Contributors</title><link>https://joanayebola.vercel.app/blog/readme-craft/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/readme-craft/</guid><description>How to structure a README that converts a curious visitor into a running install, then into a first contribution.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>documentation-dx</category><category>tutorial</category><category>readme</category><category>open-source</category><category>documentation</category><category>developer-experience</category></item><item><title>API Errors Worth Reading: Adopting RFC 9457 Problem Details</title><link>https://joanayebola.vercel.app/blog/rfc-9457-problem-details/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/rfc-9457-problem-details/</guid><description>Replace ad-hoc error JSON with RFC 9457 problem details: a standard envelope, extension members for validation, and a migration path that keeps old clients working.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>apis-developer-platforms</category><category>tutorial</category><category>api-design</category><category>rfc-9457</category><category>error-handling</category><category>rest</category><category>express</category></item><item><title>Schema Evolution Without Breaking Consumers: Avro, Protobuf, and Compatibility Modes</title><link>https://joanayebola.vercel.app/blog/schema-evolution-avro-protobuf/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/schema-evolution-avro-protobuf/</guid><description>A practical guide to evolving Avro and Protobuf schemas safely with compatibility modes, registries, and expand-and-contract deployments.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>data-engineering</category><category>tutorial</category><category>avro</category><category>protobuf</category><category>schema-registry</category><category>data-engineering</category><category>kafka</category></item><item><title>SLOs and Error Budgets a Small Team Can Actually Run</title><link>https://joanayebola.vercel.app/blog/slo-error-budgets/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/slo-error-budgets/</guid><description>Build a lean SLO practice for a small team: pick few user-facing SLIs, set defensible targets, add burn-rate alerts, and enforce an error budget policy.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>devops-observability</category><category>tutorial</category><category>slo</category><category>error-budgets</category><category>observability</category><category>alerting</category><category>sre</category></item><item><title>Streaming LLM Responses End to End: Tokens, Backpressure, and Honest Loading States</title><link>https://joanayebola.vercel.app/blog/streaming-llm-responses/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/streaming-llm-responses/</guid><description>Build production-ready token streaming with SSE, ReadableStream, backpressure, aborts, and loading states that tell the truth.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>ai-developer-tooling</category><category>tutorial</category><category>llm</category><category>streaming</category><category>typescript</category><category>server-sent-events</category><category>web-apis</category></item><item><title>Streaming vs Batch: Choosing with a Latency Budget Instead of a Trend</title><link>https://joanayebola.vercel.app/blog/streaming-vs-batch-latency-budget/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/streaming-vs-batch-latency-budget/</guid><description>Choose between streaming, micro-batch, and batch by deriving a latency budget from the consumer decision, not by following tooling trends.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>data-engineering</category><category>comparison</category><category>streaming</category><category>batch-processing</category><category>latency</category><category>data-pipelines</category><category>architecture</category></item><item><title>Structured Logging in Node.js That Pays Off During Incidents</title><link>https://joanayebola.vercel.app/blog/structured-logging-nodejs/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/structured-logging-nodejs/</guid><description>Build structured JSON logging in Node.js with correlation IDs, redaction, and error serialization so you can trace failures quickly during incidents.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>devops-observability</category><category>tutorial</category><category>nodejs</category><category>logging</category><category>observability</category><category>pino</category><category>incident-response</category></item><item><title>Structured Outputs from LLM APIs: Schemas, Retries, and the Failure Modes Nobody Documents</title><link>https://joanayebola.vercel.app/blog/structured-outputs-llm-apis/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/structured-outputs-llm-apis/</guid><description>Get reliably typed data out of LLM APIs: strict schemas, parser-backed validation, retry loops that fix errors, and the failure modes that survive all three.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>ai-developer-tooling</category><category>tutorial</category><category>structured-outputs</category><category>llm-apis</category><category>pydantic</category><category>python</category></item><item><title>Subscription Billing Is a State Machine: Trials, Proration, Dunning, and Webhooks</title><link>https://joanayebola.vercel.app/blog/subscription-billing-state-machine/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/subscription-billing-state-machine/</guid><description>Model subscriptions as an explicit state machine driven by payment webhooks: states, transitions, proration rules, and a dunning sequence that recovers failed payments.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>apis-developer-platforms</category><category>tutorial</category><category>billing</category><category>state-machines</category><category>webhooks</category><category>saas</category><category>payments</category></item><item><title>Terraform Modules Your Team Will Reuse: Interfaces, Versioning, and State Hygiene</title><link>https://joanayebola.vercel.app/blog/terraform-module-design/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/terraform-module-design/</guid><description>Design Terraform modules with narrow interfaces, honest versioning, and clean state boundaries so other teams adopt them instead of copying and forking them.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>devops-observability</category><category>tutorial</category><category>terraform</category><category>infrastructure-as-code</category><category>modules</category><category>platform-engineering</category></item><item><title>Trace Sampling Without Blind Spots: Head, Tail, and Rate-Based Strategies Compared</title><link>https://joanayebola.vercel.app/blog/trace-sampling-strategies/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/trace-sampling-strategies/</guid><description>Compare head, tail, and rate-based trace sampling by what each keeps, what each silently drops, and how to combine them without losing the traces that matter.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>devops-observability</category><category>comparison</category><category>opentelemetry</category><category>distributed-tracing</category><category>sampling</category><category>observability</category></item><item><title>Docs Teardown: Twilio&apos;s Quickstart Funnel and the Art of the Five-Minute Win</title><link>https://joanayebola.vercel.app/blog/twilio-docs-teardown/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/twilio-docs-teardown/</guid><description>How Twilio&apos;s quickstarts are engineered as a funnel: pre-written code, a working result in minutes, and a deliberate handoff from first success to production depth.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>documentation-dx</category><category>docs-teardown</category><category>documentation</category><category>quickstarts</category><category>developer-experience</category><category>docs-teardown</category><category>twilio</category></item><item><title>Docs Teardown: What Vercel&apos;s Documentation Gets Right About Developer Journeys</title><link>https://joanayebola.vercel.app/blog/vercel-docs-teardown/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/vercel-docs-teardown/</guid><description>A teardown of Vercel&apos;s docs: how task-based navigation, framework-aware content, and honest limits pages turn a platform manual into a guided developer journey.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>documentation-dx</category><category>docs-teardown</category><category>documentation</category><category>developer-experience</category><category>docs-teardown</category><category>vercel</category></item><item><title>Warehouse Cost Control: The Queries, Habits, and Guardrails That Cut the Bill</title><link>https://joanayebola.vercel.app/blog/warehouse-cost-control/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/warehouse-cost-control/</guid><description>Cut warehouse spend by finding expensive queries, fixing pruning and sizing, and adding guardrails that stop waste before it becomes the bill.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>data-engineering</category><category>opinion</category><category>data-warehousing</category><category>cost-optimization</category><category>sql</category><category>analytics-engineering</category><category>finops</category></item><item><title>Webhook Idempotency, Done Properly: Keys, Storage, and Replay Windows</title><link>https://joanayebola.vercel.app/blog/webhook-idempotency/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/webhook-idempotency/</guid><description>Build a webhook receiver that safely handles duplicates, retries, and replays without double-charging customers or corrupting state.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate><category>apis-developer-platforms</category><category>tutorial</category><category>webhooks</category><category>idempotency</category><category>api-design</category><category>distributed-systems</category></item><item><title>Orchestrate an Airbyte + dbt Pipeline with Kestra: An End-to-End Walkthrough</title><link>https://joanayebola.vercel.app/blog/orchestrate-airbyte-dbt-pipeline-kestra/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/orchestrate-airbyte-dbt-pipeline-kestra/</guid><description>Build an automated ELT pipeline that runs an Airbyte sync, waits for completion, executes dbt models, and reports status through Kestra.</description><pubDate>Wed, 21 Oct 2026 00:00:00 GMT</pubDate><category>data-engineering</category><category>tutorial</category><category>Kestra</category><category>Airbyte</category><category>dbt</category><category>PostgreSQL</category><category>ELT</category></item><item><title>Deploy to Managed Kubernetes from GitHub Actions: A Complete CI/CD Walkthrough</title><link>https://joanayebola.vercel.app/blog/deploy-managed-kubernetes-github-actions/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/deploy-managed-kubernetes-github-actions/</guid><description>Build a GitHub Actions pipeline that tests a Node.js app, publishes its Docker image to GHCR, and deploys it to DigitalOcean Kubernetes.</description><pubDate>Tue, 20 Oct 2026 00:00:00 GMT</pubDate><category>devops-observability</category><category>tutorial</category><category>GitHub Actions</category><category>Kubernetes</category><category>Docker</category><category>DigitalOcean</category><category>CI/CD</category></item><item><title>Trace a Real Node.js API with OpenTelemetry and SigNoz in 20 Minutes (ESM and TypeScript Included)</title><link>https://joanayebola.vercel.app/blog/opentelemetry-nodejs-signoz-tracing/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/opentelemetry-nodejs-signoz-tracing/</guid><description>Trace Express, Postgres, outbound HTTP calls, and custom business logic with OpenTelemetry and SigNoz, including the correct ESM and TypeScript setup.</description><pubDate>Sun, 18 Oct 2026 00:00:00 GMT</pubDate><category>devops-observability</category><category>tutorial</category><category>OpenTelemetry</category><category>SigNoz</category><category>Node.js</category><category>TypeScript</category><category>Distributed tracing</category></item><item><title>Paystack vs Flutterwave vs Stripe: Whose API Docs Give You the Clearest Path to a First Payment?</title><link>https://joanayebola.vercel.app/blog/paystack-vs-flutterwave-vs-stripe-api-docs/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/paystack-vs-flutterwave-vs-stripe-api-docs/</guid><description>A documentation teardown of Paystack, Flutterwave v4, and Stripe for Nigerian developers—from test keys to server verification and a working webhook.</description><pubDate>Sun, 18 Oct 2026 00:00:00 GMT</pubDate><category>documentation-dx</category><category>docs-teardown</category><category>Paystack</category><category>Flutterwave</category><category>Stripe</category><category>Payment APIs</category><category>Developer experience</category></item><item><title>Sync Postgres to a Data Warehouse with Airbyte in 30 Minutes (and What Breaks)</title><link>https://joanayebola.vercel.app/blog/airbyte-postgres-to-bigquery-cdc/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/airbyte-postgres-to-bigquery-cdc/</guid><description>Set up Postgres-to-BigQuery replication with Airbyte CDC, then diagnose six failures involving WAL, permissions, data types, keys, and schema changes.</description><pubDate>Sat, 17 Oct 2026 00:00:00 GMT</pubDate><category>data-engineering</category><category>tutorial</category><category>Airbyte</category><category>PostgreSQL</category><category>BigQuery</category><category>Change data capture</category></item><item><title>Build Your First MCP Server in TypeScript (SDK v2) and Connect It to Claude, Cursor and Codex</title><link>https://joanayebola.vercel.app/blog/build-mcp-server-typescript-sdk-v2/</link><guid isPermaLink="true">https://joanayebola.vercel.app/blog/build-mcp-server-typescript-sdk-v2/</guid><description>Build a local Markdown search server with MCP TypeScript SDK v2, test it with Inspector, and connect it to Claude Desktop, Cursor, and Codex.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><category>ai-developer-tooling</category><category>tutorial</category><category>MCP</category><category>TypeScript</category><category>Claude</category><category>Cursor</category><category>Codex</category></item></channel></rss>