[{"data":1,"prerenderedAt":650},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Ffinally-type-safe-ai-in-production-and-why-im-here-for-it":204,"\u002Fblog\u002Ffinally-type-safe-ai-in-production-and-why-im-here-for-it-surround":645},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200],{"title":5,"path":6,"stem":7},"You do not have time to not have tests","\u002Fblog\u002Fyou-do-not-have-time-to-not-have-tests","2.blog\u002F20211217.you-do-not-have-time-to-not-have-tests",{"title":9,"path":10,"stem":11},"Migrate Vue 2 with Vuetify and Jest to Vite and Vitest","\u002Fblog\u002Fmigrate-vue-2-with-vuetify-and-jest-to-vite-and-vitest","2.blog\u002F20220109.migrate-vue-2-with-vuetify-and-jest-to-vite-and-vitest",{"title":13,"path":14,"stem":15},"I am a Dark Matter Developer","\u002Fblog\u002Fi-am-a-dark-matter-developer","2.blog\u002F20220626.i-am-a-dark-matter-developer",{"title":17,"path":18,"stem":19},"Why using Conventional commits is useful","\u002Fblog\u002Fusing-conventional-commits","2.blog\u002F20240623.using-conventional-commits",{"title":21,"path":22,"stem":23},"Why you should make a toolbox repository","\u002Fblog\u002Fwhy-you-should-make-a-toolbox-repository","2.blog\u002F20240630.Why-you-should-make-a-toolbox-repository",{"title":25,"path":26,"stem":27},"Apache Airflow Part 1 - Why and Goals for a near Serverless ELT","\u002Fblog\u002Fapache-airflow-part-1-why-and-goals","2.blog\u002F20240710.apache-airflow-part-1-why-and-goals",{"title":29,"path":30,"stem":31},"Oh My Zsh on your server","\u002Fblog\u002Foh-my-zsh-on-your-server","2.blog\u002F20240711.oh-my-zsh-on-your-server",{"title":33,"path":34,"stem":35},"Fire tablet and YouTube Kids","\u002Fblog\u002Ffire-tablet-and-youtube-kids","2.blog\u002F20240714.fire-tablet-and-youtube-kids",{"title":37,"path":38,"stem":39},"Using Ollama and Continue as a GitHub Copilot Alternative","\u002Fblog\u002Fusing-ollama-and-continue-as-github-copilot-alternative","2.blog\u002F20240723.using-ollama-and-continue-as-github-copilot-alternative",{"title":41,"path":42,"stem":43},"Debugging Local Packages Made Easy with pnpm","\u002Fblog\u002Fdebugging-local-packages-with-pnpm-link","2.blog\u002F20250422.debugging local-packages-with-pnpm-link",{"title":45,"path":46,"stem":47},"Two Weeks with Cloudflare AI and Tools","\u002Fblog\u002Ftwo-weeks-with-cloudflare-ai-and-tools","2.blog\u002F20250509.two-weeks-with-cloudflare-aI-and-tools",{"title":49,"path":50,"stem":51},"Adding Prompts to VS Code - How I Learned to Stop Worrying and Love AI Context","\u002Fblog\u002Fadding-prompts-to-vscode","2.blog\u002F20250528.adding-prompts-to-vscode",{"title":53,"path":54,"stem":55},"My Best Practices","\u002Fblog\u002Fmy-best-practicies","2.blog\u002F20250607.my-best-practicies",{"title":57,"path":58,"stem":59},"Creating my own CLI Tool - Towles Tool","\u002Fblog\u002Ftowles-tool","2.blog\u002F20250607.towles-tool",{"title":61,"path":62,"stem":63},"Software Development Best Practices & ITIL","\u002Fblog\u002Fsoftware-engineering-and-itil-best-practices","2.blog\u002F20250612.software-engineering-and-itil-best-practices",{"title":65,"path":66,"stem":67},"Voice to Text","\u002Fblog\u002Fvoice-to-text","2.blog\u002F20250622.voice-to-text",{"title":69,"path":70,"stem":71},"Setting Up ComfyUI - A Better Alternative to Fooocus","\u002Fblog\u002Fcomfy-ui-setup","2.blog\u002F20250628.comfy-ui-setup",{"title":73,"path":74,"stem":75},"Voice to System","\u002Fblog\u002Fvoice-to-system","2.blog\u002F20250705.voice-to-system",{"title":77,"path":78,"stem":79},"Tips for Claude Code","\u002Fblog\u002Ftips-for-claude-code","2.blog\u002F20250713.tips-for-claude-code",{"title":81,"path":82,"stem":83},"Review That AI Code: Why I Read Every Line Generated Code","\u002Fblog\u002Freview-that-ai-code","2.blog\u002F20250720.review-that-ai-code",{"title":85,"path":86,"stem":87},"My Context Engineering Journey: From Dev Scripts to AI Collaboration","\u002Fblog\u002F20250803-1.my-context-engineering-journey","2.blog\u002F20250803-1.my-context-engineering-journey",{"title":89,"path":90,"stem":91},"Context Engineering at Scale: Enterprise Lessons and the Future of Development","\u002Fblog\u002F20250803-2.context-engineering-at-scale","2.blog\u002F20250803-2.context-engineering-at-scale",{"title":93,"path":94,"stem":95},"Check That Your Tools and Linters Do Not Burn Tokens","\u002Fblog\u002Fcheck-that-your-tools-and-linters-do-not-burn-tokens","2.blog\u002F20250806.check-that-your-tools-and-linters-do-not-burn-tokens",{"title":97,"path":98,"stem":99},"Markdown + AI: The Communication Protocol That Changes Everything","\u002Fblog\u002Fmarkdown-plus-ai-the-communication-protocol-that-changes-everything","2.blog\u002F20250814.markdown-plus-ai-the-communication-protocol-that-changes-everything",{"title":101,"path":102,"stem":103},"Finally: Type-Safe AI in Production (And Why I'm Here For It)","\u002Fblog\u002Ffinally-type-safe-ai-in-production-and-why-im-here-for-it","2.blog\u002F20250819.finally-type-safe-ai-in-production-and-why-im-here-for-it",{"title":105,"path":106,"stem":107},"Dotfiles: Masterpiece or Late Stage Picasso?","\u002Fblog\u002Fdotfiles-masterpiece-or-late-stage-picasso","2.blog\u002F20250822.dotfiles-masterpiece-or-late-stage-picasso",{"title":109,"path":110,"stem":111},"Beyond API Wrappers: Building State-Driven MCP Servers for Long-Horizon Agent Orchestration","\u002Fblog\u002Fbeyond-api-wrappers-mcp-servers","2.blog\u002F20250907.beyond-api-wrappers-mcp-servers",{"title":113,"path":114,"stem":115},"Why Vertical Integration Wins: A Software Engineer's Case for Owning Your Stack","\u002Fblog\u002Fwhy-i-bought-tesla-model-3-vertical-integration","2.blog\u002F20250928.why-i-bought-tesla-model-3-vertical-integration",{"title":117,"path":118,"stem":119},"The Min-Maxer's Trifecta: Building Tools for the Game You Actually Play","\u002Fblog\u002Fmin-maxer-trifecta","2.blog\u002F20251004.min-maxer-trifecta",{"title":121,"path":122,"stem":123},"Read The Source: Learning by Cutting Out The Middleman and RTFM","\u002Fblog\u002Fread-the-source","2.blog\u002F20251010.read-the-source",{"title":125,"path":126,"stem":127},"The Exponential Shift: Why AI Progress Feels Different Now","\u002Fblog\u002Fthe-exponential-shift","2.blog\u002F20251015.the-exponential-shift",{"title":129,"path":130,"stem":131},"Plan Mode for Your Problems, Edit Mode for Claude's","\u002Fblog\u002Fplan-mode-problems-edit-mode-solutions","2.blog\u002F20251019.plan-mode-problems-edit-mode-solutions",{"title":133,"path":134,"stem":135},"AWS Aurora DSQL Looked Perfect Until I Needed the Connection String","\u002Fblog\u002Faws-aurora-dsql-postgres-serverless-authentication","2.blog\u002F20251028.aws-aurora-dsql-postgres-serverless-authentication",{"title":137,"path":138,"stem":139},"Switchback: Browser History for Your Thoughts","\u002Fblog\u002Fswitchback-second-order-reasoning","2.blog\u002F20251205.switchback-second-order-reasoning",{"title":141,"path":142,"stem":143},"AI Pairing: Notes to Self","\u002Fblog\u002Fai-pairing-notes-to-self","2.blog\u002F20251216.ai-pairing-notes-to-self",{"title":145,"path":146,"stem":147},"I've Been Sleeping on Zellij","\u002Fblog\u002Fsleeping-on-zellij","2.blog\u002F20251229.sleeping-on-zellij",{"title":149,"path":150,"stem":151},"Implementing a Ralph Wiggum Loop: The Secret is Session Markers","\u002Fblog\u002Fimplementing-ralph-wiggum-loop-for-autonomous-ai-coding","2.blog\u002F20260114.implementing-ralph-wiggum-loop-for-autonomous-ai-coding",{"title":153,"path":154,"stem":155},"Goodhart's Law Ate My Context Window","\u002Fblog\u002Fgoodharts-law-ate-my-context-window","2.blog\u002F20260119.goodharts-law-ate-my-context-window",{"title":157,"path":158,"stem":159},"Claude Code's Hidden Multi-Agent System Is Real","\u002Fblog\u002Fclaude-code-hidden-multi-agent-system","2.blog\u002F20260124.claude-code-hidden-multi-agent-system",{"title":161,"path":162,"stem":163},"Free Printable Math Sheets for Kids — Number Chart, Skip Counting, Multiplication, and More","\u002Fblog\u002Ffree-printable-number-chart-and-coin-sheets","2.blog\u002F20260214.free-printable-number-chart-and-coin-sheets",{"title":165,"path":166,"stem":167},"We Are Near the End of the Exponential","\u002Fblog\u002Fnear-the-end-of-the-exponential","2.blog\u002F20260214.near-the-end-of-the-exponential",{"title":169,"path":170,"stem":171},"Free Printable Language Arts Sheets for Kids — Sight Words, Parts of Speech, Homophones, and More","\u002Fblog\u002Ffree-printable-sight-words-and-grammar-sheets","2.blog\u002F20260215.free-printable-sight-words-and-grammar-sheets",{"title":173,"path":174,"stem":175},"Interactive Code Execution with Artifacts","\u002Fblog\u002Finteractive-code-execution-with-artifacts","2.blog\u002F20260215.interactive-code-execution-with-artifacts",{"title":177,"path":178,"stem":179},"Free Printable Telling Time Worksheet for Kids — Clock Reference & Practice Sheet","\u002Fblog\u002Ffree-printable-telling-time-worksheet","2.blog\u002F20260216.free-printable-telling-time-worksheet",{"title":181,"path":182,"stem":183},"Claude Code Skills: Teaching AI Your Playbook","\u002Fblog\u002Fclaude-code-skills-guide","2.blog\u002F20260221.claude-code-skills-guide",{"title":185,"path":186,"stem":187},"Building a Multi-Agent Loan Approval System with Human-in-the-Loop","\u002Fblog\u002Fmulti-agent-loan-approval-human-in-the-loop","2.blog\u002F20260225.multi-agent-loan-approval-human-in-the-loop",{"title":189,"path":190,"stem":191},"The Inception of AI Infrastructure: Bottlenecks All the Way Down","\u002Fblog\u002Fbiggest-bottleneck-scaling-ai-compute","2.blog\u002F20260313.biggest-bottleneck-scaling-ai-compute",{"title":193,"path":194,"stem":195},"What I Tell Teams About Claude Code","\u002Fblog\u002Fwhat-i-tell-teams-about-claude-code","2.blog\u002F20260314.what-i-tell-teams-about-claude-code",{"title":197,"path":198,"stem":199},"The Hardest Part of AI Isn't the AI","\u002Fblog\u002Fthe-hardest-part-of-ai-isnt-the-ai","2.blog\u002F20260327.the-hardest-part-of-ai-isnt-the-ai",{"title":201,"path":202,"stem":203},"Claude Code Hooks: The Capability I Left on the Table","\u002Fblog\u002Fclaude-code-hooks-capability-left-on-the-table","2.blog\u002F20260401.claude-code-hooks-capability-left-on-the-table",{"id":205,"title":101,"authors":206,"badge":212,"body":214,"date":635,"description":636,"extension":637,"image":638,"meta":641,"navigation":427,"path":102,"seo":642,"status":643,"stem":103,"__hash__":644},"posts\u002F2.blog\u002F20250819.finally-type-safe-ai-in-production-and-why-im-here-for-it.md",[207],{"name":208,"to":209,"avatar":210},"Chris Towles","https:\u002F\u002Ftwitter.com\u002FChris_Towles",{"src":211},"\u002Fimages\u002Fctowles-profile-512x512.png",{"label":213},"AI Tools",{"type":215,"value":216,"toc":622},"minimark",[217,221,228,231,234,239,242,247,250,254,257,261,264,268,271,275,547,550,554,557,585,588,592,595,599,602,615,618],[218,219,220],"p",{},"We've been shipping AI applications with our fingers crossed. Parse the LLM output, hope it matches your schema, catch errors in production. It was the wild west.",[218,222,223,224],{},"But something's changing, and I'm genuinely excited about it: ",[225,226,227],"strong",{},"production AI is finally getting the type safety and validation it desperately needs.",[218,229,230],{},"While working on MCP and looking for examples, I found nearly everyone is using TypeScript and Zod integration. Suddenly, my LLM outputs had compile-time guarantees. No more defensive parsing everywhere. Just predictable, type-safe AI responses.",[218,232,233],{},"This isn't about TypeScript versus Python. It's about production AI applications finally becoming as reliable as the rest of our stack.",[235,236,238],"h2",{"id":237},"the-engineering-discipline-weve-been-waiting-for","The Engineering Discipline We've Been Waiting For",[218,240,241],{},"Here's what's got me excited about TypeScript in production AI:",[243,244,246],"h3",{"id":245},"zod-openai-compile-time-llm-guarantees","Zod + OpenAI: Compile-Time LLM Guarantees",[218,248,249],{},"OpenAI's native Zod support means we can define schemas once and get compile-time type checking for AI outputs. This is huge—we're talking about turning unpredictable LLM responses into type-safe, validated data structures. No more runtime surprises.",[243,251,253],{"id":252},"vercel-ai-sdk-production-grade-streaming","Vercel AI SDK: Production-Grade Streaming",[218,255,256],{},"2M+ developers aren't just using this for fun—they're building reliable, streaming AI features that don't crash in production. The SDK brings proper error handling, and type safety to AI streaming. Finally, streaming AI that feels like production software.",[243,258,260],{"id":259},"tools-built-on-trust","Tools Built on Trust",[218,262,263],{},"Anthropic chose TypeScript for Claude Code because production tools need predictability. This is a tool they built for internal use, but TypeScript provides the reliability foundation that production AI tools require.",[235,265,267],{"id":266},"why-type-safety-changes-everything-for-ai","Why Type Safety Changes Everything for AI",[218,269,270],{},"LLMs are inherently unpredictable. They hallucinate, they return unexpected formats, they break schemas. In Python, we handle this with runtime validation and hope for the best. In TypeScript, we handle it at compile time.",[243,272,274],{"id":273},"the-zod-difference","The Zod Difference",[276,277,282],"pre",{"className":278,"code":279,"language":280,"meta":281,"style":281},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const ResponseSchema = z.object({\n  analysis: z.string(),\n  confidence: z.number().min(0).max(1),\n  suggestions: z.array(z.string())\n});\n\n\u002F\u002F clearly communicates to the LLM exactly what we expect\nconst response = await openai.chat.completions.create({\n  model: \"gpt-4\",\n  messages: [...],\n  response_format: zodResponseFormat(ResponseSchema, \"analysis\")\n});\n","typescript","",[283,284,285,318,341,386,411,422,429,436,472,492,511,538],"code",{"__ignoreMap":281},[286,287,290,294,298,302,305,308,312,315],"span",{"class":288,"line":289},"line",1,[286,291,293],{"class":292},"spNyl","const",[286,295,297],{"class":296},"sTEyZ"," ResponseSchema ",[286,299,301],{"class":300},"sMK4o","=",[286,303,304],{"class":296}," z",[286,306,307],{"class":300},".",[286,309,311],{"class":310},"s2Zo4","object",[286,313,314],{"class":296},"(",[286,316,317],{"class":300},"{\n",[286,319,321,325,328,330,332,335,338],{"class":288,"line":320},2,[286,322,324],{"class":323},"swJcz","  analysis",[286,326,327],{"class":300},":",[286,329,304],{"class":296},[286,331,307],{"class":300},[286,333,334],{"class":310},"string",[286,336,337],{"class":296},"()",[286,339,340],{"class":300},",\n",[286,342,344,347,349,351,353,356,358,360,363,365,369,372,374,377,379,382,384],{"class":288,"line":343},3,[286,345,346],{"class":323},"  confidence",[286,348,327],{"class":300},[286,350,304],{"class":296},[286,352,307],{"class":300},[286,354,355],{"class":310},"number",[286,357,337],{"class":296},[286,359,307],{"class":300},[286,361,362],{"class":310},"min",[286,364,314],{"class":296},[286,366,368],{"class":367},"sbssI","0",[286,370,371],{"class":296},")",[286,373,307],{"class":300},[286,375,376],{"class":310},"max",[286,378,314],{"class":296},[286,380,381],{"class":367},"1",[286,383,371],{"class":296},[286,385,340],{"class":300},[286,387,389,392,394,396,398,401,404,406,408],{"class":288,"line":388},4,[286,390,391],{"class":323},"  suggestions",[286,393,327],{"class":300},[286,395,304],{"class":296},[286,397,307],{"class":300},[286,399,400],{"class":310},"array",[286,402,403],{"class":296},"(z",[286,405,307],{"class":300},[286,407,334],{"class":310},[286,409,410],{"class":296},"())\n",[286,412,414,417,419],{"class":288,"line":413},5,[286,415,416],{"class":300},"}",[286,418,371],{"class":296},[286,420,421],{"class":300},";\n",[286,423,425],{"class":288,"line":424},6,[286,426,428],{"emptyLinePlaceholder":427},true,"\n",[286,430,432],{"class":288,"line":431},7,[286,433,435],{"class":434},"sHwdD","\u002F\u002F clearly communicates to the LLM exactly what we expect\n",[286,437,439,441,444,446,450,453,455,458,460,463,465,468,470],{"class":288,"line":438},8,[286,440,293],{"class":292},[286,442,443],{"class":296}," response ",[286,445,301],{"class":300},[286,447,449],{"class":448},"s7zQu"," await",[286,451,452],{"class":296}," openai",[286,454,307],{"class":300},[286,456,457],{"class":296},"chat",[286,459,307],{"class":300},[286,461,462],{"class":296},"completions",[286,464,307],{"class":300},[286,466,467],{"class":310},"create",[286,469,314],{"class":296},[286,471,317],{"class":300},[286,473,475,478,480,483,487,490],{"class":288,"line":474},9,[286,476,477],{"class":323},"  model",[286,479,327],{"class":300},[286,481,482],{"class":300}," \"",[286,484,486],{"class":485},"sfazB","gpt-4",[286,488,489],{"class":300},"\"",[286,491,340],{"class":300},[286,493,495,498,500,503,506,509],{"class":288,"line":494},10,[286,496,497],{"class":323},"  messages",[286,499,327],{"class":300},[286,501,502],{"class":296}," [",[286,504,505],{"class":300},"...",[286,507,508],{"class":296},"]",[286,510,340],{"class":300},[286,512,514,517,519,522,525,528,530,533,535],{"class":288,"line":513},11,[286,515,516],{"class":323},"  response_format",[286,518,327],{"class":300},[286,520,521],{"class":310}," zodResponseFormat",[286,523,524],{"class":296},"(ResponseSchema",[286,526,527],{"class":300},",",[286,529,482],{"class":300},[286,531,532],{"class":485},"analysis",[286,534,489],{"class":300},[286,536,537],{"class":296},")\n",[286,539,541,543,545],{"class":288,"line":540},12,[286,542,416],{"class":300},[286,544,371],{"class":296},[286,546,421],{"class":300},[218,548,549],{},"When this compiles, you KNOW your response will match your schema. No surprises. No runtime errors. Just predictable AI behavior.",[235,551,553],{"id":552},"this-is-just-the-beginning","This Is Just the Beginning",[218,555,556],{},"What excites me most isn't that TypeScript is \"winning\" in AI—it's that we're finally treating AI applications like real production software:",[558,559,560,567,573,579],"ul",{},[561,562,563,566],"li",{},[225,564,565],{},"Type safety"," instead of hope",[561,568,569,572],{},[225,570,571],{},"Validation"," instead of prayer",[561,574,575,578],{},[225,576,577],{},"Predictability"," instead of surprises",[561,580,581,584],{},[225,582,583],{},"Engineering discipline"," instead of chaos",[218,586,587],{},"Python still owns AI research and training, and that's perfect. But for production applications that users depend on, TypeScript is bringing the engineering rigor we've needed all along.",[235,589,591],{"id":590},"pydantic-is-trying","Pydantic is Trying",[218,593,594],{},"I'm using Pydantic as much as I can when in Python. But it's like the Python culture is almost inherently against type safety.\nPydantic provides a great way to define and validate data models, but it still feels like an uphill battle to get buy-in from the broader Python community.",[235,596,598],{"id":597},"join-me-in-building-reliable-ai","Join Me in Building Reliable AI",[218,600,601],{},"I'm not here to start a language war. I'm here because I'm excited about building AI applications that don't break in production.",[218,603,604,607,608],{},[225,605,606],{},"Ready to build type-safe AI?"," Check out Matt Pocock's workshop: ",[609,610,614],"a",{"href":611,"rel":612},"https:\u002F\u002Fgithub.com\u002Fai-hero-dev\u002Fpoland-ai-ts-workshop",[613],"nofollow","github.com\u002Fai-hero-dev\u002Fpoland-ai-ts-workshop",[218,616,617],{},"What's your experience with AI in production? Are you still fighting runtime errors, or have you found your path to type safety? I'd love to hear about your engineering wins and challenges in building reliable AI systems.",[619,620,621],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":281,"searchDepth":320,"depth":320,"links":623},[624,629,632,633,634],{"id":237,"depth":320,"text":238,"children":625},[626,627,628],{"id":245,"depth":343,"text":246},{"id":252,"depth":343,"text":253},{"id":259,"depth":343,"text":260},{"id":266,"depth":320,"text":267,"children":630},[631],{"id":273,"depth":343,"text":274},{"id":552,"depth":320,"text":553},{"id":590,"depth":320,"text":591},{"id":597,"depth":320,"text":598},"2025-08-19","After years of unpredictable LLM outputs and runtime crashes, TypeScript is bringing the engineering discipline we've needed all along. Here's why I'm excited about type checking in production AI.","md",{"src":639,"alt":640},"\u002Fimages\u002Fblog\u002F20250819-1730-why-typescript-is-eating-pythons-lunch-in-production-llm-applications.png","A cinematic split-screen composition showing the evolution of production AI development: on the left, Python code and ML models representing research and training (darker, academic feel with neural network visualizations), on the right, TypeScript code with streaming APIs and web interfaces representing production deployment (brighter, modern feel with real-time data flows). The transition between sides flows like a bridge made of glowing code elements and data streams, symbolizing the shift from research to production. Professional photography quality with warm lighting on the TypeScript side and cooler tones on the Python side.",{},{"title":101,"description":636},"published","wLlj9WTZhJ9ShIU0d_s3lBTtja1jSShnsUGudWLnb_8",[646,648],{"title":97,"path":98,"stem":99,"description":647,"status":643,"children":-1},"Why Markdown has become the universal language for human-AI collaboration and the foundation of the agentic workflow revolution",{"title":105,"path":106,"stem":107,"description":649,"status":643,"children":-1},"The story of how someone took all my scripts, called them a masterpiece, and how Claude helped me make them actually worth it",1776221196452]