Field notes on building for the web — shipping AI features, front-end architecture, performance, and the craft of making software people trust.
Building an AI feature is the easy part — this is the full build most tutorials skip: Clerk auth, Stripe subscription billing, OpenAI usage tracking, rate limiting, and an architecture that survives real traffic, all in Next.js.
Read article →Every serious AI job listing in 2026 wants Python — this is the full build: a FastAPI and LangChain agent backend with real tools and streaming SSE, bridged cleanly to the Next.js frontend from Article #4.
Read article →Users stare at a blank screen for four seconds before your AI answers — streaming fixes that, and the Vercel AI SDK makes it almost free: useChat, streamText, streaming tool calls, structured objects, error handling, and production deployment on Vercel.
Read article →Function calling is what turns an LLM from a text generator into something that actually does things. This is the complete Node.js + TypeScript guide — tool schemas, parallel calls, streaming, strict mode, tool_choice, and the production-grade error handling most tutorials skip.
Read article →A complete, production-aware walkthrough of building a RAG application with Next.js App Router, OpenAI, and Pinecone — chunking, embeddings, vector search, streaming with the Vercel AI SDK, deployment, and the retrieval optimizations every tutorial skips.
Read article →A complete, production-minded walkthrough of building an AI agent with LangChain and OpenAI in TypeScript — tools, memory, the agent loop, error handling, deployment, and the things every tutorial leaves out.
Read article →Prompt engineering is not magic incantations. For developers it is interface design — clear contracts, worked examples, and treating prompts like code you can test.
Read article →React Server Components split your tree across the network. Once you see where the server/client boundary sits, the whole model — and when to reach for "use client" — clicks into place.
Read article →The best TypeScript is not the cleverest. It is the code where wrong states will not compile — using the type system as a design tool, not a chore you satisfy after the fact.
Read article →A model that is right 90% of the time can still feel broken if the other 10% shows up at the wrong moment. Trust is a product problem, not a model problem.
Read article →Performance is a feature you can measure, and most of the wins are unglamorous. Ship less, ship it later, and stop blocking the main thread.
Read article →A design system is not a component library. It is an agreement — and agreements break the moment they stop being convenient to keep.
Read article →