1:"$Sreact.fragment"
2:I[75473,["/_next/static/chunks/316a3a63422f35de.js"],"default"]
3:I[78515,["/_next/static/chunks/316a3a63422f35de.js"],"default"]
4:I[30687,["/_next/static/chunks/fd0661f1506dcbc6.js"],"Toaster"]
5:I[61076,["/_next/static/chunks/fd0661f1506dcbc6.js"],"Analytics"]
6:I[15579,["/_next/static/chunks/fd0661f1506dcbc6.js","/_next/static/chunks/ace32b0b71585800.js","/_next/static/chunks/af778fff4a0f4be6.js","/_next/static/chunks/b096b037d08e2f31.js"],"Navigation"]
f:I[90849,["/_next/static/chunks/316a3a63422f35de.js"],"default"]
:HL["/_next/static/chunks/609ea7bc18d0d15f.css","style"]
:HL["/_next/static/chunks/93b606aa9fdccd13.css","style"]
:HL["/_next/static/media/797e433ab948586e-s.p.479bea2b.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
:HL["/_next/static/media/caa3a2e1cccd8315-s.p.3b6cae6d.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
0:{"P":null,"b":"TlpKRvbES4zzM7LeczAM7","c":["","blog"],"q":"","i":false,"f":[[["",{"children":["blog",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/609ea7bc18d0d15f.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/chunks/93b606aa9fdccd13.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/fd0661f1506dcbc6.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":[["$","head",null,{"children":[["$","script",null,{"async":true,"src":"https://www.googletagmanager.com/gtag/js?id=AW-18009878040"}],["$","script",null,{"dangerouslySetInnerHTML":{"__html":"\n          window.dataLayer = window.dataLayer || [];\n          function gtag(){dataLayer.push(arguments);}\n          gtag('js', new Date());\n          gtag('config', 'AW-18009878040');\n          gtag('config', 'G-W3XKYXV2SG');\n\n          // Persist UTM and gclid params to sessionStorage for cross-page tracking\n          (function() {\n            var params = new URLSearchParams(window.location.search);\n            var keys = ['utm_source','utm_medium','utm_campaign','utm_content','utm_term','gclid'];\n            keys.forEach(function(k) {\n              var v = params.get(k);\n              if (v) sessionStorage.setItem(k, v);\n            });\n          })();\n        "}}]]}],["$","body",null,{"className":"font-sans antialiased","children":[["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}],["$","$L4",null,{"position":"top-center","richColors":true,"toastOptions":{"style":{"background":"var(--popover)","color":"var(--popover-foreground)","border":"1px solid var(--border)"}}}],["$","$L5",null,{}]]}]]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[[["$","$L6",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."}]]}],"$L7"]}]]}]}],"$L8"]}],"$L9"],["$La","$Lb","$Lc"],"$Ld"]}],{},null,false,false]},null,false,false]},null,false,false],"$Le",false]],"m":"$undefined","G":["$f",[]],"S":true}
10:I[3013,["/_next/static/chunks/fd0661f1506dcbc6.js","/_next/static/chunks/ace32b0b71585800.js","/_next/static/chunks/af778fff4a0f4be6.js","/_next/static/chunks/b096b037d08e2f31.js"],""]
39:I[41451,["/_next/static/chunks/fd0661f1506dcbc6.js","/_next/static/chunks/ace32b0b71585800.js","/_next/static/chunks/af778fff4a0f4be6.js","/_next/static/chunks/b096b037d08e2f31.js"],"Footer"]
3a:I[47913,["/_next/static/chunks/316a3a63422f35de.js"],"OutletBoundary"]
3b:"$Sreact.suspense"
3d:I[47913,["/_next/static/chunks/316a3a63422f35de.js"],"ViewportBoundary"]
3f:I[47913,["/_next/static/chunks/316a3a63422f35de.js"],"MetadataBoundary"]
: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"]
7:["$","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.","\""]}]]}]]}]
8:["$","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."}],["$","$L10",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,{"ref":"$undefined","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"]}]]}]]}]]}],["$","div",null,{"className":"grid gap-5 pt-12 md:grid-cols-3 md:pt-16","children":[["$","$L10","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,{"ref":"$undefined","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":["$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","$L31","$L32","$L33","$L34","$L35","$L36","$L37","$L38"]}]]}]
9:["$","$L39",null,{}]
a:["$","script","script-0",{"src":"/_next/static/chunks/ace32b0b71585800.js","async":true,"nonce":"$undefined"}]
b:["$","script","script-1",{"src":"/_next/static/chunks/af778fff4a0f4be6.js","async":true,"nonce":"$undefined"}]
c:["$","script","script-2",{"src":"/_next/static/chunks/b096b037d08e2f31.js","async":true,"nonce":"$undefined"}]
d:["$","$L3a",null,{"children":["$","$3b",null,{"name":"Next.MetadataOutlet","children":"$@3c"}]}]
e:["$","$1","h",{"children":[null,["$","$L3d",null,{"children":"$L3e"}],["$","div",null,{"hidden":true,"children":["$","$L3f",null,{"children":["$","$3b",null,{"name":"Next.Metadata","children":"$L40"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
: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"]
11:["$","span",null,{"className":"font-medium text-primary","children":"Founder Voice"}]
12:["$","span",null,{"aria-hidden":"true","children":"/"}]
13:["$","span",null,{"children":"2026-W20"}]
14:["$","span",null,{"aria-hidden":"true","children":"/"}]
15:["$","span",null,{"children":"5 min read"}]
16:["$","h3",null,{"className":"text-xl font-semibold leading-snug text-balance","children":"Principle vs. Virtue: How Founders Should Speak on Camera"}]
17:["$","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."}]
18:["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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":"Positioning"}],["$","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":"Offer Mechanics as Trust Signals"}],["$","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."}],["$","span",null,{"className":"mt-6 inline-flex items-center text-sm font-medium text-primary","children":["Read article",["$","svg",null,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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"]}]]}]]}]]}]
31:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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"]}]]}]]}]]}]
32:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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"]}]]}]]}]]}]
33:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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"]}]]}]]}]]}]
35:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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"]}]]}]]}]]}]
36:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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"]}]]}]]}]]}]
37:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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"]}]]}]]}]]}]
38:["$","$L10","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,{"ref":"$undefined","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,{"ref":"$undefined","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"]}]]}]]}]]}]
3e:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
41:I[94060,["/_next/static/chunks/316a3a63422f35de.js"],"IconMark"]
3c:null
40:[["$","title","0",{"children":"Blog — Bridgestack"}],["$","meta","1",{"name":"description","content":"Notes from Bridgestack on AI-assisted software builds, fixed-scope product delivery, and turning ideas into shipped apps."}],["$","meta","2",{"name":"generator","content":"v0.app"}],["$","meta","3",{"property":"og:title","content":"Bridgestack — custom software, flat prices from $9.99"}],["$","meta","4",{"property":"og:description","content":"Talk to Tom, your AI PM. A fleet of AI agents builds your product. Flat one-time price. 7 days to test before you pay. Source code is yours."}],["$","meta","5",{"property":"og:url","content":"https://www.bridgestack.systems"}],["$","meta","6",{"property":"og:site_name","content":"Bridgestack"}],["$","meta","7",{"property":"og:locale","content":"en_US"}],["$","meta","8",{"property":"og:image","content":"https://www.bridgestack.systems/bridgestack-landscape-1200x628.png"}],["$","meta","9",{"property":"og:image:width","content":"1200"}],["$","meta","10",{"property":"og:image:height","content":"628"}],["$","meta","11",{"property":"og:type","content":"website"}],["$","meta","12",{"name":"twitter:card","content":"summary_large_image"}],["$","meta","13",{"name":"twitter:title","content":"Bridgestack — custom software, flat prices from $9.99"}],["$","meta","14",{"name":"twitter:description","content":"Talk to Tom, your AI PM. A fleet of AI agents builds your product. 7 days to test before you pay. Source code is yours."}],["$","meta","15",{"name":"twitter:image","content":"https://www.bridgestack.systems/bridgestack-landscape-1200x628.png"}],["$","link","16",{"rel":"icon","href":"/icon-light-32x32.png","media":"(prefers-color-scheme: light)"}],["$","link","17",{"rel":"icon","href":"/icon-dark-32x32.png","media":"(prefers-color-scheme: dark)"}],["$","link","18",{"rel":"icon","href":"/icon.svg","type":"image/svg+xml"}],["$","link","19",{"rel":"apple-touch-icon","href":"/apple-icon.png"}],["$","$L41","20",{}]]
