1:"$Sreact.fragment"
2:I[15579,["/_next/static/chunks/fd0661f1506dcbc6.js","/_next/static/chunks/ace32b0b71585800.js","/_next/static/chunks/af778fff4a0f4be6.js","/_next/static/chunks/b096b037d08e2f31.js"],"Navigation"]
a:I[3013,["/_next/static/chunks/fd0661f1506dcbc6.js","/_next/static/chunks/ace32b0b71585800.js","/_next/static/chunks/af778fff4a0f4be6.js","/_next/static/chunks/b096b037d08e2f31.js"],""]
31:I[41451,["/_next/static/chunks/fd0661f1506dcbc6.js","/_next/static/chunks/ace32b0b71585800.js","/_next/static/chunks/af778fff4a0f4be6.js","/_next/static/chunks/b096b037d08e2f31.js"],"Footer"]
32:I[47913,["/_next/static/chunks/316a3a63422f35de.js"],"OutletBoundary"]
33:"$Sreact.suspense"
:HL["/blog/landing/cmo.png","image"]
:HL["/blog/posts/two-lane-content-strategy/hero.jpg","image"]
:HL["/blog/posts/logo.png","image"]
:HL["/blog/posts/principle-vs-virtue-founder-voice/hero.jpg","image"]
:HL["/blog/posts/offer-mechanics-as-trust-signals/hero.jpg","image"]
:HL["/blog/posts/hmac-empty-secret-bypass/hero.jpg","image"]
:HL["/blog/posts/merkle-subset-verification-trap/hero.jpg","image"]
:HL["/blog/posts/bcrypt-async-event-loop/hero.jpg","image"]
:HL["/blog/posts/toctou-async-database-handlers/hero.jpg","image"]
:HL["/blog/posts/idempotency-scheduled-jobs/hero.jpg","image"]
:HL["/blog/posts/bounding-ordered-set-aggregates/hero.jpg","image"]
:HL["/blog/posts/pydantic-production-fail-fast/hero.jpg","image"]
:HL["/blog/posts/merkle-canonical-form/hero.jpg","image"]
:HL["/blog/posts/async-sqlite-fastapi/hero.jpg","image"]
:HL["/blog/posts/fire-and-forget-asyncio/hero.jpg","image"]
:HL["/blog/posts/pg-advisory-xact-lock-version-stamp/hero.jpg","image"]
:HL["/blog/posts/postgres-sequence-race-condition/hero.jpg","image"]
:HL["/blog/posts/postgres-notify-ws-delivery/hero.jpg","image"]
:HL["/blog/posts/criu-tcp-repair-live-migration/hero.jpg","image"]
:HL["/blog/posts/incremental-indexing-git-metadata/hero.jpg","image"]
:HL["/blog/posts/mac-address-as-portable-identity/hero.jpg","image"]
:HL["/blog/posts/atomic-buffer-swap/hero.jpg","image"]
:HL["/blog/posts/sentry-fastapi-custom-handlers/hero.jpg","image"]
:HL["/blog/posts/stream-wrapper-pattern/hero.jpg","image"]
:HL["/blog/posts/gke-docker-auth-expiry/hero.jpg","image"]
:HL["/blog/posts/websocket-reconnect-loops/hero.jpg","image"]
:HL["/blog/posts/threadpool-async-background-work/hero.jpg","image"]
:HL["/blog/posts/monkeypatch-boundary/hero.jpg","image"]
:HL["/blog/posts/per-agent-api-key-rotation/hero.jpg","image"]
:HL["/blog/posts/redis-session-as-shared-state/hero.jpg","image"]
:HL["/blog/posts/pipeline-gates-as-accountability/hero.jpg","image"]
:HL["/blog/posts/when-the-database-lies-the-kernel-doesnt/hero.jpg","image"]
:HL["/blog/posts/asyncio-sync-hooks/hero.jpg","image"]
:HL["/blog/posts/keyword-plan-idea-service/hero.jpg","image"]
:HL["/blog/posts/loss-aversion-saas-positioning/hero.jpg","image"]
:HL["/blog/posts/build-in-public-flywheel/hero.jpg","image"]
0:{"buildId":"TlpKRvbES4zzM7LeczAM7","rsc":["$","$1","c",{"children":[[["$","$L2",null,{}],["$","main",null,{"className":"pt-20 md:pt-24","children":[["$","section",null,{"className":"border-b border-border","children":["$","div",null,{"className":"container mx-auto px-6 py-16 md:py-24","children":[["$","p",null,{"className":"mb-8 text-2xl font-semibold tracking-wide md:text-3xl","children":[["$","span",null,{"className":"text-primary","children":"Bridge"}],["$","span",null,{"className":"text-foreground","children":"Stack"}],["$","span",null,{"className":"mx-2 text-muted-foreground","children":"->"}],["$","span",null,{"className":"text-foreground","children":"Blog"}]]}],["$","div",null,{"className":"grid gap-10 md:grid-cols-[1fr_0.72fr] md:items-center","children":[["$","div",null,{"className":"max-w-3xl","children":[["$","h1",null,{"className":"text-4xl font-bold leading-tight text-balance md:text-6xl","children":"Notes on building useful software without the usual drag."}],["$","p",null,{"className":"mt-6 max-w-2xl text-lg leading-relaxed text-muted-foreground md:text-xl","children":"Practical writing on product scope, agent-assisted delivery, and the decisions that help founders and small teams get to a working first version."}]]}],["$","a",null,{"href":"https://www.youtube.com/shorts/AH_4607ABlw","target":"_blank","rel":"noopener noreferrer","className":"group overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/50","aria-label":"Watch Reel (CMO) I own the trust layer for Bridgestack.","children":[["$","div",null,{"className":"aspect-[4/3] overflow-hidden bg-secondary/70","children":["$","img",null,{"src":"/blog/landing/cmo.png","alt":"Reel, CMO: I own the trust layer for Bridgestack.","className":"h-full w-full object-contain object-top transition-transform duration-300 group-hover:scale-[1.02]"}]}],["$","div",null,{"className":"border-t border-border p-5","children":[["$","p",null,{"className":"mb-2 text-sm font-semibold uppercase tracking-wider text-primary","children":"Executive Brief"}],["$","blockquote",null,{"className":"text-base font-semibold leading-snug text-foreground md:text-lg","children":["\"","Reel (CMO) I own the trust layer for Bridgestack.","\""]}]]}]]}]]}]]}]}],["$","section",null,{"className":"container mx-auto px-6 py-12 md:py-16","children":[["$","article",null,{"className":"grid gap-8 border-b border-border pb-12 md:grid-cols-[1.1fr_0.9fr] md:items-center md:pb-16","children":[["$","div",null,{"className":"overflow-hidden rounded-lg border border-border bg-card","children":["$","div",null,{"className":"relative aspect-[16/10] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/two-lane-content-strategy/hero.jpg","alt":"Two parallel road lanes on dark asphalt photographed straight from above — one marked with short dashed white paint, one marked with a continuous solid white line, a thick divider between them.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}]}],["$","div",null,{"children":[["$","div",null,{"className":"mb-5 flex flex-wrap items-center gap-3 text-sm text-muted-foreground","children":[["$","span",null,{"className":"rounded-md border border-primary/40 bg-primary/10 px-2.5 py-1 text-primary","children":"Featured"}],["$","span",null,{"children":"Content Strategy"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W20"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"5 min read"}]]}],["$","h2",null,{"className":"max-w-3xl text-3xl font-semibold leading-tight text-balance md:text-5xl","children":"The Two-Lane Content Strategy: Awareness vs. Long-Form"}],["$","p",null,{"className":"mt-5 text-base leading-relaxed text-muted-foreground md:text-lg","children":"Most content strategies treat short-form and long-form as a spectrum. That model optimizes for the wrong thing."}],"$L3"]}]]}],"$L4"]}]]}],"$L5"],["$L6","$L7","$L8"],"$L9"]}],"loading":null,"isPartial":false}
3:["$","$La",null,{"href":"/blog/two-lane-content-strategy","className":"mt-6 inline-flex items-center text-sm font-medium text-primary transition-colors hover:text-primary/80","children":["Read the article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]
4:["$","div",null,{"className":"grid gap-5 pt-12 md:grid-cols-3 md:pt-16","children":[["$","$La","Principle vs. Virtue: How Founders Should Speak on Camera",{"href":"/blog/principle-vs-virtue-founder-voice","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/principle-vs-virtue-founder-voice/hero.jpg","alt":"A single camera on a tripod facing an empty wooden stool with a small lavalier mic clipped to it, late-afternoon light through a window — no presenter in frame, just the space waiting.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Founder Voice"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W20"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"5 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Principle vs. Virtue: How Founders Should Speak on Camera"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"Virtue claims feel authentic to founders, but to audiences they often land as self-praise."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}],["$","$La","Offer Mechanics as Trust Signals",{"href":"/blog/offer-mechanics-as-trust-signals","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/offer-mechanics-as-trust-signals/hero.jpg","alt":"A plain white invoice on a wooden desk, only the line \"PAY AFTER YOU TRY IT\" visible at the top, no totals or signature line, soft daylight from the left.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-rocket h-5 w-5","aria-hidden":"true","children":[["$","path","m3kijz",{"d":"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z"}],"$Lb","$Lc","$Ld","$undefined"]}]}],"$Le","$Lf","$L10","$L11"]}]]}],"$L12","$L13","$L14","$L15","$L16","$L17","$L18","$L19","$L1a","$L1b","$L1c","$L1d","$L1e","$L1f","$L20","$L21","$L22","$L23","$L24","$L25","$L26","$L27","$L28","$L29","$L2a","$L2b","$L2c","$L2d","$L2e","$L2f","$L30"]}]
5:["$","$L31",null,{}]
6:["$","script","script-0",{"src":"/_next/static/chunks/ace32b0b71585800.js","async":true}]
7:["$","script","script-1",{"src":"/_next/static/chunks/af778fff4a0f4be6.js","async":true}]
8:["$","script","script-2",{"src":"/_next/static/chunks/b096b037d08e2f31.js","async":true}]
9:["$","$L32",null,{"children":["$","$33",null,{"name":"Next.MetadataOutlet","children":"$@34"}]}]
b:["$","path","1fmvmk",{"d":"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z"}]
c:["$","path","1f8sc4",{"d":"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0"}]
d:["$","path","qeys4",{"d":"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5"}]
e:["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Positioning"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W20"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"5 min read"}]]}]
f:["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Offer Mechanics as Trust Signals"}]
10:["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"The best trust signal is not a claim about values. It is an offer structure that makes trust mechanically visible."}]
11:["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]
12:["$","$La","The Empty-Secret HMAC Bypass",{"href":"/blog/hmac-empty-secret-bypass","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/hmac-empty-secret-bypass/hero.jpg","alt":"A heavy steel padlock lying open on a dark wooden surface with no key visible, hard overhead light casting a sharp shadow.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Security"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W20"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"4 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"The Empty-Secret HMAC Bypass"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"An HMAC validator that skips checks when the secret is missing isn't lenient — it's wide open."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
13:["$","$La","The Merkle Subset Verification Trap",{"href":"/blog/merkle-subset-verification-trap","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/merkle-subset-verification-trap/hero.jpg","alt":"A pristine glass museum display case half-filled with carefully arranged artifacts on velvet, sharp focus on the artifacts, soft museum lighting.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Security"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W20"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"3 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"The Merkle Subset Verification Trap"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"Checking whether a subset of events lives in a Merkle digest by recomputing a root over the subset is always wrong — you get a different tree and verification fails forever."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
14:["$","$La","bcrypt in an Async Codebase — The Three Places It Bites You",{"href":"/blog/bcrypt-async-event-loop","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/bcrypt-async-event-loop/hero.jpg","alt":"A solitary traffic light glowing red over an empty asphalt road at dusk, no cars, no people, sharp editorial photography.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-clock h-5 w-5","aria-hidden":"true","children":[["$","path","mmk7yg",{"d":"M12 6v6l4 2"}],["$","circle","1mglay",{"cx":"12","cy":"12","r":"10"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Concurrency"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W20"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"4 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"bcrypt in an Async Codebase — The Three Places It Bites You"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"A work factor of 12 takes 200–400ms of pure CPU per call. In an async server that stalls the whole event loop. The fix is run_in_executor plus a short-TTL cache, not one or the other."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
15:["$","$La","TOCTOU Races in Async Database Handlers",{"href":"/blog/toctou-async-database-handlers","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/toctou-async-database-handlers/hero.jpg","alt":"A close-up macro shot of two identical brass keys sliding into the same antique brass door lock simultaneously against a dark wooden door, dramatic side lighting, no people, sharp editorial focus.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Concurrency"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W20"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"4 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"TOCTOU Races in Async Database Handlers"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"SELECT-then-INSERT under async load fails predictably — both coroutines pass the check, both attempt the insert, one trips a 500. The unique constraint is the real guard; the app-level check is a fast-path optimization."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
16:["$","$La","Idempotency in Scheduled Jobs — The Restart Problem",{"href":"/blog/idempotency-scheduled-jobs","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/idempotency-scheduled-jobs/hero.jpg","alt":"An industrial timestamp clock on a worn wooden desk with two identical printed slips showing the same stamped time stacked beside it, soft window light, no people.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-clock h-5 w-5","aria-hidden":"true","children":[["$","path","mmk7yg",{"d":"M12 6v6l4 2"}],["$","circle","1mglay",{"cx":"12","cy":"12","r":"10"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Backend"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W20"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"4 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Idempotency in Scheduled Jobs — The Restart Problem"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"Scheduled jobs look sequential — one timer, one window, one run. They aren't. Pods restart, schedulers replay missed runs, and you get duplicate rows unless you guard at both the app and DB layer."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
17:["$","$La","Bounding PostgreSQL Ordered-Set Aggregates Before They Eat Your Database",{"href":"/blog/bounding-ordered-set-aggregates","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/bounding-ordered-set-aggregates/hero.jpg","alt":"A row of vintage brass and copper rotary valves on an industrial pipe assembly in a dimly lit utility room, one valve partially closed, sharp focus, no people.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Database"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W20"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"5 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Bounding PostgreSQL Ordered-Set Aggregates Before They Eat Your Database"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"percentile_cont looks elegant — no intermediate materialization in the plan. It's still a full sort under the planner. Two guards (TTL clamp + row cap) keep the aggregate bounded regardless of customer size."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
18:["$","$La","Fail Fast at the Right Boundary — Pydantic Settings in Production",{"href":"/blog/pydantic-production-fail-fast","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/pydantic-production-fail-fast/hero.jpg","alt":"A solid brass padlock with its key still inserted, resting on a worn leather-bound logbook with handwritten entries, soft warm desk light, no people, editorial.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Backend"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W20"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"5 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Fail Fast at the Right Boundary — Pydantic Settings in Production"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"Hardcoded API key defaults work locally and ship secrets to production. A model_validator that refuses to start without the key turns silent misconfig into a loud startup error."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
19:["$","$La","The Canonical Form Bug That Makes Every Signature Fail",{"href":"/blog/merkle-canonical-form","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/merkle-canonical-form/hero.jpg","alt":"A vintage brass wax seal stamp pressed into a fresh crimson wax pool on parchment, sharp focus on the impression, warm desk light, no people, editorial.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Security"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W20"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"4 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"The Canonical Form Bug That Makes Every Signature Fail"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"Ed25519 verification fails universally — not 'some events' but 'all events.' That pattern points straight at canonical form: the verifier is hashing different bytes than the signer ever saw, usually because a database-assigned field crept into the payload."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
1a:["$","$La","Blocking SQLite in an Async FastAPI Route",{"href":"/blog/async-sqlite-fastapi","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/async-sqlite-fastapi/hero.jpg","alt":"A single brass funnel on a worn wooden workbench with one droplet caught mid-fall above its narrow neck, sharp focus on the droplet, soft side light, no people, editorial.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Concurrency"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W20"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"4 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Blocking SQLite in an Async FastAPI Route"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"A 2ms SQLite read becomes a 200ms tail latency on every other route. The event loop is the bottleneck, not the database. Anything that touches the filesystem or a socket inside an `async def` body belongs in `run_in_executor`."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
1b:["$","$La","Fire-and-Forget asyncio.create_task Is a Reliability Trap",{"href":"/blog/fire-and-forget-asyncio","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/fire-and-forget-asyncio/hero.jpg","alt":"A paper airplane mid-flight against a slate-grey wall, sharp focus on the folded nose, no people, no hands, dramatic single-source side light, editorial.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Concurrency"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W20"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"5 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Fire-and-Forget asyncio.create_task Is a Reliability Trap"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"An unawaited `create_task` looks identical to a properly-handled background task — until the day it raises an exception, your endpoint returns 200, and nobody knows the notification never went out. Failures must surface somewhere, or they don't exist."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
1c:["$","$La","Atomic Version Counters Without a Sequence — pg_advisory_xact_lock",{"href":"/blog/pg-advisory-xact-lock-version-stamp","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/pg-advisory-xact-lock-version-stamp/hero.jpg","alt":"A heavy metal date stamp poised over a clean white document, ink visible on the stamp rubber, single overhead light.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Database"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W20"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"4 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Atomic Version Counters Without a Sequence — pg_advisory_xact_lock"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"PostgreSQL advisory locks cost nothing to create and release automatically with the transaction — a better fit than a per-tenant sequence for monotonic counters."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
1d:["$","$La","The Select-Then-Insert Race Condition in Version Counters",{"href":"/blog/postgres-sequence-race-condition","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/postgres-sequence-race-condition/hero.jpg","alt":"Two runners' shoes captured mid-stride at the exact same finish line, viewed straight down from above.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Database"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W20"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"5 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"The Select-Then-Insert Race Condition in Version Counters"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"A `SELECT MAX()+1` then `INSERT` pattern looks correct in development and fails silently under any real concurrency. The fix lives in the database, not the application."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
1e:["$","$La","Postgres NOTIFY as a WebSocket Delivery Mechanism",{"href":"/blog/postgres-notify-ws-delivery","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/postgres-notify-ws-delivery/hero.jpg","alt":"Close shot of a server rack with a single blinking amber LED in an otherwise dark row.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Backend"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W18"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"3 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Postgres NOTIFY as a WebSocket Delivery Mechanism"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"LISTEN/NOTIFY is an underutilized real-time delivery primitive: no broker, no extra infrastructure, durable via the underlying table."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
1f:["$","$La","Freezing Live TCP Connections for Process Migration with CRIU",{"href":"/blog/criu-tcp-repair-live-migration","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/criu-tcp-repair-live-migration/hero.jpg","alt":"A bird in mid-flight viewed from below against a clean grey sky, wings extended.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-rocket h-5 w-5","aria-hidden":"true","children":[["$","path","m3kijz",{"d":"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z"}],["$","path","1fmvmk",{"d":"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z"}],["$","path","1f8sc4",{"d":"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0"}],["$","path","qeys4",{"d":"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Infrastructure"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W19"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"4 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Freezing Live TCP Connections for Process Migration with CRIU"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"Move a running process to a different machine without dropping its TCP connections. Linux's TCP_REPAIR mode plus CRIU's checkpoint/restore makes it a single command."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
20:["$","$La","Incremental Code Indexing with Git Metadata",{"href":"/blog/incremental-indexing-git-metadata","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/incremental-indexing-git-metadata/hero.jpg","alt":"A vintage wooden library card catalog with one drawer pulled out and a single index card visible inside.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Tooling"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W19"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"3 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Incremental Code Indexing with Git Metadata"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"Adding a column is easy. Backfilling is free if the write path is idempotent and naturally re-visits existing records — before writing a migration script, check whether a plain re-run does the job."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
21:["$","$La","The MAC Address as Portable Machine Identity",{"href":"/blog/mac-address-as-portable-identity","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/mac-address-as-portable-identity/hero.jpg","alt":"A USB Ethernet adapter on a worn wooden desk under a single warm overhead lamp, macro shot showing the gold contact pins, minimal dark background, no people, editorial.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Infrastructure"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W19"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"5 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"The MAC Address as Portable Machine Identity"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"A managed switch binds your IP to your NIC's MAC. Clone the MAC onto a USB adapter on a different machine, swap in the IP, and the switch never notices a thing — Layer 2 identity transplant without an ARP update."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
22:["$","$La","Atomic Buffer Swap: Thread-Safe Batching Without Blocking Writers",{"href":"/blog/atomic-buffer-swap","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/atomic-buffer-swap/hero.jpg","alt":"Two parallel conveyor belts viewed from above, one loaded with identical cargo boxes, the other empty.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Concurrency"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W18"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"3 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Atomic Buffer Swap: Thread-Safe Batching Without Blocking Writers"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"Holding a lock during network I/O turns your logging layer into a serializer for your application threads. Swap the buffer under the lock; POST outside it."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
23:["$","$La","Sentry and FastAPI Custom Exception Handlers — The Silent Swallow",{"href":"/blog/sentry-fastapi-custom-handlers","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/sentry-fastapi-custom-handlers/hero.jpg","alt":"A dark server room with a single computer monitor showing an empty log viewer while a red LED alarm glows on a nearby rack.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Observability"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W18"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"3 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Sentry and FastAPI Custom Exception Handlers — The Silent Swallow"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"FastAPI's Sentry integration captures unhandled exceptions automatically — but the moment you register an `@app.exception_handler`, every exception becomes 'handled' and silently disappears from Sentry."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
24:["$","$La","The Stream Wrapper Pattern for Transparent Event Capture",{"href":"/blog/stream-wrapper-pattern","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/stream-wrapper-pattern/hero.jpg","alt":"A clear glass laboratory pipette suspended over a beaker with a single amber drop forming at its tip.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Backend"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W18"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"3 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"The Stream Wrapper Pattern for Transparent Event Capture"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"When wrapping an SDK to add observability, usage data lives in the final chunk of a stream. The `finally` block in `__iter__` is the one place you're guaranteed to see it."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
25:["$","$La","GKE Artifact Registry Auth Expiry — The Silent Push Failure",{"href":"/blog/gke-docker-auth-expiry","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/gke-docker-auth-expiry/hero.jpg","alt":"A vintage parking meter showing 'EXPIRED' in its window against a moody urban backdrop.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-clock h-5 w-5","aria-hidden":"true","children":[["$","path","mmk7yg",{"d":"M12 6v6l4 2"}],["$","circle","1mglay",{"cx":"12","cy":"12","r":"10"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Infrastructure"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W18"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"3 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"GKE Artifact Registry Auth Expiry — The Silent Push Failure"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"Docker's exit code after a push is not a reliable success signal when GCP auth tokens expire mid-build. The only ground truth is a registry-side digest check."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
26:["$","$La","Persistent WebSocket Listeners That Actually Stay Connected",{"href":"/blog/websocket-reconnect-loops","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/websocket-reconnect-loops/hero.jpg","alt":"A coiled ethernet cable being gently uncoiled by a single hand against a warm-lit wooden desk, macro focus on the connector tip, soft studio lighting, no people visible above the wrist, editorial.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Reliability"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W18"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"4 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Persistent WebSocket Listeners That Actually Stay Connected"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"Naive `async for msg in ws` dies silently on the first reconnect. The reliable pattern is an outer `while True` loop that owns the reconnect responsibility, with `ping_interval` and `ping_timeout` configured so half-open connections actually surface."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
27:["$","$La","Offloading Slow Background Work from an Async Web Server",{"href":"/blog/threadpool-async-background-work","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/threadpool-async-background-work/hero.jpg","alt":"A chef's hands plating a dish on a stainless-steel pass at a busy restaurant kitchen, sharp focus on the plate, background blurred with motion, no faces visible, warm overhead light, editorial.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Concurrency"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W18"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"4 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Offloading Slow Background Work from an Async Web Server"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"A 30-second LLM call inside an async route ties up the event loop and starves every other request. `ThreadPoolExecutor` + `run_in_executor` is the right tool — and the executor must be sized to the downstream resource's real concurrency ceiling, not to throughput."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
28:["$","$La","Monkeypatching at the Right Boundary",{"href":"/blog/monkeypatch-boundary","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/monkeypatch-boundary/hero.jpg","alt":"A single brass valve mid-flow on a polished copper pipe assembly against a charcoal background, sharp side lighting catching the valve's machined edges, no people, editorial.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Testing"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W18"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"3 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Monkeypatching at the Right Boundary"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"Your monkeypatch looks correct, the function name resolves, the test still sees the production value. The cause is almost always import-time binding — patch the symbol where the caller resolves it, not where it's defined."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
29:["$","$La","Self-Healing API Key Rotation for Long-Running Service Processes",{"href":"/blog/per-agent-api-key-rotation","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/per-agent-api-key-rotation/hero.jpg","alt":"A row of brass keys hanging on numbered hooks against a dark wooden panel wall, one hook empty with a brighter outline, single overhead light, no people, editorial.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Security"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W18"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"4 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Self-Healing API Key Rotation for Long-Running Service Processes"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"Long-running service processes need a recovery path when keys rotate. The self-register pattern — 401 triggers a re-mint on a network-gated endpoint — gives you zero-touch credential rotation without opening a credential-theft surface."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
2a:["$","$La","Redis Session as Shared State: Coordinating AI Components Without a Message Bus",{"href":"/blog/redis-session-as-shared-state","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/redis-session-as-shared-state/hero.jpg","alt":"A single brass spigot mid-flow over a polished marble basin in a darkened utility room, sharp focus on the water stream, no people, editorial.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Backend"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W18"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"4 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Redis Session as Shared State: Coordinating AI Components Without a Message Bus"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"Two AI processes need to share state for the same session — one primary, one observer running async. Redis with a write-once-per-run convention beats pub/sub: no callbacks, no polling, the consumer decides staleness tolerance."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
2b:["$","$La","Pipeline Gates as Accountability Primitives",{"href":"/blog/pipeline-gates-as-accountability","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/pipeline-gates-as-accountability/hero.jpg","alt":"A wrought-iron gate half-open across a country lane at golden hour, sharp focus on the latch mechanism, soft warm light, no people, editorial.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Backend"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W18"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"4 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Pipeline Gates as Accountability Primitives"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"An automated worker will optimise for closing the ticket, not for shipping working code. Encode the phase transitions as CLI-enforced gates — `done` rejects unless the worker has explicitly logged `branch → pr → ci`. Auditable accountability, not advisory."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
2c:["$","$La","When the Database Lies, the Kernel Doesn't",{"href":"/blog/when-the-database-lies-the-kernel-doesnt","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/when-the-database-lies-the-kernel-doesnt/hero.jpg","alt":"A black-and-white wide shot of a server rack at night with a single green LED illuminating one rack unit, cables draping like ivy down the side, no people, dramatic editorial composition.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Infrastructure"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W18"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"6 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"When the Database Lies, the Kernel Doesn't"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"Self-registration heartbeats drift the moment a process gets killed between beats. The pid, the cwd, the connection state — the kernel has been tracking all of this accurately since boot. Read the kernel instead of building a registration protocol."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
2d:["$","$La","Calling Coroutines from Sync Hooks",{"href":"/blog/asyncio-sync-hooks","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/asyncio-sync-hooks/hero.jpg","alt":"A simple wooden footbridge spanning a small stream in a forest clearing, soft morning fog.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Concurrency"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W20"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"3 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Calling Coroutines from Sync Hooks"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"Calling async code from a sync callback raises `RuntimeError` inside a running event loop. The fix branches on `asyncio.get_running_loop()` — fire-and-forget if a loop exists, `asyncio.run()` if it doesn't."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
2e:["$","$La","What the Keyword Planner API Actually Tells You (And What It Hides)",{"href":"/blog/keyword-plan-idea-service","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/keyword-plan-idea-service/hero.jpg","alt":"A terminal window showing a raw JSON API response with search volume data, warm amber light on a dark desk, a coffee cup to the left — the quiet of early-morning research work.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-clock h-5 w-5","aria-hidden":"true","children":[["$","path","mmk7yg",{"d":"M12 6v6l4 2"}],["$","circle","1mglay",{"cx":"12","cy":"12","r":"10"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Research"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W18"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"5 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"What the Keyword Planner API Actually Tells You (And What It Hides)"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"Keyword research gets much better when you understand what Google's API gives you, and what it quietly withholds."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
2f:["$","$La","Loss Aversion Is Not a Trick — It's a Research Finding You Should Build Around",{"href":"/blog/loss-aversion-saas-positioning","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/loss-aversion-saas-positioning/hero.jpg","alt":"A split photograph: left side shows an empty wallet on a plain surface; right side shows the same wallet, full, on the same surface. Clean light, minimal composition.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-lightbulb h-5 w-5","aria-hidden":"true","children":[["$","path","1gvzjb",{"d":"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["$","path","x1upvd",{"d":"M9 18h6"}],["$","path","ceow96",{"d":"M10 22h4"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Positioning"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W18"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"5 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Loss Aversion Is Not a Trick — It's a Research Finding You Should Build Around"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"For skeptical small operators, removing a specific loss often beats promising a vague upside."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
30:["$","$La","The Build-in-Public Flywheel: How to Turn Internal Logs Into Content That Compounds",{"href":"/blog/build-in-public-flywheel","className":"overflow-hidden rounded-lg border border-border bg-card transition-colors hover:border-primary/40","children":[["$","div",null,{"className":"relative aspect-[16/9] overflow-hidden","children":[["$","img",null,{"src":"/blog/posts/build-in-public-flywheel/hero.jpg","alt":"A hand-drawn diagram on a whiteboard showing a circular flywheel with five labeled segments, marker on white, morning light catching the surface at an angle.","className":"h-full w-full object-cover"}],["$","img",null,{"src":"/blog/posts/logo.png","alt":"","aria-hidden":"true","className":"pointer-events-none absolute right-4 top-4 h-[50px] w-[50px] mix-blend-screen"}]]}],["$","div",null,{"className":"p-6","children":[["$","div",null,{"className":"mb-5 flex h-10 w-10 items-center justify-center rounded-md bg-primary/10 text-primary","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-rocket h-5 w-5","aria-hidden":"true","children":[["$","path","m3kijz",{"d":"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z"}],["$","path","1fmvmk",{"d":"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z"}],["$","path","1f8sc4",{"d":"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0"}],["$","path","qeys4",{"d":"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5"}],"$undefined"]}]}],["$","div",null,{"className":"mb-4 flex flex-wrap items-center gap-2 text-xs text-muted-foreground","children":[["$","span",null,{"className":"font-medium text-primary","children":"Content Strategy"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"2026-W18"}],["$","span",null,{"aria-hidden":"true","children":"/"}],["$","span",null,{"children":"5 min read"}]]}],["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"The Build-in-Public Flywheel: How to Turn Internal Logs Into Content That Compounds"}],["$","p",null,{"className":"mt-3 text-sm leading-relaxed text-muted-foreground","children":"Build in public works best when internal work becomes the source material for specific, compounding stories."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-arrow-right ml-2 h-4 w-4","aria-hidden":"true","children":[["$","path","1ays0h",{"d":"M5 12h14"}],["$","path","xquz4c",{"d":"m12 5 7 7-7 7"}],"$undefined"]}]]}]]}]]}]
34:null
