<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>CODERCOPS — Blog</title><description>Essays, analysis, and deep dives on developer tooling, AI hiring trends, and building a verified builder platform.</description><link>https://blog.codercops.com/</link><language>en-us</language><item><title>How to Hire a Full-Stack Developer in 2026: What the Job Actually Requires</title><link>https://blog.codercops.com/blog/how-to-hire-full-stack-developer-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/how-to-hire-full-stack-developer-2026/</guid><description>Full-stack means different things to every team. This is a practical guide to defining what you actually need, running a screen that catches specialists in disguise, and knowing when a generalist is the right call.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every agency and startup I have talked to says they are looking for a full-stack developer. Almost none of them have written down what that means for their specific context, which is why the search takes so long and the wrong hires happen so often.&lt;/p&gt;
&lt;p&gt;Full-stack is not a skill set. It is a claim about coverage. It means “this person can work on both ends of the system without handing off.” But coverage levels vary enormously. A developer who is 90% frontend and 10% backend is technically full-stack. So is someone who is evenly split. So is someone who started as a backend engineer and picked up React for a product-focused role. These are very different hires, and the gap only shows up after the offer letter is signed.&lt;/p&gt;
&lt;p&gt;The fix is to define the role before you start screening, and then to design a screen that reveals real capability on both ends rather than accepting a candidate’s self-assessment.&lt;/p&gt;
&lt;h2 id=&quot;what-full-stack-means-in-2026&quot;&gt;What full-stack means in 2026&lt;/h2&gt;
&lt;p&gt;In practice, most full-stack job listings in 2026 mean some combination of:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Frontend:&lt;/strong&gt; React, Next.js, or occasionally Vue or Svelte. TypeScript is assumed. Styling via Tailwind or CSS Modules. State management via TanStack Query for server state, Zustand or React context for client state. Familiarity with component libraries like shadcn/ui.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Backend:&lt;/strong&gt; Node.js (Express, Fastify, or Hono) or Python (FastAPI, Django). A SQL database, usually Postgres. ORM or query builder (Prisma, Drizzle, SQLAlchemy). Basic authentication, often via a third-party library. Some familiarity with deployment to a managed platform.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The connective tissue:&lt;/strong&gt; TypeScript types shared between frontend and backend. REST or tRPC for the contract. Environment configuration. CI/CD basics. Some understanding of the runtime environment.&lt;/p&gt;
&lt;p&gt;If your stack diverges significantly from this, say so in the job description. A developer who has built React and Node.js apps for three years may have zero experience with a mobile frontend, a Go backend, or a GraphQL API. Assuming otherwise wastes everyone’s time.&lt;/p&gt;
&lt;h2 id=&quot;the-most-common-hiring-mistake&quot;&gt;The most common hiring mistake&lt;/h2&gt;
&lt;p&gt;Teams hire someone who is excellent on one end and genuinely mediocre on the other. The candidate presents as full-stack, and nothing in the standard interview process contradicts that because the interview is not designed to test both ends independently.&lt;/p&gt;
&lt;p&gt;The frontend-heavy candidate builds beautiful, responsive UIs and then writes backend code that returns 200 for validation errors, uses unbounded database queries, and has no error handling. The first production incident teaches the team what they missed.&lt;/p&gt;
&lt;p&gt;The backend-heavy candidate builds rock-solid APIs and then writes frontend code with no loading states, no error boundaries, no accessibility, and inline styles everywhere. Users complain. The UX degrades.&lt;/p&gt;
&lt;p&gt;Neither of these is a bad developer. They are well-suited for one role and miscast in the other. The problem is not the candidate; it is the screening process.&lt;/p&gt;
&lt;h2 id=&quot;what-to-screen-for&quot;&gt;What to screen for&lt;/h2&gt;
&lt;p&gt;The most reliable screen is a combined task. Give the candidate a prompt that requires both ends: build a feature that stores and retrieves data, with a backend endpoint and a frontend component that calls it.&lt;/p&gt;
&lt;p&gt;A good prompt: “Add a simple todo list. There should be a GET endpoint that returns items and a POST endpoint that adds one. The frontend should show the list, handle loading, and show an error message if the request fails. TypeScript throughout.”&lt;/p&gt;
&lt;p&gt;This task is intentionally small. You are not looking for production-grade code. You are looking for what the candidate thinks about when left to their own devices.&lt;/p&gt;
&lt;p&gt;On the backend, watch for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Basic input validation (does a POST with an empty body crash the server or return a 400?)&lt;/li&gt;
&lt;li&gt;Appropriate status codes&lt;/li&gt;
&lt;li&gt;Some form of error handling, even minimal&lt;/li&gt;
&lt;li&gt;Code that would not fail silently in production&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the frontend, watch for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A loading state, even a simple one&lt;/li&gt;
&lt;li&gt;An error state when the API call fails&lt;/li&gt;
&lt;li&gt;Types for the data structure&lt;/li&gt;
&lt;li&gt;Reasonable component structure (not everything in one giant file)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most candidates will do the task they are more comfortable with well and cut corners on the other. The way they cut corners tells you where their depth actually is.&lt;/p&gt;
&lt;h2 id=&quot;the-interview-questions-that-matter&quot;&gt;The interview questions that matter&lt;/h2&gt;
&lt;p&gt;Beyond the take-home, a live conversation can fill in context.&lt;/p&gt;
&lt;p&gt;For a senior full-stack candidate, ask: “Walk me through a time you owned an end-to-end feature, from data model to UI. What decisions did you make that you would change now?” This reveals how they reason about the full system and whether they have thought about their own tradeoffs.&lt;/p&gt;
&lt;p&gt;For any level, ask: “If the API is down, what does the user experience in your frontend?” A frontend-first thinker will describe error states and retry logic. A backend-first thinker will often describe the API not being down rather than answering the frontend question. Pay attention to which end they naturally think from.&lt;/p&gt;
&lt;p&gt;Ask: “How do you handle a database schema change that breaks a deployed frontend?” This tests whether they understand the deployment contract between the two halves of a full-stack system.&lt;/p&gt;
&lt;h2 id=&quot;when-not-to-hire-full-stack&quot;&gt;When not to hire full-stack&lt;/h2&gt;
&lt;p&gt;Full-stack generalists have a real limitation: the breadth comes at the cost of depth. This is fine for most situations, and actively valuable in small teams where one person needs to ship features without coordination overhead. It is a problem when one end of the stack is where most of your product complexity lives.&lt;/p&gt;
&lt;p&gt;If your product’s competitive edge is a complex data visualization layer, a high-performance real-time UI, or a deeply accessible interface, a specialist frontend engineer will outperform a full-stack hire. They will write better accessibility code, make better performance tradeoffs, and understand the browser rendering model at a level most full-stack developers do not.&lt;/p&gt;
&lt;p&gt;If your edge is in processing complex data at scale, running background jobs with high reliability, or building an API that dozens of clients depend on, a specialist backend engineer is the right call. The full-stack hire will reach the limits of their backend depth at exactly the moment the product gets interesting.&lt;/p&gt;
&lt;h2 id=&quot;connecting-to-the-hiring-cluster&quot;&gt;Connecting to the hiring cluster&lt;/h2&gt;
&lt;p&gt;The other hiring guides in this series cover the specialized roles. If you need React specifically, &lt;a href=&quot;/blog/hire-react-developer-technical-screen-2026/&quot;&gt;the React developer screen&lt;/a&gt; goes deeper on frontend signals. For backend Node.js specifically, the &lt;a href=&quot;/blog/how-to-hire-nodejs-developer-2026/&quot;&gt;Node.js developer hiring guide&lt;/a&gt; covers the async and TypeScript screens.&lt;/p&gt;
&lt;p&gt;For the total cost of each hiring model, including the cost of getting it wrong, &lt;a href=&quot;/blog/what-it-costs-to-hire-a-developer-2026/&quot;&gt;what it costs to hire a developer in 2026&lt;/a&gt; breaks down the math. For alternatives to in-house hiring when the full-stack need is project-based, the &lt;a href=&quot;/blog/how-to-hire-software-development-agency-2026/&quot;&gt;agency vs freelancer vs in-house framework&lt;/a&gt; covers when each model makes sense.&lt;/p&gt;
&lt;h2 id=&quot;a-practical-note-on-salary&quot;&gt;A practical note on salary&lt;/h2&gt;
&lt;p&gt;Full-stack developers cost more than specialists at the same seniority level, because the combination is rarer. Budget 10-20% above what you would pay a strong specialist on either end. The market reflects the real difficulty of finding someone who is genuinely capable on both sides, not just self-described that way.&lt;/p&gt;
&lt;p&gt;If you find a candidate who is strong on both ends, do not lose them on offer. The screening process to get there is long enough that starting over costs more than the delta.&lt;/p&gt;</content:encoded><category>Business</category><category>Hiring</category><category>Full-Stack</category><category>Business</category><category>Web Development</category><category>Developers</category><category>2026</category><author>Anurag Verma</author></item><item><title>How to Hire a Node.js Developer in 2026: The Screen That Finds Real Backend Engineers</title><link>https://blog.codercops.com/blog/how-to-hire-nodejs-developer-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/how-to-hire-nodejs-developer-2026/</guid><description>Node.js has fractured into async-first, TypeScript-native, and edge-runtime camps. This is the practical screening guide for hiring a Node.js developer who can build production backends, not just Express tutorials.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Most Node.js hiring goes wrong at the job description. The team writes “Node.js developer,” posts it, and then spends two weeks screening candidates who all claim the same credential but differ wildly in what they can actually do.&lt;/p&gt;
&lt;p&gt;Part of this is the ecosystem’s fault. Node.js in 2026 spans several distinct skill profiles. There are Express developers who have been shipping CRUD APIs since 2017 and whose mental model is largely unchanged. There are Fastify engineers who care deeply about throughput and plugin lifecycle. There are NestJS teams who bring Java-style patterns to JavaScript. There are people building on Hono for Cloudflare Workers or Bun runtimes who would not call themselves Node.js developers at all. They all fit under one label.&lt;/p&gt;
&lt;p&gt;The screen has to do the disambiguation work the job description cannot.&lt;/p&gt;
&lt;h2 id=&quot;what-the-event-loop-question-is-actually-testing&quot;&gt;What the event loop question is actually testing&lt;/h2&gt;
&lt;p&gt;Ask every candidate: “What is the Node.js event loop, and why does it matter for an HTTP server?”&lt;/p&gt;
&lt;p&gt;This question sounds like trivia. It is not. A developer who cannot answer it cannot diagnose a slow API. They cannot explain why a synchronous operation inside a request handler is dangerous. They will not understand why &lt;code&gt;Promise.all&lt;/code&gt; with 100 concurrent database queries causes different problems than 100 sequential awaits.&lt;/p&gt;
&lt;p&gt;A passing answer for a mid-level engineer: they know the event loop is single-threaded, that I/O operations are offloaded to libuv’s thread pool and callbacks are queued, and that CPU-heavy synchronous work blocks the entire process. They do not need to know libuv internals, but they need to know the implication.&lt;/p&gt;
&lt;p&gt;A passing answer for a senior: all of the above, plus something about worker threads or child processes for CPU work, mention of the microtask queue and how it differs from the macrotask queue, and a real example from their own work where this caused a production problem.&lt;/p&gt;
&lt;p&gt;A failing answer: anything that treats Node.js concurrency as roughly equivalent to multi-threading.&lt;/p&gt;
&lt;h2 id=&quot;the-typescript-question-is-not-optional-anymore&quot;&gt;The TypeScript question is not optional anymore&lt;/h2&gt;
&lt;p&gt;There was a window where asking for TypeScript in a Node.js role was a nice-to-have. That window closed around 2023. The major frameworks (NestJS, Fastify, Hono) assume TypeScript. The ORMs (Prisma, Drizzle) are built around TypeScript’s type system. New hires who do not know it slow the team down within the first week.&lt;/p&gt;
&lt;p&gt;The screen for TypeScript is not “can they write a type.” It is: do they understand what TypeScript actually adds? Can they explain a generic function? Can they write a type-safe error handler that differentiates between a database error and a validation error? Can they set up a project’s &lt;code&gt;tsconfig.json&lt;/code&gt; without copying one from StackOverflow?&lt;/p&gt;
&lt;p&gt;Watch for candidates who describe TypeScript as “JavaScript with types added on top.” That framing usually means they write &lt;code&gt;any&lt;/code&gt; whenever the type gets complicated, which undermines the value entirely.&lt;/p&gt;
&lt;h2 id=&quot;frameworks-what-they-pick-and-why&quot;&gt;Frameworks: what they pick and why&lt;/h2&gt;
&lt;p&gt;The framework question reveals how a candidate thinks about tradeoffs.&lt;/p&gt;
&lt;p&gt;Ask them which framework they would use for a new internal JSON API and why. Do not accept “whatever the team uses.” Push for their preference in a greenfield context.&lt;/p&gt;
&lt;p&gt;Good answer signals: they have a reason beyond familiarity. They mention performance characteristics, plugin systems, validation, or the trade between boilerplate and flexibility. They can name something they dislike about their preferred choice.&lt;/p&gt;
&lt;p&gt;Weaker signals: they can only name Express because it is what they learned first, or they recommend NestJS because “it is enterprise” without being able to say what that means for a two-person team.&lt;/p&gt;
&lt;p&gt;The frameworks worth knowing in order of market presence:&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Framework&lt;/th&gt;&lt;th&gt;Best fit&lt;/th&gt;&lt;th&gt;Known for&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Express&lt;/td&gt;&lt;td&gt;Simple APIs, existing codebases&lt;/td&gt;&lt;td&gt;Minimal, flexible, enormous ecosystem&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fastify&lt;/td&gt;&lt;td&gt;Performance-sensitive services&lt;/td&gt;&lt;td&gt;Plugin lifecycle, schema validation, speed&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;NestJS&lt;/td&gt;&lt;td&gt;Large teams, enterprise patterns&lt;/td&gt;&lt;td&gt;Decorators, DI, Angular-like structure&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Hono&lt;/td&gt;&lt;td&gt;Edge runtimes, Bun, Cloudflare Workers&lt;/td&gt;&lt;td&gt;Tiny footprint, runtime-agnostic&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ElysiaJS&lt;/td&gt;&lt;td&gt;Bun-first, end-to-end types&lt;/td&gt;&lt;td&gt;Type-safe ergonomics, Bun runtime speed&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;A candidate who has used two or three of these and can explain when they would not use their favorite is worth putting through to the technical test.&lt;/p&gt;
&lt;h2 id=&quot;the-practical-screen&quot;&gt;The practical screen&lt;/h2&gt;
&lt;p&gt;A take-home task is the most reliable signal. The scope matters: it should be completable in two to three hours for a mid-level engineer and should not require them to build a production-grade system.&lt;/p&gt;
&lt;p&gt;A good task: build a small HTTP API with three endpoints. One should retrieve a list of items from a mock database (a local JSON file or an in-memory store works). One should accept a new item with basic validation. One should simulate a dependency that sometimes fails and handle that failure without crashing the process. Require TypeScript. Ask for at least one test.&lt;/p&gt;
&lt;p&gt;What you are grading:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do they handle async errors properly? An unhandled rejection that crashes the server in production is a day-one issue.&lt;/li&gt;
&lt;li&gt;Is the code typed or is it effectively untyped TypeScript?&lt;/li&gt;
&lt;li&gt;Do they send appropriate HTTP status codes (not 200 for a validation error)?&lt;/li&gt;
&lt;li&gt;Is there any graceful shutdown handling?&lt;/li&gt;
&lt;li&gt;Do the tests actually test behavior, or do they test that a function was called?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You will see immediately who understands what production-grade means and who does not.&lt;/p&gt;
&lt;h2 id=&quot;red-flags-in-nodejs-interviews&quot;&gt;Red flags in Node.js interviews&lt;/h2&gt;
&lt;p&gt;A few things that reliably predict problems:&lt;/p&gt;
&lt;p&gt;Callbacks over promises by preference. Not historical codebases, but greenfield choices. Candidates who actively prefer callback style in 2026 are carrying habits from a much older era and will write code nobody else wants to maintain.&lt;/p&gt;
&lt;p&gt;No TypeScript on personal or recent projects. This is not about preference. It is a signal about what the market requires and whether they are keeping up.&lt;/p&gt;
&lt;p&gt;Never deployed to any real infrastructure. Heroku shutdown pushed a generation of developers to move. If they have never used Fly.io, Railway, ECS, Render, or Kubernetes for anything, they may not understand what running a Node.js process in production actually looks like.&lt;/p&gt;
&lt;p&gt;“I have not needed queues.” Almost every production system that processes more than trivial load eventually needs background jobs. A developer who has never used BullMQ, Inngest, or a similar tool has probably not built systems that run under real conditions.&lt;/p&gt;
&lt;h2 id=&quot;green-flags-worth-paying-for&quot;&gt;Green flags worth paying for&lt;/h2&gt;
&lt;p&gt;Some things indicate a developer who has seen production and learned from it:&lt;/p&gt;
&lt;p&gt;They bring up graceful shutdown without prompting. Handling &lt;code&gt;SIGTERM&lt;/code&gt; properly, draining in-flight requests, and closing database connections before exit is not something you learn from a tutorial. It is something you learn when a deployment kills active user sessions.&lt;/p&gt;
&lt;p&gt;They have used &lt;code&gt;node --inspect&lt;/code&gt; or &lt;code&gt;clinic.js&lt;/code&gt; to profile memory. Saying “we had a memory leak in production” and having a coherent story about how they found and fixed it is a senior signal.&lt;/p&gt;
&lt;p&gt;They know when to leave Node.js entirely. A developer who reaches for worker threads for a CPU-intensive task, or who has stood up a Python service for ML inference alongside a Node.js API, understands that the runtime is a tool, not an identity.&lt;/p&gt;
&lt;p&gt;They have opinions on logging. Not just “we use Winston” but a view on structured logging, log levels, and what information belongs in a trace versus a log line. This correlates with having built and debugged things in production.&lt;/p&gt;
&lt;h2 id=&quot;connecting-the-hiring-decision-to-cost&quot;&gt;Connecting the hiring decision to cost&lt;/h2&gt;
&lt;p&gt;The difference between a mid-level and a senior Node.js hire shows up most clearly in how they handle things that go wrong. Both can build a feature in calm conditions. The senior builds it in a way that makes the next incident easier to diagnose.&lt;/p&gt;
&lt;p&gt;The framework for thinking about total hiring cost, including screening time and ramp-up, is in &lt;a href=&quot;/blog/what-it-costs-to-hire-a-developer-2026/&quot;&gt;what it costs to hire a developer in 2026&lt;/a&gt;. For the mechanics of vetting technical claims before making an offer, the process is in &lt;a href=&quot;/blog/how-to-hire-vetted-software-developer-2026/&quot;&gt;how to hire a vetted software developer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you are hiring Node.js alongside DevOps or infrastructure work, the signals to look for on the ops side are in &lt;a href=&quot;/blog/how-to-hire-devops-engineer-2026/&quot;&gt;how to hire a DevOps engineer in 2026&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;the-practical-shortcut&quot;&gt;The practical shortcut&lt;/h2&gt;
&lt;p&gt;If you do not have a senior Node.js engineer in-house who can run a technical screen, the alternative is a structured take-home followed by a review session where the candidate walks through their choices. The review session matters more than the take-home output. Someone who built something imperfect but can clearly articulate why they made each decision, and can identify what they would change, is a much better hire than someone who produced clean code but cannot explain it.&lt;/p&gt;
&lt;p&gt;Node.js hiring at the moment rewards specificity. The candidate who says “I work in Fastify with Drizzle and Postgres, mostly on APIs that handle high-frequency reads” is easier to evaluate than one who says “full-stack JavaScript.” Ask for specificity before you run a screen, and save the screen for the candidates who can describe what they have actually built.&lt;/p&gt;</content:encoded><category>Business</category><category>Hiring</category><category>Node.js</category><category>Backend</category><category>JavaScript</category><category>TypeScript</category><category>2026</category><author>Prathviraj Singh</author></item><item><title>Reducing LLM API Costs in Production: Caching, Batching, and Model Routing</title><link>https://blog.codercops.com/blog/reducing-llm-api-costs-production-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/reducing-llm-api-costs-production-2026/</guid><description>LLM API bills grow faster than usage. These are the concrete techniques that cut costs by 40-80% without degrading quality: prompt caching, semantic deduplication, tiered model routing, and batch inference.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You shipped the AI feature. Usage is growing. Then the API bill arrives.&lt;/p&gt;
&lt;p&gt;LLM costs do not scale linearly with users. They scale with tokens, which means a feature that seemed cheap in development gets expensive fast as usage grows, especially if the system prompt is long, users send verbose inputs, or the model is returning longer completions than you expected.&lt;/p&gt;
&lt;p&gt;The good news is that most production LLM systems have significant optimization headroom. The techniques below are not speculative. They are available today on every major provider and can reduce bills by 40-80% without changing what the user sees.&lt;/p&gt;
&lt;p&gt;The bad news is that you need to measure before you can optimize. If you do not know which features drive cost and what the token breakdown looks like, start there.&lt;/p&gt;
&lt;h2 id=&quot;instrument-first&quot;&gt;Instrument first&lt;/h2&gt;
&lt;p&gt;Before any optimization, add logging to every LLM call:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;interface&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; LLMCallLog&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;  feature&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;         &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;// which product surface triggered this&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;  model&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;  promptTokens&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;  completionTokens&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;  costUSD&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;         &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;// compute from the pricing table at call time&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;  latencyMs&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;  cacheHit&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; boolean&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;       &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;// fill in once you add caching&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;  requestId&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;       &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;// for correlation with provider logs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Aggregate by feature over 7-day windows. You will usually find that one or two features drive 60-80% of the cost. Those are where you start.&lt;/p&gt;
&lt;h2 id=&quot;prompt-caching-the-highest-leverage-change&quot;&gt;Prompt caching: the highest-leverage change&lt;/h2&gt;
&lt;p&gt;Prompt caching stores the transformer’s computed key-value pairs for a given input prefix. On subsequent requests that share that prefix, the model reads from cache rather than recomputing, which is faster and costs a fraction of normal input token pricing.&lt;/p&gt;
&lt;p&gt;All three major providers support it:&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Provider&lt;/th&gt;&lt;th&gt;Cache read cost&lt;/th&gt;&lt;th&gt;Cache write cost&lt;/th&gt;&lt;th&gt;TTL&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Anthropic&lt;/td&gt;&lt;td&gt;10% of input token price&lt;/td&gt;&lt;td&gt;25% of input token price&lt;/td&gt;&lt;td&gt;5 minutes (refreshes on hit)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OpenAI&lt;/td&gt;&lt;td&gt;50% of input token price&lt;/td&gt;&lt;td&gt;Full price (first request)&lt;/td&gt;&lt;td&gt;5-10 minutes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Google Gemini&lt;/td&gt;&lt;td&gt;~25% of input token price&lt;/td&gt;&lt;td&gt;Full price&lt;/td&gt;&lt;td&gt;1 hour minimum&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The catch: the cached prefix must be static. System prompts, retrieved documents, conversation history, and other fixed context can be cached. The dynamic user message cannot. Most well-structured prompts have a large system prompt and a small user turn, which means caching dramatically reduces the per-request input cost.&lt;/p&gt;
&lt;p&gt;On Anthropic, you mark cacheable prefixes explicitly with a &lt;code&gt;cache_control&lt;/code&gt; header:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; anthropic&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;client &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; anthropic.Anthropic()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;response &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; client.messages.create(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;    model&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;claude-sonnet-4-6&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;    max_tokens&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;1024&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;    system&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;            &quot;type&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;            &quot;text&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;LONG_SYSTEM_PROMPT&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,  &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;# could be thousands of tokens&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;            &quot;cache_control&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: {&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;ephemeral&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;    messages&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        {&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;role&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: user_message}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;# Check the usage to confirm cache behavior&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(response.usage.cache_read_input_tokens)    &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;# tokens served from cache&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(response.usage.cache_creation_input_tokens) &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;# tokens written to cache&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On a system prompt of 2,000 tokens with 100 daily users each sending 10 messages, moving from no caching to cached system prompt reduces input token cost by roughly 90%. At claude-sonnet-4-6 pricing, that is a meaningful number by month’s end.&lt;/p&gt;
&lt;h2 id=&quot;semantic-caching-for-repeated-questions&quot;&gt;Semantic caching for repeated questions&lt;/h2&gt;
&lt;p&gt;Prompt caching handles identical prefixes. Semantic caching handles near-duplicate user inputs.&lt;/p&gt;
&lt;p&gt;Users ask the same question in different words constantly, especially in support, Q&amp;#x26;A, and document retrieval features. “What is your return policy?” and “How do returns work?” are different strings that should return the same response. Without semantic caching, both hit the API and pay full price.&lt;/p&gt;
&lt;p&gt;Semantic caching works like this: embed the incoming user query, compare it against a vector index of cached (query, response) pairs, return the cached response if similarity exceeds a threshold (typically 0.92-0.95 cosine similarity), and cache the new pair if it misses.&lt;/p&gt;
&lt;p&gt;A minimal implementation with Redis and &lt;code&gt;pgvector&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; psycopg2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; numpy &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; np&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; openai &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; OpenAI&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;client &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; OpenAI()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;conn &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; psycopg2.connect(&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;DATABASE_URL&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;SIMILARITY_THRESHOLD&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 0.93&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; embed&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(text: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) -&gt; list[&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;float&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;]:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; client.embeddings.create(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;        input&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;text,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;        model&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;text-embedding-3-small&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    ).data[&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;].embedding&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; semantic_cache_get&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(query: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) -&gt; &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; None&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    embedding &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; embed(query)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    cur &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; conn.cursor()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    cur.execute(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;        SELECT response, 1 - (embedding &amp;#x3C;=&gt; &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;::vector) AS similarity&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;        FROM llm_cache&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;        ORDER BY similarity DESC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;        LIMIT 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;    &quot;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, (embedding,))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    row &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; cur.fetchone()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; row &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;and&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; row[&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; SIMILARITY_THRESHOLD&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; row[&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; None&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; semantic_cache_set&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(query: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, response: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    embedding &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; embed(query)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    cur &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; conn.cursor()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    cur.execute(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;        INSERT INTO llm_cache (query, response, embedding)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;        VALUES (&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;::vector)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;        ON CONFLICT DO NOTHING&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;    &quot;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, (query, response, embedding))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    conn.commit()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cache hit rates after the first week of operation are typically 30-60% for customer-facing features. The embedding call itself costs a small amount, but &lt;code&gt;text-embedding-3-small&lt;/code&gt; at $0.02 per million tokens is trivially cheap compared to a full generation call.&lt;/p&gt;
&lt;p&gt;One caution: staleness. A cached response that is weeks old may be wrong if the product changed. Include a TTL and an invalidation mechanism for content that changes.&lt;/p&gt;
&lt;h2 id=&quot;model-routing-right-model-for-the-task&quot;&gt;Model routing: right model for the task&lt;/h2&gt;
&lt;p&gt;Not every request needs your most capable model. A classification task, a short factual lookup, or a simple reformatting job does not need GPT-4 or Claude Opus. It needs something that is correct and fast.&lt;/p&gt;
&lt;p&gt;Model routing classifies incoming requests and sends them to the cheapest model that can handle them:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; enum &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; Enum&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; RequestComplexity&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;Enum&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;    SIMPLE&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &quot;simple&quot;&lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;     # factual lookup, classification, formatting&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;    MEDIUM&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &quot;medium&quot;&lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;     # summarization, basic Q&amp;#x26;A, code completion&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;    COMPLEX&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &quot;complex&quot;&lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;   # reasoning, long-form writing, code generation&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;MODEL_BY_COMPLEXITY&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    RequestComplexity.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;SIMPLE&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;claude-haiku-4-5-20251001&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    RequestComplexity.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;MEDIUM&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;claude-sonnet-4-6&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    RequestComplexity.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;COMPLEX&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;claude-sonnet-4-6&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,  &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;# or claude-opus-4-8 for highest stakes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; classify_complexity&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(user_message: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, context: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;dict&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) -&gt; RequestComplexity:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;    # Rule-based is often good enough to start&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; len&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(user_message) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; context.get(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;task_type&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;classify&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;format&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;extract&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; RequestComplexity.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;SIMPLE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; context.get(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;requires_reasoning&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;or&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; len&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(user_message) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 1000&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; RequestComplexity.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;COMPLEX&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; RequestComplexity.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;MEDIUM&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; route_request&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(user_message: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, context: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;dict&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) -&gt; &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    complexity &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; classify_complexity(user_message, context)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; MODEL_BY_COMPLEXITY&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;[complexity]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The cost differences are large. Haiku 4.5 is roughly 20-30x cheaper than Opus 4.8 per token. Even moving 40% of requests from Sonnet to Haiku reduces the blended cost by 20-30%.&lt;/p&gt;
&lt;p&gt;The risk is misrouting: sending a complex task to a cheap model and getting a wrong or low-quality response. The mitigation is to start conservative (route only very clearly simple tasks to the cheap model), track quality metrics per model tier, and expand routing as you gain confidence in the classifier.&lt;/p&gt;
&lt;p&gt;Existing tools like OpenRouter and LiteLLM have routing built in and support fallbacks when a model is unavailable.&lt;/p&gt;
&lt;h2 id=&quot;batch-inference-for-offline-workloads&quot;&gt;Batch inference for offline workloads&lt;/h2&gt;
&lt;p&gt;Any task that does not need a real-time response is a candidate for batch inference. The savings are significant and the implementation is simple.&lt;/p&gt;
&lt;p&gt;Anthropic’s Batch API and OpenAI’s Batch API both offer 50% cost reduction on batch requests, processed within 24 hours. Google Vertex has similar offerings.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; anthropic&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;client &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; anthropic.Anthropic()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;# Create a batch for document summarization&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;batch &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; client.messages.batches.create(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;    requests&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;            &quot;custom_id&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;doc-&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;            &quot;params&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;                &quot;model&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;claude-sonnet-4-6&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;                &quot;max_tokens&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;500&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;                &quot;messages&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;                    {&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;role&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;Summarize this document:&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;\n\n{&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;doc&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;                ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;        for&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; i, doc &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; enumerate&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(documents)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;Batch ID: &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;batch.id&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;# Poll for completion or use a webhook&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Use cases that map well to batch inference: content classification at scale, document summarization pipelines, bulk data extraction, generating product descriptions, batch translation, and any nightly data processing job.&lt;/p&gt;
&lt;p&gt;Tasks that do not fit: anything user-facing that needs a response within seconds.&lt;/p&gt;
&lt;h2 id=&quot;output-token-reduction-where-the-money-hides&quot;&gt;Output token reduction: where the money hides&lt;/h2&gt;
&lt;p&gt;Input tokens are cheaper than output tokens on every major provider. Long, verbose completions cost more than short, direct ones, and they are slower.&lt;/p&gt;
&lt;p&gt;The practical lever is explicit instructions in the system prompt:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Be concise. Use bullet points instead of prose for lists. Do not restate the user&apos;s question.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Limit responses to 300 words unless the task genuinely requires more.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On customer-facing features, reducing average completion length from 400 tokens to 150 tokens cuts output cost by 62%. Check your analytics: if the median user reads 150 tokens of a 400-token response, the extra 250 tokens are cost with no value.&lt;/p&gt;
&lt;p&gt;For structured data extraction, use JSON output modes (supported on all major providers) rather than asking the model to explain its reasoning first. Structured output produces shorter completions and is easier to parse downstream.&lt;/p&gt;
&lt;h2 id=&quot;putting-it-together&quot;&gt;Putting it together&lt;/h2&gt;
&lt;p&gt;The order of operations matters. Each of these techniques takes time to implement correctly. A reasonable sequencing:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Instrument&lt;/strong&gt; (one sprint): log model, tokens, cost, latency for every call. No optimization yet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identify the hot paths&lt;/strong&gt; (one week of data): which features drive 80% of cost?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add prompt caching&lt;/strong&gt; (one sprint): highest leverage, lowest risk, lowest complexity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add model routing&lt;/strong&gt; for clearly simple tasks (one sprint): conservative routing on well-understood request types.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add semantic caching&lt;/strong&gt; for high-volume Q&amp;#x26;A features (one to two sprints): more complex, higher reward for the right use cases.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Move eligible offline work to batch&lt;/strong&gt; (one sprint): straightforward if the feature is already async.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tune output length&lt;/strong&gt; (ongoing): iterative, based on real usage data.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Most teams that go through this sequence find that steps 3 and 4 alone cut their bill by 40-60%. Steps 5 and 6 can take it further.&lt;/p&gt;
&lt;p&gt;The budget lines that tend to catch teams off guard during AI feature development are covered in &lt;a href=&quot;/blog/true-cost-ai-features-production-budget-2026/&quot;&gt;what an AI feature actually costs&lt;/a&gt;. For observability tooling that makes cost tracking less painful, &lt;a href=&quot;/blog/llm-observability-langfuse-helicone-2026/&quot;&gt;LLM observability tools&lt;/a&gt; covers the options. If you are building AI features for clients and need to explain these cost structures in project scoping, the context is useful for &lt;a href=&quot;/services/&quot;&gt;how we structure AI integration projects&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;one-thing-to-track-that-most-teams-do-not&quot;&gt;One thing to track that most teams do not&lt;/h2&gt;
&lt;p&gt;Track cost per unit of user value, not just cost per call.&lt;/p&gt;
&lt;p&gt;A feature where each LLM call generates a report that saves a user 30 minutes has a very different economics profile than a feature where each call produces a one-line summary the user ignores. The second feature looks cheap per call but has no return. The first looks expensive but is worth every token.&lt;/p&gt;
&lt;p&gt;The optimization work makes more sense, and is easier to prioritize internally, when it is connected to the value the feature delivers. A 50% cost reduction on a feature that should not exist is not an accomplishment.&lt;/p&gt;</content:encoded><category>AI Integration</category><category>AI Integration</category><category>LLM</category><category>Performance</category><category>Backend</category><category>Production</category><category>2026</category><author>Prathviraj Singh</author></item><item><title>Statement of Work vs. Time and Materials: Getting the Contract Right Before Work Starts</title><link>https://blog.codercops.com/blog/statement-of-work-vs-time-and-materials-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/statement-of-work-vs-time-and-materials-2026/</guid><description>Choosing the wrong contract structure is one of the most reliable ways to damage a client relationship. Here is a practical guide to SoW, T&amp;M, and the hybrid models that actually work for software projects.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Most disputes between software agencies and their clients come down to a mismatch between what was contracted and what was expected. The technical work is often fine. The relationship breaks over scope creep, payment timing, or a disagreement about what “done” means.&lt;/p&gt;
&lt;p&gt;The contract structure is not the cause of those disputes, but it determines how they play out. A well-matched contract type absorbs the normal friction of a software project. A mismatched one amplifies it.&lt;/p&gt;
&lt;h2 id=&quot;the-two-main-models&quot;&gt;The two main models&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Statement of Work (SoW)&lt;/strong&gt; defines a specific deliverable, a timeline, and a price. The agency agrees to build a described thing by a described date for a described fee. If the client asks for something outside that definition, it requires a formal change order. The risk of underestimating sits with the agency. The risk of having no flexibility sits with the client.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Time and Materials (T&amp;#x26;M)&lt;/strong&gt; bills actual hours worked at an agreed rate. The client pays for the work, not the outcome. Risk of scope expansion sits with the client. Risk of the agency underdelivering for the hours billed sits with the client too, which is why T&amp;#x26;M works best when the client has enough technical oversight to know whether the hours are productive.&lt;/p&gt;
&lt;p&gt;Both models are complete contracts. Neither is a workaround or a compromise. The choice is about which party should hold which risks given what the project actually looks like.&lt;/p&gt;
&lt;h2 id=&quot;when-sow-is-the-right-call&quot;&gt;When SoW is the right call&lt;/h2&gt;
&lt;p&gt;A fixed-price SoW makes sense when:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Requirements are genuinely stable.&lt;/strong&gt; The client has a specification, the agency can scope against it, and both parties can agree on acceptance criteria before work starts. This is rarer than it sounds. Most clients think they have stable requirements until the first prototype arrives.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The client cannot carry budget uncertainty.&lt;/strong&gt; A startup raising its first round, a small business owner, or a non-profit with a fixed grant budget may need to know the total cost upfront to proceed at all. SoW is often the only viable commercial structure in these cases.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The project is a known type.&lt;/strong&gt; A standard e-commerce build, a marketing site with a defined page count, a mobile app with a clear feature list, an API integration between two documented systems. These are projects where an experienced agency can scope accurately enough that a fixed fee is not a gamble.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The agency has done it before.&lt;/strong&gt; Fixed-price contracts carry estimation risk. The mitigation is depth of experience with that project type. An agency that has built 50 similar projects can absorb that risk because the unknowns are bounded by prior experience. An agency building in an unfamiliar domain is taking on risk that will cost someone.&lt;/p&gt;
&lt;h2 id=&quot;when-tm-is-the-right-call&quot;&gt;When T&amp;#x26;M is the right call&lt;/h2&gt;
&lt;p&gt;Time and Materials is the right structure when:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Requirements will evolve.&lt;/strong&gt; Products that are being discovered during development, integrations with undocumented legacy systems, or projects where the client needs to see a working version before finalizing the next phase. In these cases, a fixed SoW is a fiction, because neither party knows what to fix it to.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The engagement is ongoing.&lt;/strong&gt; Retainer relationships, maintenance contracts, and long-term product partnerships are naturally T&amp;#x26;M. The value of the relationship is in continuous access to a team that knows the product deeply. Trying to repackage that as a series of SoWs adds administrative overhead without adding clarity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The client wants to control scope dynamically.&lt;/strong&gt; Some clients, usually ones with technical leadership, prefer to adjust priorities sprint by sprint. They want to be able to say “skip that feature, do this instead” without filing change orders. T&amp;#x26;M lets them do that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Discovery is required.&lt;/strong&gt; If you are auditing an existing system, scoping a large project, or doing technical research before committing to a build, T&amp;#x26;M is the right structure for that phase. You cannot write a fixed-price contract for work whose output you cannot define yet.&lt;/p&gt;
&lt;h2 id=&quot;the-failure-mode-wrong-model-for-the-project-type&quot;&gt;The failure mode: wrong model for the project type&lt;/h2&gt;
&lt;p&gt;The most common problem is a fixed-price SoW on a project that was never actually well-defined.&lt;/p&gt;
&lt;p&gt;It goes like this: the client wants budget certainty, the agency wants to close the deal, and neither party pushes hard enough on “do we actually know what we are building?” The SoW is signed with some ambiguity baked in. Development starts. Scope questions arise. The agency issues a change order. The client is surprised (“we thought that was included”). Tension builds. By the third change order, the relationship is damaged.&lt;/p&gt;
&lt;p&gt;This is not a bad-faith problem. Both parties wanted the project to work. The structure was just wrong for the actual project.&lt;/p&gt;
&lt;p&gt;The solution is a short discovery phase before any fixed-price contract. Two to four weeks of requirements work, prototyping, and specification writing, billed on T&amp;#x26;M. At the end of discovery, both parties know enough to sign a meaningful SoW or to agree that T&amp;#x26;M is the right structure for the build phase. The discovery investment pays for itself in avoided disputes.&lt;/p&gt;
&lt;h2 id=&quot;the-hybrid-capped-tm&quot;&gt;The hybrid: capped T&amp;#x26;M&lt;/h2&gt;
&lt;p&gt;For most mid-sized projects, neither pure model is ideal. The client wants budget certainty but the scope is not fully defined. The agency wants flexibility but also needs the project to be financeable.&lt;/p&gt;
&lt;p&gt;A capped T&amp;#x26;M contract addresses both. The work is billed at an hourly rate (T&amp;#x26;M), but the total is capped at a maximum figure. The client cannot be surprised with a bill beyond the cap. The agency has flexibility to handle scope evolution within the cap.&lt;/p&gt;
&lt;p&gt;The cap is not a free unlimited guarantee. The contract should specify:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What happens when the project is tracking toward the cap (the agency flags it, the parties decide whether to extend, reduce scope, or close out)&lt;/li&gt;
&lt;li&gt;What is excluded from the cap (client-caused delays, third-party integration issues, requirements changes)&lt;/li&gt;
&lt;li&gt;What happens if the project finishes under the cap (the client does not pay the remainder, or they apply it to a next phase)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The capped T&amp;#x26;M model works well when the agency commits to honest forecasting. A project that is 80% through the budget at 40% through the scope is not a surprise at the end. It is a conversation in week four. The contract does not help if the agency does not raise the flag.&lt;/p&gt;
&lt;h2 id=&quot;acceptance-criteria-the-part-that-makes-the-contract-real&quot;&gt;Acceptance criteria: the part that makes the contract real&lt;/h2&gt;
&lt;p&gt;Whatever structure you use, the acceptance criteria are what make the contract enforceable.&lt;/p&gt;
&lt;p&gt;A SoW that says “build a mobile app” is not a contract in any meaningful sense. A SoW that says “build iOS and Android applications with the features listed in Appendix A, accepted when the client signs off on a test build that passes the checklist in Appendix B” is a contract.&lt;/p&gt;
&lt;p&gt;Acceptance criteria should describe:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What the deliverable does (feature list, user flows, API behaviors)&lt;/li&gt;
&lt;li&gt;What environment it is tested in (staging, production-equivalent, real devices)&lt;/li&gt;
&lt;li&gt;Who signs off and how (a named role, a written approval)&lt;/li&gt;
&lt;li&gt;What happens if feedback arrives after sign-off (change order, or included if it is a bug vs. a new requirement)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Time and Materials contracts need acceptance criteria too. Without them, you cannot tell the client that a phase is complete and billing has moved to the next phase.&lt;/p&gt;
&lt;h2 id=&quot;payment-structure-by-contract-type&quot;&gt;Payment structure by contract type&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SoW (fixed-price):&lt;/strong&gt; Milestone payments are standard. A typical structure: 30-50% upfront, 30-40% at a defined midpoint (delivery of a working build, completion of a phase), and the remainder on final acceptance. Never 100% at the end. The agency carries execution risk; the client carries payment risk. Milestone payments balance them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;T&amp;#x26;M:&lt;/strong&gt; Weekly or monthly invoicing against hours logged. Most clients accept 30-day payment terms. Government or enterprise clients may take 45-60 days. Factor this into your cash flow before signing a large T&amp;#x26;M engagement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Capped T&amp;#x26;M:&lt;/strong&gt; Either milestone or periodic billing works, but periodic billing (monthly) is more common because the scope is fluid. The cap means the client is never surprised; the billing frequency means the agency is not carrying the cost for extended periods.&lt;/p&gt;
&lt;h2 id=&quot;the-contracts-that-make-the-rest-of-this-work&quot;&gt;The contracts that make the rest of this work&lt;/h2&gt;
&lt;p&gt;None of this matters without supporting agreements. Before any work starts, you also need:&lt;/p&gt;
&lt;p&gt;A master services agreement (MSA) that covers IP ownership, confidentiality, liability limits, and how disputes are handled. The SoW or T&amp;#x26;M addendum lives under it.&lt;/p&gt;
&lt;p&gt;An IP assignment clause that is specific about what the client owns (typically the deliverables) and what the agency retains (their tooling, frameworks, methodologies).&lt;/p&gt;
&lt;p&gt;A termination clause that specifies what happens if either party walks away. For T&amp;#x26;M, this is usually “pay for hours worked.” For SoW, it requires more care around partial completion.&lt;/p&gt;
&lt;p&gt;The operational side of client relationships, including how payment terms, SLAs, and retainers work in practice, is covered in detail across &lt;a href=&quot;/blog/agency-client-payment-terms-2026/&quot;&gt;agency payment terms&lt;/a&gt; and &lt;a href=&quot;/blog/agency-sla-support-contracts-2026/&quot;&gt;SLA and support contracts&lt;/a&gt;. For the proposal stage that happens before any contract is signed, &lt;a href=&quot;/blog/technical-proposal-writing-agency-2026/&quot;&gt;writing a technical proposal&lt;/a&gt; covers the process of moving from a client conversation to a written scope.&lt;/p&gt;
&lt;h2 id=&quot;the-one-rule-that-covers-most-cases&quot;&gt;The one rule that covers most cases&lt;/h2&gt;
&lt;p&gt;If the client cannot tell you, before work starts, what done looks like and what they will check before they accept it, do not sign a fixed-price SoW. Use T&amp;#x26;M or discovery first.&lt;/p&gt;
&lt;p&gt;The SoW is a useful structure. It gives the client budget certainty and the agency a clear target. But it only works when both parties can agree on what they are committing to. When they cannot, the paperwork is a formality that delays the inevitable dispute rather than preventing it.&lt;/p&gt;</content:encoded><category>Business</category><category>Business</category><category>Agency</category><category>Pricing</category><category>Contracts</category><category>Client Communication</category><category>2026</category><author>Anurag Verma</author></item><item><title>How to Hire a DevOps Engineer in 2026: Kubernetes, IaC, and the Roles That Replaced DevOps</title><link>https://blog.codercops.com/blog/how-to-hire-devops-engineer-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/how-to-hire-devops-engineer-2026/</guid><description>The &apos;DevOps engineer&apos; title now covers three distinct jobs: platform engineer, SRE, and CI/CD specialist. Here&apos;s what each role actually does, what to screen for, and what the market pays.</description><pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When a startup says they need a “DevOps engineer,” they usually mean the person who will set up their CI/CD pipeline, manage Kubernetes, write Terraform, handle cloud costs, and be on call when the site goes down. That is four different jobs, and the market has mostly sorted out that they are not the same job.&lt;/p&gt;
&lt;p&gt;Before you post a DevOps role, decide which of these you actually need.&lt;/p&gt;
&lt;h2 id=&quot;the-three-jobs-hiding-inside-devops&quot;&gt;The three jobs hiding inside “DevOps”&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Platform engineer.&lt;/strong&gt; Builds and maintains the internal developer platform: Kubernetes clusters, service templates, CI/CD abstractions, developer tooling, deployment frameworks. The customer is other engineers, and the goal is making them faster and more self-sufficient. This role cares deeply about developer experience. If your engineers spend significant time fighting infrastructure or wait 20 minutes for CI to finish, a platform engineer is what you need.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Site reliability engineer (SRE).&lt;/strong&gt; Owns availability, latency, and production reliability. Writes runbooks. Manages SLOs and error budgets. Conducts postmortems. On call in a structured way. Tends to have more software engineering background than classic ops. The SRE model, as defined by Google’s original book, treats reliability as a software problem. If your team ships features but nobody owns reliability, this is the gap.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CI/CD and toolchain specialist.&lt;/strong&gt; Builds and maintains the pipeline: GitHub Actions, ArgoCD, GitLab CI, build caching, artifact management, deployment automation. Overlaps heavily with platform engineering but can be narrower. This is often the first DevOps hire at an early startup.&lt;/p&gt;
&lt;p&gt;Most “DevOps engineer” job descriptions mix all three. The best hire for an early-stage team is someone who can do all three at a junior or mid level. At a 50+ engineer company, you need specialists, and posting a generalist role will attract the wrong candidates.&lt;/p&gt;
&lt;h2 id=&quot;what-the-stack-looks-like-in-2026&quot;&gt;What the stack looks like in 2026&lt;/h2&gt;
&lt;p&gt;Any serious DevOps hire in 2026 needs to be fluent in:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Containers and Kubernetes.&lt;/strong&gt; Docker is assumed. Kubernetes is now the default for everything above “small app deployed on a single server.” The real question is not “do you know Kubernetes?” but “have you operated it in production under load?”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Infrastructure as Code.&lt;/strong&gt; Terraform or OpenTofu is the most common choice. AWS CDK is strong for AWS-only teams. Pulumi is used in teams that want TypeScript or Python over HCL. The tool matters less than whether they write IaC like software: modules, state management, code reviews, testing with Terratest or Checkov.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CI/CD.&lt;/strong&gt; GitHub Actions is dominant. GitLab CI is common in enterprise. ArgoCD or Flux for GitOps deployment to Kubernetes. The candidate should have opinions about when GitOps patterns help and when they add complexity that small teams don’t need.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Observability.&lt;/strong&gt; OpenTelemetry for instrumentation, Prometheus and Grafana for metrics, a centralized logging stack (ELK, Loki, or a managed service like Datadog or Axiom). The ability to debug a production incident using traces and metrics is the actual skill, not just knowing how to run the tools.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cloud.&lt;/strong&gt; AWS is the most common; GCP and Azure have their niches. Multi-cloud experience sounds good on a resume but often means surface-level exposure to each rather than deep expertise in any. For most teams, deep expertise in one cloud is more useful.&lt;/p&gt;
&lt;p&gt;What is becoming more important:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FinOps awareness.&lt;/strong&gt; Cloud bills have become a material cost at any company running serious workloads. Engineers who understand how to read a cloud bill and what drives costs (egress, data transfer, oversized instances, unused resources) are increasingly valuable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Supply chain security.&lt;/strong&gt; SBOM generation, container image scanning (Trivy, Snyk), signing images with Cosign, SLSA compliance. Regulation and customer expectations are pushing this into standard practice.&lt;/p&gt;
&lt;h2 id=&quot;how-to-screen-a-devops-candidate&quot;&gt;How to screen a DevOps candidate&lt;/h2&gt;
&lt;p&gt;The portfolio signal for DevOps is harder to evaluate than software engineering. They may not have public GitHub repos. Look for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Documented postmortems or incident reports (many engineers keep anonymized ones)&lt;/li&gt;
&lt;li&gt;Conference talks or blog posts about infrastructure work&lt;/li&gt;
&lt;li&gt;Contributions to open-source infrastructure projects or Helm charts&lt;/li&gt;
&lt;li&gt;Demonstrated certification (AWS Solutions Architect Professional, CKA, CKAD) as a minimum bar signal, not a hiring criterion&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For the technical screen, use a scenario, not an algorithm:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“We have a Node.js service running in Kubernetes that is serving elevated p99 latency (around 2 seconds) during business hours. CPU usage is normal. Memory is stable. The service has 3 replicas. Walk me through how you would investigate this.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A good answer covers: checking pod-level metrics vs node-level metrics, looking at request traces if available, checking for garbage collection pauses in Node.js (heap dumps, GC logs), looking at whether the p99 is caused by a specific endpoint or all of them, checking if the latency correlates with horizontal scaling behavior, and asking about external dependencies (databases, downstream APIs).&lt;/p&gt;
&lt;p&gt;A weak answer goes straight to “I would increase the number of replicas” without diagnosing why the latency is elevated.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The infrastructure review.&lt;/strong&gt; Share a Terraform configuration (can be from a public repo) and ask them to review it. You are looking for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Security issues (overly permissive IAM roles, public S3 buckets, hardcoded secrets)&lt;/li&gt;
&lt;li&gt;Missing best practices (no remote state, no locking, no variable validation)&lt;/li&gt;
&lt;li&gt;Whether they structure feedback clearly or just list problems&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The “make developers faster” question.&lt;/strong&gt; “What is the biggest thing you have done that made other developers more productive?” A platform engineer orientation shows up here. Look for: they reduced CI time, they built a self-service deployment tool, they moved a manual process to automation, they wrote a runbook that eliminated a class of support requests. Operations-only engineers answer this with things like “I set up monitoring.” Platform engineers answer with outcomes for other people.&lt;/p&gt;
&lt;h2 id=&quot;what-to-pay&quot;&gt;What to pay&lt;/h2&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Level&lt;/th&gt;&lt;th&gt;India (annual)&lt;/th&gt;&lt;th&gt;US (annual)&lt;/th&gt;&lt;th&gt;Contract rate&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Mid (3-5 yrs)&lt;/td&gt;&lt;td&gt;$30k-$55k&lt;/td&gt;&lt;td&gt;$130k-$170k&lt;/td&gt;&lt;td&gt;$65-$100/hr&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Senior (5-8 yrs)&lt;/td&gt;&lt;td&gt;$55k-$80k&lt;/td&gt;&lt;td&gt;$170k-$220k&lt;/td&gt;&lt;td&gt;$100-$150/hr&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Staff / Principal&lt;/td&gt;&lt;td&gt;$80k+&lt;/td&gt;&lt;td&gt;$220k-$300k&lt;/td&gt;&lt;td&gt;$150+/hr&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Platform engineer (senior)&lt;/td&gt;&lt;td&gt;$60k-$90k&lt;/td&gt;&lt;td&gt;$180k-$250k&lt;/td&gt;&lt;td&gt;$110-$160/hr&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Senior DevOps engineers with Kubernetes operator development experience, multi-cloud architecture, or SRE background with strong software skills command a premium over these ranges. Expect to compete aggressively for that tier in any market.&lt;/p&gt;
&lt;p&gt;A note on scope: if you are hiring one person to do everything (cloud, CI/CD, Kubernetes, on call, FinOps), you are asking for a senior or staff engineer. Do not post that role at mid-level rates and wonder why you get mid-level candidates.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This post is part of the hiring series. For adjacent roles: &lt;a href=&quot;/blog/hire-react-developer-technical-screen-2026/&quot;&gt;How to hire a React developer&lt;/a&gt;, &lt;a href=&quot;/blog/how-to-hire-python-developer-2026/&quot;&gt;How to hire a Python developer&lt;/a&gt;, &lt;a href=&quot;/blog/how-to-hire-ios-developer-2026/&quot;&gt;How to hire an iOS developer&lt;/a&gt;, and the overview of &lt;a href=&quot;/blog/what-it-costs-to-hire-a-developer-2026/&quot;&gt;what developers cost across geographies and experience levels&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>Business</category><category>Hiring</category><category>DevOps</category><category>Cloud &amp; Infrastructure</category><category>Business</category><category>2026</category><author>Prathviraj Singh</author></item><item><title>How to Hire an iOS Developer in 2026: SwiftUI, Concurrency, and What to Screen For</title><link>https://blog.codercops.com/blog/how-to-hire-ios-developer-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/how-to-hire-ios-developer-2026/</guid><description>iOS development has changed more in the last three years than it did in the previous seven. Here&apos;s what strong iOS candidates know, how to screen them, and what to expect on rates.</description><pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;iOS development has shifted faster in the last few years than most hiring managers realize. A candidate pool that looks experienced on paper can contain developers running three years behind the current stack, and unlike web development where the migration paths are gradual, iOS has had a set of genuine break points: Swift Concurrency in 2021, SwiftUI reaching production-readiness around 2022-2023, and the toolchain now requiring Apple Silicon Macs. If your job description still asks for “Objective-C experience preferred,” you are screening for the wrong things.&lt;/p&gt;
&lt;p&gt;Here is what to look for, how to screen, and what you will pay.&lt;/p&gt;
&lt;h2 id=&quot;the-current-ios-stack&quot;&gt;The current iOS stack&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SwiftUI&lt;/strong&gt; is now the primary way to build new iOS UI. It has been maturing since 2019, but it reached the point where teams could build full production apps in it without constantly hitting missing APIs around 2022. In 2026, a developer who can’t write SwiftUI is behind.&lt;/p&gt;
&lt;p&gt;That said, UIKit is not dead. Every team with a pre-2023 codebase has UIKit code, and even new apps hit UIKit through third-party libraries, custom components that SwiftUI still can’t express cleanly, and interop requirements. Strong candidates know both and understand when to reach for which.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Swift Concurrency&lt;/strong&gt; (async/await, structured concurrency, actors) replaced the old patterns — Grand Central Dispatch, Completion handlers, Combine — as the idiomatic way to handle asynchronous work. Swift 5.5 shipped this in 2021, and by 2023 it was standard in most teams. A candidate who still structures their async code around &lt;code&gt;DispatchQueue.main.async&lt;/code&gt; everywhere hasn’t updated their mental model.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SwiftData&lt;/strong&gt; (2023) is Apple’s modern replacement for Core Data. Not every app needs it, but it is worth knowing, especially if you are building an app with local-first or offline requirements.&lt;/p&gt;
&lt;p&gt;The development machine requirement: Xcode now requires Apple Silicon (M-series Mac). Any candidate working on an Intel Mac is working with a degraded toolchain and a significantly slower build cycle. Ask.&lt;/p&gt;
&lt;h2 id=&quot;what-separates-good-ios-candidates-from-great-ones&quot;&gt;What separates good iOS candidates from great ones&lt;/h2&gt;
&lt;p&gt;The basics any candidate should have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SwiftUI for new UI, UIKit fluency for existing components&lt;/li&gt;
&lt;li&gt;Swift Concurrency for async work (not just “I know async/await” but structured concurrency with task groups, cancellation, actors for state isolation)&lt;/li&gt;
&lt;li&gt;Xcode Instruments for profiling: memory leaks, CPU hangs, energy impact&lt;/li&gt;
&lt;li&gt;App Store submission, TestFlight, entitlements, and the review process&lt;/li&gt;
&lt;li&gt;Dependency management via Swift Package Manager&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Depth signals that distinguish strong seniors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Opinion on architecture patterns (MVVM, TCA, VIPER) and when the complexity is worth it&lt;/li&gt;
&lt;li&gt;Experience with push notifications end-to-end (APNs token management, silent vs user-facing, background modes)&lt;/li&gt;
&lt;li&gt;WidgetKit or App Clips, which require understanding the iOS extension model&lt;/li&gt;
&lt;li&gt;Accessibility — VoiceOver, Dynamic Type, color contrast in SwiftUI — most developers haven’t done this seriously&lt;/li&gt;
&lt;li&gt;Localization beyond just wrapping strings in &lt;code&gt;NSLocalizedString&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Red flags in portfolios and interviews:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Using &lt;code&gt;DispatchQueue.main.async&lt;/code&gt; as the answer to every threading question in 2026&lt;/li&gt;
&lt;li&gt;“Expertise” in Objective-C listed prominently as a main skill (fine as a note, worrying as a headline)&lt;/li&gt;
&lt;li&gt;Portfolio apps that only show simulators, never real device screenshots or TestFlight links&lt;/li&gt;
&lt;li&gt;No mention of testing (XCTest, Swift Testing framework) in any project&lt;/li&gt;
&lt;li&gt;Combine as their concurrency answer without mentioning Swift Concurrency at all&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-screening-process&quot;&gt;The screening process&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Portfolio and GitHub review.&lt;/strong&gt; Before any interview, look at their apps on the App Store and their public repos. An iOS developer without a shipped App Store app or an open-source SwiftUI project is a larger risk. It does not disqualify them, but you need something to evaluate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Short take-home (3-5 hours max).&lt;/strong&gt; The format that works:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Build a simple app that fetches a list from the GitHub repos API (or any public API), displays it in a list, and lets the user tap an item to see a detail view. Use SwiftUI and Swift Concurrency. Include one test.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What you are evaluating:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Architecture choice and whether it was appropriate for the scope&lt;/li&gt;
&lt;li&gt;Proper use of &lt;code&gt;async/await&lt;/code&gt; and &lt;code&gt;@MainActor&lt;/code&gt; (or equivalent actor isolation)&lt;/li&gt;
&lt;li&gt;Error handling — does the UI show something meaningful when the network fails?&lt;/li&gt;
&lt;li&gt;Whether they wrote a real test or a token one&lt;/li&gt;
&lt;li&gt;Code organization and naming&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Step 3: Walkthrough call (45-60 min).&lt;/strong&gt; Not a quiz session. Ask them to walk you through their take-home code. Focus on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Why did you structure it this way?”&lt;/li&gt;
&lt;li&gt;“What would you do differently if this needed to support 100k users offline?”&lt;/li&gt;
&lt;li&gt;“Where do you think this code is weakest?”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The walkthrough reveals communication quality and self-awareness better than any trivia question.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What to avoid:&lt;/strong&gt; Live algorithmic coding interviews (LeetCode-style) have poor signal for iOS roles. iOS development is UI-heavy and architecture-heavy; sorting algorithms under pressure tells you little about whether someone can ship a well-structured iOS app.&lt;/p&gt;
&lt;h2 id=&quot;what-to-pay&quot;&gt;What to pay&lt;/h2&gt;
&lt;p&gt;Rates vary significantly by location and experience level.&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Level&lt;/th&gt;&lt;th&gt;India (annual)&lt;/th&gt;&lt;th&gt;US (annual)&lt;/th&gt;&lt;th&gt;Contract (USD/hr)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Junior (0-2 yrs)&lt;/td&gt;&lt;td&gt;$12k-$25k&lt;/td&gt;&lt;td&gt;$80k-$110k&lt;/td&gt;&lt;td&gt;$25-$45&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mid (3-5 yrs)&lt;/td&gt;&lt;td&gt;$25k-$50k&lt;/td&gt;&lt;td&gt;$110k-$160k&lt;/td&gt;&lt;td&gt;$50-$85&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Senior (6+ yrs)&lt;/td&gt;&lt;td&gt;$50k-$90k&lt;/td&gt;&lt;td&gt;$160k-$220k&lt;/td&gt;&lt;td&gt;$90-$140&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Staff / Tech Lead&lt;/td&gt;&lt;td&gt;$90k+&lt;/td&gt;&lt;td&gt;$200k-$280k&lt;/td&gt;&lt;td&gt;$140+&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;These are 2026 market rates for full-time employment. Contract rates run higher to account for the lack of benefits. For agencies and startups hiring in India or Eastern Europe, the best candidates are typically out-competing domestic salaries and have good English, which means you should expect to pay toward the top of the India range for someone you can actually work with asynchronously.&lt;/p&gt;
&lt;p&gt;visionOS and spatial computing experience commands a significant premium (20-40% above senior rates). If you need it, budget accordingly — the talent pool is small.&lt;/p&gt;
&lt;h2 id=&quot;the-question-to-ask-in-every-ios-interview&quot;&gt;The question to ask in every iOS interview&lt;/h2&gt;
&lt;p&gt;“Walk me through what happens from the moment a user taps your app icon to the moment your first screen is interactive.”&lt;/p&gt;
&lt;p&gt;A junior developer gives a vague answer about app launch. A mid-level developer mentions UIApplicationDelegate or the @main entry point and maybe AppDelegate lifecycle methods. A senior developer talks about app initialization, scene lifecycle in multi-scene apps, the cost of loading the storyboard (or not) vs programmatic setup, what they move off the main thread, and how they instrument that launch time in Xcode Instruments.&lt;/p&gt;
&lt;p&gt;The question has no wrong answer format. It just scales clearly with actual depth of experience.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;For the other roles in this hiring cluster: &lt;a href=&quot;/blog/hire-react-developer-technical-screen-2026/&quot;&gt;How to hire a React developer&lt;/a&gt;, &lt;a href=&quot;/blog/how-to-hire-python-developer-2026/&quot;&gt;How to hire a Python developer&lt;/a&gt;, &lt;a href=&quot;/blog/how-to-hire-android-developer-2026/&quot;&gt;How to hire an Android developer&lt;/a&gt;, and &lt;a href=&quot;/blog/what-it-costs-to-hire-a-developer-2026/&quot;&gt;what it actually costs across skill levels and geographies&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>Business</category><category>Hiring</category><category>iOS</category><category>Mobile</category><category>Business</category><category>2026</category><author>Anurag Verma</author></item><item><title>Svelte 5 Runes in Production: How the New Reactivity Model Changes the Way You Write Components</title><link>https://blog.codercops.com/blog/svelte-5-runes-production-reactivity-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/svelte-5-runes-production-reactivity-2026/</guid><description>Svelte 5&apos;s runes replace the old magic variable tracking with explicit reactive primitives. A year into production use, here is what changed, what improved, and what surprised us.</description><pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When Svelte 5 shipped in October 2024, the most polarizing change was runes. The old Svelte model — every &lt;code&gt;let&lt;/code&gt; variable in a component is implicitly reactive, &lt;code&gt;$:&lt;/code&gt; marks a reactive statement — was one of the reasons people liked Svelte in the first place. It felt like magic. You wrote normal JavaScript and the framework made it reactive.&lt;/p&gt;
&lt;p&gt;The magic also had a cost. The implicit tracking meant the compiler had to make decisions about reactivity that were sometimes surprising. Debugging “why did this rerender” or “why didn’t this update” often meant reading the compiled output or consulting the documentation on which patterns Svelte did and did not track. The mental model was simple until it wasn’t.&lt;/p&gt;
&lt;p&gt;Runes trade some of that simplicity for predictability. After using them in production for a year, the tradeoff is worth it.&lt;/p&gt;
&lt;h2 id=&quot;the-runes-one-by-one&quot;&gt;The runes, one by one&lt;/h2&gt;
&lt;h3 id=&quot;state&quot;&gt;$state&lt;/h3&gt;
&lt;p&gt;In Svelte 4:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;svelte&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  let&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; count &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  function&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; increment&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    count&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In Svelte 5 with runes:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;svelte&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  let&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; count &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  function&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; increment&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    count&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The change looks minor. The difference matters when you extract logic into a function or a module, where Svelte 4’s implicit tracking broke down. &lt;code&gt;$state&lt;/code&gt; creates a reactive binding that works outside the component compiler context too.&lt;/p&gt;
&lt;p&gt;For objects and arrays, &lt;code&gt;$state&lt;/code&gt; creates a deeply reactive proxy:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;svelte&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  let&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; user &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ name: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;Alice&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, age: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  function&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; birthday&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    user.age&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;  &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;// this triggers an update; no need for user = { ...user, age: user.age + 1 }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is a real improvement over Svelte 4, where mutating nested properties required reassigning the whole object or using a special array method pattern.&lt;/p&gt;
&lt;h3 id=&quot;derived&quot;&gt;$derived&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;$derived&lt;/code&gt; replaces the &lt;code&gt;$:&lt;/code&gt; reactive declaration for computed values:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;svelte&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;  // Svelte 4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;  $&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: doubled &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; count &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;  // Svelte 5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  let&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; doubled &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;derived&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(count &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;More useful with &lt;code&gt;$derived.by&lt;/code&gt; for multi-line derivations:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;svelte&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  let&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; items &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  let&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; stats &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; $derived.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;by&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(() &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; sum&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; items.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;reduce&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;b&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; a &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; b, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      sum,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      average: sum &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; items.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      max: Math.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;max&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;items),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;Sum: &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;stats.sum&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, Average: &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;stats.average.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;toFixed&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The key rule: &lt;code&gt;$derived&lt;/code&gt; is for pure computations. No side effects inside &lt;code&gt;$derived&lt;/code&gt;. If you catch yourself writing &lt;code&gt;$derived&lt;/code&gt; and then calling a fetch inside it, stop — that belongs in &lt;code&gt;$effect&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;effect&quot;&gt;$effect&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;$effect&lt;/code&gt; runs a side effect whenever its reactive dependencies change. The dependencies are inferred, not declared:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;svelte&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  let&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; query &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  $&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;effect&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(() &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;    // Runs whenever `query` changes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (query.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;      fetchResults&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(query);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The cleanup pattern works the same way as React’s &lt;code&gt;useEffect&lt;/code&gt; return:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;svelte&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  let&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; width &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(window.innerWidth);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  $&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;effect&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(() &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; handler&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { width &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; window.innerWidth; };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    window.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;resize&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, handler);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; window.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;removeEventListener&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;resize&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, handler);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The most common mistake in Svelte 5 migrations: replacing &lt;code&gt;$:&lt;/code&gt; statements that have side effects with &lt;code&gt;$derived&lt;/code&gt; instead of &lt;code&gt;$effect&lt;/code&gt;. &lt;code&gt;$derived&lt;/code&gt; is for values, &lt;code&gt;$effect&lt;/code&gt; is for side effects. Blurring this causes hard-to-debug update loops or effects that do not run when expected.&lt;/p&gt;
&lt;h3 id=&quot;props&quot;&gt;$props&lt;/h3&gt;
&lt;p&gt;Props are now explicitly declared with &lt;code&gt;$props&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;svelte&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;  // Svelte 4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  export&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; let&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; name;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  export&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; let&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; age &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 25&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;  // Svelte 5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  let&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { name, age &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 25&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;props&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This might look like a step backward — &lt;code&gt;export let&lt;/code&gt; was clean. The advantage is that &lt;code&gt;$props()&lt;/code&gt; returns a regular destructured object, and you can use TypeScript more naturally:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;svelte&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; lang&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;ts&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  interface&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Props&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;    name&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;    age&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;    onUpdate&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; void&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  let&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { name, age &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 25&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, onUpdate }&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Props&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;props&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For two-way binding scenarios, &lt;code&gt;$bindable&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;svelte&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  let&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { value &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;bindable&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;() } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;props&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;inspect&quot;&gt;$inspect&lt;/h3&gt;
&lt;p&gt;Debugging reactive state used to mean littering &lt;code&gt;console.log&lt;/code&gt; in reactive statements. &lt;code&gt;$inspect&lt;/code&gt; is a development-mode-only rune that logs whenever a value changes:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;svelte&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  let&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; count &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  $&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;inspect&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(count);  &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;// logs to console on every change, dev mode only&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Stripped from production builds automatically. Small thing, genuinely useful.&lt;/p&gt;
&lt;h2 id=&quot;extracting-logic-into-stores-and-utilities&quot;&gt;Extracting logic into stores and utilities&lt;/h2&gt;
&lt;p&gt;One of the practical gains from runes is that reactive logic can live outside the &lt;code&gt;.svelte&lt;/code&gt; file. In Svelte 4, you needed writable stores and the &lt;code&gt;$&lt;/code&gt; prefix to make this work. In Svelte 5, you can write plain TypeScript:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// counter.svelte.ts — note the .svelte.ts extension; runes work in these files&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; createCounter&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;initial&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  let&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; count &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; $state&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(initial);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    get&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; value&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;() { &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; count; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;    increment&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;() { count&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;    decrement&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;() { count&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;    reset&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;() { count &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; initial; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;svelte&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { createCounter } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;./counter.svelte.ts&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; counter&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; createCounter&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; onclick&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;counter.increment&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;counter.value&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;.svelte.ts&lt;/code&gt; extension tells the Svelte compiler to allow runes in a TypeScript file. This pattern makes logic testable outside the component and reusable across multiple components without the ceremony of a full Svelte store.&lt;/p&gt;
&lt;h2 id=&quot;the-migration-from-svelte-4&quot;&gt;The migration from Svelte 4&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;svelte-migrate&lt;/code&gt; CLI handles most of the mechanical changes:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; sv&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; migrate&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; svelte-5&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What it handles automatically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Converting &lt;code&gt;export let&lt;/code&gt; to &lt;code&gt;$props()&lt;/code&gt; destructuring&lt;/li&gt;
&lt;li&gt;Converting &lt;code&gt;let x = ...&lt;/code&gt; assignments to &lt;code&gt;$state(x)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Converting most &lt;code&gt;$:&lt;/code&gt; statements to &lt;code&gt;$derived&lt;/code&gt; or &lt;code&gt;$effect&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What needs manual review:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$:&lt;/code&gt; statements that have both a computed value and side effects mixed together&lt;/li&gt;
&lt;li&gt;Complex reactive chains where the ordering of &lt;code&gt;$:&lt;/code&gt; statements mattered&lt;/li&gt;
&lt;li&gt;Component lifecycle events (the Svelte 4 &lt;code&gt;onMount&lt;/code&gt;, &lt;code&gt;onDestroy&lt;/code&gt;, &lt;code&gt;beforeUpdate&lt;/code&gt;, &lt;code&gt;afterUpdate&lt;/code&gt; all still work, but you may want to convert to &lt;code&gt;$effect&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Custom stores that relied on the &lt;code&gt;Writable&amp;#x3C;T&gt;&lt;/code&gt; pattern from &lt;code&gt;svelte/store&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For most well-organized Svelte 4 components, the migration is an afternoon of work per hundred components. For components that leaned heavily on complex reactive statement chains, expect to rewrite some logic.&lt;/p&gt;
&lt;h2 id=&quot;what-changed-in-practice&quot;&gt;What changed in practice&lt;/h2&gt;
&lt;p&gt;After running Svelte 5 runes in production on a mid-size SvelteKit app (about 140 components) for the better part of a year, the honest summary:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Better:&lt;/strong&gt; TypeScript integration improved substantially. Reactive logic extracted into &lt;code&gt;.svelte.ts&lt;/code&gt; utilities is testable with Vitest without mounting a component. The explicit &lt;code&gt;$derived&lt;/code&gt; vs &lt;code&gt;$effect&lt;/code&gt; distinction has prevented several categories of bugs that were common with &lt;code&gt;$:&lt;/code&gt; statements. Debugging rerenders is easier because the reactive dependencies are visible in the code rather than inferred from compiler output.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Worse:&lt;/strong&gt; More to write. The Svelte 4 feel of “just write JavaScript and it works” is somewhat reduced. New team members who come from React or Vue adapt faster (familiar mental model), but people who came specifically because of Svelte’s minimalism sometimes feel like something was lost.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Neutral:&lt;/strong&gt; Performance is similar. The compiler still produces efficient JavaScript; the main difference is what you write, not what the browser runs.&lt;/p&gt;
&lt;p&gt;The runes model makes Svelte feel more like Vue 3’s Composition API or SolidJS signals. Whether that is a good thing depends on what you liked about Svelte in the first place. If you valued the compiler magic, the runes feel like a step back. If you valued the compilation approach but wanted more explicit reactivity, runes are the right direction.&lt;/p&gt;
&lt;p&gt;For new projects, start with Svelte 5 and write runes from day one. For existing projects, the &lt;a href=&quot;https://svelte.dev/docs/svelte/v5-migration-guide&quot;&gt;svelte-migrate tool&lt;/a&gt; makes the path manageable, and the compatibility mode means you can migrate incrementally rather than all at once.&lt;/p&gt;
&lt;p&gt;The broader &lt;a href=&quot;/blog/svelte-5-49-sveltekit-remote-functions-2026/&quot;&gt;SvelteKit ecosystem&lt;/a&gt; has continued to move fast in 2026, and remote functions (introduced in 5.49) are worth reading about separately — they represent a different kind of change to how you structure data fetching in a SvelteKit app.&lt;/p&gt;</content:encoded><category>Web Development</category><category>Web Development</category><category>JavaScript</category><category>Frontend</category><category>Developer Tools</category><category>2026</category><author>Abhishek Gupta</author></item><item><title>The Technical Interview Process That Actually Predicts Job Performance</title><link>https://blog.codercops.com/blog/technical-interview-process-that-predicts-performance-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/technical-interview-process-that-predicts-performance-2026/</guid><description>LeetCode interviews are popular and largely useless for predicting on-the-job performance. Here is what the research says works, and how to build a process that finds engineers who will thrive in your codebase.</description><pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Most companies hire developers the same way: a recruiter screen, a coding challenge, some interviews, maybe a system design question, and a vibe check called “culture fit.” The process feels thorough because it has stages. It is not particularly good at finding the right people.&lt;/p&gt;
&lt;p&gt;The problem is almost never dishonesty in the process. It is that the things being measured have a loose relationship to what the job actually requires.&lt;/p&gt;
&lt;h2 id=&quot;what-research-says-about-interview-validity&quot;&gt;What research says about interview validity&lt;/h2&gt;
&lt;p&gt;Interview research has been consistent for decades. The factors that most strongly predict job performance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Work sample tests&lt;/strong&gt;: having the candidate do tasks representative of the actual job&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structured interviews&lt;/strong&gt;: consistent questions, consistent scoring criteria, multiple interviewers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Job knowledge tests&lt;/strong&gt;: assessments of relevant technical knowledge&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Peer ratings from past work&lt;/strong&gt;: references done properly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The factors that have surprisingly low predictive validity:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unstructured interviews&lt;/strong&gt;: casual conversations based on whatever the interviewer feels like asking&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Graphology, personality tests&lt;/strong&gt;: low-to-no validity for most professional roles&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Years of experience as a primary filter&lt;/strong&gt;: weakly correlated with performance past about 5 years&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Algorithmic coding interviews sit somewhere in the middle. They test a real cognitive skill, but the skill (solving novel graph problems under time pressure) has modest overlap with daily software engineering work. The false negative rate — strong engineers who perform poorly in algorithm interviews because they have not practiced recently — is significant.&lt;/p&gt;
&lt;p&gt;This matters because false negatives have a cost you never see. The engineer who failed your coding round and went to your competitor does not appear in your hiring funnel metrics. Your rejection rate looks good. Your team gets worse.&lt;/p&gt;
&lt;h2 id=&quot;the-take-home-assignment-how-to-do-it-right&quot;&gt;The take-home assignment: how to do it right&lt;/h2&gt;
&lt;p&gt;Work sample tests are the highest-validity interview format. For software engineers, this means a task representative of what they will actually build.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What works:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A specific, scoped task from your actual problem domain. Not a generic CRUD app, but something that surfaces the kinds of decisions your team makes regularly:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“We need a small service that accepts a list of URLs via a REST endpoint, fetches their content in parallel, and returns a summary of the response codes and content lengths. Add tests. We expect this to take around 3 hours.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You get to see: their approach to concurrency, error handling decisions, how they structure a small service, their testing patterns, and how they document things.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What to avoid:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tasks that take longer than 4 hours. Candidates who are currently employed (the ones you most want) have limited time.&lt;/li&gt;
&lt;li&gt;Tasks so open-ended that you cannot evaluate them consistently. “Build whatever you think is interesting” produces beautiful portfolios and tells you very little about how someone will fit your specific context.&lt;/li&gt;
&lt;li&gt;Tasks that are a thinly veiled request for a working prototype of something you need. If the output has real business value to you, pay for it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The walkthrough matters more than the code.&lt;/strong&gt; Schedule a 45-minute call after the take-home where the candidate walks you through what they built. This is where most of the signal is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Can they explain their decisions clearly?&lt;/li&gt;
&lt;li&gt;Do they know the tradeoffs of the approach they chose?&lt;/li&gt;
&lt;li&gt;Do they see the weaknesses in their own work?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A developer who writes decent code and explains it articulately is more valuable than a developer who writes excellent code and cannot discuss it. Communication is part of the job.&lt;/p&gt;
&lt;h2 id=&quot;the-structured-interview-questions-that-scale&quot;&gt;The structured interview: questions that scale&lt;/h2&gt;
&lt;p&gt;A structured interview asks every candidate the same questions and scores each answer against a rubric. It sounds bureaucratic. It substantially outperforms the intuition-based alternative.&lt;/p&gt;
&lt;p&gt;The question types worth including:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Past behavior questions&lt;/strong&gt; (best predictor of future behavior):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Tell me about a production incident you were responsible for diagnosing. Walk me through what happened, how you found the root cause, and what you changed.”&lt;/li&gt;
&lt;li&gt;“Describe a technical decision you made that you later regretted. What did you learn?”&lt;/li&gt;
&lt;li&gt;“Tell me about a time you pushed back on a technical decision you disagreed with. How did it go?”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The scoring rubric for each: did they take ownership, did they demonstrate actual technical depth in their explanation, did they show they learned something, were they honest about their role vs someone else’s?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hypothetical technical scenarios&lt;/strong&gt; (for skills that are hard to infer from past behavior):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“We are seeing elevated p95 latency on a service that we just deployed. Nothing is throwing errors. Walk me through how you would investigate.” (Diagnoses debugging methodology)&lt;/li&gt;
&lt;li&gt;“A customer reports their data is missing from a table that you expected to have it. How do you approach this?” (Diagnoses how someone reasons about data consistency)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are not looking for a specific correct answer. They are looking at the quality of the diagnostic process: do they systematically check hypotheses, do they ask clarifying questions before jumping to conclusions, do they think about rollback or impact while diagnosing?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The one question that works across all roles:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Walk me through a production problem you debugged. What was it, how did you find it, what did you change?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This surfaces: real technical depth, ability to narrate a technical story clearly, how they think about root causes vs symptoms, and whether they have worked on systems that actually have production problems. The answer scales exactly with experience. A junior developer will tell you about a bug in their side project. A staff engineer will tell you about a database deadlock that took three days to find and required a schema change.&lt;/p&gt;
&lt;h2 id=&quot;where-most-interview-processes-go-wrong&quot;&gt;Where most interview processes go wrong&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The culture fit round.&lt;/strong&gt; Usually the last stage. Usually unstructured. Usually the highest-bias moment in the process. “Culture fit” often encodes “seems like the people we already have,” which is a reliable mechanism for filtering in homogeneity.&lt;/p&gt;
&lt;p&gt;Replace it with: a concrete team values conversation. List the 3-4 things that genuinely matter to your team culture (direct feedback, async-first communication, engineers own their services in production). Ask candidates how they handle each in practice. Score it like the other stages.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The “brilliant jerk” trap.&lt;/strong&gt; Strong technical performance can mask poor collaboration signals in a short interview process. Behavioral questions are specifically good at surfacing this. “Tell me about a time you had a significant disagreement with a colleague about a technical direction. What happened?” is a direct probe. The people who have never had a disagreement they can tell you about are either junior or not being honest.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Asking the same questions as everyone else.&lt;/strong&gt; If your take-home is the same FizzBuzz variant every other company uses, candidates will have polished answers ready. Novel scenarios — pulled from your actual production codebase or real problems your team has faced — produce much higher-signal conversations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Skipping reference checks.&lt;/strong&gt; Reference checks are treated as box-checking in most hiring processes. Done well, they are a work sample of a different kind: talking to people who have seen the candidate work over time. Ask: “Can you describe a project they owned end to end and how it went?” and “If you were hiring for a senior backend role, would you want to work with them again?” The second question is binary and produces very honest answers.&lt;/p&gt;
&lt;h2 id=&quot;the-format-in-practice&quot;&gt;The format in practice&lt;/h2&gt;
&lt;p&gt;A process that has worked across a range of companies:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Application review + portfolio/GitHub.&lt;/strong&gt; Not a filter on credentials but on evidence of actual work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;30-minute recruiter screen.&lt;/strong&gt; Role fit, communication basics, timeline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Take-home assignment.&lt;/strong&gt; 3-4 hour scoped task. 48-72 hour window.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Technical walkthrough (45-60 min).&lt;/strong&gt; The candidate walks through their take-home. Structured questions from the same scoring guide for every candidate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structured behavioral interview (45-60 min).&lt;/strong&gt; Same 4-5 behavioral questions for every candidate, scored against rubric.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Team meet (30 min).&lt;/strong&gt; Conversational, not evaluative. This is the candidate evaluating you as much as the reverse.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;References.&lt;/strong&gt; Two calls, 20 minutes each. Ask about the work, not the character.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Total candidate time: around 6-7 hours including the take-home. That is realistic for a senior role. For junior roles, skip the take-home in favor of a longer technical walkthrough on a lighter task.&lt;/p&gt;
&lt;p&gt;The process takes more preparation than an improvised series of conversations. The payoff is that your decisions are more consistent, more defensible, and more accurate.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;For the role-specific screening guides that plug into this framework: &lt;a href=&quot;/blog/hire-react-developer-technical-screen-2026/&quot;&gt;React developer technical screen&lt;/a&gt;, &lt;a href=&quot;/blog/how-to-hire-python-developer-2026/&quot;&gt;Python developer screening&lt;/a&gt;, &lt;a href=&quot;/blog/how-to-hire-ios-developer-2026/&quot;&gt;iOS developer screening&lt;/a&gt;, and &lt;a href=&quot;/blog/how-to-hire-devops-engineer-2026/&quot;&gt;DevOps engineer screening&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>Business</category><category>Hiring</category><category>Career</category><category>Business</category><category>Developers</category><category>2026</category><author>Anurag Verma</author></item><item><title>Background Jobs in 2026: BullMQ, Inngest, or Temporal?</title><link>https://blog.codercops.com/blog/background-jobs-bullmq-inngest-temporal-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/background-jobs-bullmq-inngest-temporal-2026/</guid><description>Three tools, three different bets on where complexity belongs. Here&apos;s how to choose between BullMQ, Inngest, and Temporal based on what your system actually needs — not what sounds most impressive.</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every backend eventually needs to run work outside the request-response cycle. Send a confirmation email. Process an uploaded file. Sync data to a third-party system. Retry a failed webhook. The tools that handle this have multiplied enough that picking one is now a real architectural decision.&lt;/p&gt;
&lt;p&gt;BullMQ, Inngest, and Temporal are the three I get asked about most. They solve similar problems with very different approaches, and picking the wrong one creates friction you will feel for years. Here is how to choose.&lt;/p&gt;
&lt;h2 id=&quot;what-each-tool-actually-is&quot;&gt;What each tool actually is&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;BullMQ&lt;/strong&gt; is a job queue. You push a job onto a queue, workers pick it up and execute it, and the queue tracks success, failure, and retries. It is backed by Redis, which means it is fast and you can inspect queue state directly. You manage the infrastructure (Redis, your worker processes), and you manage the retry and failure logic in your application.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Inngest&lt;/strong&gt; is an event-driven function runtime. Instead of a queue you manage, you write functions that run in response to events. Inngest handles the scheduling, retry, and observability layer. Your functions are HTTP endpoints; the Inngest platform calls them. There is no queue server to run.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Temporal&lt;/strong&gt; is a workflow orchestration engine. You write workflows in code (durable, stateful sequences of steps) and Temporal guarantees they will complete correctly even if your servers crash, your dependencies go down, or the workflow takes months. It persists workflow state externally and replays execution history on recovery. It is its own cluster (or a managed service), and it has real operational weight.&lt;/p&gt;
&lt;h2 id=&quot;when-bullmq-fits&quot;&gt;When BullMQ fits&lt;/h2&gt;
&lt;p&gt;BullMQ is the right default for most applications. Use it when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You are already running Redis (or are willing to add it).&lt;/li&gt;
&lt;li&gt;Your jobs are discrete, short-running tasks: sending a notification, generating a PDF, processing a webhook, running a scheduled batch.&lt;/li&gt;
&lt;li&gt;Throughput matters: BullMQ handles tens of thousands of jobs per second on a modest Redis instance.&lt;/li&gt;
&lt;li&gt;You want simple, inspectable state: Redis data is queryable, job state is visible.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A typical BullMQ setup:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { Queue, Worker } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &quot;bullmq&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; IORedis &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &quot;ioredis&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; connection&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; IORedis&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(process.env.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;REDIS_URL&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// Producer — add jobs to the queue&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; emailQueue&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; Queue&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;email&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, { connection });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; emailQueue.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;  &quot;welcome&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  { userId: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;123&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, to: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;user@example.com&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    attempts: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    backoff: { type: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;exponential&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, delay: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;2000&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// Worker — consume and process jobs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; worker&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; Worker&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;  &quot;email&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  async&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;job&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; sendEmail&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(job.data.to, job.data.userId);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  { connection, concurrency: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;worker.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;failed&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, (&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;job&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;err&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  console.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;`Job ${&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;job&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;?.&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;} failed:`&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, err.message);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The tradeoff: you manage the worker processes and Redis. If your workers crash during a job, BullMQ can retry it (that is what &lt;code&gt;attempts&lt;/code&gt; handles), but you have to think about idempotency: if a job runs twice because of a retry, does it do the right thing?&lt;/p&gt;
&lt;h2 id=&quot;when-inngest-fits&quot;&gt;When Inngest fits&lt;/h2&gt;
&lt;p&gt;Inngest is the right choice when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You are on a serverless platform (Next.js on Vercel, Remix on Fly, SvelteKit) where managing persistent worker processes is inconvenient.&lt;/li&gt;
&lt;li&gt;You want the retry and observability layer managed for you without running a queue server.&lt;/li&gt;
&lt;li&gt;Your jobs are event-driven: something happened, trigger a function.&lt;/li&gt;
&lt;li&gt;You want step functions — multi-step jobs where each step can be retried independently.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Inngest model:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { inngest } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &quot;./client&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; processSignup&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; inngest.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;createFunction&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  { id: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;process-signup&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, retries: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  { event: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;user/signup&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  async&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; ({ &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;step&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; }) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;    // Each step is retried independently on failure&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; step.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;run&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;send-welcome-email&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;      await&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; sendWelcomeEmail&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(event.data.email);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; step.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;sleep&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;wait-for-activation&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;24h&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; step.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;run&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;check-activation&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; user&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; getUser&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(event.data.userId);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;      if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;user.activated) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;        await&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; sendReminderEmail&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(event.data.email);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What you get: each step is persisted. If &lt;code&gt;check-activation&lt;/code&gt; fails, it retries from that step, not from the beginning. The &lt;code&gt;24h&lt;/code&gt; sleep does not consume a running process. Inngest handles the scheduling. You can see every job run, every step, every error in their dashboard.&lt;/p&gt;
&lt;p&gt;What you give up: your job handlers must be accessible HTTP endpoints. On a public serverless platform, this is natural. On a private service without a public URL, it requires a tunnel or reverse proxy. You also depend on Inngest’s platform for the coordination layer (they have a self-hosted option, but it adds operational overhead).&lt;/p&gt;
&lt;h2 id=&quot;when-temporal-fits&quot;&gt;When Temporal fits&lt;/h2&gt;
&lt;p&gt;Temporal is the right choice when your workflow is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Long-running: hours, days, or longer.&lt;/li&gt;
&lt;li&gt;Stateful: you need to remember what happened across multiple steps.&lt;/li&gt;
&lt;li&gt;Reliable under arbitrary failures: crashes, restarts, outages should not lose workflow state.&lt;/li&gt;
&lt;li&gt;Complex: human approval gates, compensating transactions, parallel fan-out and fan-in.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A Temporal workflow for a document approval process:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { proxyActivities, defineSignal, setHandler, sleep } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &quot;@temporalio/workflow&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;sendForReview&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;applyDocument&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;notifyRejection&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; proxyActivities&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  typeof&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; activities&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ startToCloseTimeout: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;30s&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; approvedSignal&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; defineSignal&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;[{ &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;approved&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; boolean&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; }]&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;approved&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; documentApprovalWorkflow&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;documentId&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  await&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; sendForReview&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(documentId);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  let&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; approved&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; boolean&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; undefined&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;  setHandler&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(approvedSignal, ({ &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;approved&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; }) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    approved &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; a;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;  // Wait up to 7 days for approval&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  await&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; sleep&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;7 days&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (approved &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; applyDocument&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(documentId);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; notifyRejection&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(documentId);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Temporal persists the workflow state as an event log. If your server crashes while waiting for approval, the workflow resumes on restart. The &lt;code&gt;7 days&lt;/code&gt; sleep does not hold a thread; it is stored in Temporal’s state and fires when the time comes.&lt;/p&gt;
&lt;p&gt;The cost: Temporal is its own distributed system. You need to run the Temporal server (or use Temporal Cloud, which is managed but adds cost). The development model requires understanding replay semantics — your workflow code runs in a deterministic execution engine with specific restrictions. The learning curve is real.&lt;/p&gt;
&lt;h2 id=&quot;the-comparison-in-one-table&quot;&gt;The comparison in one table&lt;/h2&gt;





















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;BullMQ&lt;/th&gt;&lt;th&gt;Inngest&lt;/th&gt;&lt;th&gt;Temporal&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Infrastructure&lt;/td&gt;&lt;td&gt;Redis&lt;/td&gt;&lt;td&gt;None (or self-hosted)&lt;/td&gt;&lt;td&gt;Temporal server&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Job duration&lt;/td&gt;&lt;td&gt;Seconds to minutes&lt;/td&gt;&lt;td&gt;Seconds to days&lt;/td&gt;&lt;td&gt;Seconds to months&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;State persistence&lt;/td&gt;&lt;td&gt;Redis&lt;/td&gt;&lt;td&gt;Inngest platform&lt;/td&gt;&lt;td&gt;Temporal history&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Steps / multi-stage&lt;/td&gt;&lt;td&gt;No (manual chaining)&lt;/td&gt;&lt;td&gt;Yes (built-in)&lt;/td&gt;&lt;td&gt;Yes (core model)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Serverless-friendly&lt;/td&gt;&lt;td&gt;Moderate&lt;/td&gt;&lt;td&gt;Yes, native&lt;/td&gt;&lt;td&gt;Moderate&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Operational burden&lt;/td&gt;&lt;td&gt;Low-medium&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;High&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Best for&lt;/td&gt;&lt;td&gt;High-throughput queues&lt;/td&gt;&lt;td&gt;Serverless multi-step&lt;/td&gt;&lt;td&gt;Long, stateful workflows&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;the-decision&quot;&gt;The decision&lt;/h2&gt;
&lt;p&gt;If you are uncertain, start with BullMQ. It is the simplest option with the most predictable operational behavior. Add Inngest if your environment is serverless and you want managed retries and multi-step support. Add Temporal when BullMQ or Inngest cannot express what you need — specifically, when long-running stateful workflows with recovery guarantees are the requirement.&lt;/p&gt;
&lt;p&gt;Most applications only ever need BullMQ. A smaller number benefit from Inngest’s model. Temporal is for the workflows where losing state on a crash is genuinely not an option.&lt;/p&gt;
&lt;p&gt;The existing posts on &lt;a href=&quot;/blog/inngest-background-jobs-nextjs-2026/&quot;&gt;Inngest&lt;/a&gt; and &lt;a href=&quot;/blog/temporal-durable-workflows-production-2026/&quot;&gt;Temporal&lt;/a&gt; go deep on each tool’s patterns. Read those after deciding which direction fits your system.&lt;/p&gt;</content:encoded><category>Cloud &amp; Infrastructure</category><category>Backend</category><category>Infrastructure</category><category>JavaScript</category><category>Architecture</category><category>Production</category><category>2026</category><author>Prathviraj Singh</author></item><item><title>How to Hire an Android Developer in 2026: What to Screen For</title><link>https://blog.codercops.com/blog/how-to-hire-android-developer-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/how-to-hire-android-developer-2026/</guid><description>Android development has changed more in the last three years than the previous decade. Here&apos;s how to tell who can build modern Android apps from who learned it circa 2019 and never looked back.</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have been doing Android development since the days when RecyclerView was the new thing and XML layouts were the only option. The platform looks nothing like that now. Jetpack Compose changed the UI model. Coroutines and Flow changed how we handle async and state. Architecture patterns solidified around a small set of well-tested approaches. The developer who learned Android in 2018 and has not kept up is a different hire than someone who shipped a Compose app last year.&lt;/p&gt;
&lt;p&gt;This creates a specific problem for teams hiring Android developers: the job description and the CV do not always reveal which kind of candidate you are looking at. Here is how to tell.&lt;/p&gt;
&lt;h2 id=&quot;what-modern-android-looks-like-in-2026&quot;&gt;What modern Android looks like in 2026&lt;/h2&gt;
&lt;p&gt;Any hire for a new project or maintained modern codebase should be comfortable with these:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kotlin&lt;/strong&gt; is the primary language. Coroutines and Flow are how you handle async work and reactive state. A candidate who cannot explain the difference between &lt;code&gt;launch&lt;/code&gt;, &lt;code&gt;async&lt;/code&gt;, and &lt;code&gt;runBlocking&lt;/code&gt; in a coroutine context is not current.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Jetpack Compose&lt;/strong&gt; is now the standard UI framework. It replaced XML-based layouts for most new development. Someone who can only work with Views and XML can maintain old code but will be slow and frustrated on any team moving forward.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Architecture patterns,&lt;/strong&gt; specifically MVVM or MVI with a clear data layer, are the expected baseline. Candidates should be able to explain how they structure a feature, what belongs in the ViewModel vs the repository vs the data source, and how they manage UI state.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dependency injection.&lt;/strong&gt; Hilt (Google’s supported DI library) or Koin. Candidates who manage dependencies manually in a large codebase are working harder than they need to.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Navigation.&lt;/strong&gt; The Jetpack Navigation component, and increasingly Compose Navigation. How screens communicate, how deep links work, and how back-stack management is handled.&lt;/p&gt;
&lt;p&gt;None of this is exotic. It is the current standard. A candidate who has shipped an app in the last two years with a team using modern practices will have all of it. The screen exists to confirm this, not to quiz them.&lt;/p&gt;
&lt;h2 id=&quot;the-technical-conversation-that-reveals-the-most&quot;&gt;The technical conversation that reveals the most&lt;/h2&gt;
&lt;p&gt;The most informative Android screen is not a whiteboard problem. It is asking a candidate to describe, in detail, how they would build a specific feature from scratch.&lt;/p&gt;
&lt;p&gt;Pick something representative of your app: a list screen that loads paginated data, a form with validation, a screen that reacts to real-time updates. Ask them to walk through the architecture: where does data come from, how does it move through the layers, how does the UI consume it, what happens when the network fails?&lt;/p&gt;
&lt;p&gt;Listen for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do they mention a repository layer, or do they call APIs directly from the ViewModel?&lt;/li&gt;
&lt;li&gt;How do they represent loading and error states?&lt;/li&gt;
&lt;li&gt;Do they mention testing? What would they test and how?&lt;/li&gt;
&lt;li&gt;Do they think about configuration changes (rotation, process death)?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Configuration changes are a reliable litmus test. An experienced Android developer has been bitten by them. A candidate who has not thought seriously about what happens to the UI state when the user rotates the device has not shipped a real app to real users.&lt;/p&gt;
&lt;h2 id=&quot;lifecycle-understanding-is-the-real-dividing-line&quot;&gt;Lifecycle understanding is the real dividing line&lt;/h2&gt;
&lt;p&gt;Android’s activity and fragment lifecycle is one of the platform’s most notorious difficulties. Senior developers understand it deeply because they have debugged its failures. Ask:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Can you describe a lifecycle-related bug you have encountered and how you fixed it?”&lt;/li&gt;
&lt;li&gt;“How do you handle work that should survive a screen rotation but not an explicit back press?”&lt;/li&gt;
&lt;li&gt;“What is the difference between &lt;code&gt;viewModelScope&lt;/code&gt; and &lt;code&gt;lifecycleScope&lt;/code&gt;, and when do you use each?”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A candidate who stumbles on these questions either has not shipped production Android or has worked exclusively on simple, non-lifecycle-sensitive screens. Both are worth knowing going in.&lt;/p&gt;
&lt;h2 id=&quot;reading-the-cv&quot;&gt;Reading the CV&lt;/h2&gt;
&lt;p&gt;Before the screen, look for these in the CV:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Good signals:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Shipped apps on the Play Store with real user counts (even modest ones).&lt;/li&gt;
&lt;li&gt;Compose mentioned prominently, not buried at the bottom.&lt;/li&gt;
&lt;li&gt;Coroutines and Flow, not RxJava as the primary async library (RxJava is fine for maintenance, but it is not how new Android is written).&lt;/li&gt;
&lt;li&gt;Architecture terms that match current practice: Repository, ViewModel, Clean Architecture, or MVI.&lt;/li&gt;
&lt;li&gt;Tests mentioned, ideally with instrumented tests or a Compose UI test framework.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Worth asking about:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Only Java, no Kotlin.&lt;/li&gt;
&lt;li&gt;AsyncTask anywhere (deprecated in API 30, removed in 33). Any live codebase still using it is carrying maintenance debt.&lt;/li&gt;
&lt;li&gt;No shipped apps, only tutorials or personal projects.&lt;/li&gt;
&lt;li&gt;Cross-platform tools only (Flutter or React Native) if the role is native Android.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of these are automatic disqualifiers, but each warrants a direct conversation about currency and transferability.&lt;/p&gt;
&lt;h2 id=&quot;where-cross-platform-fits&quot;&gt;Where cross-platform fits&lt;/h2&gt;
&lt;p&gt;Flutter and Kotlin Multiplatform are real options, not consolation prizes. If you are building a new product that needs iOS and Android parity and your app’s main value is in the business logic and UI, not deep platform integration, Flutter can deliver both platforms faster than two native codebases.&lt;/p&gt;
&lt;p&gt;Kotlin Multiplatform is worth considering when you want shared business logic and offline-first data handling but genuinely want native UIs on each platform for feel and accessibility.&lt;/p&gt;
&lt;p&gt;Native Android wins when you need precise performance, hardware access (camera, Bluetooth, NFC, sensors), or tight integration with Android system features. It also wins when your users expect a premium, platform-native feel that cross-platform tools do not yet fully deliver.&lt;/p&gt;
&lt;p&gt;That decision should happen before the hiring process, because “Android developer” and “Flutter developer” are different roles with different candidate pools.&lt;/p&gt;
&lt;h2 id=&quot;where-to-find-strong-android-candidates&quot;&gt;Where to find strong Android candidates&lt;/h2&gt;
&lt;p&gt;Android talent is globally available. The constraint is Compose fluency combined with a production delivery record. Freelance marketplaces that pre-screen are faster than a cold job post; the &lt;a href=&quot;/blog/toptal-alternatives-hire-vetted-developers-2026/&quot;&gt;hiring guides&lt;/a&gt; in this series cover how to evaluate which option fits your situation.&lt;/p&gt;
&lt;p&gt;If your team is technical enough to run a 30-minute screen, a marketplace gives you pre-filtered candidates and you add the final technical judgment. If you want the screening handled, a managed engagement delivers a shortlist with the vetting already done.&lt;/p&gt;
&lt;h2 id=&quot;a-note-on-ai-tooling-in-android-development&quot;&gt;A note on AI tooling in Android development&lt;/h2&gt;
&lt;p&gt;Android Studio’s built-in Gemini integration, Copilot, and Cursor have all made writing boilerplate Compose code faster. This matters for hiring in one direction: the bar for generating working Compose layouts has dropped, and the bar for architecture judgment, performance, and production debugging has risen. Your screen should weight toward the latter. Ask candidates to explain why they made a specific architecture decision, not just write a Compose composable on demand.&lt;/p&gt;
&lt;p&gt;The developers worth hiring understand when AI-generated code is correct and when it is subtly wrong. That judgment comes from production experience, not from prompt skill.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you are building out a mobile team, &lt;a href=&quot;/blog/what-it-costs-to-hire-a-developer-2026/&quot;&gt;what it costs to hire a developer&lt;/a&gt; is a useful frame for comparing full-time, contractor, and agency options before you commit to a hiring model.&lt;/p&gt;</content:encoded><category>Business</category><category>Hiring</category><category>Android</category><category>Mobile</category><category>Recruiting</category><category>Business</category><category>2026</category><author>Aman Chaudhary</author></item><item><title>How to Hire a Python Developer in 2026: A Practical Screening Guide</title><link>https://blog.codercops.com/blog/how-to-hire-python-developer-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/how-to-hire-python-developer-2026/</guid><description>Python is the language of AI, data, and backend. But &apos;Python developer&apos; covers a huge range of skill sets. Here&apos;s how to define the role, screen for real ability, and avoid costly mismatches.</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Python is the most popular programming language by several measures, which makes “I need a Python developer” one of the least informative hiring requests I hear. The language spans data science, web backends, automation, machine learning, DevOps scripting, and scientific computing. The person who writes your ETL pipelines and the person who builds your Django API are both Python developers. They are not the same hire.&lt;/p&gt;
&lt;p&gt;This post is a guide for getting specific: how to define the role accurately, what to screen for, and how to avoid the most common mismatch.&lt;/p&gt;
&lt;h2 id=&quot;start-with-what-your-python-actually-does&quot;&gt;Start with what your Python actually does&lt;/h2&gt;
&lt;p&gt;Before writing the job description, answer these questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is the Python running in a web server, a data pipeline, a machine learning training job, or a scheduled script?&lt;/li&gt;
&lt;li&gt;What frameworks are already in use? (Django, FastAPI, Flask, Celery, Airflow, PySpark?)&lt;/li&gt;
&lt;li&gt;Does the role interact with databases, ML models, external APIs, or all three?&lt;/li&gt;
&lt;li&gt;How much of the work is greenfield vs maintaining existing code?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The answers determine who you need. A FastAPI-and-Postgres backend role has almost nothing in common with a PySpark data pipeline role, even though both are “Python.”&lt;/p&gt;
&lt;h2 id=&quot;the-four-main-python-developer-types&quot;&gt;The four main Python developer types&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Backend web developer.&lt;/strong&gt; Builds APIs and services. Familiar with Django or FastAPI, relational databases, authentication patterns, async programming with asyncio, and deployment. Tests their code. Thinks in HTTP and SQL.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Data engineer.&lt;/strong&gt; Builds and maintains pipelines that move and transform data. Familiar with Airflow, dbt, Spark, and the data warehouse your company uses. Cares about schema, data quality, and backfill logic. Tests for correctness over time, not just at startup.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ML/AI engineer.&lt;/strong&gt; Trains, evaluates, and serves machine learning models. Familiar with PyTorch or TensorFlow, model deployment patterns (ONNX, TorchServe, vLLM for LLMs), data preprocessing, and evaluation frameworks. Overlaps with data engineering but the work is different.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Automation and tooling developer.&lt;/strong&gt; Writes scripts and internal tools. Comfortable with subprocess, CLI frameworks like Typer, file I/O, and integrating with vendor APIs. Often the generalist who knows “enough Python” to connect things.&lt;/p&gt;
&lt;p&gt;Most job descriptions collapse all four into one posting. That produces candidates who are strong at one type and weaker at others, then fail to deliver on the work you actually need.&lt;/p&gt;
&lt;h2 id=&quot;what-a-strong-screen-looks-like&quot;&gt;What a strong screen looks like&lt;/h2&gt;
&lt;p&gt;A useful Python screen takes 30 to 45 minutes and focuses on real problems from your stack, not textbook exercises. Here’s a structure that works:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ten minutes: the conversation.&lt;/strong&gt; Ask them to walk through a production system they built or significantly improved. What was the context, what problem did they solve, and what would they do differently now? You learn how they think about tradeoffs, how they communicate technical decisions, and whether they have shipped real things.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Twenty minutes: the task.&lt;/strong&gt; Give a short, scoped problem from your actual domain. If you have a data pipeline, ask them to write a small transformation function and explain how they would test it. If you have an API, ask them to design a simple endpoint with error handling. The point is not to complete the full task; it is to watch how they approach an ambiguous problem with partial information.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ten minutes: depth questions.&lt;/strong&gt; Ask about Python-specific concepts that matter for your stack. If you are using async, ask how they structure async code and what mistakes they have made. If you are using type annotations, ask what tools they use and why they find them useful or annoying. If data correctness is critical, ask how they have handled schema drift in a live system.&lt;/p&gt;
&lt;p&gt;What you are looking for is not cleverness. It is clarity of thought, comfort with ambiguity, and evidence that they have shipped similar work before.&lt;/p&gt;
&lt;h2 id=&quot;green-flags-in-senior-python-candidates&quot;&gt;Green flags in senior Python candidates&lt;/h2&gt;
&lt;p&gt;Senior Python skill shows up in specific ways. Look for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They reach for types (&lt;code&gt;mypy&lt;/code&gt;, Pydantic) in production code, not just tutorials.&lt;/li&gt;
&lt;li&gt;They can explain the Global Interpreter Lock and when it matters (and when it does not).&lt;/li&gt;
&lt;li&gt;They know the difference between threads, multiprocessing, and async, and can reason about which to use.&lt;/li&gt;
&lt;li&gt;They have opinions about dependency management (&lt;code&gt;uv&lt;/code&gt;, &lt;code&gt;poetry&lt;/code&gt;, or &lt;code&gt;pip-tools&lt;/code&gt;) and can explain why.&lt;/li&gt;
&lt;li&gt;Their test code looks like production code: organized, readable, with test fixtures that make sense.&lt;/li&gt;
&lt;li&gt;They have thought about observability: how do you know when a Python service is misbehaving in production?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The last point trips up a lot of candidates. Anyone can write Python that runs locally. Fewer have shipped it to production and been responsible for it at 2 am.&lt;/p&gt;
&lt;h2 id=&quot;red-flags-worth-acting-on&quot;&gt;Red flags worth acting on&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;They cannot name the Python version they have most recently shipped.&lt;/li&gt;
&lt;li&gt;Their test strategy is “I ran it and it worked.”&lt;/li&gt;
&lt;li&gt;They treat &lt;code&gt;requirements.txt&lt;/code&gt; without pinned versions as normal.&lt;/li&gt;
&lt;li&gt;They have only used Python in Jupyter notebooks and cannot describe a deployment.&lt;/li&gt;
&lt;li&gt;They conflate &lt;code&gt;asyncio&lt;/code&gt; with parallelism and believe it makes code faster across all workloads.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of these are disqualifiers on their own for a junior candidate learning on the job. For a senior role where you are paying for judgment, they are real signals.&lt;/p&gt;
&lt;h2 id=&quot;where-to-find-python-talent&quot;&gt;Where to find Python talent&lt;/h2&gt;
&lt;p&gt;Python developers are among the most abundant in the global remote market. The practical constraint is not supply; it is knowing what you want specifically enough to filter.&lt;/p&gt;
&lt;p&gt;If you have a technical person who can run a short screen, marketplace options like &lt;a href=&quot;/blog/toptal-alternatives-hire-vetted-developers-2026/&quot;&gt;Toptal alternatives&lt;/a&gt; let you source pre-screened candidates and add your own final check. If you want to define the role and hand off the screening, a managed engagement handles the funnel and gives you a shortlist.&lt;/p&gt;
&lt;p&gt;The hiring cluster we have built out covers &lt;a href=&quot;/blog/what-it-costs-to-hire-a-developer-2026/&quot;&gt;what the total cost really looks like&lt;/a&gt; and &lt;a href=&quot;/blog/technical-job-description-senior-developers-2026/&quot;&gt;what a strong technical job description contains&lt;/a&gt;, which are worth reading before you post anything.&lt;/p&gt;
&lt;h2 id=&quot;the-job-description-trap&quot;&gt;The job description trap&lt;/h2&gt;
&lt;p&gt;Most Python job descriptions ask for everything: Django, FastAPI, Flask, Pandas, NumPy, PyTorch, Spark, Airflow, SQL, and three years of “AI/ML experience.” This signals that the team has not decided what the role actually is. Strong candidates read it and move on. Junior candidates who match the keyword list apply.&lt;/p&gt;
&lt;p&gt;Write the job description after you have answered the four questions at the top of this post. Then list the three to five frameworks and libraries the person will actually use in the first 90 days. Everything else is a “nice to have” that you train or hire for later.&lt;/p&gt;
&lt;h2 id=&quot;a-note-on-ai-assisted-python-development&quot;&gt;A note on AI-assisted Python development&lt;/h2&gt;
&lt;p&gt;Python is one of the most AI-augmented development environments right now. Copilot, Cursor, and similar tools generate competent Python quickly. This is worth knowing in a screen: the bar for syntactically correct code has dropped, and the bar for good design, maintainability, and production judgment has gone up. Screen for the latter. A candidate who can write clean Python fast with AI assistance and explain why each decision makes sense is better than one who can recite library APIs from memory.&lt;/p&gt;
&lt;p&gt;The Python developers worth hiring are the ones who know what the tools get wrong, not just what they get right.&lt;/p&gt;</content:encoded><category>Business</category><category>Hiring</category><category>Python</category><category>Recruiting</category><category>Business</category><category>Developers</category><category>2026</category><author>Anurag Verma</author></item><item><title>OpenFeature in 2026: Feature Flags Without Vendor Lock-in</title><link>https://blog.codercops.com/blog/openfeature-feature-flags-production-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/openfeature-feature-flags-production-2026/</guid><description>OpenFeature is now a CNCF incubating project with broad SDK support. Here&apos;s how to use vendor-neutral feature flags in production — and why the standard matters more than the specific tool you back it with.</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Feature flags are one of those practices that teams discover when they get burned. A big-bang release that went wrong, a rollback that took two hours instead of two minutes, a hotfix that required a late-night deploy because there was no way to turn a feature off without one. After the incident, feature flags become standard.&lt;/p&gt;
&lt;p&gt;The second discovery happens later: you are tightly coupled to whatever flag service you chose first, and changing it means touching every evaluation call in the codebase. OpenFeature is the solution to that second problem.&lt;/p&gt;
&lt;h2 id=&quot;what-openfeature-solves&quot;&gt;What OpenFeature solves&lt;/h2&gt;
&lt;p&gt;Every feature flag service ships its own SDK with its own API. Switching from LaunchDarkly to Unleash means finding every call to &lt;code&gt;launchDarkly.variation(&apos;flag-name&apos;, user, false)&lt;/code&gt; and rewriting it to &lt;code&gt;unleash.isEnabled(&apos;flag-name&apos;)&lt;/code&gt;. In a large codebase, that is weeks of work and a non-trivial test surface.&lt;/p&gt;
&lt;p&gt;OpenFeature defines a single evaluation API that all compliant providers implement. Your application code calls:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { OpenFeature } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &quot;@openfeature/server-sdk&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; client&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; OpenFeature.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;getClient&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; isEnabled&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; client.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;getBooleanValue&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;new-checkout-flow&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Behind that call can be LaunchDarkly, GrowthBook, Unleash, Flagsmith, or your own flat-file flag definitions. Changing the backing provider is a configuration change at startup, not a code change in your features.&lt;/p&gt;
&lt;h2 id=&quot;setting-up-openfeature-with-growthbook&quot;&gt;Setting up OpenFeature with GrowthBook&lt;/h2&gt;
&lt;p&gt;GrowthBook is the most commonly self-hosted option and has an official OpenFeature provider. A minimal setup in Node.js:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { OpenFeature } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &quot;@openfeature/server-sdk&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { GrowthBookProvider } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &quot;@growthbook/openfeature-node&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { GrowthBook } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &quot;@growthbook/growthbook&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// Initialize GrowthBook — fetches flags from your self-hosted instance&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; growthbook&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; GrowthBook&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  apiHost: process.env.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;GROWTHBOOK_API_HOST&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  clientKey: process.env.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;GROWTHBOOK_CLIENT_KEY&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  enableDevMode: process.env.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;NODE_ENV&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; !==&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &quot;production&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; growthbook.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;loadFeatures&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ autoRefresh: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// Register the provider with OpenFeature — one line&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;OpenFeature.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;setProvider&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; GrowthBookProvider&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(growthbook));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// Use OpenFeature&apos;s standard API everywhere in your app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; client&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; OpenFeature.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;getClient&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now any part of your application that needs to check a flag uses the OpenFeature client, not the GrowthBook SDK directly. If you later switch to Unleash or LaunchDarkly, the provider line at startup changes; nothing else does.&lt;/p&gt;
&lt;h2 id=&quot;evaluation-context-targeting-without-coupling&quot;&gt;Evaluation context: targeting without coupling&lt;/h2&gt;
&lt;p&gt;The power beyond simple booleans is targeting: a flag that is on for 10% of users, or on for all users in the “beta” group, or on only for a specific tenant ID. OpenFeature handles this through an evaluation context that you set per request:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { OpenFeature, EvaluationContext } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &quot;@openfeature/server-sdk&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// In your middleware or request handler&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; context&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; EvaluationContext&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  targetingKey: user.id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  email: user.email,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  plan: user.plan,        &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;// &quot;free&quot; | &quot;pro&quot; | &quot;enterprise&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  region: req.region,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// This evaluation respects whatever targeting rules you defined in GrowthBook&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; client&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; OpenFeature.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;getClient&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; showNewPricing&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; client.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;getBooleanValue&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;  &quot;new-pricing-page&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;  false&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  context&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The targeting rules live in your flag provider’s dashboard. You can change who sees a feature without a deploy and without touching the code.&lt;/p&gt;
&lt;h2 id=&quot;hooks-what-makes-openfeature-more-capable-than-manual-checks&quot;&gt;Hooks: what makes OpenFeature more capable than manual checks&lt;/h2&gt;
&lt;p&gt;OpenFeature hooks let you attach behavior to every flag evaluation without cluttering your feature code. The most useful patterns:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Logging hook.&lt;/strong&gt; Record every flag evaluation for debugging:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { Hook, HookContext, EvaluationDetails } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &quot;@openfeature/server-sdk&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; loggingHook&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Hook&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;  after&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;hookContext&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; HookContext&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;evaluationDetails&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; EvaluationDetails&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;boolean&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    logger.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;debug&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;Flag evaluated&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      flagKey: hookContext.flagKey,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      value: evaluationDetails.value,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      reason: evaluationDetails.reason,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      userId: hookContext.context.targetingKey,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;OpenFeature.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;addHooks&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(loggingHook);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Analytics hook.&lt;/strong&gt; Send an event every time a feature is evaluated for A/B testing attribution:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; analyticsHook&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Hook&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;  after&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;hookContext&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;details&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    analytics.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;track&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;feature_evaluated&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      flag: hookContext.flagKey,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      value: details.value,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      userId: hookContext.context.targetingKey,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These hooks apply globally, so you write them once and every flag evaluation in the application is automatically instrumented.&lt;/p&gt;
&lt;h2 id=&quot;choosing-a-provider&quot;&gt;Choosing a provider&lt;/h2&gt;















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Provider&lt;/th&gt;&lt;th&gt;Hosted&lt;/th&gt;&lt;th&gt;Self-hosted&lt;/th&gt;&lt;th&gt;A/B testing&lt;/th&gt;&lt;th&gt;Pricing&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;LaunchDarkly&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Enterprise ($)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GrowthBook&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Free / $200+&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Unleash&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Limited&lt;/td&gt;&lt;td&gt;Free / Enterprise&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Flagsmith&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Limited&lt;/td&gt;&lt;td&gt;Free / $45+&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Statsig&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Free / $150+&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;For most small-to-mid teams, &lt;strong&gt;GrowthBook self-hosted&lt;/strong&gt; covers feature flags and basic A/B testing at no infrastructure cost beyond the server you run it on. The UI is clean, the SDK coverage is good, and OpenFeature support is first-class.&lt;/p&gt;
&lt;p&gt;If you are in enterprise and need SSO, audit logs, and SLAs, &lt;strong&gt;Unleash Enterprise&lt;/strong&gt; or &lt;strong&gt;LaunchDarkly&lt;/strong&gt; are the serious options. Both have OpenFeature providers, so you are not locked in.&lt;/p&gt;
&lt;h2 id=&quot;what-this-looks-like-in-a-full-stack-app&quot;&gt;What this looks like in a full-stack app&lt;/h2&gt;
&lt;p&gt;The pattern that works well across a full-stack app:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Server-side evaluations (API routes, middleware) use the OpenFeature Node.js SDK directly, as above.&lt;/li&gt;
&lt;li&gt;Client-side feature flags for UI only (show/hide a component, toggle a layout) use the OpenFeature Web SDK with a browser-compatible provider. These are evaluated after hydration, so account for the flash of wrong content if you are gating layout.&lt;/li&gt;
&lt;li&gt;Feature flags for AI model routing or prompt changes work the same way. See the &lt;a href=&quot;/blog/feature-flags-ai-features-2026/&quot;&gt;feature flags for AI features post&lt;/a&gt; for the specific patterns around non-deterministic outputs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;when-a-flat-file-is-enough&quot;&gt;When a flat file is enough&lt;/h2&gt;
&lt;p&gt;Not every application needs a feature flag service. If you are shipping weekly and deploying cleanly, environment variables cover the use case. A JSON file checked into the repo with your flag defaults, loaded at startup, is fine for small teams.&lt;/p&gt;
&lt;p&gt;The right time to graduate to a proper flag system is when you want runtime changes without a deploy, when you want targeting by user attribute, or when your release cadence is fast enough that a flag rollback is faster than a hotfix deploy.&lt;/p&gt;
&lt;p&gt;OpenFeature makes that graduation cheaper: you write against the standard API from the start, and the provider behind it can be a flat file in development and GrowthBook in production. The calling code never knows the difference.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Feature flags are a deployability decision more than a tooling decision. The goal is the ability to ship code before it is “on,” to decouple deploy from release. OpenFeature just makes sure that whichever tool you back that with, you can change your mind without rewriting half the codebase. For the broader architectural context, &lt;a href=&quot;/blog/monorepo-tooling-turborepo-nx-pnpm-2026/&quot;&gt;the monorepo tooling post&lt;/a&gt; covers how feature flag configuration fits into a multi-package setup.&lt;/p&gt;</content:encoded><category>Technology</category><category>Developer Tools</category><category>Backend</category><category>Infrastructure</category><category>Open Source</category><category>Production</category><category>2026</category><author>Abhishek Gupta</author></item><item><title>Web Scraping in 2026: Playwright, Puppeteer, and the Legal Line</title><link>https://blog.codercops.com/blog/web-scraping-playwright-puppeteer-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/web-scraping-playwright-puppeteer-2026/</guid><description>Playwright has become the dominant web scraping tool, but the tooling decision is the easy part. Here&apos;s a practical guide to scraping that works, and the legal and ethical lines you need to know before shipping.</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Someone on your team needs to pull data from a website that does not have an API. Maybe it is competitor pricing, maybe it is a public government data source that only has a web interface, maybe it is product listings from a marketplace. Web scraping is the answer. The question is how to do it cleanly, reliably, and without stepping into legal or ethical problems.&lt;/p&gt;
&lt;p&gt;This is a practical guide. It covers tool choice, the patterns that work, the patterns that get you blocked, and the legal and ethical situation you need to understand before you ship anything commercial.&lt;/p&gt;
&lt;h2 id=&quot;playwright-vs-puppeteer-vs-everything-else&quot;&gt;Playwright vs. Puppeteer vs. everything else&lt;/h2&gt;
&lt;p&gt;Playwright is the right default for new projects in 2026. The quick comparison:&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Tool&lt;/th&gt;&lt;th&gt;Language&lt;/th&gt;&lt;th&gt;Browser support&lt;/th&gt;&lt;th&gt;Maintained by&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Playwright&lt;/td&gt;&lt;td&gt;JS/TS, Python, Java, .NET&lt;/td&gt;&lt;td&gt;Chromium, Firefox, WebKit&lt;/td&gt;&lt;td&gt;Microsoft&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Puppeteer&lt;/td&gt;&lt;td&gt;JS/TS&lt;/td&gt;&lt;td&gt;Chromium (Firefox experimental)&lt;/td&gt;&lt;td&gt;Google&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Selenium&lt;/td&gt;&lt;td&gt;JS, Python, Java, Ruby, C#&lt;/td&gt;&lt;td&gt;All major browsers&lt;/td&gt;&lt;td&gt;Selenium Project&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Scrapy&lt;/td&gt;&lt;td&gt;Python&lt;/td&gt;&lt;td&gt;N/A (HTTP only)&lt;/td&gt;&lt;td&gt;Open source&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Playwright wins on most dimensions for browser-based scraping: cross-browser, automatic waiting for elements, better async API, and first-class Python support. Selenium is worth considering when you need Java or Ruby and the project is large enough to have settled on those languages. Scrapy is the right tool when you are scraping at scale and the target site is mostly HTML-rendered (no JavaScript needed). It is faster and more efficient for that workload.&lt;/p&gt;
&lt;p&gt;Puppeteer is still used, particularly in Node.js projects where switching would be costly. But for greenfield work, there is no reason to choose it over Playwright.&lt;/p&gt;
&lt;h2 id=&quot;a-minimal-working-playwright-scraper&quot;&gt;A minimal working Playwright scraper&lt;/h2&gt;
&lt;p&gt;Here is what a clean Python scraper looks like in 2026:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; asyncio&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; playwright.async_api &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; async_playwright, Page&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; scrape_listing&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(url: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) -&gt; &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;dict&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    async&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; with&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; async_playwright() &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; p:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        browser &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; p.chromium.launch(&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;headless&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        context &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; browser.new_context(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;            user_agent&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;                &quot;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) &quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;                &quot;AppleWebKit/537.36 (KHTML, like Gecko) &quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;                &quot;Chrome/124.0.0.0 Safari/537.36&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;            ),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;            viewport&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;width&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;1280&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;height&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;800&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        page: Page &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; context.new_page()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;        await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; page.goto(url, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;wait_until&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;domcontentloaded&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;        # Playwright auto-waits; you should still be explicit about what you need&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;        await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; page.wait_for_selector(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;.product-title&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;timeout&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;10_000&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        title &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; page.text_content(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;.product-title&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        price &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; page.text_content(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;.product-price&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;        await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; browser.close()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: title, &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;price&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: price}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;asyncio.run(scrape_listing(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;https://example.com/product/1&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A few notes on this pattern:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Always set a realistic &lt;code&gt;user_agent&lt;/code&gt;. A headless browser with the default Playwright agent is easy to fingerprint.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wait_until=&quot;domcontentloaded&quot;&lt;/code&gt; is faster than &lt;code&gt;networkidle&lt;/code&gt; and sufficient when your target content is in the DOM rather than loaded by a subsequent fetch.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wait_for_selector&lt;/code&gt; is more reliable than &lt;code&gt;wait_for_timeout&lt;/code&gt;. An explicit time delay is fragile; an element wait adapts to the actual page state.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;patterns-that-prevent-blocks&quot;&gt;Patterns that prevent blocks&lt;/h2&gt;
&lt;p&gt;Anti-bot systems fingerprint several signals. Here are the practical countermeasures:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rate limiting.&lt;/strong&gt; Add delays between requests. One to three seconds between pages is the range most sites consider human. Machine-speed requests (hundreds per minute) will get you blocked everywhere.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; asyncio&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; random&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; polite_fetch&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(page, url):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; page.goto(url)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;    # jitter the wait so it does not look robotic&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; asyncio.sleep(random.uniform(&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;1.5&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;3.5&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;IP rotation.&lt;/strong&gt; A single IP hitting a site repeatedly at any speed is detectable. For larger-scale work, use a rotating proxy service or accept that your scrape will be blocked and throttled.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Request headers.&lt;/strong&gt; Rotate User-Agent strings, set &lt;code&gt;Accept-Language&lt;/code&gt; and &lt;code&gt;Accept&lt;/code&gt; headers to plausible browser values, and do not send headers that headless browsers omit by default (like &lt;code&gt;Sec-CH-UA&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Session management.&lt;/strong&gt; Logged-in sessions are more complex. If a site requires login, that is a clear signal that scraping it may violate the ToS, and you should read the legal section below carefully.&lt;/p&gt;
&lt;h2 id=&quot;handling-javascript-rendered-content&quot;&gt;Handling JavaScript-rendered content&lt;/h2&gt;
&lt;p&gt;Sites that load content via JavaScript after page load need a headful or headless browser (Playwright or Puppeteer, not a plain HTTP fetcher like &lt;code&gt;requests&lt;/code&gt;). The Playwright pattern above handles this. Two specific cases worth knowing:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Infinite scroll.&lt;/strong&gt; The content loads as you scroll. Simulate this:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;# Scroll to the bottom incrementally to trigger loading&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; _ &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; page.evaluate(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;window.scrollTo(0, document.body.scrollHeight)&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; asyncio.sleep(&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;1.5&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Waiting for network responses.&lt;/strong&gt; Sometimes you want to intercept the API call the page makes rather than parse the rendered HTML. Playwright’s &lt;code&gt;page.expect_response()&lt;/code&gt; lets you wait for a specific URL and parse the JSON directly, which is cleaner and more stable than HTML parsing:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; with&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; page.expect_response(&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;lambda&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; r: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;/api/products&quot;&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; r.url) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; resp_info:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; page.goto(url)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;response &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; resp_info.value&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;data &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; response.json()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is worth checking: many sites that do not have a public API do have internal API calls. Intercepting those is simpler and more stable than scraping the HTML.&lt;/p&gt;
&lt;h2 id=&quot;the-legal-and-ethical-lines&quot;&gt;The legal and ethical lines&lt;/h2&gt;
&lt;p&gt;The legal picture shifted with the 9th Circuit’s ruling in hiQ v. LinkedIn (upheld in 2022), which held that scraping publicly accessible data does not automatically violate the Computer Fraud and Abuse Act. Public data, accessible without authentication, is generally scrapeable under US law.&lt;/p&gt;
&lt;p&gt;That said, three things can create real legal exposure:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Terms of Service violations.&lt;/strong&gt; Scraping in violation of a site’s ToS is a contract issue, not a criminal one under most readings of the CFAA, but it can result in civil action and account termination. Read the ToS before scraping commercially.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Personal data.&lt;/strong&gt; If the data you are collecting contains personal information about EU residents, GDPR applies. If it contains California residents’ personal data, CCPA applies. “It’s public” is not a defense if you are building a database of personal information at scale.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Competitive misappropriation.&lt;/strong&gt; Some courts have found scraping to create liability under state unfair competition law, particularly when it harms the business being scraped. The lines here are less clear.&lt;/p&gt;
&lt;p&gt;The practical rule: check &lt;code&gt;robots.txt&lt;/code&gt;, honor the &lt;code&gt;Crawl-delay&lt;/code&gt; if it is set, do not scrape behind authentication without permission, and if you are building a commercial product on scraped data, talk to a lawyer before you launch.&lt;/p&gt;
&lt;h2 id=&quot;when-to-use-a-managed-scraping-service&quot;&gt;When to use a managed scraping service&lt;/h2&gt;
&lt;p&gt;For personal projects and internal tooling, running your own Playwright scraper is fine. For commercial products where the scraping is core to the value proposition, managed services are usually the better investment:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apify.&lt;/strong&gt; Orchestration layer, actor-based jobs, runs at scale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bright Data.&lt;/strong&gt; Residential proxy network, web unlocker, structured data products.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Oxylabs.&lt;/strong&gt; Similar to Bright Data, strong enterprise support.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ScrapingBee.&lt;/strong&gt; Simpler API, good for teams that want a service without managing the infrastructure.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These services handle residential IP rotation, browser fingerprinting challenges, and CAPTCHA solving. If your target site uses Cloudflare or Akamai Bot Manager, you will spend weeks building and maintaining bypass logic that a managed service has already solved. That time cost is real.&lt;/p&gt;
&lt;h2 id=&quot;storing-and-using-scraped-data&quot;&gt;Storing and using scraped data&lt;/h2&gt;
&lt;p&gt;The scraping is usually the easy part. Think about these before you start:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How often do you need to refresh? Run your scrape on a schedule (Airflow, Prefect, even a cron job on a VPS) rather than on demand.&lt;/li&gt;
&lt;li&gt;Where does the data land? Postgres with a &lt;code&gt;scraped_at&lt;/code&gt; timestamp column is a sensible starting point. Add &lt;code&gt;source_url&lt;/code&gt; so you can debug which page a row came from.&lt;/li&gt;
&lt;li&gt;How do you handle change? Structure evolves. Name your selectors clearly, write tests against the structure, and get notified when a scrape yields zero results.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The most common failure mode is a scraper that silently stops working because the site changed a class name. An empty result is not an error the way a thrown exception is, so you have to build that check explicitly.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Web scraping is a legitimate tool for gathering data that is otherwise unavailable. Done well (with rate limiting, legal awareness, and a clear data storage strategy) it works reliably for years. Done without those considerations, it is a fragile script that gets blocked and creates liability. The gap between the two is mostly planning, not sophistication.&lt;/p&gt;
&lt;p&gt;For related reading on automation tooling at the project level, &lt;a href=&quot;/blog/github-actions-optimization-speed-cost-2026/&quot;&gt;GitHub Actions in 2026&lt;/a&gt; shows how scheduled scraping jobs fit into a larger CI/CD workflow.&lt;/p&gt;</content:encoded><category>Web Development</category><category>Web Development</category><category>Python</category><category>JavaScript</category><category>Automation</category><category>Developer Tools</category><category>2026</category><author>Abhishek Gupta</author></item><item><title>Developer Onboarding in 30 Days: Getting Engineers Productive Without the Chaos</title><link>https://blog.codercops.com/blog/developer-onboarding-30-days-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/developer-onboarding-30-days-2026/</guid><description>A week-by-week playbook for onboarding a new software engineer. What to cover in the first month, what most teams skip, and how to measure whether it is working.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The most common onboarding story I hear from developers joining new teams goes like this: day 1 is meeting people and waiting for accounts to be provisioned, day 2 is reading a README that was last updated 18 months ago, day 3 is unclear, and somewhere in week 2 they are handed a ticket with no context and told to figure it out.&lt;/p&gt;
&lt;p&gt;This is not malicious. It is what happens when no one owns onboarding as an engineering concern. HR owns the paperwork. IT owns the accounts. The engineering lead is busy. The new developer has context debt that compounds with every day they spend trying to parse the codebase without a guide.&lt;/p&gt;
&lt;p&gt;A month of that costs more than the setup time for a real onboarding process. Here is the one we use.&lt;/p&gt;
&lt;h2 id=&quot;before-day-1&quot;&gt;Before day 1&lt;/h2&gt;
&lt;p&gt;The biggest onboarding speedup is not something you do in the first week — it is setup you do before the developer arrives.&lt;/p&gt;
&lt;p&gt;Create a single “start here” document. Not a list of links to Confluence pages — a document that tells the developer in plain text what the product does, what tech stack they will work in, who does what on the team, and what a good first week looks like. One page is enough. The goal is to give them enough context to ask useful questions rather than open-ended “where do I start?” ones.&lt;/p&gt;
&lt;p&gt;Provision access before day 1. GitHub, the cloud environment, the deployment pipeline, the communication tools, the password manager. Waiting for IT requests to clear on day 2 is unnecessary friction and signals disorganization from the first impression.&lt;/p&gt;
&lt;p&gt;Pick a first task in advance. Not a large feature — a small, real, code-touching task. A failing test to fix, a small UI bug with a clear reproduction path, a documentation gap. The first task is not about productivity. It is about getting the developer into the real workflow so they can ask specific questions.&lt;/p&gt;
&lt;h2 id=&quot;week-1-environment-first-pr-first-feedback-loop&quot;&gt;Week 1: environment, first PR, first feedback loop&lt;/h2&gt;
&lt;p&gt;The goal for week 1 is narrow: get the developer’s development environment working, get them comfortable navigating the codebase, and get a PR merged.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 1 and 2&lt;/strong&gt; are setup and orientation. Pair them with whoever knows the codebase best — not for a formal walkthrough, but to answer questions in real time as they hit them. A codebase tour where someone just explains every file in order is not useful. A session where the developer runs the app locally, breaks something, and the pair helps them diagnose it is.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 3&lt;/strong&gt; is the first task. They know enough to start something. Let them struggle with it a bit before offering help — the struggle is where they learn what they do not know.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;By end of week 1&lt;/strong&gt;, the PR should be in review. The review matters as much as the code. This is the first time the developer gets a real signal about code standards, comment culture, and how the team communicates disagreement. Review it the same way you would review any PR, not more leniently because they are new. Overly gentle reviews do not help — they just delay the moment when real feedback arrives.&lt;/p&gt;
&lt;h2 id=&quot;week-2-and-3-expand-scope-establish-norms&quot;&gt;Week 2 and 3: expand scope, establish norms&lt;/h2&gt;
&lt;p&gt;The developer can now navigate the codebase and has been through the deploy pipeline. Week 2 is about broadening context.&lt;/p&gt;
&lt;p&gt;Assign something slightly larger. Still scoped — not a month-long feature, but something that requires understanding more than one file or system. Notice where they get stuck. Those are your documentation gaps.&lt;/p&gt;
&lt;p&gt;Run a reverse code review in week 2. Ask the developer to review someone else’s PR. This is underused as an onboarding tool. Reviewing code forces you to understand what you are looking at and reveals what you do not know. It also tells you a lot about how the new developer thinks. Do they look at tests? Do they ask about edge cases? Do they comment or stay quiet?&lt;/p&gt;
&lt;p&gt;The end of week 2 is also when async communication norms need to be explicit, if they have not been. How does the team expect questions to be asked? Slack in a specific channel? A GitHub comment? Direct messages? Teams with undocumented norms create confusion that persists for months.&lt;/p&gt;
&lt;h2 id=&quot;week-4-solo-task-performance-conversation&quot;&gt;Week 4: solo task, performance conversation&lt;/h2&gt;
&lt;p&gt;By week 4, the developer should be working mostly independently. Assign something they own end to end: specification, implementation, tests, and the deploy. Watch what questions they bring and what they resolve themselves.&lt;/p&gt;
&lt;p&gt;The end-of-month conversation is not a performance review. It is a two-way check-in. What is unclear? What would have helped? What is working? The developer has just spent 30 days forming opinions about the codebase, the team, and the processes. Those opinions are cheap to act on now and expensive to ignore for a year.&lt;/p&gt;
&lt;p&gt;This conversation also surfaces onboarding debt. If they had to ask the same question twice because the answer was not documented, write it down. If something about the dev environment setup wasted two days, fix it before the next hire.&lt;/p&gt;
&lt;h2 id=&quot;what-to-skip&quot;&gt;What to skip&lt;/h2&gt;
&lt;p&gt;Some things that end up in onboarding schedules and should not:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day-long system tours.&lt;/strong&gt; A three-hour walkthrough of every service in a distributed system on day 1 is not retained. Show the developer the parts they will touch in their first task. They will learn the rest as they need it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reading documentation without a task.&lt;/strong&gt; Documentation is useful as a reference, not as a substitute for doing. Give them a task and point them at the docs that support it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Isolated “training” work.&lt;/strong&gt; Toy tasks built specifically for onboarding, like “build this feature in a throwaway branch,” are less effective than real tasks in the real codebase. The feedback loop is artificial and the stakes are wrong.&lt;/p&gt;
&lt;h2 id=&quot;onboarding-a-contractor-versus-a-full-time-hire&quot;&gt;Onboarding a contractor versus a full-time hire&lt;/h2&gt;
&lt;p&gt;Contractors — whether through an agency or a marketplace — often have more context-switching experience and will get oriented faster on their own. They have usually seen more codebases than full-time engineers at the same experience level.&lt;/p&gt;
&lt;p&gt;What contractors need that full-time hires also need but more urgently: explicit task definition, a clear deliverable for week 1, and access to whoever makes decisions about requirements. A contractor without access to that decision-maker is blocked every time they hit an ambiguous spec, and that compounds into expensive delays fast.&lt;/p&gt;
&lt;p&gt;If you are hiring a contractor through a studio or agency, the handoff to your team is part of what you are paying for. Ask how they structure it — a studio that cannot describe their onboarding process is one that has not thought hard about how their developer will work in your environment. Our &lt;a href=&quot;/services/&quot;&gt;services&lt;/a&gt; page covers how we handle integration with existing client teams.&lt;/p&gt;
&lt;h2 id=&quot;the-metric-that-tells-you-if-it-is-working&quot;&gt;The metric that tells you if it is working&lt;/h2&gt;
&lt;p&gt;There is one leading indicator of a good onboarding process: does the developer make a meaningful commit in the first five working days?&lt;/p&gt;
&lt;p&gt;Not a commit to a side branch nobody sees — a commit that goes through real review. That single event means the environment works, the developer understands what the codebase needs, and the feedback loop is running. Everything after that is about expanding scope.&lt;/p&gt;
&lt;p&gt;If week 1 passes without that commit, something is blocked. Find it and remove it. The blockage is almost always documentation, access, or ambiguity in the first task — not developer skill.&lt;/p&gt;
&lt;p&gt;For the hiring side of getting to that first onboarding, the full process for vetting and selecting a developer is in &lt;a href=&quot;/blog/how-to-hire-vetted-software-developer-2026/&quot;&gt;how to hire a vetted software developer&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>Business</category><category>Career</category><category>Business</category><category>Developers</category><category>Productivity</category><category>Hiring</category><category>2026</category><author>Abhishek Gupta</author></item><item><title>How to Hire a React Developer in 2026: The Technical Screen That Finds Real Skill</title><link>https://blog.codercops.com/blog/hire-react-developer-technical-screen-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/hire-react-developer-technical-screen-2026/</guid><description>A step-by-step guide to screening React developers in 2026 — what to test, what seniority looks like, and the red flags that save you from a bad hire.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Most teams screen React developers the wrong way. They pick a number of years of experience, run a coding challenge lifted from LeetCode, and then wonder why the hire who passed the screen can’t maintain a production codebase six months in.&lt;/p&gt;
&lt;p&gt;The problem is usually a spec-to-screen gap: the company needs someone who can own a component library and debug rendering issues, but the screen tests algorithm fluency. Those are different skills.&lt;/p&gt;
&lt;p&gt;This guide is for hiring managers and CTOs who want a screen that actually predicts job performance, not just interview performance.&lt;/p&gt;
&lt;h2 id=&quot;start-with-what-your-codebase-actually-needs&quot;&gt;Start with what your codebase actually needs&lt;/h2&gt;
&lt;p&gt;Before writing a job description, spend 30 minutes with whoever runs the React codebase. Ask three questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What is the most painful class of bug we deal with?&lt;/li&gt;
&lt;li&gt;What does a new component need to satisfy before it gets merged?&lt;/li&gt;
&lt;li&gt;What skill gap has caused the most incidents or delays?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The answers should drive your screen. A team that primarily writes data-heavy dashboards has different needs than one shipping a design system. Screening for the generic “React developer” instead of the specific role you need is how you end up paying for expertise you won’t use.&lt;/p&gt;
&lt;h2 id=&quot;what-good-react-skill-actually-looks-like&quot;&gt;What good React skill actually looks like&lt;/h2&gt;
&lt;p&gt;React’s learning curve flattens early and then gets steep again. Getting hooks to work is fast. Understanding why a component re-renders six more times than expected, how to architect state that doesn’t turn into spaghetti at scale, or how to write tests that survive refactors — that takes longer and doesn’t come from tutorials.&lt;/p&gt;
&lt;p&gt;The things that predict job performance are not the same as the things that are easy to test:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rendering mental model.&lt;/strong&gt; Can the candidate explain what triggers a re-render without being prompted? Do they know why &lt;code&gt;React.memo&lt;/code&gt; is not always the right fix? This is the foundation. Without it, performance problems pile up invisibly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;State architecture instincts.&lt;/strong&gt; At what point does co-located component state belong in a context? When does a context become a performance liability? Senior engineers have opinions on this. They will describe a tradeoff without being asked.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Testing discipline.&lt;/strong&gt; Does the candidate write tests that verify behavior or tests that just cover lines? The difference shows up immediately when you ask them to walk through a test file.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Accessibility awareness.&lt;/strong&gt; Not deep expertise — just knowing that a button should be a button, that interactive elements need focus states, and that screen reader support is a real requirement for most production apps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Opinion about tooling.&lt;/strong&gt; A senior React developer has worked with enough state management libraries, data-fetching strategies, and bundler configs to have genuine preferences. Blank indifference is a signal.&lt;/p&gt;
&lt;h2 id=&quot;a-three-stage-screen&quot;&gt;A three-stage screen&lt;/h2&gt;
&lt;p&gt;A single-stage process catches single failure modes. Here is a structure that has worked for us:&lt;/p&gt;
&lt;h3 id=&quot;stage-1--async-exercise-2-hours-target&quot;&gt;Stage 1 — Async exercise (2 hours target)&lt;/h3&gt;
&lt;p&gt;Send a take-home with a realistic but contained scope. A good prompt for most React roles:&lt;/p&gt;
&lt;p&gt;Build a small component that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fetches a list of items from a public API&lt;/li&gt;
&lt;li&gt;Handles loading and error states explicitly&lt;/li&gt;
&lt;li&gt;Lets the user filter the list by a field of your choosing&lt;/li&gt;
&lt;li&gt;Includes at least one test&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Give candidates 48 hours. Make clear the 2-hour guidance is real — you are not looking for a polished app, and effort beyond that signals the candidate is anxious rather than thorough.&lt;/p&gt;
&lt;p&gt;What you are evaluating:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Does the loading and error path actually work, or was it bolted on?&lt;/li&gt;
&lt;li&gt;Is state in the right place, or is data living in components that don’t need it?&lt;/li&gt;
&lt;li&gt;Does the test check behavior or just call a function and assert it exists?&lt;/li&gt;
&lt;li&gt;Is the component readable by someone who did not write it?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You do not need TypeScript, a perfect file structure, or a production deployment. You need to see how they think.&lt;/p&gt;
&lt;h3 id=&quot;stage-2--live-session-45-minutes&quot;&gt;Stage 2 — Live session (45 minutes)&lt;/h3&gt;
&lt;p&gt;Walk through their take-home together. The goal is not to critique it — it is to see how they reason when someone is watching.&lt;/p&gt;
&lt;p&gt;Start with an open-ended question: “Walk me through the decisions you made on the state structure here.”&lt;/p&gt;
&lt;p&gt;Listen for: confidence with tradeoffs, willingness to say “I would do this differently if I had more time,” and the ability to defend a choice without being defensive about it.&lt;/p&gt;
&lt;p&gt;Then ask one debugging question. Introduce a simple bug or pull in something from your real codebase. How they approach it tells you more than the take-home did.&lt;/p&gt;
&lt;p&gt;Finish with one performance question. “If this list had 10,000 items, what would break and what would you do about it?” Good answers mention virtualization or lazy loading. Great answers also question whether you need 10,000 items in the DOM at all.&lt;/p&gt;
&lt;h3 id=&quot;stage-3--values-and-async-conversation-30-minutes&quot;&gt;Stage 3 — Values and async conversation (30 minutes)&lt;/h3&gt;
&lt;p&gt;This is a call with whoever the developer will work closest with. Not a technical round — a conversation about how they work.&lt;/p&gt;
&lt;p&gt;Useful questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How do you decide when a PR is ready for review vs. when you need more time?&lt;/li&gt;
&lt;li&gt;Tell me about a time you disagreed with a technical decision. What did you do?&lt;/li&gt;
&lt;li&gt;How do you document work that is going to live in the codebase for years?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This catches a class of problems that technical screens miss entirely: people who are technically strong but write unreadable code, merge without reviews, or disappear when a deadline slips.&lt;/p&gt;
&lt;h2 id=&quot;red-flags-that-compound&quot;&gt;Red flags that compound&lt;/h2&gt;
&lt;p&gt;Some things that seem minor in a screen are expensive in production:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No opinion on testing.&lt;/strong&gt; “I test when there is time” means there is never time. Good developers understand that untested code is debt that gets called in at the worst moment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reaching for a library before understanding the problem.&lt;/strong&gt; Suggesting Redux for a contact form, or reaching for SWR when a single &lt;code&gt;useEffect&lt;/code&gt; is fine, suggests the candidate navigates by pattern-matching rather than reasoning. That works until the project is unusual.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Inability to explain their own take-home.&lt;/strong&gt; If a candidate used a pattern they read about but cannot explain why, the code review cycle will be expensive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Confidence without curiosity.&lt;/strong&gt; Senior engineers ask clarifying questions. The ones who don’t tend to build what they imagined, not what was needed.&lt;/p&gt;
&lt;h2 id=&quot;the-seniority-question&quot;&gt;The seniority question&lt;/h2&gt;
&lt;p&gt;The Stack Overflow Developer Survey 2025 found that React remains the most-used web framework for the fifth year running, which means the market is saturated with self-described “experienced React developers.” Seniority means something specific:&lt;/p&gt;
&lt;p&gt;A mid-level developer makes it work. A senior developer makes it not break. The difference shows up in code reviews (do they catch issues before they ship?), in meetings (do they flag problems before they become blockers?), and in architecture discussions (do they think three decisions ahead?).&lt;/p&gt;
&lt;p&gt;For most product teams, a strong mid-level developer with good instincts is a better hire than a technically senior developer with poor communication. Screen for both.&lt;/p&gt;
&lt;h2 id=&quot;before-you-post-the-job&quot;&gt;Before you post the job&lt;/h2&gt;
&lt;p&gt;Check what you actually need against what you are about to pay for. If the work is a defined project — an MVP, a new feature, a frontend rebuild — an agency or studio may be a better fit than a hire. We walk through the decision in &lt;a href=&quot;/blog/how-to-hire-software-development-agency-2026/&quot;&gt;how to hire a software development agency&lt;/a&gt;, and the cost comparison across models is in &lt;a href=&quot;/blog/what-it-costs-to-hire-a-developer-2026/&quot;&gt;what it costs to hire a developer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you do need a dedicated seat, the full vetting process for any developer hire — not just React — is in &lt;a href=&quot;/blog/how-to-hire-vetted-software-developer-2026/&quot;&gt;how to hire a vetted software developer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The screen above is a starting point, not a complete answer. Every team ships something slightly different. The best interview process is the one built around the specific problems your codebase actually has.&lt;/p&gt;</content:encoded><category>Business</category><category>Hiring</category><category>React</category><category>Frontend</category><category>Developers</category><category>Business</category><category>2026</category><author>Anurag Verma</author></item><item><title>How to Get Hired as a Remote Developer in 2026</title><link>https://blog.codercops.com/blog/how-to-get-hired-remote-developer-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/how-to-get-hired-remote-developer-2026/</guid><description>The remote market is more competitive and more winnable than it looks. The developers who get hired are not always the strongest coders. They are the easiest to evaluate. Here is how to become one of them.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have been on both sides of the remote hiring conversation: applying for contracts, and screening other developers for them. The thing that surprised me most is how rarely the strongest engineer wins. The developer who gets hired is usually the one who was easiest to say yes to.&lt;/p&gt;
&lt;p&gt;That is good news, because being easy to evaluate is a skill you can build deliberately. Here is how.&lt;/p&gt;
&lt;h2 id=&quot;stop-competing-on-skill-alone&quot;&gt;Stop competing on skill alone&lt;/h2&gt;
&lt;p&gt;The instinct is to grind more LeetCode and add more frameworks to your resume. It rarely moves the needle. The person hiring you is not trying to find the best coder on earth. They are trying to confirm, quickly and with low risk, that you can do their specific job and will be easy to work with.&lt;/p&gt;
&lt;p&gt;That reframing changes everything you do next. Your job is not to be the strongest. It is to be the clearest. Make the yes obvious.&lt;/p&gt;
&lt;p&gt;If you want to understand exactly what the person on the other side is checking, read &lt;a href=&quot;/blog/how-to-hire-vetted-software-developer-2026/&quot;&gt;how teams actually screen developers&lt;/a&gt;. When you know what the screen tests, you can build the evidence it looks for.&lt;/p&gt;
&lt;h2 id=&quot;ship-one-thing-deeply&quot;&gt;Ship one thing, deeply&lt;/h2&gt;
&lt;p&gt;A profile with ten repos that are each two commits deep tells me nothing. One project that is real, deployed, and that you can walk me through tells me almost everything.&lt;/p&gt;
&lt;p&gt;Pick something and take it further than feels necessary. Deploy it so it actually runs at a URL. Write a paragraph on what it does, what was hard, and one decision you would now make differently. That last part is the tell that you have shipped and learned, not just followed a tutorial.&lt;/p&gt;
&lt;p&gt;Depth is the signal. A hiring manager can evaluate one deep project in three minutes. Ten shallow ones take longer and say less.&lt;/p&gt;
&lt;h2 id=&quot;make-a-profile-that-does-the-filtering-for-you&quot;&gt;Make a profile that does the filtering for you&lt;/h2&gt;
&lt;p&gt;The developers who get inbound are the ones who are findable and legible. When someone lands on your page, three questions should answer themselves in the first few seconds: what do you do, what have you shipped, and are you available.&lt;/p&gt;
&lt;p&gt;State your specialty in plain words. List the skills you would actually want to be hired for, not every technology you have touched. Link the one deployed project. Say whether you are open to work. A profile that does this filters out the wrong roles and pulls in the right ones without you doing anything.&lt;/p&gt;
&lt;p&gt;This is the whole reason we let developers publish a profile in a few minutes and become discoverable to companies hiring through us. A clear public page is leverage. If you want one, you can build yours and read &lt;a href=&quot;/about/&quot;&gt;more about how the platform works&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;write-about-your-work&quot;&gt;Write about your work&lt;/h2&gt;
&lt;p&gt;You do not need a big audience. You need a small body of evidence that you think clearly.&lt;/p&gt;
&lt;p&gt;One short post explaining a real decision you made, the constraint, the options, and why you chose what you chose, is worth more than another generic tutorial. It shows the exact judgment that companies are screening for and cannot test from a resume. It also keeps working while you sleep. Months later, someone finds it, and the conversation starts warm.&lt;/p&gt;
&lt;h2 id=&quot;be-specific-about-rate-and-availability&quot;&gt;Be specific about rate and availability&lt;/h2&gt;
&lt;p&gt;This is where a lot of strong developers quietly lose work. Asked their rate, they say “it depends.” Asked when they can start, they hedge.&lt;/p&gt;
&lt;p&gt;Vagueness reads badly. It signals either that you do not know your worth or that you are not really available. State a clear rate. Anchor it on what comparable developers in your stack charge, not on what you think you can get away with. Say plainly when you can start. You can always negotiate from a clear number. You cannot negotiate from a shrug.&lt;/p&gt;
&lt;h2 id=&quot;put-it-together&quot;&gt;Put it together&lt;/h2&gt;
&lt;p&gt;None of this requires you to be a stronger engineer than you are today. It requires you to package what you already are so a busy person can evaluate it fast.&lt;/p&gt;
&lt;p&gt;Ship one real thing. Put up a page that answers the three questions. Write one honest post. Name your rate. Do that and you stop being a resume in a pile and start being an easy yes. If you want a place to publish that page and get in front of companies that are hiring, &lt;a href=&quot;/contact/&quot;&gt;start here&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>Career</category><category>Career</category><category>Remote Work</category><category>Developers</category><category>Portfolio</category><category>2026</category><author>Abhishek Gupta</author></item><item><title>How to Hire a Software Development Agency in 2026</title><link>https://blog.codercops.com/blog/how-to-hire-software-development-agency-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/how-to-hire-software-development-agency-2026/</guid><description>I run one, so I will tell you how to hire one, including the parts most agency owners would rather you did not know. The green flags, the red flags, and how to tell a partner from a vendor.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I run a software studio, which makes this an awkward post to write, because the honest version of “how to hire an agency” includes the things agencies prefer you did not scrutinize. I am going to write the honest version anyway, because the clients who know what to look for are better clients, and the agencies that fear an informed buyer are the ones you should avoid.&lt;/p&gt;
&lt;h2 id=&quot;first-decide-if-you-even-want-an-agency&quot;&gt;First, decide if you even want an agency&lt;/h2&gt;
&lt;p&gt;The most expensive mistake is hiring the right agency for the wrong kind of work.&lt;/p&gt;
&lt;p&gt;Agencies are built for projects: a thing with a shape and a deadline. An MVP. A redesign. A feature your team has never built and does not want to learn once. You bring in a team that has shipped that shape before, they ship it, and you are not managing individuals day to day.&lt;/p&gt;
&lt;p&gt;Agencies are the wrong tool for an ongoing seat. If what you actually need is a developer embedded in your team indefinitely, a direct hire or a long-term contractor is cheaper and closer to your context. The thinking behind that tradeoff is the same one in &lt;a href=&quot;/blog/toptal-alternatives-hire-vetted-developers-2026/&quot;&gt;our breakdown of the hiring options&lt;/a&gt;: seat versus project decides more than brand or price.&lt;/p&gt;
&lt;p&gt;Sort this out before you take a single sales call. It tells you whether you are even in the right aisle.&lt;/p&gt;
&lt;h2 id=&quot;the-proposal-tells-you-most-of-what-you-need&quot;&gt;The proposal tells you most of what you need&lt;/h2&gt;
&lt;p&gt;You learn more about an agency from how it scopes than from how it sells.&lt;/p&gt;
&lt;p&gt;A good proposal writes the work down. Not “we will build your platform,” but the specific systems, the phases, what is included and what is explicitly not. That document is doing real work: it is the thing you both point at when a disagreement happens, and disagreements always happen. Vagueness at the proposal stage is not a small thing to fix later. It is a dispute at the invoice stage, pre-loaded.&lt;/p&gt;
&lt;p&gt;If an agency resists writing down scope and wants to keep things loose and trust-based until you have paid a deposit, that is information. The way we scope and price is laid out on our &lt;a href=&quot;/services/&quot;&gt;services&lt;/a&gt; page precisely because the document should come before the money.&lt;/p&gt;
&lt;h2 id=&quot;ask-who-actually-builds-it&quot;&gt;Ask who actually builds it&lt;/h2&gt;
&lt;p&gt;The oldest move in this trade is senior-sells, junior-builds. The impressive person on the sales call is not the person who will write your code. You meet the principal, you sign, and your project lands with a team you never spoke to.&lt;/p&gt;
&lt;p&gt;So ask directly: who specifically will do this work, and can I talk to them before I commit? A confident agency introduces the team. An evasive one talks about “our process” and “our bench.” You are allowed to want names.&lt;/p&gt;
&lt;h2 id=&quot;references-are-weak-post-mortems-are-strong&quot;&gt;References are weak, post-mortems are strong&lt;/h2&gt;
&lt;p&gt;Reference calls are theater. No agency hands you an unhappy client. You will hear three glowing stories that tell you nothing about the failure modes.&lt;/p&gt;
&lt;p&gt;Ask a better question: tell me about a project that went wrong, and what you did about it. Every real agency has them. The ones worth hiring will answer honestly, because they have a system for when things break and they are a little proud of it. The ones to avoid will insist nothing has ever gone wrong, which means either they have not shipped much or they are lying to you in the first hour. Our own &lt;a href=&quot;/projects/&quot;&gt;case studies&lt;/a&gt; exist alongside the messier lessons, and the messier lessons are the ones I would actually probe.&lt;/p&gt;
&lt;h2 id=&quot;the-counterintuitive-green-flag&quot;&gt;The counterintuitive green flag&lt;/h2&gt;
&lt;p&gt;Here is the signal I trust most, and it is the opposite of what you would expect from a sales conversation: a good agency will sometimes talk you out of building something.&lt;/p&gt;
&lt;p&gt;A vendor says yes to everything because every yes is revenue. A partner tells you when a feature is premature, when your scope is too big for your stage, when you would be better served by a smaller build or a different approach. It costs them money in the short term and it is the clearest sign they are optimizing for your outcome instead of their invoice.&lt;/p&gt;
&lt;h2 id=&quot;start-small&quot;&gt;Start small&lt;/h2&gt;
&lt;p&gt;Whatever else you do, do not hand a stranger your whole project on day one. Start with a small, paid first phase: a discovery sprint, an architecture document, one slice of the build. You learn how they communicate, whether they hit dates, and whether the people who sold you are the people building. A good agency welcomes this because they are confident the small phase will earn the big one.&lt;/p&gt;
&lt;p&gt;Hiring an agency well is mostly about refusing to skip these steps when you are in a hurry. The hurry is exactly when they matter. If you want to talk through whether your project is even an agency-shaped problem, &lt;a href=&quot;/contact/&quot;&gt;tell us about it&lt;/a&gt; and we will give you a straight answer.&lt;/p&gt;</content:encoded><category>Business</category><category>Agency</category><category>Hiring</category><category>Business</category><category>Outsourcing</category><category>2026</category><author>Anurag Verma</author></item><item><title>How to Hire a Vetted Software Developer in 2026</title><link>https://blog.codercops.com/blog/how-to-hire-vetted-software-developer-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/how-to-hire-vetted-software-developer-2026/</guid><description>Everyone says their developers are vetted. Almost nobody tells you what that means. Here is what real vetting looks like, the screen we actually run, and the red flags that should end a conversation early.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The word “vetted” has been worn smooth. Every platform, agency, and marketplace uses it, and it has stopped meaning anything specific. So before you hire anyone described that way, the useful move is to translate the word back into a process and ask what the process was.&lt;/p&gt;
&lt;p&gt;I screen developers for a living. Here is what I actually look for, in the order it matters.&lt;/p&gt;
&lt;h2 id=&quot;vetting-is-a-process-not-a-property&quot;&gt;Vetting is a process, not a property&lt;/h2&gt;
&lt;p&gt;A developer is not vetted the way a diamond is certified. There is no universal test they passed once. Someone, somewhere, ran a screen and decided they cleared a bar. Your only real question is what that screen tested and whether it tested the thing that will break your project.&lt;/p&gt;
&lt;p&gt;A resume read is a screen. So is a four-hour system design interview. Both produce a “vetted” developer and they are not remotely the same. When a vendor or a candidate uses the word, the right response is one question: what did the screen check? If the answer is fuzzy, the screen was fuzzy.&lt;/p&gt;
&lt;p&gt;This is also the throughline in our &lt;a href=&quot;/blog/toptal-alternatives-hire-vetted-developers-2026/&quot;&gt;comparison of hiring options&lt;/a&gt;: the platforms differ less in quality than in what they screen for and how much of it they let you see.&lt;/p&gt;
&lt;h2 id=&quot;the-three-things-a-real-screen-tests&quot;&gt;The three things a real screen tests&lt;/h2&gt;
&lt;p&gt;When we screen, we are answering three separate questions, and a strong candidate has to clear all three.&lt;/p&gt;
&lt;p&gt;Can they build it? Not in the abstract. Can they build the kind of thing you need built. A backend specialist who has never shipped a React app is not a weak engineer, they are the wrong engineer for a frontend role. Test against the actual work.&lt;/p&gt;
&lt;p&gt;Can they reason about tradeoffs? Code is the easy part now. AI writes a lot of it. The value a senior developer adds is judgment: choosing among three working approaches, knowing which one will hurt in six months, spotting the requirement nobody wrote down. You test this by asking them to defend a decision, not just produce an answer.&lt;/p&gt;
&lt;p&gt;Have they shipped and lived with it? Anyone can build a feature. Fewer have maintained one after it broke in production at 2 a.m. Ask about something that went wrong. The depth of the answer tells you how much real ownership they have carried.&lt;/p&gt;
&lt;h2 id=&quot;run-the-screen-that-mirrors-the-work&quot;&gt;Run the screen that mirrors the work&lt;/h2&gt;
&lt;p&gt;The single best change most teams can make is to throw out the puzzle interview and replace it with a small, paid take-home that looks like your real work.&lt;/p&gt;
&lt;p&gt;Give them a scoped task, a few hours, and pay them for it. Then sit down and have them walk you through it. You learn three things at once: whether they can build, how they think while building, and whether they communicate clearly about their own choices. A whiteboard reversal-of-a-binary-tree question tells you none of that.&lt;/p&gt;
&lt;p&gt;The walk-through matters as much as the code. The signal I trust most is a candidate who points at their own work and says, “I did this, but if I were starting again I would do it differently, and here is why.” That sentence is impossible to fake and it is the clearest marker of someone who learns from what they ship.&lt;/p&gt;
&lt;h2 id=&quot;red-flags-that-should-end-the-conversation&quot;&gt;Red flags that should end the conversation&lt;/h2&gt;
&lt;p&gt;A few patterns are reliable enough to act on.&lt;/p&gt;
&lt;p&gt;A resume that lists twenty technologies at “expert” level. Real depth is narrow. Breadth that wide is usually a centimeter deep.&lt;/p&gt;
&lt;p&gt;An inability to talk about failure. Everyone who has shipped real software has shipped real bugs. A candidate with only triumphs has either not done much or is not being honest.&lt;/p&gt;
&lt;p&gt;Vagueness about their specific contribution. “We built a platform that served millions” is a team’s accomplishment. What did this person do? If they cannot draw a clean line around their own work, be careful.&lt;/p&gt;
&lt;p&gt;A vendor that will not describe its vetting. If you are hiring through a platform and they answer “what do you test?” with a marketing figure instead of a method, you are buying a black box. Sometimes that is fine. Know that you are doing it.&lt;/p&gt;
&lt;h2 id=&quot;if-you-cannot-screen-deeply-yourself&quot;&gt;If you cannot screen deeply yourself&lt;/h2&gt;
&lt;p&gt;Most teams hiring their first few engineers do not have someone who can run a rigorous technical screen. That is the honest reason vetted-talent services exist, and it is a good reason.&lt;/p&gt;
&lt;p&gt;The thing to demand is transparency. The service worth paying for shows you what each candidate was tested on and why they made the shortlist. That is exactly the gap we set out to close: a structured screen you can actually see, with three to five candidates and the reasoning behind each. If that is what you need, &lt;a href=&quot;/contact/&quot;&gt;describe the role&lt;/a&gt; or look at how we &lt;a href=&quot;/services/&quot;&gt;scope engagements&lt;/a&gt; first.&lt;/p&gt;
&lt;p&gt;Hiring well is not about finding mythical top-percentile talent. It is about running a screen that matches your work and being honest with yourself about which parts of it you can run and which parts you should hand to someone who will show you theirs.&lt;/p&gt;</content:encoded><category>Business</category><category>Hiring</category><category>Recruiting</category><category>Developers</category><category>Vetting</category><category>2026</category><author>Prathviraj Singh</author></item><item><title>LLM Evaluation Platforms in 2026: LangSmith, Braintrust, and Weave</title><link>https://blog.codercops.com/blog/llm-evaluation-langsmith-braintrust-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/llm-evaluation-langsmith-braintrust-2026/</guid><description>Comparing LangSmith, Braintrust, and Weights &amp; Biases Weave for LLM evaluation. What each platform does well, where it breaks down, and how to build a minimum viable eval pipeline.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;At some point in every LLM product build, the team realizes they cannot tell if the last prompt change was actually better. They made it because something looked worse in a few examples. They shipped it because something else looked better in a few other examples. Now they are not sure what they have.&lt;/p&gt;
&lt;p&gt;This is what LLM evaluation is for: replacing “looks about right to me” with a measurement that holds up as the application grows.&lt;/p&gt;
&lt;p&gt;The three platforms I have used seriously in production are LangSmith, Braintrust, and Weights &amp;#x26; Biases Weave. They solve the same fundamental problem in meaningfully different ways, and the right choice depends on what your team already uses and what kind of evaluator you want to write.&lt;/p&gt;
&lt;h2 id=&quot;what-an-eval-platform-actually-does&quot;&gt;What an eval platform actually does&lt;/h2&gt;
&lt;p&gt;Every platform in this space does three things, with varying depth:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tracing.&lt;/strong&gt; Capture every call to an LLM — the prompt, the model, the parameters, the response, the latency, the cost — so you can debug failures and understand what your application actually sent and received. This is the most basic feature and the one that every platform does reasonably well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Evaluation.&lt;/strong&gt; Run a set of inputs through your application, score the outputs against expected behavior, and surface which cases pass and which fail. The hard part is the scorer: what makes an output “good”? Some platforms let you write that logic as a function. Others rely on LLM-as-judge, where a second model scores the output of the first. Both have failure modes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dataset management.&lt;/strong&gt; Store and version the test cases you care about so you can run them consistently as your prompts and models change. This is the unglamorous part that determines whether your evals are actually useful six months from now.&lt;/p&gt;
&lt;h2 id=&quot;langsmith&quot;&gt;LangSmith&lt;/h2&gt;
&lt;p&gt;LangSmith is LangChain’s observability and evaluation product. If you are building with LangChain or LangGraph, the tracing integration is close to zero-configuration — you set an environment variable and your chain runs show up in the UI.&lt;/p&gt;
&lt;p&gt;The tracing UI is genuinely good. You can see every node in a chain execution, the intermediate steps, where latency accumulated, and the token counts. For debugging “why did the agent take the wrong path,” it is the fastest tool I have used.&lt;/p&gt;
&lt;p&gt;The evaluation layer is where you feel the seams. LangSmith gives you the structure — datasets, runs, evaluators — but the evaluator logic is something you write yourself or delegate to an LLM-as-judge. The built-in evaluators cover basic things like trajectory correctness for agents and string similarity, but any domain-specific correctness logic is yours to implement.&lt;/p&gt;
&lt;p&gt;For teams already using LangChain, LangSmith is the obvious default. For teams that are not, the tracing setup requires more work and the advantages narrow.&lt;/p&gt;
&lt;h2 id=&quot;braintrust&quot;&gt;Braintrust&lt;/h2&gt;
&lt;p&gt;Braintrust is framework-agnostic and has, in my experience, the best ergonomics for writing custom eval functions. The workflow feels closer to writing unit tests: you define a function that takes an input and an output and returns a score, you register your dataset, and the platform runs everything and shows you the results in a clean table.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; braintrust &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; Eval&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; correctness_scorer&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(output, expected):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;    # Your logic here — exact match, fuzzy match, LLM judge, whatever&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 1.0&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; output.strip().lower() &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; expected.strip().lower() &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 0.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;Eval(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;    &quot;my-project&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;    data&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=lambda&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        {&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;input&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;What is 2+2?&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;expected&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;4&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;        # more test cases&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;    task&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=lambda&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; input: my_llm_function(&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;    scores&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;[correctness_scorer],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The results UI is the clearest of the three: you see a score per case, per run, and per version of your prompt. Regression tracking — “did this change make things worse on cases that used to pass?” — is a first-class feature rather than something you build yourself.&lt;/p&gt;
&lt;p&gt;Braintrust’s weakness is tracing. It is less complete than LangSmith’s chain-level view, and for debugging multi-step agents the visibility is thinner. It is strongest as an evaluation-first tool with tracing as a secondary concern.&lt;/p&gt;
&lt;h2 id=&quot;weights--biases-weave&quot;&gt;Weights &amp;#x26; Biases Weave&lt;/h2&gt;
&lt;p&gt;Weave is W&amp;#x26;B’s LLM observability product. If your team uses W&amp;#x26;B for ML experiment tracking — training runs, hyperparameter sweeps, model versioning — Weave adds LLM tracing and evaluation to the same workspace.&lt;/p&gt;
&lt;p&gt;The pitch is unification: your model training experiments and your deployed LLM application quality metrics live in the same tool. For teams that do both traditional ML and LLM work, this is real value. You can correlate a fine-tuning experiment with its downstream application performance without switching contexts.&lt;/p&gt;
&lt;p&gt;For teams that are purely in the LLM application space with no ML training work, the W&amp;#x26;B tooling can feel like more surface area than you need. The eval SDK is solid, the tracing is good, but there is no obvious reason to choose it over Braintrust unless you already have a W&amp;#x26;B account and want to keep everything together.&lt;/p&gt;
&lt;h2 id=&quot;platform-comparison&quot;&gt;Platform comparison&lt;/h2&gt;





















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Feature&lt;/th&gt;&lt;th&gt;LangSmith&lt;/th&gt;&lt;th&gt;Braintrust&lt;/th&gt;&lt;th&gt;W&amp;#x26;B Weave&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Tracing&lt;/td&gt;&lt;td&gt;Excellent (LangChain-native)&lt;/td&gt;&lt;td&gt;Good&lt;/td&gt;&lt;td&gt;Good&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Custom evaluators&lt;/td&gt;&lt;td&gt;Requires setup&lt;/td&gt;&lt;td&gt;First-class&lt;/td&gt;&lt;td&gt;Solid&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;LLM-as-judge&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Dataset management&lt;/td&gt;&lt;td&gt;Good&lt;/td&gt;&lt;td&gt;Excellent&lt;/td&gt;&lt;td&gt;Good&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ML experiment integration&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Excellent&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Framework dependency&lt;/td&gt;&lt;td&gt;LangChain preferred&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Free tier&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;building-a-minimum-viable-eval-pipeline&quot;&gt;Building a minimum viable eval pipeline&lt;/h2&gt;
&lt;p&gt;A platform is infrastructure. Before you connect to any of them, you need test cases. Here is the sequence that avoids buying the tooling before you have anything to put in it:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Week 1: log everything.&lt;/strong&gt; Add logging to every LLM call in production. Store the input, the output, the model, the prompt version, and any user feedback signal you have. You are building a dataset of real behavior before you decide what to evaluate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Week 2: tag your failures.&lt;/strong&gt; Go through a week of logs and tag 20 to 50 cases that produced wrong, unhelpful, or risky output. These are your first eval cases. The specifics depend on your application — for a customer support bot, “wrong” might mean off-topic or factually incorrect. For a code completion tool, it might mean code that does not compile.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Week 3: write the scorer.&lt;/strong&gt; Define what passing looks like for your tagged cases. This forces you to articulate what “good” means for your application, which most teams have not done explicitly. A scorer does not have to be complex — a simple keyword check or LLM judge call is enough to start.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Week 4: connect the platform.&lt;/strong&gt; Now you have a dataset and a scorer. Connect to whichever platform matches your stack, run your eval against the current production prompt, and save that as your baseline. Every prompt change from here gets measured against it.&lt;/p&gt;
&lt;p&gt;The most valuable thing you can do after that baseline is routine: run evals on every prompt change, expand the dataset as new failure modes appear, and treat a regression in any category the same way you would treat a failing test in CI.&lt;/p&gt;
&lt;p&gt;The practical guide to testing LLM features more broadly — including how to write evals without a dedicated platform — is in &lt;a href=&quot;/blog/llm-eval-testing-ai-features-production-2026/&quot;&gt;LLM evals in practice&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;a-word-on-llm-as-judge&quot;&gt;A word on LLM-as-judge&lt;/h2&gt;
&lt;p&gt;All three platforms support using a second LLM to score the output of the first, which solves the hard problem of “how do I write a function that captures quality for open-ended text?” The catch is that the judge is itself a language model — it can be wrong, biased by the model it is using, or inconsistent across runs.&lt;/p&gt;
&lt;p&gt;LLM-as-judge is useful for dimensions that are hard to specify programmatically: coherence, helpfulness, tone. It is unreliable for factual correctness, security properties, or anything that requires reasoning about external context. Build a portfolio of scorers rather than relying on a single LLM judge for everything, and calibrate your judges by checking their scores against human ratings on a sample.&lt;/p&gt;
&lt;p&gt;The platforms let you ship a product you can reason about at scale. The eval cases and scorers are what make those platforms useful. Start building them before you start evaluating tools.&lt;/p&gt;</content:encoded><category>AI Integration</category><category>AI Integration</category><category>LLM</category><category>Testing</category><category>Backend</category><category>Developer Tools</category><category>2026</category><author>Prathviraj Singh</author></item><item><title>Offshore vs Nearshore vs Onshore Software Development in 2026</title><link>https://blog.codercops.com/blog/offshore-nearshore-onshore-software-development-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/offshore-nearshore-onshore-software-development-2026/</guid><description>A practical comparison of offshore, nearshore, and onshore development for teams deciding how to staff a project. What each model costs, where it breaks, and how to choose.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The offshore-vs-onshore question never really gets easier, because the right answer keeps depending on things that are specific to your project, your team, and your tolerance for particular kinds of pain.&lt;/p&gt;
&lt;p&gt;What I can give you is a framework that is not a sales pitch for any one model. I run a studio that works with global clients from India, so I have a stake in being honest about what offshore actually is and what it is not. The clients who’ve had good experiences knew what they were buying. The ones who didn’t usually believed they were buying something the model does not provide.&lt;/p&gt;
&lt;h2 id=&quot;what-the-labels-mean&quot;&gt;What the labels mean&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Offshore&lt;/strong&gt; means contracting work to a team in a significantly different timezone — typically 8 to 12 hours from your location. For US and European companies, offshore usually means India, Eastern Europe, Southeast Asia, or the Philippines. The talent pools are large, the rate differential is substantial, and the timezone gap is real.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nearshore&lt;/strong&gt; means contracting to a team in a closer timezone — within 3 to 5 hours. For US companies, that means Latin America. For European companies, it often means Eastern Europe or Turkey. Rates are lower than onshore but higher than offshore. The key selling point is that you can run a morning standup and get same-day responses to questions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Onshore&lt;/strong&gt; means working with a team in your own country. The rates are highest. The advantages are no timezone gap, the same regulatory and legal context, and often simpler compliance for regulated industries.&lt;/p&gt;
&lt;h2 id=&quot;the-real-cost-comparison&quot;&gt;The real cost comparison&lt;/h2&gt;
&lt;p&gt;Hourly rates are not the comparison that matters. Total cost of a shipped project is.&lt;/p&gt;
&lt;p&gt;If you hire an offshore team at 40% of an onshore rate but the project takes twice as long due to communication friction, the cost advantage has evaporated. If you hire an onshore team and the project ships in half the time because the team can walk over and ask a question, the premium was worth paying.&lt;/p&gt;
&lt;p&gt;What actually drives total cost:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Specification quality.&lt;/strong&gt; The more explicit your requirements, the less the timezone gap matters. A team that can build from a fully-written brief with edge cases documented does not need to call you when they hit an ambiguous case — they have the answer in the spec. This is true for any geography, but it penalizes offshore models more when skipped because the feedback loop is slower.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Number of decision cycles.&lt;/strong&gt; Discovery-phase work — building something where you expect to change direction based on user feedback — burns through async communication overhead fast. Work with a stable spec that is mostly execution has a much better match with offshore.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Overlap hours.&lt;/strong&gt; Most offshore arrangements include 2 to 4 hours of daily overlap by design, usually early morning for the offshore team and late afternoon for the US team. What that looks like in practice matters more than what it says in the proposal. Ask specifically: how does a developer flag a blocker when one appears?&lt;/p&gt;
&lt;h2 id=&quot;where-each-model-works&quot;&gt;Where each model works&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Offshore works well for:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Execution-heavy projects with stable requirements&lt;/li&gt;
&lt;li&gt;Backend and infrastructure work where questions are mostly technical and documentable&lt;/li&gt;
&lt;li&gt;Teams with strong technical project management who can write good briefs&lt;/li&gt;
&lt;li&gt;Long-term relationships where the team builds context over time — the first month is always the hardest&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Offshore works poorly for:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Early-stage products where the spec changes every two weeks&lt;/li&gt;
&lt;li&gt;Work that is highly collaborative and conversation-heavy&lt;/li&gt;
&lt;li&gt;Teams without a technical person who can review work daily&lt;/li&gt;
&lt;li&gt;Short-burst projects where there is not enough time to build shared context&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Nearshore works well for:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Teams that need daily sync but cannot afford or staff onshore&lt;/li&gt;
&lt;li&gt;Projects with moderate spec stability that still benefit from regular iteration&lt;/li&gt;
&lt;li&gt;US companies building out digital product teams on a startup budget&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Onshore works well for:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Highly regulated industries (finance, healthcare) where data residency and compliance conversations need to happen frequently&lt;/li&gt;
&lt;li&gt;Products where customer insight needs to move into the build cycle very quickly&lt;/li&gt;
&lt;li&gt;Teams where the communication model is inherently synchronous and that is not going to change&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-india-question-specifically&quot;&gt;The India question specifically&lt;/h2&gt;
&lt;p&gt;India produces more English-speaking software engineers than any other country, the talent quality at the top is genuinely high, and the rate differential compared to the US and Western Europe is real. It is also, for most US and European companies, a 9-to-11-hour timezone gap, which is not a nearshore arrangement by any stretch.&lt;/p&gt;
&lt;p&gt;Working across that gap well requires process investment that most teams underestimate. You need written handoffs, documented decisions, and a rhythm where the offshore team’s end-of-day and the US team’s start-of-day actually connect. Teams that treat it as “we’ll figure it out” usually pay for that in misaligned builds and slow iteration cycles.&lt;/p&gt;
&lt;p&gt;When we work with US clients from our studio, we’re explicit about this upfront — the red flags and green flags to watch for when evaluating any India-based agency are covered in &lt;a href=&quot;/blog/hiring-tech-agency-india-red-flags-green-flags-2026/&quot;&gt;hiring a tech agency in India&lt;/a&gt;. The short version: process maturity matters more than portfolio.&lt;/p&gt;
&lt;h2 id=&quot;the-question-under-the-question&quot;&gt;The question under the question&lt;/h2&gt;
&lt;p&gt;Most teams asking about offshore vs. onshore are really asking: “how do I get good work done for less?” That is a reasonable question with more than one answer.&lt;/p&gt;
&lt;p&gt;An alternative worth considering is not picking a geography at all, but picking a model. If the work is a scoped project — an MVP, a new feature, an integration — an agency arrangement (offshore, nearshore, or onshore) that owns delivery may cost less in total than hiring a contractor of any geography and managing them line by line. The comparison between models is in &lt;a href=&quot;/blog/how-to-hire-software-development-agency-2026/&quot;&gt;how to hire a software development agency&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you are hiring a permanent seat, the geography decision matters more than for project work. But the principles for vetting a developer are the same regardless of where they are: good work sample, coherent problem-solving process, clear communication, and references you actually call.&lt;/p&gt;
&lt;h2 id=&quot;a-practical-decision-framework&quot;&gt;A practical decision framework&lt;/h2&gt;
&lt;p&gt;Before picking a model:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Write one page describing the project. If you cannot get it onto one page with enough specificity that a developer who has never met you could start work, you are not ready to offshore.&lt;/li&gt;
&lt;li&gt;Identify what “done” looks like for the first milestone. If you can’t define it now, nearshore or onshore will save you money on rework.&lt;/li&gt;
&lt;li&gt;Count the decisions per week. High-decision work with frequent direction changes needs overlap. Low-decision execution work can run async.&lt;/li&gt;
&lt;li&gt;Check your technical review capacity. Offshore requires someone on your side who can review code and catch problems early. If that person does not exist, budget for an onshore or nearshore technical lead.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The model that fits those constraints is usually obvious once the constraints are written down.&lt;/p&gt;</content:encoded><category>Business</category><category>Business</category><category>Hiring</category><category>Developers</category><category>Teams</category><category>Agency</category><category>2026</category><author>Anurag Verma</author></item><item><title>Writing a Technical Job Description That Attracts Senior Developers</title><link>https://blog.codercops.com/blog/technical-job-description-senior-developers-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/technical-job-description-senior-developers-2026/</guid><description>Most technical job descriptions repel the people they are trying to hire. Here is what senior developers actually look for, and how to write a posting that gets responses from the right people.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Senior developers do not read job descriptions to get excited. They read them to find reasons to move on. By the time someone with 8 years of production experience opens your posting, they have read hundreds of others, and they can clock a generic description in about 30 seconds.&lt;/p&gt;
&lt;p&gt;Most technical job descriptions fail for the same reasons: they are written by HR from a template, contain requirements that are obviously a wishlist rather than a real list, say nothing specific about what the developer will actually do, and bury the salary three clicks deep in an application form if they include it at all.&lt;/p&gt;
&lt;p&gt;Here is what to do instead.&lt;/p&gt;
&lt;h2 id=&quot;start-with-what-you-are-building-not-who-you-are&quot;&gt;Start with what you are building, not who you are&lt;/h2&gt;
&lt;p&gt;The instinct is to open with a company description. “We are a fast-growing SaaS company on a mission to…” This is the part senior developers skip. They can read that later.&lt;/p&gt;
&lt;p&gt;Open with the problem:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“We’re rebuilding our data pipeline from a fragile Python monolith into a service architecture. You’d own the migration plan and most of the implementation, working directly with our data team and one other backend engineer.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is a sentence a developer can evaluate. They know immediately whether this is a problem they find interesting, whether they have done something like it before, and whether the scope sounds right.&lt;/p&gt;
&lt;p&gt;Compare it to: “We are looking for a passionate backend engineer to join our growing team and help us scale our platform.”&lt;/p&gt;
&lt;p&gt;The second version is not wrong. It is just useless.&lt;/p&gt;
&lt;h2 id=&quot;the-technology-section-should-be-honest-not-aspirational&quot;&gt;The technology section should be honest, not aspirational&lt;/h2&gt;
&lt;p&gt;Requirements lists are where job descriptions become fiction. A team that uses TypeScript, Postgres, and Docker will write a requirements list that also includes Kubernetes, Kafka, Redis, Elasticsearch, and strong familiarity with GraphQL. Those may be things you want to adopt someday. They are not what the developer will touch in their first year.&lt;/p&gt;
&lt;p&gt;Senior developers know the difference between a real requirement and a wishlist. The wishlist is a signal that the role is not thought through, or that the team is fishing for a unicorn rather than a capable engineer who can learn what they do not know.&lt;/p&gt;
&lt;p&gt;Write what they will actually work with on week one. Note what is planned or preferred but not required. Note what you are willing to teach.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;You will work with:&lt;/strong&gt; TypeScript, Postgres, Node.js, Docker, GitHub Actions
&lt;strong&gt;Nice to have:&lt;/strong&gt; Kubernetes, Redis, familiarity with stream processing&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is more useful than a 20-bullet requirements list and signals that you are serious about finding someone who fits, not someone who checked every box.&lt;/p&gt;
&lt;h2 id=&quot;five-to-seven-requirements-maximum&quot;&gt;Five to seven requirements, maximum&lt;/h2&gt;
&lt;p&gt;Any requirements list past seven items is telling candidates something you probably do not mean to tell them: that the role is sprawling, the team has not decided what they actually need, or the hiring manager wrote the list without thinking about whether any one person could plausibly have all of it.&lt;/p&gt;
&lt;p&gt;Five specific requirements that match the actual job beats fifteen generic requirements every time. “3+ years with React and strong understanding of rendering performance” is more useful to a candidate than “Strong experience with modern JavaScript frameworks.” The first one they can evaluate themselves. The second one means nothing.&lt;/p&gt;
&lt;p&gt;On years-of-experience requirements: be careful. “10+ years of React experience” is a phrase that appeared in real postings in 2023 for a framework that shipped in 2013. Senior developers notice this. It signals either careless copy-paste or a genuine misunderstanding of the landscape. If you want someone with deep expertise, say what the expertise looks like, not how many calendar years it covers.&lt;/p&gt;
&lt;h2 id=&quot;the-90-day-question&quot;&gt;The 90-day question&lt;/h2&gt;
&lt;p&gt;One paragraph that describes what the developer will own in the first 90 days is worth more than a full “responsibilities” section of generic bullets.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“In the first three months, you would take over ownership of our authentication service — it needs a security audit, some performance work on the session management, and better test coverage before we expand it to support multi-tenancy. After that, you’d roll into our main roadmap, which for Q3 is focused on the API that our mobile clients use.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A developer reading that knows what they are walking into. They can calibrate whether they have done something like it. They can ask specific questions in an interview. They cannot do any of that from “responsible for maintaining and improving our backend systems.”&lt;/p&gt;
&lt;h2 id=&quot;what-not-to-waste-words-on&quot;&gt;What not to waste words on&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Perks sections.&lt;/strong&gt; “We offer unlimited PTO, a pet-friendly office, team lunches, and a $500 home office stipend.” These are not wrong, but they are not differentiating. Every tech company offers some version of this. Experienced candidates know perks lists do not tell you what it is actually like to work there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mission statements.&lt;/strong&gt; One sentence is enough. More than that is the company’s marketing copy inserted into a document where someone is trying to make a practical decision.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“Team player” and similar.&lt;/strong&gt; Any phrase that means “we want someone who does not cause problems” is not useful information. Everyone says this. If there is something specific about collaboration style that matters for the role, say that specifically.&lt;/p&gt;
&lt;h2 id=&quot;the-compensation-question&quot;&gt;The compensation question&lt;/h2&gt;
&lt;p&gt;Include it. A range is better than nothing. A specific number is better than a range if you actually have a budget in mind.&lt;/p&gt;
&lt;p&gt;The argument against including it is usually about “flexibility” — you want to hire the right person regardless of where they land in a range. The argument for including it is that everyone is going to find out what the number is anyway, and filtering out candidates whose expectations are far outside your range is better done at the posting stage than after three interview rounds.&lt;/p&gt;
&lt;p&gt;A developer who would have been excited about a $160,000 role but discovers in week four that the budget is $120,000 is now a developer who feels their time was wasted. That candidate tells other developers. Do not optimize the posting for candidates you cannot close.&lt;/p&gt;
&lt;h2 id=&quot;the-process-section&quot;&gt;The process section&lt;/h2&gt;
&lt;p&gt;One paragraph at the bottom describing the hiring process takes two minutes to write and reduces a lot of candidate anxiety. What are the stages? Who will they talk to? How long does it typically take? Is there a take-home?&lt;/p&gt;
&lt;p&gt;Candidates who do not know what to expect will either drop off or spend interview energy on “what is going to happen next” instead of on the actual conversation. Transparency about process is also a real signal about the team’s organization.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;For the screening and evaluation side of the process — how to run a technical screen that actually predicts job performance — we have written specific guides for &lt;a href=&quot;/blog/hire-react-developer-technical-screen-2026/&quot;&gt;hiring a React developer&lt;/a&gt; and the &lt;a href=&quot;/blog/how-to-hire-vetted-software-developer-2026/&quot;&gt;general framework for vetting any software developer&lt;/a&gt;. The job description is the first filter. The screen is what you learn after they apply.&lt;/p&gt;</content:encoded><category>Business</category><category>Hiring</category><category>Career</category><category>Developers</category><category>Business</category><category>2026</category><author>Anurag Verma</author></item><item><title>Toptal Alternatives in 2026: How to Hire Vetted Developers</title><link>https://blog.codercops.com/blog/toptal-alternatives-hire-vetted-developers-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/toptal-alternatives-hire-vetted-developers-2026/</guid><description>Toptal is the default answer when someone wants pre-vetted developers fast. It is not the only one, and for a lot of teams it is not the right one. An honest look at the alternatives and how to choose.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Someone on your team needs a senior React developer, the project started two weeks ago, and you do not have a month to run a hiring funnel. So you type “Toptal alternatives” into a search box, or more likely you ask an AI assistant for a shortlist. This post is the answer I wish that search returned.&lt;/p&gt;
&lt;p&gt;I run a dev studio. We hire contractors, we get hired as one, and we have watched clients work through every option on this list. None of them is bad. They are good at different things, and the gap between them is rarely about quality. It is about what they screen for, how much they mark up, and how much of the work they take off your plate.&lt;/p&gt;
&lt;h2 id=&quot;what-toptal-actually-sells&quot;&gt;What Toptal actually sells&lt;/h2&gt;
&lt;p&gt;Toptal’s pitch is “top 3% of talent,” fast. The real product is risk reduction. You pay a premium and in exchange you do not interview ten people to find one who can do the job. For a non-technical founder hiring their first engineer, that is worth a lot.&lt;/p&gt;
&lt;p&gt;The two honest complaints: the markup is steep, and the vetting is a black box. You are told the person passed a screen. You do not see the screen. When a placement does not work out, you cannot tell whether the vetting missed something or the role was just a bad fit.&lt;/p&gt;
&lt;p&gt;If budget is not your constraint and you value speed over everything, Toptal is a reasonable default. For most of the teams I talk to, one of the options below fits better.&lt;/p&gt;
&lt;h2 id=&quot;the-marketplaces&quot;&gt;The marketplaces&lt;/h2&gt;
&lt;p&gt;Turing, Lemon.io, Arc, and Gun.io sit in roughly the same category: a vetted pool, a matching layer, lower markup than Toptal. They differ in the details.&lt;/p&gt;
&lt;p&gt;Turing leans toward longer-term, full-time-equivalent remote engineers and global supply. Lemon.io is startup-friendly and moves quickly on contract roles. Arc and Gun.io sit closer to a curated freelance marketplace. The vetting is real but lighter than Toptal’s, which is exactly why the price is lower.&lt;/p&gt;
&lt;p&gt;The tradeoff to go in with eyes open about: lighter vetting means more variance. You will get strong people and you will occasionally get a mismatch, so keep your own short technical screen in the loop. If you have someone technical who can spend 30 minutes checking fit, marketplaces give you most of Toptal’s benefit at a real discount.&lt;/p&gt;
&lt;h2 id=&quot;hiring-an-agency-or-studio&quot;&gt;Hiring an agency or studio&lt;/h2&gt;
&lt;p&gt;This is the option people forget. Instead of one contractor, you bring in a small team that has shipped together. You trade the lower hourly rate of a solo freelancer for delivery you do not have to manage line by line.&lt;/p&gt;
&lt;p&gt;Agencies make sense when the work is a project, not a seat: an MVP, a feature with a deadline, an integration nobody on your team has done before. We wrote up &lt;a href=&quot;/blog/how-to-hire-software-development-agency-2026/&quot;&gt;how to evaluate one&lt;/a&gt; because the failure modes are specific and avoidable. If you want the short version of what good looks like, our &lt;a href=&quot;/services/&quot;&gt;services&lt;/a&gt; page lays out how we scope and price.&lt;/p&gt;
&lt;p&gt;Where it is wrong: if you genuinely need a person embedded in your team for a year, an agency seat is more expensive than a direct hire.&lt;/p&gt;
&lt;h2 id=&quot;the-newer-option-an-ai-managed-shortlist&quot;&gt;The newer option: an AI-managed shortlist&lt;/h2&gt;
&lt;p&gt;The model we have been building toward is different from all of the above. You describe the role in a conversation. An agent gathers the requirements in detail, sources matching developers, runs a structured screen, and hands you three to five vetted candidates. You only run the final decision interview.&lt;/p&gt;
&lt;p&gt;The reason this matters is not novelty. It is that the screening is explicit. You can see what was tested and why each candidate made the shortlist, which is the exact thing the black-box vendors will not show you. It sits between “hire a marketplace contractor and screen them yourself” and “pay Toptal to screen for you,” and it is cheaper than the second because no human recruiter runs the funnel.&lt;/p&gt;
&lt;p&gt;If that is the shape of what you want, &lt;a href=&quot;/contact/&quot;&gt;tell us about the role&lt;/a&gt; and you will see how the shortlist comes together.&lt;/p&gt;
&lt;h2 id=&quot;how-to-actually-choose&quot;&gt;How to actually choose&lt;/h2&gt;
&lt;p&gt;Forget the brand names for a second. The decision comes down to three questions.&lt;/p&gt;
&lt;p&gt;How much risk can you carry? Less technical buyers should pay for heavier vetting. Teams with a strong engineer who can screen can go lighter and save money.&lt;/p&gt;
&lt;p&gt;Is this a seat or a project? A seat, meaning ongoing and embedded, favors marketplaces or a direct hire. A project, meaning scoped with a deadline, favors an agency or a managed engagement.&lt;/p&gt;
&lt;p&gt;Can the vendor describe their vetting? This is the filter that matters most. Any serious option, Toptal included, should be able to tell you exactly what they test. If the answer is vague, the vetting is vague.&lt;/p&gt;
&lt;p&gt;The thing I want you to take away is that “vetted” is not a property a developer has. It is a process someone ran, and processes vary enormously. Ask to see it. The vendor worth hiring will be glad you did, and if you want a second opinion on a role you are filling right now, &lt;a href=&quot;/contact/&quot;&gt;reach out&lt;/a&gt;. We will tell you honestly which path fits, even when it is not us.&lt;/p&gt;</content:encoded><category>Business</category><category>Hiring</category><category>Recruiting</category><category>Developers</category><category>Business</category><category>2026</category><author>Anurag Verma</author></item><item><title>What It Costs to Hire a Developer in 2026</title><link>https://blog.codercops.com/blog/what-it-costs-to-hire-a-developer-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/what-it-costs-to-hire-a-developer-2026/</guid><description>The salary number is the smallest part of the answer. This is a framework for the real cost of each hiring model, in-house, freelance, agency, and managed, so you can budget for the total, not the sticker.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;People ask me what it costs to hire a developer and expect a number. The honest answer is that the number they are picturing, the salary or the hourly rate, is the least important figure in the calculation. I look at hiring costs for a living, and the teams that overspend almost always did it by comparing rates instead of totals.&lt;/p&gt;
&lt;p&gt;So this is not a rate card. Rates move too much by region, seniority, and stack for a single figure to mean anything. This is a framework for budgeting the total cost of each model, so you can choose the one that is actually cheapest for your situation.&lt;/p&gt;
&lt;h2 id=&quot;the-salary-is-the-down-payment-not-the-price&quot;&gt;The salary is the down payment, not the price&lt;/h2&gt;
&lt;p&gt;When you hire a developer full time, their pay is the visible cost. The real cost is meaningfully higher, and the gap is not a rounding error.&lt;/p&gt;
&lt;p&gt;Add employer taxes and benefits. Add equipment and software licenses. Add the recruiting cost to find them and the weeks of reduced output while they onboard. Add the management time their work requires from someone more senior. Across all of that, the loaded cost of a full-time engineer runs well above their salary, and the multiplier is large enough that ignoring it wrecks a budget.&lt;/p&gt;
&lt;p&gt;Full-time hiring is still the right call when the work is core and permanent. You are buying not just output but continuity, context, and ownership that compounds over years. Just budget for the loaded cost, not the offer letter.&lt;/p&gt;
&lt;h2 id=&quot;freelance-cheapest-per-hour-not-always-per-project&quot;&gt;Freelance: cheapest per hour, not always per project&lt;/h2&gt;
&lt;p&gt;A freelancer’s hourly rate is usually the lowest number you will see, and that is exactly why it is easy to misread.&lt;/p&gt;
&lt;p&gt;The hidden costs sit around the rate. You spend time screening, because an unvetted freelancer is a real risk. You spend time managing, because they are not embedded in your context. And you carry the cost of a mismatch, which on a tight timeline can be larger than the entire contract. The path that controls this is to pair a marketplace contractor with a short screen of your own, which we walk through in &lt;a href=&quot;/blog/how-to-hire-vetted-software-developer-2026/&quot;&gt;how teams screen developers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Freelance wins on total cost when the work is well defined, your own technical oversight is strong, and the relationship is ongoing enough to amortize the screening.&lt;/p&gt;
&lt;h2 id=&quot;agencies-more-per-hour-often-less-per-outcome&quot;&gt;Agencies: more per hour, often less per outcome&lt;/h2&gt;
&lt;p&gt;An agency’s blended rate is higher than a freelancer’s, and people stop the comparison there. That is the mistake.&lt;/p&gt;
&lt;p&gt;What you are buying with the higher rate is delivery risk moving off your plate. A team that has shipped your kind of project before needs less management, makes fewer expensive architecture mistakes, and is accountable for the outcome as a unit. For a scoped project with a deadline, that frequently costs less in total than a cheaper-per-hour arrangement that you have to manage closely and that might miss the date.&lt;/p&gt;
&lt;p&gt;The way to keep an agency honest on cost is a written scope and a small first phase, which is the same discipline in &lt;a href=&quot;/blog/how-to-hire-software-development-agency-2026/&quot;&gt;how to hire an agency&lt;/a&gt;. Our &lt;a href=&quot;/services/&quot;&gt;services&lt;/a&gt; page shows how we structure scope so the price is a fixed quantity, not a meter running.&lt;/p&gt;
&lt;h2 id=&quot;managed-a-fee-to-skip-the-funnel&quot;&gt;Managed: a fee to skip the funnel&lt;/h2&gt;
&lt;p&gt;The last model is the one we build. You pay a fee and in exchange you skip the most expensive thing of all, which is your own team’s time spent running a hiring funnel.&lt;/p&gt;
&lt;p&gt;Sourcing, screening, and shortlisting consume senior hours that could be spent building. A managed engagement absorbs that and hands you three to five vetted candidates with the screening shown. Whether the fee is worth it comes down to one question: is your team’s time the scarce resource? For a small team where every senior hour matters, paying to skip the funnel is usually cheaper than the funnel.&lt;/p&gt;
&lt;h2 id=&quot;budget-for-the-total-compare-to-the-outcome&quot;&gt;Budget for the total, compare to the outcome&lt;/h2&gt;
&lt;p&gt;The single habit that fixes hiring budgets is to stop comparing rate to rate and start comparing total cost to outcome.&lt;/p&gt;
&lt;p&gt;A freelancer at a low hourly rate who needs heavy management and might miss the deadline can be the most expensive option in the building. An agency at a higher rate that ships the project on time and off your plate can be the cheapest. The rate told you almost nothing. The total cost against the value of the result told you everything.&lt;/p&gt;
&lt;p&gt;Decide whether you are buying a seat or a project. Estimate the full cost of that model, overhead and risk included. Then weigh it against what the outcome is worth to your business. If you want help running that math for a specific role, &lt;a href=&quot;/contact/&quot;&gt;tell us about it&lt;/a&gt; and we will give you an honest read, even when the cheapest answer is not us.&lt;/p&gt;</content:encoded><category>Business</category><category>Hiring</category><category>Business</category><category>Budgeting</category><category>Developers</category><category>2026</category><author>Shashikant Gupta</author></item><item><title>How to Price Projects When AI Wrote Half the Code</title><link>https://blog.codercops.com/blog/agency-pricing-ai-assisted-development-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/agency-pricing-ai-assisted-development-2026/</guid><description>AI tools have cut development time on many projects. That creates an uncomfortable question: do you pass those savings to clients, pocket the difference, or rethink how you charge for software work entirely?</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A developer on your team spends three hours building a feature that would have taken eight hours a year ago. The client gets the same outcome. Do you charge for three hours or eight?&lt;/p&gt;
&lt;p&gt;Most agencies are quietly answering this question right now without having answered it out loud. The choices being made by default will define margins, client relationships, and competitive positioning for the next few years.&lt;/p&gt;
&lt;p&gt;There’s no universally correct answer. But there are wrong ways to handle it, and some approaches hold up much better under pressure than others.&lt;/p&gt;
&lt;h2 id=&quot;the-problem-with-time-based-billing-in-an-ai-world&quot;&gt;The Problem With Time-Based Billing in an AI World&lt;/h2&gt;
&lt;p&gt;Time and materials pricing made sense when developer time was the primary input into software. You hired skilled people, they worked hours, and the client paid for those hours. The relationship between time spent and value delivered was close enough that billing for time as a proxy for value was defensible.&lt;/p&gt;
&lt;p&gt;AI tools have broken that proxy. A developer with strong AI tool skills might deliver work in two hours that another developer (or the same developer a year ago) would have needed twelve. The output is similar. The input is not.&lt;/p&gt;
&lt;p&gt;If you’re billing hourly, you’re now in a position where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Being good at AI tools lowers your revenue&lt;/li&gt;
&lt;li&gt;Being slow (or avoiding AI) pays better per project&lt;/li&gt;
&lt;li&gt;Clients with any insight will notice the pattern&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s a bad dynamic. The business model punishes competence.&lt;/p&gt;
&lt;p&gt;Fixed-price projects have the opposite problem. If you quoted based on eight-hour assumptions and now complete the work in three, you pocketed the difference, which is the normal business logic of fixed-price work. Except clients are becoming aware that AI changes completion times significantly, and some are starting to ask about it in proposal conversations.&lt;/p&gt;
&lt;h2 id=&quot;what-clients-are-actually-asking&quot;&gt;What Clients Are Actually Asking&lt;/h2&gt;
&lt;p&gt;Client awareness varies widely, but a consistent pattern is emerging: sophisticated buyers ask directly, while smaller clients often don’t think to ask until after they’ve had a few projects.&lt;/p&gt;
&lt;p&gt;Questions that have started appearing in RFPs and proposal conversations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“What percentage of your development work uses AI assistance?”&lt;/li&gt;
&lt;li&gt;“How does AI change your pricing vs a year ago?”&lt;/li&gt;
&lt;li&gt;“If AI writes the code, what are we paying you for?”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last question isn’t hostile. It’s fair. And it has a good answer that most agencies haven’t yet learned to articulate.&lt;/p&gt;
&lt;p&gt;What clients are paying for isn’t keystrokes. It’s:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Judgment: which of the three AI-generated approaches is actually right for their system&lt;/li&gt;
&lt;li&gt;Architecture: decisions that don’t show up in any single file but shape everything downstream&lt;/li&gt;
&lt;li&gt;Review: catching what AI got wrong before it ships&lt;/li&gt;
&lt;li&gt;Context: knowing the client’s constraints, team, and technical history&lt;/li&gt;
&lt;li&gt;Accountability: being the party responsible when things go wrong&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AI handles the mechanical parts of software production. The parts that require experience, client knowledge, and professional judgment remain human work. That’s worth paying for, and pricing should reflect it.&lt;/p&gt;
&lt;h2 id=&quot;three-models-that-work&quot;&gt;Three Models That Work&lt;/h2&gt;
&lt;h3 id=&quot;1-value-based-pricing&quot;&gt;1. Value-Based Pricing&lt;/h3&gt;
&lt;p&gt;Price based on the outcome, not the inputs. What is this feature worth to the client’s business? A checkout flow that converts 2% better for a $5M annual revenue business is worth real money regardless of how long it took to build.&lt;/p&gt;
&lt;p&gt;Value-based pricing requires you to understand the client’s business well enough to quantify the outcome, and to have the confidence to charge accordingly. Most agencies are uncomfortable with this model because it requires negotiating on business value rather than scope, and it means some projects will generate excellent margins while others are thin.&lt;/p&gt;
&lt;p&gt;Where it works: clients with measurable revenue outcomes (e-commerce, SaaS, lead generation sites) where you can connect your work to business results. It’s harder to apply to internal tools or branding projects where ROI is diffuse.&lt;/p&gt;
&lt;h3 id=&quot;2-output-based-pricing&quot;&gt;2. Output-Based Pricing&lt;/h3&gt;
&lt;p&gt;Charge per feature, per component, or per deliverable. Scope the project in terms of what will be built, not how long it takes.&lt;/p&gt;
&lt;p&gt;“$4,000 for the user authentication system (registration, login, password reset, email verification, social OAuth).”&lt;/p&gt;
&lt;p&gt;This is easier to defend than hourly billing because you’re quoting on what the client gets, not how long you take. If AI lets you build the auth system in two days instead of five, that’s your efficiency to keep.&lt;/p&gt;
&lt;p&gt;The catch: scope definition is harder than it sounds. “User authentication system” means different things to different clients. Good output-based pricing requires detailed specifications, which you should be writing anyway.&lt;/p&gt;
&lt;p&gt;Where it works: established agencies with good discovery processes who can define scope accurately. It fails for projects where requirements are fuzzy or change frequently.&lt;/p&gt;
&lt;h3 id=&quot;3-retainer-with-defined-capacity&quot;&gt;3. Retainer with Defined Capacity&lt;/h3&gt;
&lt;p&gt;Monthly fee for a defined amount of capacity: a set number of developer-days or story points per month. The client uses that capacity on whatever matters most, and unused capacity doesn’t roll over.&lt;/p&gt;
&lt;p&gt;AI efficiency doesn’t directly affect this model because you’re selling access to skilled judgment over time, not a fixed block of time itself. You scope what can realistically be done in a month with AI-assisted development, price the month accordingly, and deliver against that scope.&lt;/p&gt;
&lt;p&gt;This model works well for ongoing product development relationships where requirements evolve and the value of predictability (for both parties) is high.&lt;/p&gt;
&lt;p&gt;Where it works: long-term relationships with sophisticated clients who want a development partner rather than a project vendor.&lt;/p&gt;
&lt;h2 id=&quot;the-transparency-question&quot;&gt;The Transparency Question&lt;/h2&gt;
&lt;p&gt;Some agencies are preemptively addressing AI efficiency in their proposals. Something like:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“We use AI coding tools on all projects, which lets us move faster and catch more edge cases. Our pricing reflects what the work is worth and what it takes from us in skill and judgment, not raw hours.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is honest and positions the agency well. It turns AI from something to hide into something to be proud of.&lt;/p&gt;
&lt;p&gt;A small number of clients will push back and ask for hourly billing specifically. This is a compatibility signal. Clients who only want to pay for hours are betting against your efficiency. That’s a relationship that will struggle as AI tools improve.&lt;/p&gt;
&lt;p&gt;Clients who understand they’re paying for outcomes and judgment tend to be better partners. Proactively framing your pricing this way acts as a filter.&lt;/p&gt;
&lt;h2 id=&quot;what-to-do-with-the-efficiency-dividend&quot;&gt;What to Do With the Efficiency Dividend&lt;/h2&gt;
&lt;p&gt;The honest answer: keep most of it, pass some of it on.&lt;/p&gt;
&lt;p&gt;Trying to maintain exactly the same billing on projects that now take half the time is a path to client resentment. If a client knows a project type well and sees your quote go up year-over-year while the timeline goes down, the math is visible.&lt;/p&gt;
&lt;p&gt;A reasonable approach: price AI-assisted projects somewhere between what you’d have charged in 2024 and what pure hourly billing would give you now. You’re faster and more capable than you were. Charge accordingly, modestly less than the pre-AI equivalent, not dramatically less.&lt;/p&gt;
&lt;p&gt;More importantly, reinvest efficiency gains into quality: more thorough review, better testing, more careful architecture conversations. Clients don’t need to know this is happening. They’ll feel it in fewer bugs and better delivered work.&lt;/p&gt;
&lt;h2 id=&quot;proposals-that-hold-up-under-scrutiny&quot;&gt;Proposals That Hold Up Under Scrutiny&lt;/h2&gt;
&lt;p&gt;If your pricing model changes, your proposal documents need to support it.&lt;/p&gt;
&lt;p&gt;A proposal that used to say “200 hours at $150/hour = $30,000” needs to become something different. Options:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scope-based:&lt;/strong&gt; “User authentication system, product catalog with search, checkout with Stripe, order management dashboard: $28,000.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Phase-based:&lt;/strong&gt; “Phase 1: Discovery and architecture ($4,000). Phase 2: Core feature development ($18,000). Phase 3: QA, performance optimization, and launch ($6,000).”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Outcome-based:&lt;/strong&gt; “A fully functional e-commerce platform capable of handling your projected 500 orders/day at launch, with a two-week onboarding period and 30 days of post-launch support — $30,000.”&lt;/p&gt;
&lt;p&gt;All three are harder to argue with on a per-hour basis, because they’re not quoting per hour.&lt;/p&gt;
&lt;h2 id=&quot;one-concrete-change-to-make-now&quot;&gt;One Concrete Change to Make Now&lt;/h2&gt;
&lt;p&gt;If you’re still billing hourly and this post is resonating, the single highest-leverage change is: stop quoting projects as time estimates.&lt;/p&gt;
&lt;p&gt;Instead, quote total project fees based on scope. When clients ask how many hours it will take, answer: “Our projects are priced based on what we’ll deliver, not how long we take. We commit to the outcome at the price we’ve quoted.”&lt;/p&gt;
&lt;p&gt;Some clients will push back. The right clients won’t.&lt;/p&gt;
&lt;p&gt;The underlying point is this: AI has changed what goes into building software, not what software is worth. Pricing should reflect the value to the client and the skill it takes to deliver, not the computational work of generating code. Agencies that make this shift explicitly will have cleaner relationships and better margins than those still waiting for the right moment to have the conversation.&lt;/p&gt;</content:encoded><category>Business</category><category>Agency</category><category>Pricing</category><category>Business</category><category>AI</category><category>2026</category><author>Anurag Verma</author></item><item><title>AI Search Is Eating Web Traffic: What Developers and Agencies Need to Do About It</title><link>https://blog.codercops.com/blog/ai-search-traffic-seo-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-search-traffic-seo-2026/</guid><description>Google AI Overviews, Perplexity, and ChatGPT Search are answering questions without sending users anywhere. Here&apos;s what that means for your content strategy and what actually drives traffic now.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The deal web publishers had with Google was simple: create content, get traffic. Google indexed it, ranked it, and sent visitors. That deal is changing.&lt;/p&gt;
&lt;p&gt;Google AI Overviews answer informational queries directly in search results, pulling from indexed pages without necessarily sending traffic to them. Perplexity builds answers from cited sources but keeps users inside its interface. ChatGPT’s web search mode answers questions with brief citations at the bottom. The query gets answered, but the click that used to follow doesn’t always happen.&lt;/p&gt;
&lt;p&gt;This isn’t speculation anymore. Publishers across verticals have reported meaningful changes in referral traffic from search for informational content. The pattern is specific: tutorial-style content (“how to do X”), definition content (“what is X”), and listicle content (“best tools for X”) are seeing the sharpest impact. Opinionated takes, case studies, and data-backed analyses are holding better.&lt;/p&gt;
&lt;p&gt;For agencies and developers who run content programs, this is a shift worth understanding clearly.&lt;/p&gt;
&lt;h2 id=&quot;whats-actually-happening&quot;&gt;What’s Actually Happening&lt;/h2&gt;
&lt;p&gt;Three separate things are happening simultaneously, and it helps to separate them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI Overviews in Google Search&lt;/strong&gt; appear above organic results for queries Google classifies as informational. They’re generated from web content but don’t always trigger a click through to the source. Google has stated it prioritizes sources for overviews, but citation doesn’t guarantee traffic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Perplexity and ChatGPT Search&lt;/strong&gt; are alternative search interfaces that a growing slice of users choose over Google for research queries. These tools typically cite sources more explicitly than Google AI Overviews, and some portion of their users do click through, though the user base is smaller than Google’s.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zero-click rates&lt;/strong&gt; were already rising before AI Overviews, driven by featured snippets, Knowledge Panels, and People Also Ask. AI Overviews accelerate an existing trend rather than starting a new one.&lt;/p&gt;
&lt;p&gt;The net effect is concentrated on the middle of the funnel: informational content that used to drive awareness and early consideration is generating fewer visits from organic search.&lt;/p&gt;
&lt;h2 id=&quot;what-still-works&quot;&gt;What Still Works&lt;/h2&gt;
&lt;p&gt;Not all traffic is declining equally. Content that doesn’t get swept up in AI-generated answers still drives visits.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Specificity defeats the overview.&lt;/strong&gt; AI Overviews handle general questions well. “How does JWT authentication work?” gets summarized. “How do I configure Auth.js v5 with Drizzle ORM and a Next.js App Router project?” is specific enough that a direct, detailed answer exists in one place, and a user with that problem will click through to find it.&lt;/p&gt;
&lt;p&gt;The practical implication: go narrower. Instead of “how to optimize a PostgreSQL query,” write “how to diagnose an n+1 query in Django with django-debug-toolbar.” The specific answer doesn’t fit in a summary box.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Opinion, experience, and case studies.&lt;/strong&gt; AI tools can summarize claims, but they can’t generate original experience. A post titled “We migrated from Prisma to Drizzle and here’s what we learned” contains first-person data that doesn’t exist anywhere else. It can’t be replaced by a synthesis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Recency for fast-moving topics.&lt;/strong&gt; A post published the week Bun 2.0 ships, or the day a framework releases a security patch, is faster than any AI knowledge cutoff. Time-sensitive content gets traffic before the AI tools catch up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tool comparisons with current pricing.&lt;/strong&gt; AI Overviews use training data with cutoff dates. Pricing tables, benchmark comparisons, and feature matrices go stale. A detailed comparison of Vercel vs Cloudflare Pages pricing from last week isn’t in any AI’s training data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Content that readers want to save, share, or reference.&lt;/strong&gt; Long-form guides, checklists, and reference materials get bookmarked and linked. That link signal still matters for rankings, and bookmarked content gets revisited regardless of search.&lt;/p&gt;
&lt;h2 id=&quot;how-ai-search-decides-what-to-cite&quot;&gt;How AI Search Decides What to Cite&lt;/h2&gt;
&lt;p&gt;Understanding how Perplexity and ChatGPT Search select sources helps you write content that gets cited rather than ignored.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Structured, factual claims.&lt;/strong&gt; AI citation algorithms favor content with clear, specific claims stated directly. “Fastify handles approximately 70,000 requests per second on a standard Node.js benchmark” is more citeable than “Fastify is very fast.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Clean HTML structure.&lt;/strong&gt; AI crawlers parse your page the same way screen readers do: headings, paragraphs, lists, and tables. Dense prose with few semantic markers is harder to extract. Use &lt;code&gt;&amp;#x3C;h2&gt;&lt;/code&gt;, &lt;code&gt;&amp;#x3C;h3&gt;&lt;/code&gt;, &lt;code&gt;&amp;#x3C;ul&gt;&lt;/code&gt;, and &lt;code&gt;&amp;#x3C;table&gt;&lt;/code&gt; deliberately.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Authoritative signals.&lt;/strong&gt; Domain authority still matters. Being cited once by a high-authority source creates a feedback loop. If Perplexity cites you in an answer, users who click through to your site may link to you, which improves your ranking in traditional search results, which improves your chance of being cited again.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Freshness.&lt;/strong&gt; AI search tools crawl frequently and often prioritize recent content. Dates in your frontmatter matter. A post with a &lt;code&gt;2024&lt;/code&gt; publish date loses to a &lt;code&gt;2026&lt;/code&gt; equivalent on queries where recency matters.&lt;/p&gt;
&lt;h2 id=&quot;structured-data-for-ai-discoverability&quot;&gt;Structured Data for AI Discoverability&lt;/h2&gt;
&lt;p&gt;Schema.org markup doesn’t directly affect AI Overviews, but it improves how Google understands and classifies your content, which indirectly affects which pages get included in AI-generated answers.&lt;/p&gt;
&lt;p&gt;For technical blog posts, &lt;code&gt;Article&lt;/code&gt; schema is the baseline:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;application/ld+json&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  &quot;@context&quot;: &quot;https://schema.org&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  &quot;@type&quot;: &quot;TechArticle&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  &quot;headline&quot;: &quot;Fastify in 2026: The Node.js API Framework That Stayed When Everyone Left&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  &quot;datePublished&quot;: &quot;2026-06-14&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  &quot;dateModified&quot;: &quot;2026-06-14&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  &quot;author&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &quot;@type&quot;: &quot;Person&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &quot;name&quot;: &quot;Anurag Verma&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  &quot;publisher&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &quot;@type&quot;: &quot;Organization&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &quot;name&quot;: &quot;CoderCops&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  &quot;description&quot;: &quot;...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For FAQ-style content, &lt;code&gt;FAQPage&lt;/code&gt; schema makes the Q&amp;#x26;A structure explicit:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;application/ld+json&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  &quot;@context&quot;: &quot;https://schema.org&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  &quot;@type&quot;: &quot;FAQPage&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  &quot;mainEntity&quot;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &quot;@type&quot;: &quot;Question&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &quot;name&quot;: &quot;When should I use Fastify instead of Express?&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &quot;acceptedAnswer&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        &quot;@type&quot;: &quot;Answer&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        &quot;text&quot;: &quot;Use Fastify when you need schema-based validation, automatic OpenAPI documentation generation, or are building a high-throughput API where JSON serialization speed matters.&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note: Google’s documentation explicitly states that FAQ schema doesn’t guarantee a featured snippet or AI Overview inclusion. It’s one signal among many.&lt;/p&gt;
&lt;h2 id=&quot;what-to-track-now&quot;&gt;What to Track Now&lt;/h2&gt;
&lt;p&gt;The standard metric, organic sessions from Google, is becoming a lagging indicator. It captures clicks but not impressions or citations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Add to your tracking:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google Search Console impressions (not just clicks). If impressions hold but clicks drop, that’s an AI Overview pattern: your content is being seen in summaries but not clicked.&lt;/li&gt;
&lt;li&gt;Referral traffic from Perplexity, ChatGPT, and other AI search tools. These show up as referral sources in your analytics when users do click through.&lt;/li&gt;
&lt;li&gt;Direct traffic changes. Some AI-cited content drives brand searches and direct visits, not tracked as organic.&lt;/li&gt;
&lt;li&gt;Branded search volume. If your brand name appears in AI answers as a citation, branded search typically increases.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Stop optimizing for:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keyword density. AI Overviews don’t care about keyword repetition; they care about clear, accurate answers.&lt;/li&gt;
&lt;li&gt;Exact-match anchor text. The link graph still matters, but anchor text optimization is increasingly irrelevant.&lt;/li&gt;
&lt;li&gt;Thin pages targeting long-tail keywords. These were already losing to featured snippets; AI Overviews accelerate that.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-agency-angle&quot;&gt;The Agency Angle&lt;/h2&gt;
&lt;p&gt;For agencies running content programs for clients, the conversation is shifting from “get on page one” to “get cited in AI answers.”&lt;/p&gt;
&lt;p&gt;Those are related but different goals. Page one requires backlinks and authority at scale. Getting cited in an AI answer requires being the clearest, most specific, most structured source on a topic.&lt;/p&gt;
&lt;p&gt;That means:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Depth over breadth.&lt;/strong&gt; Ten well-researched, specific posts beat a hundred thin ones. The specific posts get cited; the thin ones get absorbed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update discipline.&lt;/strong&gt; A post with accurate current information beats a better-written post with stale facts. Building in a quarterly review of high-traffic posts to update pricing, version numbers, and statistics is now table stakes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Original data.&lt;/strong&gt; Surveys, benchmarks, case studies, and analysis of proprietary data are the formats least replaceable by AI summaries. If your agency runs a survey of 200 clients about their AI budgets, that data exists nowhere else and will get cited.&lt;/p&gt;
&lt;p&gt;The underlying point: the content that’s always worked (genuinely useful, specific, authoritative, kept current) works better than ever. What’s changing is that generic SEO content, written to rank rather than to help, is getting competed away by AI systems that are very good at generic answers. The bar for what earns traffic has moved up.&lt;/p&gt;
&lt;p&gt;That’s uncomfortable for content programs built on volume. It’s straightforward for teams that were already writing things worth reading.&lt;/p&gt;</content:encoded><category>Technology</category><category>SEO</category><category>AI</category><category>Technology</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>Cloudflare Durable Objects: Stateful Edge Computing That Actually Works</title><link>https://blog.codercops.com/blog/cloudflare-durable-objects-stateful-edge-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/cloudflare-durable-objects-stateful-edge-2026/</guid><description>Durable Objects solve the coordination problem that makes edge computing hard: how do you maintain consistent state across distributed nodes? Here&apos;s how they work and when to use them.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Cloudflare Workers are stateless by design. Each request handler starts fresh, processes, and exits. That’s what makes them fast and infinitely scalable, but it also means you can’t hold mutable state in memory. The moment you need something like “how many active connections are in this chat room right now?” you’re stuck reaching for a database. Now your edge function has a latency floor set by the database round trip.&lt;/p&gt;
&lt;p&gt;Durable Objects are Cloudflare’s answer to that problem. They’re stateful, strongly consistent, and single-threaded. Each object instance runs in exactly one location at a time, processes requests one at a time, and persists its state to Cloudflare’s storage. You get the coordination guarantees of a single-process system with the global reach of edge infrastructure.&lt;/p&gt;
&lt;h2 id=&quot;the-core-model&quot;&gt;The Core Model&lt;/h2&gt;
&lt;p&gt;A Durable Object is a JavaScript class that Cloudflare instantiates and keeps alive. The key properties:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Single-instance per ID&lt;/strong&gt;: For a given ID, there’s exactly one running instance, somewhere in Cloudflare’s network.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Location pinning&lt;/strong&gt;: The instance migrates to be close to where requests originate. If most requests come from Mumbai, the instance runs near Mumbai.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Serialized request handling&lt;/strong&gt;: Requests to the same instance are queued. No concurrent execution, no race conditions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Built-in storage&lt;/strong&gt;: Each instance has access to a transactional key-value store. Data persists across hibernation periods.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here’s the minimal definition:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Counter&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; implements&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; DurableObject&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  private&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; count&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  private&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; state&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; DurableObjectState&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  constructor&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; DurableObjectState&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Env&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.state &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; state;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;    // Restore from storage on startup&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.state.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;blockConcurrencyWhile&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;      this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.count &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.state.storage.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;count&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;??&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  async&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; fetch&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Request&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;Response&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; url&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; URL&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(request.url);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (url.pathname &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;/increment&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;      this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.count&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;      await&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.state.storage.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;put&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;count&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.count);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;      return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; Response.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ count: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.count });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (url.pathname &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;/value&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;      return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; Response.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ count: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.count });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; Response&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;Not found&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, { status: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;404&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And the Worker that routes requests to the right instance:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  async&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; fetch&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;(request&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Request, env&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Env)&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Promise&amp;#x3C;Response&gt; &lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; url&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; URL&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(request.url);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;    // Extract a namespace from the URL — each unique ID gets its own object&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; counterId&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; url.searchParams.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;id&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;??&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;global&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;    // Get or create the Durable Object stub&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; env.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;COUNTER&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;idFromName&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(counterId);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; stub&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; env.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;COUNTER&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(id);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;    // Forward the request to the object&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; stub.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;fetch&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(request);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;wrangler.toml&lt;/code&gt; binding:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;[[&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;durable_objects&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;bindings&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;name = &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;COUNTER&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;class_name = &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;Counter&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;[[&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;migrations&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;tag = &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;v1&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;new_classes = [&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;Counter&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;why-this-is-different-from-kv&quot;&gt;Why This Is Different From KV&lt;/h2&gt;
&lt;p&gt;Cloudflare KV is a global distributed key-value store. It’s eventually consistent: a write in one region takes a few seconds to propagate everywhere. For most reads, that’s fine. For counters, leaderboards, inventory, and anything where the current value matters before you write, it’s a serious problem.&lt;/p&gt;
&lt;p&gt;With KV, two simultaneous increments on the same counter will both read the old value, both add 1, and both write back the same new value. You lose an increment.&lt;/p&gt;
&lt;p&gt;Durable Objects don’t have that problem. Because all requests to a given object are serialized, the second increment request waits until the first completes. No lost updates.&lt;/p&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Cloudflare KV&lt;/th&gt;&lt;th&gt;Durable Objects&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Consistency&lt;/td&gt;&lt;td&gt;Eventual&lt;/td&gt;&lt;td&gt;Strong&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Read latency&lt;/td&gt;&lt;td&gt;~1ms (from cache)&lt;/td&gt;&lt;td&gt;~10ms (round trip to instance)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Concurrent writes&lt;/td&gt;&lt;td&gt;Race conditions&lt;/td&gt;&lt;td&gt;Serialized, safe&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Best for&lt;/td&gt;&lt;td&gt;Config, cached data&lt;/td&gt;&lt;td&gt;Coordination, counters, sessions&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pricing (storage)&lt;/td&gt;&lt;td&gt;$0.50/GB-month&lt;/td&gt;&lt;td&gt;$0.20/GB-month&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pricing (reads)&lt;/td&gt;&lt;td&gt;$0.50/million&lt;/td&gt;&lt;td&gt;$0.20/million&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;real-time-collaboration-a-chat-room&quot;&gt;Real-Time Collaboration: A Chat Room&lt;/h2&gt;
&lt;p&gt;The most common Durable Object use case is real-time coordination. Here’s a WebSocket chat room where the Durable Object tracks connected clients and broadcasts messages:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; ChatRoom&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; implements&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; DurableObject&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  private&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; sessions&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Map&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;WebSocket&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, { &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; }&gt; &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; Map&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  private&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; state&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; DurableObjectState&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  constructor&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; DurableObjectState&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Env&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.state &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; state;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;    // Accept WebSocket connections from hibernated state&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.state.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;getWebSockets&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;forEach&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;ws&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; meta&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; ws.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;deserializeAttachment&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;      this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.sessions.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(ws, meta);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  async&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; fetch&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Request&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;Response&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (request.headers.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;Upgrade&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;!==&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;websocket&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;      return&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; Response&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;Expected WebSocket&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, { status: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;426&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; url&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; URL&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(request.url);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; url.searchParams.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;name&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;??&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;anonymous&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; pair&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; WebSocketPair&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;server&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; Object.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;values&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(pair);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;    // Accept and register with Cloudflare&apos;s WebSocket hibernation API&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.state.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;acceptWebSocket&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(server);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    server.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;serializeAttachment&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ name });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.sessions.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(server, { name });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;broadcast&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      type: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;system&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      text: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;`${&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;} joined`&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      time: Date.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    }, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; Response&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, { status: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;101&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, webSocket: client });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  async&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; webSocketMessage&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;ws&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; WebSocket&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;message&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; ArrayBuffer&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; session&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.sessions.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(ws);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;session) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; text&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; typeof&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; message &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;string&apos;&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; ?&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; message &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; TextDecoder&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;decode&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(message);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;broadcast&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      type: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;message&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      name: session.name,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      text,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      time: Date.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    }, ws);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  async&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; webSocketClose&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;ws&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; WebSocket&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;code&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; session&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.sessions.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(ws);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.sessions.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;delete&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(ws);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (session) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;      this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;broadcast&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        type: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;system&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        text: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;`${&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;session&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;} left`&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        time: Date.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      }, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  private&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; broadcast&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; object&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;exclude&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; WebSocket&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; void&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; message&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; JSON&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;stringify&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(data);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.sessions.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;forEach&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;_&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;ws&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;      if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (ws &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;!==&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; exclude &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; ws.readyState &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; WebSocket.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;READY_STATE_OPEN&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        ws.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;send&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(message);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;getWebSockets()&lt;/code&gt; call in the constructor is the hibernation API at work. Cloudflare can pause the object when no requests are active and wake it up when a new message arrives, without losing the WebSocket connections. You pay for compute only when processing messages, not for idle connections.&lt;/p&gt;
&lt;h2 id=&quot;rate-limiting-per-user&quot;&gt;Rate Limiting Per User&lt;/h2&gt;
&lt;p&gt;Rate limiting is another classic Durable Object use case. A global rate limiter that’s actually accurate (no race conditions) across any number of Worker instances:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; RateLimiter&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; implements&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; DurableObject&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  private&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; state&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; DurableObjectState&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  constructor&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; DurableObjectState&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Env&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.state &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; state;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  async&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; fetch&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Request&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;Response&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; now&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; Date.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; windowMs&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 60_000&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;// 1 minute window&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; limit&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;// requests per window&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; windowStart&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; now &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; windowMs;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;    // Get existing request timestamps for this window&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; timestamps&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;[] &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.state.storage.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;timestamps&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;??&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; [];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;    // Remove expired entries&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; active&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; timestamps.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;filter&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; t &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; windowStart);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (active.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; &gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; limit) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; oldestActive&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; Math.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;min&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;active);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; resetIn&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; Math.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;ceil&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;((oldestActive &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; windowMs &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; now) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 1000&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;      return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; Response.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        { allowed: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, resetIn },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        { status: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;429&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, headers: { &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;Retry-After&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(resetIn) } }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    active.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(now);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.state.storage.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;put&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;timestamps&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, active);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; Response.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      allowed: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      remaining: limit &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; active.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In your Worker:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; checkRateLimit&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;userId&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Env&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;boolean&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; env.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;RATE_LIMITER&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;idFromName&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(userId);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; limiter&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; env.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;RATE_LIMITER&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(id);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; limiter.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;fetch&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;https://rate-limiter/check&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;allowed&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; response.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; allowed;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each user gets their own Durable Object instance. The rate limiter for user A and user B never touch the same storage or contend with each other. And unlike a Redis-based rate limiter, this one doesn’t require a separate infrastructure component.&lt;/p&gt;
&lt;h2 id=&quot;storage-patterns&quot;&gt;Storage Patterns&lt;/h2&gt;
&lt;p&gt;The Durable Object storage API is transactional and supports batching:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// Atomic multi-key operations&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.state.storage.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;transaction&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;txn&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; balance&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; txn.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;balance&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;??&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (balance &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; amount) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;throw&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; Error&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;Insufficient funds&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; txn.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;put&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;balance&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, balance &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; amount);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; txn.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;put&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;lastDebit&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, { amount, time: Date.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;() });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// List keys with prefix&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; entries&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.state.storage.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ prefix: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;session:&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// Delete a range&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.state.storage.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;deleteAll&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(); &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;// Use carefully&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Storage limits to know: each object can hold up to 128 KB per value, and the total storage per object isn’t capped in the pricing documentation (you pay per GB stored). Individual operations have a 1 MB payload limit.&lt;/p&gt;
&lt;h2 id=&quot;the-alarm-api-scheduled-work-per-object&quot;&gt;The Alarm API: Scheduled Work per Object&lt;/h2&gt;
&lt;p&gt;Each Durable Object can schedule a future callback via the alarm API. This is useful for cleanup tasks, expiry logic, and delayed processing:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; SessionManager&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; implements&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; DurableObject&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  constructor&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; state&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; DurableObjectState&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Env&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  async&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; fetch&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Request&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;Response&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;    // Create a session that expires in 24 hours&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; sessionId&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; crypto.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;randomUUID&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.state.storage.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;put&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;`session:${&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;sessionId&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;}`&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      created: Date.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      data: &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; request.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;    // Schedule cleanup&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; alarm&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.state.storage.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;getAlarm&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;alarm) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;      await&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.state.storage.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;setAlarm&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(Date.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 86_400_000&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;// 24h&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; Response.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ sessionId });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  async&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; alarm&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;    // Called by Cloudflare when the alarm fires&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; cutoff&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; Date.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 86_400_000&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; sessions&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.state.storage.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ prefix: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;session:&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; toDelete&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;[] &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; [];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;of&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; sessions) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;      if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; ((value &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;created&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; }).created &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; cutoff) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        toDelete.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(key);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (toDelete.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;      await&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.state.storage.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;delete&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(toDelete);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;    // Reschedule if there are still active sessions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; remaining&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.state.storage.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ prefix: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;session:&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (remaining.size &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;      await&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.state.storage.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;setAlarm&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(Date.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 3_600_000&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;// check again in 1h&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;when-not-to-use-durable-objects&quot;&gt;When Not to Use Durable Objects&lt;/h2&gt;
&lt;p&gt;Durable Objects fit a specific niche. They’re not a general-purpose database replacement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Skip Durable Objects when:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You need to query across many objects. Each DO only knows its own state. Cross-object queries don’t exist; you’d need a separate index layer.&lt;/li&gt;
&lt;li&gt;Your state is read-heavy with infrequent writes. KV with its caching is cheaper and faster for that pattern.&lt;/li&gt;
&lt;li&gt;You need full SQL queries, joins, or aggregations. Use D1 (Cloudflare’s SQLite) instead.&lt;/li&gt;
&lt;li&gt;Object count will be enormous but most objects are inactive. Durable Objects are priced on active usage, but the coordination overhead adds up if you’re waking objects constantly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Use Durable Objects when:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You need a single authoritative state that multiple clients or Workers might update simultaneously.&lt;/li&gt;
&lt;li&gt;You’re building real-time features: collaborative editing, live presence, shared counters, game state.&lt;/li&gt;
&lt;li&gt;You need per-tenant rate limiting, per-room coordination, or per-session state without an external service.&lt;/li&gt;
&lt;li&gt;You want to avoid an external state layer (Redis, Postgres) just for coordination logic.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The pricing is reasonable for the use cases it fits: $0.20 per million requests, $12.50 per million GB-seconds of CPU time. Most coordination objects use very little CPU and receive bursts of requests. For a chat room with 100 active users sending occasional messages, the cost is negligible.&lt;/p&gt;
&lt;p&gt;Where Durable Objects stand out is the operational simplicity. No Redis cluster to manage, no connection pooling, no failover configuration. The object lives wherever Cloudflare decides, migrates as needed, and wakes up when it gets traffic. The coordination complexity that typically requires careful distributed systems work is handled by the platform.&lt;/p&gt;</content:encoded><category>Cloud &amp; Infrastructure</category><category>Cloudflare</category><category>Edge Computing</category><category>Infrastructure</category><category>Backend</category><category>2026</category><author>Anurag Verma</author></item><item><title>Expo Router in 2026: File-Based Navigation That Makes React Native Feel Modern</title><link>https://blog.codercops.com/blog/expo-router-react-native-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/expo-router-react-native-2026/</guid><description>Expo Router brings file-based routing to React Native, the same pattern web developers know from Next.js. Here&apos;s how it works, what it gets right, and where the friction still lives.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;React Native navigation has always been the part of mobile development that web developers struggle with most. React Navigation works, but it’s explicit: you define a navigator, list the screens, configure transitions, wire up deep linking, and handle the stack state manually. After building a few apps, it becomes manageable. For the first few projects, it’s genuinely confusing.&lt;/p&gt;
&lt;p&gt;Expo Router treats navigation like a file system, which is the pattern web developers already know. A file at &lt;code&gt;app/profile/[id].tsx&lt;/code&gt; is the screen at &lt;code&gt;/profile/:id&lt;/code&gt;. A file at &lt;code&gt;app/(tabs)/home.tsx&lt;/code&gt; is a tab screen. Deep links, URL structure, and navigation state follow from the file structure rather than configuration.&lt;/p&gt;
&lt;p&gt;This post covers how Expo Router actually works, what the file structure means for navigation, and where the approach still has rough edges.&lt;/p&gt;
&lt;h2 id=&quot;the-setup&quot;&gt;The Setup&lt;/h2&gt;
&lt;p&gt;Expo Router is part of the Expo ecosystem and works with the managed workflow (Expo Go, EAS Build) or bare React Native projects:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; create-expo-app@latest&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; my-app&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; --template&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; tabs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; my-app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; install&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; expo&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; start&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;tabs&lt;/code&gt; template starts you with a working tab navigation setup. The project structure looks like:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;app/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  (tabs)/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    _layout.tsx    — defines the tab bar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    index.tsx      — first tab (Home)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    explore.tsx    — second tab&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  _layout.tsx      — root layout, wraps everything&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  +not-found.tsx   — 404 screen&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;assets/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;components/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;constants/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Every file inside &lt;code&gt;app/&lt;/code&gt; that exports a default React component becomes a navigable screen. The file path is the route.&lt;/p&gt;
&lt;h2 id=&quot;file-conventions&quot;&gt;File Conventions&lt;/h2&gt;
&lt;p&gt;Expo Router uses a few special filename patterns:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;_layout.tsx&lt;/code&gt;&lt;/strong&gt; — defines a layout that wraps all screens in the same directory. Use this for tab bars, drawer navigators, stack headers, and shared providers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;(group)/&lt;/code&gt;&lt;/strong&gt; — parenthesized folder names create route groups. The group name doesn’t appear in the URL. &lt;code&gt;(tabs)/home.tsx&lt;/code&gt; maps to &lt;code&gt;/home&lt;/code&gt;, not &lt;code&gt;/(tabs)/home&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;[param].tsx&lt;/code&gt;&lt;/strong&gt; — dynamic segments. &lt;code&gt;app/users/[id].tsx&lt;/code&gt; matches &lt;code&gt;/users/123&lt;/code&gt;, &lt;code&gt;/users/abc&lt;/code&gt;, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;[...rest].tsx&lt;/code&gt;&lt;/strong&gt; — catch-all segments. &lt;code&gt;app/docs/[...path].tsx&lt;/code&gt; matches &lt;code&gt;/docs/getting-started&lt;/code&gt;, &lt;code&gt;/docs/api/components&lt;/code&gt;, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;+not-found.tsx&lt;/code&gt;&lt;/strong&gt; — shown when no other route matches.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;+html.tsx&lt;/code&gt;&lt;/strong&gt; — for web-specific HTML customization (Expo Router supports web targets).&lt;/p&gt;
&lt;h2 id=&quot;building-a-tabbed-app&quot;&gt;Building a Tabbed App&lt;/h2&gt;
&lt;p&gt;Here’s a complete tab layout with two tabs:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;tsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// app/(tabs)/_layout.tsx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { Tabs } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;expo-router&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { Ionicons } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;@expo/vector-icons&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; TabLayout&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Tabs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;      screenOptions&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;={&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        tabBarActiveTintColor: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;#007AFF&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        headerShown: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      }&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Tabs.Screen&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;        name&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;index&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;        options&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;={&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;          title: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;Home&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;          tabBarIcon&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: ({ &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;color&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; }) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;            &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Ionicons&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;home&quot;&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; color&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;={&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;color&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; size&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;={&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;          ),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        }&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Tabs.Screen&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;        name&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;profile&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;        options&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;={&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;          title: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;Profile&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;          tabBarIcon&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: ({ &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;color&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; }) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;            &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Ionicons&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;person&quot;&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; color&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;={&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;color&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; size&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;={&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;          ),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        }&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Tabs&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;tsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// app/(tabs)/index.tsx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { View, Text, Pressable } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;react-native&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { Link } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;expo-router&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; HomeScreen&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;View&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; style&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;={&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;{ flex: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, justifyContent: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;center&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, alignItems: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;center&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Text&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;Home&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Text&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;      {&lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;/* Link component works like &amp;#x3C;a&gt; on the web */&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;/users/123&quot;&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; asChild&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Pressable&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;          &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Text&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;Go to User 123&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Text&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Pressable&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;View&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;Link&lt;/code&gt; component handles navigation without needing access to a navigation object. Same API as Next.js’s &lt;code&gt;Link&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;dynamic-routes-and-params&quot;&gt;Dynamic Routes and Params&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;tsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// app/users/[id].tsx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { View, Text } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;react-native&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { useLocalSearchParams } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;expo-router&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; UserScreen&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; useLocalSearchParams&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;{ &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; }&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;View&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Text&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;User ID: &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Text&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;View&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Navigate programmatically using the &lt;code&gt;router&lt;/code&gt; object:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;tsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { router } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;expo-router&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// Navigate to a route&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;router.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;/users/123&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// Replace (no back stack entry)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;router.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;/login&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// Go back&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;router.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;back&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// Navigate with typed params&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;router.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ pathname: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;/users/[id]&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, params: { id: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;123&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; } });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The typed version catches typos at build time if you use TypeScript with Expo Router’s generated types. Run &lt;code&gt;npx expo-env&lt;/code&gt; to generate types for your route structure.&lt;/p&gt;
&lt;h2 id=&quot;nested-layouts-stack-inside-a-tab&quot;&gt;Nested Layouts: Stack Inside a Tab&lt;/h2&gt;
&lt;p&gt;A common pattern is a tab bar with multiple screens per tab (a stack inside each tab). Here’s how that nests:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;app/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  (tabs)/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    _layout.tsx           — tab navigator&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    (home)/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      _layout.tsx         — stack navigator inside &quot;home&quot; tab&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      index.tsx           — home feed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      post/[id].tsx       — individual post detail&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    profile.tsx           — profile tab (no nested stack)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;tsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// app/(tabs)/(home)/_layout.tsx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { Stack } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;expo-router&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; HomeStackLayout&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Stack&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Stack.Screen&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;index&quot;&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; options&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;={&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;{ title: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;Feed&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Stack.Screen&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;post/[id]&quot;&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; options&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;={&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;{ title: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;Post&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Stack&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now tapping “Back” from the post detail screen returns to the feed, and the tab bar stays visible throughout. The nesting handles the state automatically.&lt;/p&gt;
&lt;h2 id=&quot;authentication-gates&quot;&gt;Authentication Gates&lt;/h2&gt;
&lt;p&gt;A common need: redirect unauthenticated users to a login screen. Expo Router handles this with a root layout and conditional rendering:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;tsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// app/_layout.tsx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { useEffect } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;react&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { Stack, useRouter, useSegments } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;expo-router&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { useAuth } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;../hooks/useAuth&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; RootLayout&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;user&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;isLoading&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; useAuth&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; router&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; useRouter&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; segments&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; useSegments&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;  useEffect&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(() &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (isLoading) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; inAuthGroup&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; segments[&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;(auth)&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;user &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;inAuthGroup) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;      // Not signed in, redirect to login&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      router.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;/(auth)/login&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (user &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; inAuthGroup) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;      // Signed in, redirect to app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      router.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;/(tabs)&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }, [user, isLoading, segments]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Stack&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Stack.Screen&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;(tabs)&quot;&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; options&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;={&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;{ headerShown: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Stack.Screen&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;(auth)&quot;&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; options&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;={&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;{ headerShown: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;Stack&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;app/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  _layout.tsx           — root: handles auth redirect&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  (tabs)/               — protected screens&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    _layout.tsx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    index.tsx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  (auth)/               — public screens&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    _layout.tsx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    login.tsx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    signup.tsx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;useSegments()&lt;/code&gt; hook gives you the current route path as an array of segments, which you use to determine which group the user is in.&lt;/p&gt;
&lt;h2 id=&quot;deep-linking-without-configuration&quot;&gt;Deep Linking Without Configuration&lt;/h2&gt;
&lt;p&gt;One of Expo Router’s genuine advantages over manual React Navigation setup is deep linking. In React Navigation, you write a &lt;code&gt;linking&lt;/code&gt; config object that maps URL patterns to screen names. It’s tedious for anything more than a few screens.&lt;/p&gt;
&lt;p&gt;With Expo Router, deep links work automatically because the URL structure is the file structure. Configure the scheme in &lt;code&gt;app.json&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;  &quot;expo&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;    &quot;scheme&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;myapp&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then &lt;code&gt;myapp://users/123&lt;/code&gt; opens the &lt;code&gt;app/users/[id].tsx&lt;/code&gt; screen with &lt;code&gt;id=&quot;123&quot;&lt;/code&gt;. Universal links (HTTPS URLs that open the app) require an associated domain setup, but the routing configuration is already done.&lt;/p&gt;
&lt;p&gt;For web targets (&lt;code&gt;npx expo start --web&lt;/code&gt;), the same routes work as real URLs. The same app file renders in the browser with proper URL structure.&lt;/p&gt;
&lt;h2 id=&quot;whats-still-rough&quot;&gt;What’s Still Rough&lt;/h2&gt;
&lt;p&gt;Expo Router is genuinely useful, but there are places where the abstraction leaks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Complex navigation flows are harder to trace.&lt;/strong&gt; When navigation logic is spread across &lt;code&gt;_layout.tsx&lt;/code&gt; files and &lt;code&gt;useEffect&lt;/code&gt; hooks, debugging “why is the app navigating to X” requires tracing through multiple files. React Navigation’s explicit configuration is verbose but centralized.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Typed routes have caveats.&lt;/strong&gt; The generated &lt;code&gt;expo-env&lt;/code&gt; types help, but route parameters passed via &lt;code&gt;useLocalSearchParams&lt;/code&gt; are always strings. A param like &lt;code&gt;id=123&lt;/code&gt; gives you &lt;code&gt;&quot;123&quot;&lt;/code&gt;, not &lt;code&gt;123&lt;/code&gt;. This bites TypeScript users who forget to parse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Modals and sheets.&lt;/strong&gt; Presenting a modal (a screen that slides up, has its own header, can be dismissed) works via &lt;code&gt;presentation: &apos;modal&apos;&lt;/code&gt; in screen options, but the interactions with the routing state can feel awkward when you want modal-like navigation that doesn’t add to the URL.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Performance on deep stacks.&lt;/strong&gt; Expo Router renders all screens in a navigator at startup (for performance), which means complex apps need to be thoughtful about heavy initialization in screen components.&lt;/p&gt;
&lt;h2 id=&quot;comparing-to-react-navigation&quot;&gt;Comparing to React Navigation&lt;/h2&gt;
&lt;p&gt;Expo Router is built on React Navigation. They’re not alternatives in the sense that one replaces the other; Expo Router is an opinionated layer on top that handles routing configuration automatically.&lt;/p&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;React Navigation&lt;/th&gt;&lt;th&gt;Expo Router&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Config style&lt;/td&gt;&lt;td&gt;Explicit navigator + screen definitions&lt;/td&gt;&lt;td&gt;File system&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Deep linking&lt;/td&gt;&lt;td&gt;Manual linking config&lt;/td&gt;&lt;td&gt;Automatic from file structure&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Web support&lt;/td&gt;&lt;td&gt;Limited (community packages)&lt;/td&gt;&lt;td&gt;First-class&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Universal links&lt;/td&gt;&lt;td&gt;Separate config&lt;/td&gt;&lt;td&gt;Same routing, scheme config in app.json&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Escape hatches&lt;/td&gt;&lt;td&gt;Full API access&lt;/td&gt;&lt;td&gt;Full React Navigation API underneath&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Best for&lt;/td&gt;&lt;td&gt;Complex app-specific navigation flows&lt;/td&gt;&lt;td&gt;Standard app structures, universal apps&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;If your app has unusual navigation requirements (non-linear flows, branching onboarding, game-like navigation), React Navigation’s explicit API gives you more control. If you’re building a standard app (tabs, stacks, modals) or want native + web from the same codebase, Expo Router’s defaults get you there faster.&lt;/p&gt;
&lt;h2 id=&quot;getting-there-from-an-existing-react-navigation-app&quot;&gt;Getting There from an Existing React Navigation App&lt;/h2&gt;
&lt;p&gt;Expo Router and React Navigation coexist. You can migrate one section of your app at a time by adopting Expo Router for new screens while keeping existing React Navigation code intact. The Expo Router documentation has a migration guide, but the short version:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add Expo Router to your project&lt;/li&gt;
&lt;li&gt;Move new screens into the &lt;code&gt;app/&lt;/code&gt; directory with Expo Router structure&lt;/li&gt;
&lt;li&gt;Keep existing React Navigation navigators for parts you haven’t migrated&lt;/li&gt;
&lt;li&gt;Gradually move existing screens into &lt;code&gt;app/&lt;/code&gt; as you touch them&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It’s not a weekend migration for a large app, but the incremental path is real.&lt;/p&gt;
&lt;p&gt;For new projects in 2026, Expo Router is the default unless you have specific reasons to go with raw React Navigation. The conventions it provides are the same ones web developers already know, and the deep linking and web support you’d otherwise configure manually comes for free.&lt;/p&gt;</content:encoded><category>Web Development</category><category>React Native</category><category>Mobile</category><category>JavaScript</category><category>TypeScript</category><category>2026</category><author>Anurag Verma</author></item><item><title>Fastify in 2026: The Node.js API Framework That Stayed When Everyone Left</title><link>https://blog.codercops.com/blog/fastify-nodejs-api-framework-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/fastify-nodejs-api-framework-2026/</guid><description>While the JavaScript ecosystem chased Bun, Deno, and edge runtimes, Fastify quietly became the production choice for high-throughput Node.js APIs. Here&apos;s why it&apos;s still the right call for many teams.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The JavaScript backend ecosystem has fragmented a lot in the last two years. Bun ships its own web framework. Deno has its own standard library. Edge runtimes run Workers, not Node.js. Meanwhile, the question of “what do I use for a production Node.js API?” has a quieter, less hyped answer: Fastify.&lt;/p&gt;
&lt;p&gt;Fastify isn’t new. It launched in 2016. But it’s been compounding improvements methodically, and in 2026 it handles a genuinely compelling combination: performance close to the theoretical Node.js ceiling, a schema-based validation system that generates OpenAPI docs automatically, a plugin architecture that scales from a single file to a hundred-module system, and TypeScript support that actually works without ceremony.&lt;/p&gt;
&lt;p&gt;This isn’t an argument that Fastify beats Hono or Bun’s built-in server on benchmarks. For edge deployments or maximum raw throughput, those tools have their place. This is about building a maintainable, well-documented API that runs on Node.js and needs to serve production traffic for years.&lt;/p&gt;
&lt;h2 id=&quot;the-basics&quot;&gt;The Basics&lt;/h2&gt;
&lt;p&gt;Install and the simplest possible server:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; Fastify &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;fastify&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; fastify&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; Fastify&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ logger: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;fastify.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;/health&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { status: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;ok&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, time: &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; Date&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;toISOString&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;() }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; fastify.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;listen&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ port: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;3000&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, host: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;0.0.0.0&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; })&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’s it. No separate listen callback, no &lt;code&gt;req&lt;/code&gt;/&lt;code&gt;res&lt;/code&gt; ceremony. Routes return values or promises, and Fastify serializes them.&lt;/p&gt;
&lt;h2 id=&quot;schema-validation&quot;&gt;Schema Validation&lt;/h2&gt;
&lt;p&gt;The biggest practical difference from Express is schema-first route definitions. You define the shape of request and response, and Fastify validates incoming requests and serializes responses using fast-json-stringify (which pre-compiles JSON serialization for each schema, typically 2-5x faster than &lt;code&gt;JSON.stringify&lt;/code&gt;).&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; Fastify, { FastifyRequest, FastifyReply } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;fastify&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; fastify&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; Fastify&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// Define schema shapes inline using JSON Schema&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; createUserSchema&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  body: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    type: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;object&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    required: [&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;email&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;name&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    properties: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      email: { type: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;string&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, format: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;email&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      name: { type: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;string&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, minLength: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, maxLength: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      role: { type: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;string&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, enum: [&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;admin&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;member&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;viewer&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;], default: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;member&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    additionalProperties: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  response: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;    201&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      type: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;object&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      properties: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        id: { type: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;string&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, format: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;uuid&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        email: { type: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;string&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        name: { type: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;string&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        role: { type: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;string&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        createdAt: { type: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;string&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, format: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;date-time&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; const&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;fastify.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;post&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;  &apos;/users&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  { schema: createUserSchema },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  async&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;req&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; FastifyRequest&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;{ &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;Body&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;email&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; } }&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;reply&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; FastifyReply&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;email&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;member&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; req.body&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;    // req.body is already validated — email is a valid email, name is within length limits&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; user&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; db.users.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ email, name, role })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    reply.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;201&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; user&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Invalid requests (missing required fields, wrong types, values outside enum) get a &lt;code&gt;400&lt;/code&gt; response with a structured error automatically. No validation middleware to write.&lt;/p&gt;
&lt;p&gt;The response schema does double duty: it strips any fields not listed in the schema (preventing accidental data leaks) and enables fast serialization.&lt;/p&gt;
&lt;h2 id=&quot;typebox-for-typescript-integration&quot;&gt;TypeBox for TypeScript Integration&lt;/h2&gt;
&lt;p&gt;Writing JSON Schema by hand gets tedious in TypeScript. TypeBox generates JSON Schema from TypeScript types:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { Type, Static } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;@sinclair/typebox&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; Fastify, { FastifyRequest } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;fastify&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { TypeBoxTypeProvider } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;@fastify/type-provider-typebox&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; fastify&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; Fastify&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;withTypeProvider&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;TypeBoxTypeProvider&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; CreateProductBody&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; Type.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;Object&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  name: Type.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ minLength: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, maxLength: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  price: Type.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;Number&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ minimum: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  sku: Type.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ pattern: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;^[A-Z]{3}-&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;\\&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;d{4}$&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  categoryId: Type.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;Optional&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(Type.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ format: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;uuid&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; })),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; ProductResponse&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; Type.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;Object&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  id: Type.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ format: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;uuid&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  name: Type.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  price: Type.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;Number&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  sku: Type.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  createdAt: Type.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ format: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;date-time&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;fastify.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;post&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;  &apos;/products&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    schema: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      body: CreateProductBody,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      response: { &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;201&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: ProductResponse },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  async&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;req&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;    // req.body is typed as Static&amp;#x3C;typeof CreateProductBody&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;    // TypeScript knows the shape without extra type assertions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;price&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;sku&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;categoryId&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; req.body&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; product&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; db.products.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ name, price, sku, categoryId })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; product&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With &lt;code&gt;TypeBoxTypeProvider&lt;/code&gt;, TypeScript infers request body types directly from your schema. No separate interface declarations, no casting.&lt;/p&gt;
&lt;h2 id=&quot;the-plugin-system&quot;&gt;The Plugin System&lt;/h2&gt;
&lt;p&gt;Fastify’s plugin system is where it scales beyond a single file. Plugins are functions that extend the Fastify instance with routes, decorators, and hooks, with scope isolation.&lt;/p&gt;
&lt;p&gt;A typical structure for a medium-sized API:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;src/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  server.ts          — creates and configures the Fastify instance&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  plugins/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    db.ts            — database connection, registers env.db on fastify instance  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    auth.ts          — registers preHandler hook for JWT verification&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    swagger.ts       — registers @fastify/swagger for OpenAPI docs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  routes/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    users/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      index.ts       — registers user routes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      schema.ts      — TypeBox schemas for user routes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    products/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      index.ts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      schema.ts&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// src/plugins/db.ts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; fp &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;fastify-plugin&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { drizzle } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;drizzle-orm/node-postgres&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;declare&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; module&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;fastify&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  interface&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; FastifyInstance&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;    db&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; ReturnType&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;typeof&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; drizzle&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; fp&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; (fastify) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; db&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; drizzle&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(process.env.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;DATABASE_URL&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  fastify.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;decorate&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;db&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, db)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// src/routes/users/index.ts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { FastifyInstance } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;fastify&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; { CreateUserBody, UserResponse } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;./schema&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; userRoutes&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;(fastify&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; FastifyInstance) &lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  fastify.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;post&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;/&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    schema: { body: CreateUserBody, response: { &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;201&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: UserResponse } },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }, &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;req&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; fastify.db.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;insert&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(users).&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;values&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(req.body).&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;returning&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  fastify.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;/:id&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    schema: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      params: Type.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;Object&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ id: Type.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ format: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;uuid&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; }) }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      response: { &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;: UserResponse },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }, &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;req&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; fastify.db.query.users.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;findFirst&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      where: &lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;eq&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(users.id, req.params.id)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// src/server.ts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; Fastify &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;fastify&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; dbPlugin &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;./plugins/db&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; authPlugin &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;./plugins/auth&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; userRoutes &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;./routes/users&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; productRoutes &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;./routes/products&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; fastify&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; Fastify&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ logger: { level: process.env.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;LOG_LEVEL&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; ??&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;info&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; } })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; fastify.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;register&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(dbPlugin)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; fastify.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;register&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(authPlugin)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// Route prefix scoping&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; fastify.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;register&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(userRoutes, { prefix: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;/users&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; fastify.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;register&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(productRoutes, { prefix: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;/products&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; fastify&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;fastify-plugin&lt;/code&gt; wrapper (&lt;code&gt;fp&lt;/code&gt;) breaks scope isolation deliberately. It makes the database decorator available to all routes. Routes registered with &lt;code&gt;fastify.register()&lt;/code&gt; without &lt;code&gt;fp&lt;/code&gt; get an isolated scope: decorators registered inside that scope don’t leak out.&lt;/p&gt;
&lt;h2 id=&quot;auto-generated-openapi-docs&quot;&gt;Auto-Generated OpenAPI Docs&lt;/h2&gt;
&lt;p&gt;Add &lt;code&gt;@fastify/swagger&lt;/code&gt; and &lt;code&gt;@fastify/swagger-ui&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; swagger &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;@fastify/swagger&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; swaggerUI &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &apos;@fastify/swagger-ui&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; fastify.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;register&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(swagger, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  openapi: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    info: { title: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;My API&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, version: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;1.0.0&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    components: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      securitySchemes: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        bearerAuth: { type: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;http&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, scheme: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;bearer&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, bearerFormat: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;JWT&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; fastify.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;register&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(swaggerUI, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  routePrefix: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;/docs&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  uiConfig: { deepLinking: &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Every route with a schema definition shows up in &lt;code&gt;/docs&lt;/code&gt; automatically. The OpenAPI spec is generated at runtime from the same TypeBox schemas that validate your requests. No separate spec file to maintain.&lt;/p&gt;
&lt;h2 id=&quot;hooks&quot;&gt;Hooks&lt;/h2&gt;
&lt;p&gt;Fastify’s hook system gives you lifecycle points without middleware stacks:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// Run before every route handler — authentication check&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;fastify.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;addHook&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;preHandler&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;reply&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; auth&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; request.headers.authorization&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;auth?.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;startsWith&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;Bearer &apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    reply.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;401&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;send&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ error: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;Missing token&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    return&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  try&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    request.user &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; verifyToken&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(auth.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;slice&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;7&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  } &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    reply.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;401&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;send&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ error: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;Invalid token&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// Run after response is sent — logging, cleanup&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;fastify.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;addHook&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;onSend&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;reply&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;payload&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  fastify.log.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;info&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    method: request.method,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    url: request.url,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    statusCode: reply.statusCode,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    responseTime: reply.elapsedTime,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; payload &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;// Must return payload&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The hook chain is explicit and ordered. You know exactly when each hook runs relative to route handlers.&lt;/p&gt;
&lt;h2 id=&quot;error-handling&quot;&gt;Error Handling&lt;/h2&gt;
&lt;p&gt;Fastify’s error model separates framework errors from application errors cleanly:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// Custom error class&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; AppError&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; extends&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; Error&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  constructor&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    public&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; statusCode&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;    message&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    public&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; code&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; string&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  ) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;    super&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(message)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;// Global error handler&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;fastify.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;setErrorHandler&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;reply&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (error &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;instanceof&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; AppError&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    reply.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(error.statusCode).&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;send&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      error: error.message,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      code: error.code,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    return&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;  // Fastify validation errors&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (error.validation) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    reply.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;400&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;send&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      error: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;Validation failed&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      details: error.validation,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    return&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;  // Unexpected errors&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  fastify.log.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(error)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  reply.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;500&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;send&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ error: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;Internal server error&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;choosing-between-fastify-hono-and-nestjs&quot;&gt;Choosing Between Fastify, Hono, and NestJS&lt;/h2&gt;
&lt;p&gt;These three cover most production Node.js (and beyond) use cases in 2026:&lt;/p&gt;





















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Fastify&lt;/th&gt;&lt;th&gt;Hono&lt;/th&gt;&lt;th&gt;NestJS&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Runtime&lt;/td&gt;&lt;td&gt;Node.js primarily&lt;/td&gt;&lt;td&gt;Any (Bun, Deno, Workers)&lt;/td&gt;&lt;td&gt;Node.js&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Schema validation&lt;/td&gt;&lt;td&gt;JSON Schema / TypeBox&lt;/td&gt;&lt;td&gt;Zod / Valibot&lt;/td&gt;&lt;td&gt;class-validator&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Learning curve&lt;/td&gt;&lt;td&gt;Low-medium&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;High&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Boilerplate&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;Very low&lt;/td&gt;&lt;td&gt;High&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Plugin ecosystem&lt;/td&gt;&lt;td&gt;Mature&lt;/td&gt;&lt;td&gt;Growing&lt;/td&gt;&lt;td&gt;Mature&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OpenAPI generation&lt;/td&gt;&lt;td&gt;Built-in&lt;/td&gt;&lt;td&gt;Add-on&lt;/td&gt;&lt;td&gt;Add-on&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Best for&lt;/td&gt;&lt;td&gt;Node.js APIs needing performance&lt;/td&gt;&lt;td&gt;Edge deployments, multi-runtime&lt;/td&gt;&lt;td&gt;Enterprise apps with Spring-like patterns&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Fastify wins when you’re committed to Node.js, want automatic OpenAPI generation, and need a mature plugin ecosystem. Hono wins when you might deploy to Workers or Bun and want maximum portability. NestJS wins when your team comes from a Java/Spring background and wants decorators and dependency injection.&lt;/p&gt;
&lt;h2 id=&quot;deploying&quot;&gt;Deploying&lt;/h2&gt;
&lt;p&gt;Fastify runs anywhere Node.js runs. One note: the &lt;code&gt;listen&lt;/code&gt; call should bind to &lt;code&gt;0.0.0.0&lt;/code&gt; in containers, not &lt;code&gt;127.0.0.1&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; fastify.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;listen&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({ port: &lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;Number&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(process.env.&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;PORT&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; ??&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 3000&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;), host: &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;0.0.0.0&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; })&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For graceful shutdown in Kubernetes or similar:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; shutdown&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;signal&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  fastify.log.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;info&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;`Received ${&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;signal&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;}, shutting down`&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  await&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; fastify.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;close&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;  process.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;exit&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;process.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;SIGTERM&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, () &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; shutdown&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;SIGTERM&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;process.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;SIGINT&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, () &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; shutdown&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&apos;SIGINT&apos;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;fastify.close()&lt;/code&gt; calls the &lt;code&gt;onClose&lt;/code&gt; hooks (where you’d close database connections) and waits for in-flight requests to complete before returning.&lt;/p&gt;
&lt;p&gt;The case for Fastify in 2026 isn’t novelty. It’s reliability. The schema-first design catches bugs at the boundary, the OpenAPI generation keeps documentation honest, and the plugin system keeps complexity manageable as projects grow. It’s not flashy, but it’s a tool that keeps working.&lt;/p&gt;</content:encoded><category>Web Development</category><category>Node.js</category><category>Backend</category><category>JavaScript</category><category>API</category><category>2026</category><author>Anurag Verma</author></item><item><title>Phoenix LiveView: Real-Time Web Features Without Writing a Line of JavaScript</title><link>https://blog.codercops.com/blog/phoenix-liveview-real-time-web-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/phoenix-liveview-real-time-web-2026/</guid><description>Phoenix LiveView lets you build real-time, interactive UIs with server-side Elixir and minimal JavaScript. Here&apos;s how it works, where it shines, and what you give up compared to React.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Most real-time web features follow the same pattern: a React frontend, a WebSocket server, some state management library, and a lot of code synchronizing what the server knows with what the browser shows. It works, but there’s a lot of surface area: two runtimes, two state models, coordination logic.&lt;/p&gt;
&lt;p&gt;Phoenix LiveView takes a different path. The server renders HTML, sends it over a persistent WebSocket connection, and patches the DOM when state changes. You write Elixir on the server, and the browser handles the DOM diffing. For the right use cases, it cuts the complexity down significantly.&lt;/p&gt;
&lt;p&gt;This post is for developers already comfortable with React or another frontend framework who want to understand what the LiveView model offers and where it falls short.&lt;/p&gt;
&lt;h2 id=&quot;what-elixir-and-phoenix-are&quot;&gt;What Elixir and Phoenix Are&lt;/h2&gt;
&lt;p&gt;Before LiveView, a quick orientation:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Elixir&lt;/strong&gt; is a functional language built on the Erlang VM (BEAM). It inherits Erlang’s concurrency model: lightweight processes, message passing, and fault tolerance built into the runtime. A typical Elixir application runs millions of processes concurrently. Each process has its own memory and fails independently. One process crash doesn’t bring down others.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Phoenix&lt;/strong&gt; is Elixir’s web framework. It’s fast (handling hundreds of thousands of WebSocket connections per server is routine), and it uses channels as the abstraction for persistent connections. LiveView is built on top of Phoenix Channels.&lt;/p&gt;
&lt;h2 id=&quot;the-liveview-model&quot;&gt;The LiveView Model&lt;/h2&gt;
&lt;p&gt;When a user loads a LiveView page, this happens:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The server renders the initial HTML and sends it in the HTTP response (fast first paint, crawlable content).&lt;/li&gt;
&lt;li&gt;The page loads a small JavaScript client (~50KB) that opens a WebSocket back to the server.&lt;/li&gt;
&lt;li&gt;The server keeps a process alive for this connection. This process holds the UI state.&lt;/li&gt;
&lt;li&gt;When state changes (user clicks a button, a database record updates, a timer fires), the server re-renders just the changed parts and sends a minimal diff to the client.&lt;/li&gt;
&lt;li&gt;The JavaScript client applies the diff to the DOM.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From the developer’s perspective, you write one template and one Elixir module. The framework handles the WebSocket, the diffing, and the DOM updates.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;elixir&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;# lib/my_app_web/live/counter_live.ex&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;defmodule&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; MyAppWeb&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;CounterLive&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  use&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; MyAppWeb&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:live_view&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; mount&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;_params&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;_session&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, socket) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    {&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:ok&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;assign&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(socket, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;count:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; handle_event&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;increment&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;_params&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, socket) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    {&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:noreply&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;update&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(socket, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:count&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &amp;#x26;(&amp;#x26;1 &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;))}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; handle_event&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;decrement&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;_params&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, socket) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    {&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:noreply&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;update&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(socket, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:count&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &amp;#x26;(&amp;#x26;1 &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;))}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; render&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(assigns) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    ~H&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;counter&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; phx-click&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;decrement&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;-&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&amp;#x3C;%= @count %&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; phx-click&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;increment&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;+&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;phx-click&lt;/code&gt; attribute tells LiveView to send the &lt;code&gt;&quot;increment&quot;&lt;/code&gt; event to the server when clicked. The server handles it, updates the socket state, and the framework sends a diff back. No JavaScript written.&lt;/p&gt;
&lt;h2 id=&quot;a-live-search-example&quot;&gt;A Live Search Example&lt;/h2&gt;
&lt;p&gt;A more practical case: a search input that filters results in real-time as the user types.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;elixir&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;defmodule&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; MyAppWeb&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;SearchLive&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  use&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; MyAppWeb&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:live_view&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  alias&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; MyApp&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;Products&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; mount&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;_params&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;_session&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, socket) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    {&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:ok&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;assign&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(socket, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;query:&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;results:&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; [], &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;loading:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; handle_event&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;search&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, %{&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;query&quot;&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; query}, socket) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    socket &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; assign&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(socket, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;query:&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; query, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;loading:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;    # In a real app, use Task.async or Phoenix.PubSub for async search&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    results &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Products&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;search&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(query)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    {&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:noreply&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;assign&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(socket, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;results:&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; results, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;loading:&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; render&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(assigns) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    ~H&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;input&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;        type&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;        value&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;{@query}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;        phx-input&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;search&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;        phx-debounce&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;300&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;        placeholder&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;Search products...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;%= if @loading do %&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;spinner&quot;&lt;/span&gt;&lt;span style=&quot;color:#FF938A;font-style:italic&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;% else %&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;          &amp;#x3C;%= for product &amp;#x3C;- @results do %&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;            &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;              &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;strong&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&amp;#x3C;%= product.name %&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;strong&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;              &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&amp;#x3C;%= product.price %&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;            &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;          &amp;#x3C;% end %&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;% end %&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;phx-debounce=&quot;300&quot;&lt;/code&gt; attribute delays sending the event until the user stops typing for 300ms. The debouncing is handled client-side by the LiveView JavaScript library. No custom debounce code.&lt;/p&gt;
&lt;h2 id=&quot;real-time-updates-via-pubsub&quot;&gt;Real-Time Updates via PubSub&lt;/h2&gt;
&lt;p&gt;LiveView integrates tightly with Phoenix PubSub. When a record changes anywhere in the system (another user’s action, a background job, an external event), you can push the update to all subscribers:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;elixir&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;defmodule&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; MyAppWeb&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;OrdersLive&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  use&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; MyAppWeb&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:live_view&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  alias&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; MyApp&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;Orders&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  alias&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Phoenix&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;PubSub&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; mount&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;_params&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, %{&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;user_id&quot;&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; user_id}, socket) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; connected?&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(socket) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;      # Only subscribe after the WebSocket is open (not during HTTP render)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;      PubSub&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;subscribe&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;MyApp&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;PubSub&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;orders:&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;#{&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;user_id&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    orders &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Orders&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;list_for_user&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(user_id)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    {&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:ok&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;assign&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(socket, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;orders:&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; orders, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;user_id:&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; user_id)}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;  # Called when a PubSub message arrives&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; handle_info&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;({&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:order_updated&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, order}, socket) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    updated_orders &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      socket.assigns.orders&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;      |&gt;&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Enum&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; o &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;-&gt;&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; o.id &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; order.id, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;do:&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; order, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;else:&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; o &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    {&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:noreply&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;assign&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(socket, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;orders:&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; updated_orders)}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; render&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(assigns) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    ~H&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;table&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;tbody&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        &amp;#x3C;%= for order &amp;#x3C;- @orders do %&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;          &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;tr&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#FF938A;font-style:italic&quot;&gt;&quot;order-#{order.id}&quot;}&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;            &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;td&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&amp;#x3C;%= order.id %&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;td&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;            &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;td&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&amp;#x3C;%= order.status %&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;td&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;            &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;td&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&amp;#x3C;%= order.total %&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;td&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;          &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;tr&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        &amp;#x3C;% end %&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;tbody&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8DDB8C&quot;&gt;table&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When a background job updates an order status and broadcasts to &lt;code&gt;&quot;orders:user_123&quot;&lt;/code&gt;, every LiveView connected for that user gets the update and re-renders the row. The browser sees a targeted DOM patch, not a full page reload.&lt;/p&gt;
&lt;h2 id=&quot;forms-and-validation&quot;&gt;Forms and Validation&lt;/h2&gt;
&lt;p&gt;LiveView has built-in form handling that gives you live validation feedback without submitting the form:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;elixir&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;defmodule&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; MyAppWeb&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;RegistrationLive&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  use&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; MyAppWeb&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:live_view&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  alias&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; MyApp&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;Accounts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  alias&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; MyApp&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;Accounts&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;User&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; mount&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;_params&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;_session&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, socket) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    changeset &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Accounts&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;change_user&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(%&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;User&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;{})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    {&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:ok&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;assign&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(socket, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;form:&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; to_form&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(changeset))}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; handle_event&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;validate&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, %{&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; params}, socket) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    changeset &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;=&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      %&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;User&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;{}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;      |&gt;&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Accounts&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;change_user&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(params)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;      |&gt;&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Map&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;put&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:action&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:validate&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    {&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:noreply&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;assign&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(socket, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;form:&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; to_form&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(changeset))}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; handle_event&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;save&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, %{&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt; =&gt;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt; params}, socket) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    case&lt;/span&gt;&lt;span style=&quot;color:#F69D50&quot;&gt; Accounts&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;create_user&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(params) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      {&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:ok&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#768390&quot;&gt;_user&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;-&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        {&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:noreply&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;push_navigate&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(socket, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;to:&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; &quot;/dashboard&quot;&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;)}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      {&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:error&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, changeset} &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;-&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;        {&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;:noreply&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt;assign&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(socket, &lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;form:&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; to_form&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(changeset))}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCBDFB&quot;&gt; render&lt;/span&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;(assigns) &lt;/span&gt;&lt;span style=&quot;color:#F47067&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    ~H&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &amp;#x3C;.form for={@form} phx-change=&quot;validate&quot; phx-submit=&quot;save&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;.input field={@form[:email]} type=&quot;email&quot; label=&quot;Email&quot; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;.input field={@form[:password]} type=&quot;password&quot; label=&quot;Password&quot; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;      &amp;#x3C;.button type=&quot;submit&quot;&gt;Create account&amp;#x3C;/.button&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &amp;#x3C;/.form&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ADBAC7&quot;&gt;    &quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F47067&quot;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;phx-change=&quot;validate&quot;&lt;/code&gt; sends the form values to the server on every change. The server runs the changeset validation and sends back the errors. The form shows inline error messages as the user types. No client-side validation code, no synchronization between client and server validation rules.&lt;/p&gt;
&lt;h2 id=&quot;what-liveview-gives-up-compared-to-react&quot;&gt;What LiveView Gives Up Compared to React&lt;/h2&gt;
&lt;p&gt;LiveView is compelling for the use cases it fits, but the tradeoffs are real.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Network round-trip on every interaction.&lt;/strong&gt; Every click, input, and event goes to the server. If the user is on a slow connection, interactions feel sluggish. React can handle most interactions offline and sync later.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JavaScript ecosystem access is limited.&lt;/strong&gt; You can add JavaScript hooks for things LiveView can’t do (rich text editors, file uploads with previews, canvas drawing), but you’re working against the grain. A complex drag-and-drop or animation-heavy interface is genuinely harder in LiveView.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Server resources per connection.&lt;/strong&gt; Each connected LiveView is a running Elixir process. The BEAM handles millions of processes, so this isn’t a concern in most cases, but it’s a different mental model from stateless HTTP endpoints.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Smaller ecosystem.&lt;/strong&gt; Phoenix and Elixir have good libraries, but they’re a fraction of what the Node.js ecosystem offers. If you need a specific third-party integration, you’ll check if an Elixir library exists before choosing LiveView.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Learning curve.&lt;/strong&gt; Elixir’s functional style, pattern matching, and process model take a few weeks to get comfortable with if you’re coming from JavaScript.&lt;/p&gt;
&lt;h2 id=&quot;where-liveview-wins&quot;&gt;Where LiveView Wins&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Admin interfaces and internal tools.&lt;/strong&gt; Data tables, form editing, real-time dashboards. These don’t need the full power of React and benefit from LiveView’s simplicity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SaaS dashboards with real-time data.&lt;/strong&gt; Order status pages, analytics views, notification feeds. LiveView’s PubSub integration makes these straightforward.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Collaborative features.&lt;/strong&gt; Shared whiteboards, multi-user forms, live presence indicators. The process model maps naturally to “who is connected and what are they doing.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Teams with Elixir expertise.&lt;/strong&gt; If your backend team already knows Elixir, adding LiveView means one language instead of two. That’s a significant advantage for small teams.&lt;/p&gt;
&lt;h2 id=&quot;htmx-vs-liveview&quot;&gt;HTMX vs LiveView&lt;/h2&gt;
&lt;p&gt;Both approaches use server-rendered HTML updates instead of a JavaScript SPA, but they’re meaningfully different.&lt;/p&gt;
&lt;p&gt;HTMX is a JavaScript library you add to existing HTML. It works with any backend: Rails, Django, FastAPI. It enhances specific elements with dynamic behavior via attributes. It’s simpler and easier to adopt incrementally.&lt;/p&gt;
&lt;p&gt;LiveView is a framework with its own opinions about state management and process lifecycle. It’s more opinionated and more capable for complex real-time scenarios. The persistent connection and server-side process model enable patterns that HTMX can’t do cleanly.&lt;/p&gt;
&lt;p&gt;If you have an existing Ruby or Python backend, HTMX is the more practical path. If you’re starting fresh and want real-time-first, LiveView with Elixir is worth evaluating seriously.&lt;/p&gt;
&lt;h2 id=&quot;getting-started&quot;&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;The quickest way to try it:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark-dimmed&quot; style=&quot;background-color:#22272e;color:#adbac7; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;# Install Elixir (macOS)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;brew&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; elixir&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;# Install Phoenix project generator&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;mix&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; archive.install&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; hex&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; phx_new&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#768390&quot;&gt;# Create a new project with LiveView&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;mix&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; phx.new&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; my_app&lt;/span&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt; --live&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6CB6FF&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; my_app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;mix&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; deps.get&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;mix&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; ecto.create&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;mix&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; ecto.migrate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F69D50&quot;&gt;mix&lt;/span&gt;&lt;span style=&quot;color:#96D0FF&quot;&gt; phx.server&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Visit &lt;code&gt;http://localhost:4000&lt;/code&gt; and you’ll see the default Phoenix welcome page. The generated app includes a LiveView counter at &lt;code&gt;/dev/dashboard&lt;/code&gt; you can inspect.&lt;/p&gt;
&lt;p&gt;The Phoenix documentation is genuinely excellent. The LiveView guides walk through the programming model clearly. The official HexDocs for &lt;code&gt;Phoenix.LiveView&lt;/code&gt; are worth reading even before you start a project, just to understand what the framework handles for you and what you’re responsible for.&lt;/p&gt;
&lt;p&gt;For teams evaluating it: build a small internal tool before committing to LiveView for a customer-facing product. The model clicks after a couple of days of hands-on work in a way it doesn’t from reading about it.&lt;/p&gt;</content:encoded><category>Web Development</category><category>Elixir</category><category>Backend</category><category>Web Development</category><category>Real-Time</category><category>2026</category><author>Anurag Verma</author></item><item><title>Turning Agency Work Into Products: The IP Playbook</title><link>https://blog.codercops.com/blog/agency-ip-productization-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/agency-ip-productization-2026/</guid><description>Most agency IP sits unused in client project folders. Here&apos;s how to identify what&apos;s worth extracting, how to package it, and how to build recurring revenue from work you&apos;ve already done.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;After a few years of client work, most agencies have built the same thing four or five times. A multi-tenant authentication system. A CMS integration layer. A notification pipeline. An e-commerce checkout that’s actually been tested in production. Each time, it gets rebuilt from scratch or copied between projects in ways that create maintenance headaches.&lt;/p&gt;
&lt;p&gt;The code exists. The patterns exist. The lesson learned from the thing that broke in production on project three exists. The question is whether any of it becomes a business asset or just stays in a folder labeled “old client projects.”&lt;/p&gt;
&lt;p&gt;Productization is the process of taking repeatable agency work and packaging it as something with standalone value: a SaaS tool, an internal library, a starter template, a productized service, a plugin. Done well, it creates recurring revenue from work you’ve already done. Done poorly, it creates a distraction that competes with your core client work.&lt;/p&gt;
&lt;p&gt;Here’s how to tell the difference.&lt;/p&gt;
&lt;h2 id=&quot;whats-worth-extracting&quot;&gt;What’s Worth Extracting&lt;/h2&gt;
&lt;p&gt;Not everything that gets rebuilt deserves productization. The signal to look for is a combination of:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;High rebuild frequency.&lt;/strong&gt; If you’ve built the same pattern three or more times in the past two years, you’ll build it again. That’s your supply side.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Client willingness to pay separately.&lt;/strong&gt; If clients treat this component as a cost center (“just wire up the auth”), it probably won’t support product pricing. If they’ve ever asked “can we get the same thing you built for client X?” you have demand-side signal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Low client-specific customization.&lt;/strong&gt; The more a piece of work is shaped by one client’s specific business rules, the harder it is to generalize. Multi-tenancy patterns are highly generalizable. A custom workflow for one company’s approval process is not.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Maintenance surface you control.&lt;/strong&gt; You can productize internal tooling that you update when you want. You should not productize something where a single client’s changing requirements drive the roadmap.&lt;/p&gt;
&lt;p&gt;The highest-value candidates are usually:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Authentication and user management patterns (every web project needs them)&lt;/li&gt;
&lt;li&gt;CMS integration layers (especially when a client reuses the same headless CMS)&lt;/li&gt;
&lt;li&gt;Notification systems (email + SMS + push with unified delivery tracking)&lt;/li&gt;
&lt;li&gt;Admin panel scaffolding (generic enough to be useful, specific enough to save meaningful time)&lt;/li&gt;
&lt;li&gt;Internal tooling for your team’s own operations (billing integrations, client portals, project trackers)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-four-models-of-agency-productization&quot;&gt;The Four Models of Agency Productization&lt;/h2&gt;
&lt;p&gt;Once you’ve identified a candidate, you have four packaging options with different economics:&lt;/p&gt;
&lt;h3 id=&quot;1-starter-templates&quot;&gt;1. Starter Templates&lt;/h3&gt;
&lt;p&gt;The lowest-investment option. You extract a project scaffold into a template repository and sell it once. Pricing is typically one-time: $200-1500 for a complete project starter. Revenue scales with distribution, not with your time.&lt;/p&gt;
&lt;p&gt;Good candidates: full-stack starters with a specific tech combination (Next.js + Supabase + Stripe + Resend), Figma component libraries with real component sets, CI/CD pipeline configurations.&lt;/p&gt;
&lt;p&gt;The margin is high but revenue is lumpy. Templates work well as lead generation for your agency (buyers become potential clients) or as passive income supplements.&lt;/p&gt;
&lt;h3 id=&quot;2-internal-libraries&quot;&gt;2. Internal Libraries&lt;/h3&gt;
&lt;p&gt;You package a reusable component or service as an internal library that your team uses across all projects. This isn’t sold externally — it’s an investment in internal efficiency.&lt;/p&gt;
&lt;p&gt;The ROI calculation is straightforward: if the library saves 20 hours per project and you run 8 projects per year, that’s 160 hours saved at your billing rate. At $150/hour, that’s $24,000 in recovered capacity annually from a one-time investment.&lt;/p&gt;
&lt;p&gt;Internal libraries often become the most valuable agency IP because they compound. Each improvement benefits all future projects.&lt;/p&gt;
&lt;h3 id=&quot;3-productized-services&quot;&gt;3. Productized Services&lt;/h3&gt;
&lt;p&gt;You package a scope of work as a fixed-price, fixed-deliverable service with a well-defined process. The “product” here is the process and the output, not software.&lt;/p&gt;
&lt;p&gt;Examples: a three-week performance audit at $4,500, a four-day security review, a two-week AI feature integration package. The value is in the repeatable process that lets you deliver predictably and at lower cost than custom-scoped work.&lt;/p&gt;
&lt;p&gt;Productized services are the fastest to market. There’s no software to build. You’re packaging existing expertise into a named offering with a clear outcome. Revenue starts on day one.&lt;/p&gt;
&lt;h3 id=&quot;4-saas-tools&quot;&gt;4. SaaS Tools&lt;/h3&gt;
&lt;p&gt;The highest-complexity, highest-ceiling option. You build something client-adjacent that small businesses or other agencies would pay for monthly.&lt;/p&gt;
&lt;p&gt;This is the path most agency founders want to take, and the one that most frequently fails. SaaS requires a different discipline from client work: building in public, managing support volume, shipping to an opinionated general audience instead of a single client with known requirements.&lt;/p&gt;
&lt;p&gt;Before building a SaaS, ask honestly: are you solving a problem for the market, or building the tool you wish you’d had on your last project? The second is a product you’ll understand deeply. The first is the one other people will pay for. Often these are the same thing, but verify before you build.&lt;/p&gt;
&lt;h2 id=&quot;the-extraction-process&quot;&gt;The Extraction Process&lt;/h2&gt;
&lt;p&gt;Once you’ve picked a candidate and a model, the extraction process follows the same steps regardless:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Document the current state.&lt;/strong&gt; Write down what the existing code does, where the client-specific parts are, and what would need to change to make it general. This takes 2-4 hours and will surface most of the generalization problems before you’ve written any new code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Define the interface, not the implementation.&lt;/strong&gt; For a library or template, start with the API surface — what does a consumer of this thing see and interact with? Get the interface right before building the internals. Interface mistakes are expensive to fix after launch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Separate the general from the specific.&lt;/strong&gt; Client-specific business logic goes out. Configuration surfaces come in. A notification system that’s hardcoded to one client’s Postmark account becomes a notification system that accepts provider configuration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Write the integration guide before the code.&lt;/strong&gt; Writing the README before the implementation forces you to think about the developer experience from the outside. If the integration guide is confusing to write, the API is confusing to use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Time-box the build.&lt;/strong&gt; A template should take one week to extract and polish. A library, two to four weeks. A productized service, a few days of documentation and process mapping. A SaaS product requires a separate business plan, not a time-box.&lt;/p&gt;
&lt;h2 id=&quot;pricing-productized-work&quot;&gt;Pricing Productized Work&lt;/h2&gt;
&lt;p&gt;Productized work is priced on value, not on time. The buyer doesn’t care how long the template took to build — they care what it would cost to build the equivalent themselves.&lt;/p&gt;
&lt;p&gt;A Next.js + Stripe + Supabase starter that includes production-ready auth, billing, and email infrastructure saves a competent developer 30-50 hours. At a senior developer’s rate of $150/hour, that’s $4,500-7,500 of value. Pricing it at $200-500 is reasonable for a template; pricing it at $1,000-2,000 for an agency-quality implementation with support is also defensible.&lt;/p&gt;
&lt;p&gt;For productized services, anchor to the outcome rather than the input. “Security audit” is less compelling than “a report that tells you exactly which vulnerabilities would fail a client’s compliance review and how to fix them before it becomes your problem.”&lt;/p&gt;
&lt;h2 id=&quot;the-realistic-timeline&quot;&gt;The Realistic Timeline&lt;/h2&gt;
&lt;p&gt;Productization is a parallel investment, not a replacement for client work. The realistic timeline:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Month 1: Pick one candidate. Document it. Define the interface.&lt;/li&gt;
&lt;li&gt;Month 2-3: Build the extracted version. Use it on one internal or client project.&lt;/li&gt;
&lt;li&gt;Month 4: Publish and see if anyone buys it without you explaining it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most productization efforts stall because agencies try to build something polished before they’ve validated whether anyone wants it. A rough template with clear documentation sells better than a perfect one nobody can find.&lt;/p&gt;
&lt;p&gt;The distribution question matters as much as the product. For templates: sell on Gumroad or a personal site, not on marketplaces that commoditize. For productized services: your existing client base is the first market. For SaaS: budget for marketing before you budget for features.&lt;/p&gt;
&lt;h2 id=&quot;what-not-to-productize&quot;&gt;What Not to Productize&lt;/h2&gt;
&lt;p&gt;A few traps to avoid:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Client work where the IP belongs to them.&lt;/strong&gt; Check your contracts. Most agency agreements transfer IP to the client on payment. If you want to retain rights to patterns you build, that needs to be in the contract before the work starts, not extracted after.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Things that are only useful with your specific setup.&lt;/strong&gt; A tool that solves a problem unique to your team’s workflow is useful internally. It’s probably not a product.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Whatever is currently your biggest client bottleneck.&lt;/strong&gt; Don’t start a productization project with bandwidth that your clients are currently waiting on. The best time to build a product side is when client work is slightly slow, not when you’re already stretched.&lt;/p&gt;
&lt;p&gt;The agencies that build durable product revenue start small — one template, one productized service, one internal library — and reinvest the early revenue into the next layer. It compounds slowly and then faster than expected.&lt;/p&gt;
&lt;p&gt;The core work is already done. What’s sitting in your project folders?&lt;/p&gt;</content:encoded><category>Business</category><category>Agency</category><category>Business</category><category>Pricing</category><category>Career</category><category>2026</category><author>Anurag Verma</author></item><item><title>NATS JetStream in Production: When Kafka Is Too Much</title><link>https://blog.codercops.com/blog/nats-jetstream-production-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/nats-jetstream-production-2026/</guid><description>Kafka is the default answer for message queuing at scale. But for teams running fewer than a million messages per day, NATS JetStream offers persistence, delivery guarantees, and a dramatically simpler operational footprint.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Backend</category><category>Infrastructure</category><category>Cloud &amp; Infrastructure</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>Prometheus and Grafana: Production Monitoring Without the Complexity Tax</title><link>https://blog.codercops.com/blog/prometheus-grafana-monitoring-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/prometheus-grafana-monitoring-2026/</guid><description>A practical guide to setting up metrics collection with Prometheus and visualization with Grafana for backend services — what to instrument, what to skip, and what the dashboards should actually show.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Infrastructure</category><category>DevOps</category><category>Backend</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>Python asyncio in Production: The Pitfalls No One Warns You About</title><link>https://blog.codercops.com/blog/python-asyncio-production-pitfalls-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/python-asyncio-production-pitfalls-2026/</guid><description>async/await syntax makes Python code look concurrent. The behavior when you get it wrong is harder to predict than most tutorials explain. Here&apos;s what breaks in production and how to fix it before it does.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Python</category><category>Backend</category><category>Performance</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>Pydantic v2: The Data Validation Layer Your Python APIs Actually Need</title><link>https://blog.codercops.com/blog/pydantic-v2-python-validation-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/pydantic-v2-python-validation-2026/</guid><description>Pydantic v2 shipped with a Rust-based core that made validation 5-50x faster. But the performance is only part of it — the v2 model redesign changes how you structure validation logic for complex APIs.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Python</category><category>Backend</category><category>Developer Tools</category><category>API</category><category>2026</category><author>Anurag Verma</author></item><item><title>Agency Operations: Building Systems That Work Without You</title><link>https://blog.codercops.com/blog/agency-operations-systems-delegation-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/agency-operations-systems-delegation-2026/</guid><description>Most agency owners are the bottleneck in their own business. Here&apos;s how to identify where you&apos;re needed versus where a system or a person could replace you, and how to build those systems.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><category>Business</category><category>Agency</category><category>Business</category><category>Productivity</category><category>Career</category><category>Hiring</category><author>Anurag Verma</author></item><item><title>Dev Containers: Reproducible Development Environments in 2026</title><link>https://blog.codercops.com/blog/dev-containers-github-codespaces-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/dev-containers-github-codespaces-2026/</guid><description>Dev Containers let you define your entire development environment in a JSON file. New team members are productive in minutes, not days. Here&apos;s how to set them up properly.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Developer Tools</category><category>DevOps</category><category>Infrastructure</category><category>Docker</category><category>2026</category><author>Anurag Verma</author></item><item><title>OWASP API Security Top 10: A Developer&apos;s Field Guide for 2026</title><link>https://blog.codercops.com/blog/owasp-api-security-top-10-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/owasp-api-security-top-10-2026/</guid><description>The OWASP API Security Top 10 lists the most critical API vulnerabilities. Most are fixable with straightforward code changes. This guide walks through each one with real examples.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>Security</category><category>API</category><category>Backend</category><category>Cybersecurity</category><category>Web Development</category><author>Anurag Verma</author></item><item><title>SolidJS in 2026: Fine-Grained Reactivity Without the Virtual DOM</title><link>https://blog.codercops.com/blog/solidjs-react-alternative-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/solidjs-react-alternative-2026/</guid><description>SolidJS is not React with a different syntax. It compiles to real DOM operations, skips the virtual DOM entirely, and has a different mental model for reactivity. Here&apos;s what that means in practice.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>JavaScript</category><category>Frontend</category><category>Web Development</category><category>Performance</category><category>React</category><author>Anurag Verma</author></item><item><title>Three.js and React Three Fiber: 3D on the Web Without the Pain</title><link>https://blog.codercops.com/blog/threejs-react-three-fiber-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/threejs-react-three-fiber-2026/</guid><description>Three.js makes WebGL accessible. React Three Fiber makes Three.js feel like React. Together they&apos;re the fastest path to interactive 3D on the web. Here&apos;s how to actually use them.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>JavaScript</category><category>Frontend</category><category>Web Development</category><category>Performance</category><category>React</category><author>Anurag Verma</author></item><item><title>Container Security Scanning in 2026: What Trivy and Snyk Find That Your Pipeline Misses</title><link>https://blog.codercops.com/blog/container-security-scanning-trivy-snyk-sbom-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/container-security-scanning-trivy-snyk-sbom-2026/</guid><description>Vulnerability scanning catches known CVEs in your base images and dependencies before they reach production. Here&apos;s how to set up Trivy and Snyk, understand their output, and act on what they find.</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>Cybersecurity</category><category>DevOps</category><category>Infrastructure</category><category>Security</category><category>2026</category><author>Anurag Verma</author></item><item><title>Docker Image Optimization in 2026: Multi-Stage Builds and the Sizes That Actually Matter</title><link>https://blog.codercops.com/blog/docker-image-optimization-multi-stage-builds-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/docker-image-optimization-multi-stage-builds-2026/</guid><description>A bloated Docker image costs you in pull times, storage fees, and attack surface. Here&apos;s how to build images that are small, fast to rebuild, and genuinely production-ready.</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Cloud &amp; Infrastructure</category><category>DevOps</category><category>Infrastructure</category><category>Backend</category><category>2026</category><author>Anurag Verma</author></item><item><title>TanStack Router in 2026: Type-Safe Routing That Rewires How You Think About Navigation</title><link>https://blog.codercops.com/blog/tanstack-router-type-safe-routing-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/tanstack-router-type-safe-routing-2026/</guid><description>TanStack Router brings full TypeScript inference to URL params, search params, and loader data. Here&apos;s what that looks like in practice and when it&apos;s worth adopting.</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>TypeScript</category><category>React</category><category>Frontend</category><category>2026</category><author>Anurag Verma</author></item><item><title>Web Images in 2026: AVIF, WebP, and the LCP Work Nobody Does Until It&apos;s a Problem</title><link>https://blog.codercops.com/blog/web-images-avif-webp-lcp-optimization-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/web-images-avif-webp-lcp-optimization-2026/</guid><description>Images are the single biggest factor in Largest Contentful Paint for most sites. AVIF has widespread browser support now. Here&apos;s the optimization stack worth using and how to implement it.</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Performance</category><category>Frontend</category><category>2026</category><author>Anurag Verma</author></item><item><title>XState v5: State Machines for UI That&apos;s Too Complex to Wing It</title><link>https://blog.codercops.com/blog/xstate-v5-state-machines-ui-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/xstate-v5-state-machines-ui-2026/</guid><description>XState v5 ships a rewritten API that&apos;s smaller, faster, and easier to read than v4. Here&apos;s how state machines actually help in production UI, and what the migration looks like.</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>JavaScript</category><category>TypeScript</category><category>Frontend</category><category>2026</category><author>Anurag Verma</author></item><item><title>Sprint Planning for Agency Client Projects: An Honest Adaptation of Agile</title><link>https://blog.codercops.com/blog/agency-sprint-planning-client-projects-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/agency-sprint-planning-client-projects-2026/</guid><description>The standard Scrum playbook was designed for product teams with stable backlogs. Agencies have different constraints: client reviews, scope negotiations, and projects that end. Here&apos;s what actually works.</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><category>Business</category><category>Agency</category><category>Business</category><category>Career</category><category>Productivity</category><category>2026</category><author>Anurag Verma</author></item><item><title>Cursor Rules for Teams: Codifying Your Standards for AI Coding</title><link>https://blog.codercops.com/blog/cursor-rules-team-coding-standards-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/cursor-rules-team-coding-standards-2026/</guid><description>Cursor&apos;s rules system lets teams encode their architecture decisions, naming conventions, and coding standards into the AI&apos;s context. Here&apos;s how to set it up so every engineer gets consistent suggestions.</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Developer Tools</category><category>AI Integration</category><category>Web Development</category><category>Productivity</category><category>2026</category><author>Anurag Verma</author></item><item><title>HTTP Security Headers in 2026: The Checklist That Actually Matters</title><link>https://blog.codercops.com/blog/http-security-headers-csp-hsts-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/http-security-headers-csp-hsts-2026/</guid><description>Most web apps are missing four or five headers that would neutralize entire classes of attack. Here&apos;s what each header does, what to set, and why most defaults leave you exposed.</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>Cybersecurity</category><category>Web Development</category><category>Backend</category><category>Security</category><category>2026</category><author>Anurag Verma</author></item><item><title>LangChain vs LlamaIndex in 2026: Choosing the Right AI Framework</title><link>https://blog.codercops.com/blog/langchain-vs-llamaindex-ai-framework-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/langchain-vs-llamaindex-ai-framework-2026/</guid><description>Both frameworks can build RAG pipelines and agent systems, but they&apos;re designed with different priorities. Here&apos;s when to reach for each and when to skip both.</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Integration</category><category>LLM</category><category>Python</category><category>Backend</category><category>2026</category><author>Anurag Verma</author></item><item><title>Running LLMs Locally with Ollama: A Practical Guide for Developers</title><link>https://blog.codercops.com/blog/running-local-llms-ollama-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/running-local-llms-ollama-2026/</guid><description>Ollama makes it possible to run Llama 3, Mistral, Phi-4, and dozens of other open-weight models on your laptop or server with a single command. Here&apos;s what actually works and when local inference makes sense.</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Integration</category><category>Developer Tools</category><category>LLM</category><category>Backend</category><category>2026</category><author>Anurag Verma</author></item><item><title>Agency SLAs and Support Contracts: What Ongoing Work Actually Looks Like</title><link>https://blog.codercops.com/blog/agency-sla-support-contracts-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/agency-sla-support-contracts-2026/</guid><description>Most agencies figure out support pricing and SLA structure only after a client calls at 11pm. A better approach: define what you&apos;re selling before the project launches.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate><category>Business</category><category>Agency</category><category>Business</category><category>Pricing</category><category>Career</category><category>2026</category><author>Anurag Verma</author></item><item><title>Alpine.js in 2026: Lightweight Interactivity for Server-Rendered Apps</title><link>https://blog.codercops.com/blog/alpinejs-lightweight-interactivity-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/alpinejs-lightweight-interactivity-2026/</guid><description>Alpine.js lets you add dropdown menus, modals, tabs, and form behavior directly in HTML without a build step or a JavaScript framework. Here&apos;s when that&apos;s exactly what you want.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>JavaScript</category><category>Frontend</category><category>2026</category><author>Anurag Verma</author></item><item><title>Cloudflare R2 vs AWS S3 in 2026: The Storage Decision for Developer Teams</title><link>https://blog.codercops.com/blog/cloudflare-r2-vs-s3-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/cloudflare-r2-vs-s3-2026/</guid><description>R2&apos;s zero-egress pricing looks compelling on paper. Here&apos;s when it actually saves money, when S3&apos;s ecosystem still wins, and how to migrate if you decide to switch.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Cloud &amp; Infrastructure</category><category>Backend</category><category>Infrastructure</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>Deno 2 in Production: What Actually Changed and When to Use It</title><link>https://blog.codercops.com/blog/deno-2-production-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/deno-2-production-guide-2026/</guid><description>Deno 2 ships with full Node.js compatibility, npm support, and a revised standard library. Here&apos;s what that means for teams evaluating it as a serious Node alternative.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Backend</category><category>JavaScript</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>Maintenance Pricing for AI-Assisted Projects: What&apos;s Different in 2026</title><link>https://blog.codercops.com/blog/maintenance-pricing-ai-built-projects-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/maintenance-pricing-ai-built-projects-2026/</guid><description>When AI tools write 40-70% of a codebase, the usual rules for estimating support costs break down. Here&apos;s how to price maintenance work when your team didn&apos;t write most of the code.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate><category>Business</category><category>Agency</category><category>Business</category><category>AI Integration</category><category>Pricing</category><category>2026</category><author>Anurag Verma</author></item><item><title>TypeScript Decorators in 2026: The Stabilized Proposal Worth Learning</title><link>https://blog.codercops.com/blog/typescript-decorators-stable-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/typescript-decorators-stable-2026/</guid><description>TypeScript 5.0 shipped support for the TC39 Stage 3 decorators proposal. It&apos;s different from the old experimentalDecorators, more useful, and now the way to actually write decorators.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>TypeScript</category><category>Web Development</category><category>JavaScript</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>Agency Case Studies That Win Work: Structure, Metrics, and What to Leave Out</title><link>https://blog.codercops.com/blog/agency-case-studies-win-new-business-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/agency-case-studies-win-new-business-2026/</guid><description>Most agency case studies don&apos;t convert because they focus on process and outputs instead of client decisions and outcomes. Here&apos;s how to write case studies that do the selling for you.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><category>Business</category><category>Agency</category><category>Business</category><category>Career</category><category>Pricing</category><category>2026</category><author>Anurag Verma</author></item><item><title>CSS Cascade Layers in 2026: Fix Specificity Wars Without Fighting the Stylesheet</title><link>https://blog.codercops.com/blog/css-cascade-layers-production-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/css-cascade-layers-production-2026/</guid><description>CSS @layer lets you define explicit ordering between your reset, base, components, and utility styles. Here&apos;s how cascade layers work and how they simplify stylesheet architecture.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Frontend</category><category>CSS</category><category>Performance</category><category>2026</category><author>Anurag Verma</author></item><item><title>ElysiaJS in 2026: End-to-End Type Safety for Bun APIs Without the Ceremony</title><link>https://blog.codercops.com/blog/elysia-js-bun-type-safe-api-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/elysia-js-bun-type-safe-api-2026/</guid><description>ElysiaJS gives Bun apps fast routing, request validation, and full type inference between server and client — without code generation. Here&apos;s how it works and when to use it.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Backend</category><category>TypeScript</category><category>API</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>Error Tracking in 2026: What Sentry Catches That Your Logs Don&apos;t</title><link>https://blog.codercops.com/blog/error-tracking-sentry-production-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/error-tracking-sentry-production-2026/</guid><description>Logs tell you what happened. Error tracking tells you what broke, in what context, for which users. Here&apos;s how to set up Sentry properly and avoid the alert fatigue that makes it useless.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Backend</category><category>Production</category><category>Developer Tools</category><category>Infrastructure</category><category>2026</category><author>Anurag Verma</author></item><item><title>Vendor Lock-in in 2026: What It Actually Costs and When to Stop Worrying About It</title><link>https://blog.codercops.com/blog/vendor-lock-in-cloud-agnostic-patterns-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/vendor-lock-in-cloud-agnostic-patterns-2026/</guid><description>The fear of vendor lock-in leads to over-engineering. Here&apos;s a practical framework for deciding when to abstract cloud dependencies and when accepting lock-in is the right call.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Cloud &amp; Infrastructure</category><category>Architecture</category><category>Infrastructure</category><category>DevOps</category><category>2026</category><author>Anurag Verma</author></item><item><title>How Agencies Build Contractor Networks: Adding Capacity Without the Headcount</title><link>https://blog.codercops.com/blog/agency-contractor-network-capacity-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/agency-contractor-network-capacity-2026/</guid><description>Hiring a full-time developer for a three-month surge then watching them sit idle is one of the most expensive mistakes agencies make. Here&apos;s how to build a contractor network that actually works.</description><pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate><category>Business</category><category>Agency</category><category>Business</category><category>Career</category><category>Operations</category><category>Pricing</category><category>2026</category><author>Anurag Verma</author></item><item><title>ClickHouse in 2026: Analytical Queries on Billions of Rows Without the Pain</title><link>https://blog.codercops.com/blog/clickhouse-analytics-application-developers-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/clickhouse-analytics-application-developers-2026/</guid><description>ClickHouse is a columnar database designed for analytical workloads. It answers queries over billions of rows in seconds that would take minutes in Postgres. Here&apos;s what application developers need to know.</description><pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Database</category><category>Backend</category><category>Analytics</category><category>Infrastructure</category><category>Performance</category><category>2026</category><author>Anurag Verma</author></item><item><title>dbt in 2026: SQL-First Data Transformation That Actually Scales</title><link>https://blog.codercops.com/blog/dbt-analytics-engineering-sql-pipelines-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/dbt-analytics-engineering-sql-pipelines-2026/</guid><description>dbt turns SQL SELECT statements into a tested, documented, version-controlled data pipeline. Here&apos;s how it works and when you should add it to your data stack.</description><pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Data Engineering</category><category>Analytics</category><category>SQL</category><category>Backend</category><category>Python</category><category>2026</category><author>Anurag Verma</author></item><item><title>Fly.io and Railway in 2026: Deploy Full-Stack Apps Without Becoming a DevOps Team</title><link>https://blog.codercops.com/blog/fly-io-railway-app-deployment-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/fly-io-railway-app-deployment-2026/</guid><description>Vercel dominates frontend hosting. AWS dominates enterprise infrastructure. Between those two extremes, Fly.io and Railway are the most practical choices for backend-heavy full-stack apps in 2026.</description><pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>DevOps</category><category>Cloud &amp; Infrastructure</category><category>Backend</category><category>Deployment</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>Zustand and Jotai: React State Management Without the Redux Ceremony</title><link>https://blog.codercops.com/blog/zustand-jotai-react-state-management-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/zustand-jotai-react-state-management-2026/</guid><description>Redux is overkill for most React apps. Zustand and Jotai cover 90% of real state management needs with a fraction of the boilerplate. Here&apos;s when to use each and how they actually work.</description><pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>React</category><category>JavaScript</category><category>Frontend</category><category>Web Development</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>Architecture Decision Records: Lightweight Docs That Survive Team Turnover</title><link>https://blog.codercops.com/blog/architecture-decision-records-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/architecture-decision-records-2026/</guid><description>An Architecture Decision Record captures why a technical choice was made, not just what was decided. One page per decision, stored in the repo, reviewed in PRs. Here&apos;s the format and how to make it stick.</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Architecture</category><category>Backend</category><category>Career</category><category>2026</category><author>Anurag Verma</author></item><item><title>ESLint 9 Flat Config: The Migration Guide for Teams Who Have Put It Off</title><link>https://blog.codercops.com/blog/eslint-9-flat-config-migration-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/eslint-9-flat-config-migration-2026/</guid><description>ESLint 9 made flat config the default and deprecated the old .eslintrc format. If your project is still on the legacy config, here&apos;s what changed, why it&apos;s better, and how to migrate without breaking your setup.</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Developer Tools</category><category>JavaScript</category><category>TypeScript</category><category>2026</category><author>Anurag Verma</author></item><item><title>Pre-commit Hooks and Automated Code Quality: The Setup That Catches Problems Before CI Does</title><link>https://blog.codercops.com/blog/pre-commit-hooks-code-quality-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/pre-commit-hooks-code-quality-2026/</guid><description>Git hooks enforced by Lefthook, Husky, or lint-staged can stop broken code, style violations, and type errors before they reach your CI pipeline. Here&apos;s how to build a hook setup that teams actually keep.</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Developer Tools</category><category>Web Development</category><category>TypeScript</category><category>Productivity</category><category>2026</category><author>Anurag Verma</author></item><item><title>Internationalizing a React App in 2026: react-i18next, next-intl, and Lingui Compared</title><link>https://blog.codercops.com/blog/react-app-i18n-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/react-app-i18n-2026/</guid><description>Adding multi-language support to a React app is straightforward when you pick the right library for your setup. Here&apos;s how react-i18next, next-intl, and Lingui differ, and which fits each project type.</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>React</category><category>Frontend</category><category>JavaScript</category><category>2026</category><author>Anurag Verma</author></item><item><title>Why Software Estimates Are Always Wrong (And How to Make Them Less Wrong)</title><link>https://blog.codercops.com/blog/software-project-estimation-agencies-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/software-project-estimation-agencies-2026/</guid><description>Most project estimates fail before a single line of code is written. The problem is almost never the hours. It&apos;s the unexamined assumptions buried in them. Here&apos;s a more honest estimation process.</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate><category>Business</category><category>Agency</category><category>Business</category><category>Career</category><category>Pricing</category><category>2026</category><author>Anurag Verma</author></item><item><title>Client Handoff Documentation That Gets Read After Launch</title><link>https://blog.codercops.com/blog/client-handoff-documentation-agency-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/client-handoff-documentation-agency-2026/</guid><description>Most handoff docs end up ignored six months later when a client can&apos;t find their CMS login. Here&apos;s what to write, how to structure it, and what most agencies skip that causes the most post-launch support calls.</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><category>Business</category><category>Agency</category><category>Business</category><category>Documentation</category><category>Career</category><category>Operations</category><author>Anurag Verma</author></item><item><title>Cloudflare Workers AI: Running Models at the Edge Without a GPU Bill</title><link>https://blog.codercops.com/blog/cloudflare-workers-ai-edge-inference-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/cloudflare-workers-ai-edge-inference-2026/</guid><description>Workers AI gives you access to a catalog of open-weight models — Llama, Mistral, Whisper, embedding models — running in Cloudflare&apos;s network. Here&apos;s what&apos;s actually useful, what the limitations are, and when it makes sense.</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>AI Integration</category><category>Cloud &amp; Infrastructure</category><category>LLM</category><category>Cloudflare</category><category>2026</category><author>Anurag Verma</author></item><item><title>Inngest: Background Jobs Without the Queue Infrastructure</title><link>https://blog.codercops.com/blog/inngest-background-jobs-nextjs-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/inngest-background-jobs-nextjs-2026/</guid><description>Most background job solutions require you to run and monitor a Redis instance, manage worker processes, and wire up your own retry logic. Inngest skips all of that. Here&apos;s how it works and when it&apos;s the right call.</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Backend</category><category>Node.js</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>Next.js Auth in 2026: Clerk vs Better Auth vs Auth.js v5</title><link>https://blog.codercops.com/blog/nextjs-auth-comparison-clerk-better-auth-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/nextjs-auth-comparison-clerk-better-auth-2026/</guid><description>Three real authentication options for Next.js apps, with different trade-offs on control, cost, and setup time. Here&apos;s what each one actually involves.</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Security</category><category>Next.js</category><category>Authentication</category><category>2026</category><author>Anurag Verma</author></item><item><title>Ruby on Rails 8: What the Comeback Looks Like in Production</title><link>https://blog.codercops.com/blog/ruby-rails-8-production-comeback-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ruby-rails-8-production-comeback-2026/</guid><description>Rails 8 ships Solid Queue, Solid Cache, Solid Cable, and Kamal 2. Together they make it possible to run a production app on one server, without Redis, without a separate Node process, and without external managed services for the basics.</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Backend</category><category>Ruby</category><category>Production</category><category>2026</category><author>Anurag Verma</author></item><item><title>Getting Paid: How Agencies Should Structure Payment Terms</title><link>https://blog.codercops.com/blog/agency-client-payment-terms-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/agency-client-payment-terms-2026/</guid><description>The invoice you send is only as good as the terms behind it. Here&apos;s how to structure deposits, milestones, and late fees so cash flow stays predictable and overdue invoices become rare.</description><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate><category>Business</category><category>Agency</category><category>Business</category><category>Pricing</category><category>Career</category><category>Operations</category><author>Anurag Verma</author></item><item><title>Bruno: The API Client That Stores Requests in Git</title><link>https://blog.codercops.com/blog/bruno-api-client-git-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/bruno-api-client-git-2026/</guid><description>Bruno keeps API collections as plain files in your repository. No account, no cloud sync, no vendor lock-in. Here&apos;s how it compares to Postman and why teams are switching.</description><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Developer Tools</category><category>API</category><category>Git</category><category>Open Source</category><category>Backend</category><category>Productivity</category><author>Anurag Verma</author></item><item><title>Git Worktrees: Check Out Multiple Branches at Once Without the Stash Dance</title><link>https://blog.codercops.com/blog/git-worktrees-parallel-development-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/git-worktrees-parallel-development-2026/</guid><description>Git worktrees let you have multiple branches checked out simultaneously in separate directories. No stashing, no context switching, no &apos;just a second while I save my work.&apos;</description><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Git</category><category>Developer Tools</category><category>Productivity</category><category>DevOps</category><category>2026</category><author>Anurag Verma</author></item><item><title>Headless CMS in 2026: Sanity, Payload, and Contentful for Agency Projects</title><link>https://blog.codercops.com/blog/headless-cms-sanity-payload-contentful-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/headless-cms-sanity-payload-contentful-2026/</guid><description>Three headless CMS platforms used by agencies, three different bets on where content management is going. Here&apos;s how Sanity, Payload, and Contentful actually compare when you&apos;re building for clients.</description><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>CMS</category><category>Agency</category><category>TypeScript</category><category>Backend</category><category>Frontend</category><author>Anurag Verma</author></item><item><title>HTTP/3 and QUIC: What Changes for Web Developers and When It Actually Helps</title><link>https://blog.codercops.com/blog/http3-quic-web-developers-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/http3-quic-web-developers-2026/</guid><description>HTTP/3 replaces TCP with QUIC, a UDP-based protocol that eliminates head-of-line blocking and handles packet loss better. Here&apos;s when that matters, when it doesn&apos;t, and how to enable and verify it.</description><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Performance</category><category>Infrastructure</category><category>Networking</category><category>Backend</category><category>2026</category><author>Anurag Verma</author></item><item><title>Structured Outputs from LLMs: JSON Mode, Tool Calls, and Schema Validation in Practice</title><link>https://blog.codercops.com/blog/llm-structured-outputs-json-tool-calls-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/llm-structured-outputs-json-tool-calls-2026/</guid><description>Getting a language model to return reliably structured data is not just about asking nicely. Here&apos;s the pattern that actually works at production scale.</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Integration</category><category>LLM</category><category>Backend</category><category>TypeScript</category><category>Python</category><category>Production</category><author>Anurag Verma</author></item><item><title>Model Context Protocol in Production: How MCP Is Connecting the AI Tool Ecosystem</title><link>https://blog.codercops.com/blog/model-context-protocol-production-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/model-context-protocol-production-2026/</guid><description>MCP has become the standard for connecting AI models to external systems. Here&apos;s how it works, how to implement an MCP server, and what to watch out for before going to production.</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Integration</category><category>LLM</category><category>Developer Tools</category><category>Backend</category><category>Architecture</category><category>Production</category><author>Anurag Verma</author></item><item><title>React Native vs Flutter vs PWA in 2026: Choosing Your Cross-Platform Strategy</title><link>https://blog.codercops.com/blog/react-native-flutter-pwa-cross-platform-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/react-native-flutter-pwa-cross-platform-2026/</guid><description>Three viable paths to cross-platform mobile in 2026. Which one makes sense depends on your team, your deadlines, and how much of the device you actually need.</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>React Native</category><category>Flutter</category><category>Mobile</category><category>Web Development</category><category>JavaScript</category><category>TypeScript</category><author>Anurag Verma</author></item><item><title>Shadow AI in the Enterprise: The Security Gap Most Teams Haven&apos;t Closed</title><link>https://blog.codercops.com/blog/shadow-ai-enterprise-security-risk-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/shadow-ai-enterprise-security-risk-2026/</guid><description>Employees are using AI tools IT hasn&apos;t approved, and the data leaving through those tools is largely invisible. Here&apos;s what the risk looks like and what actually helps.</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>Cybersecurity</category><category>Security</category><category>AI Integration</category><category>Enterprise</category><category>Business</category><category>Governance</category><author>Anurag Verma</author></item><item><title>Turso and LibSQL: SQLite at the Edge for Production Applications</title><link>https://blog.codercops.com/blog/turso-libsql-edge-sqlite-production-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/turso-libsql-edge-sqlite-production-2026/</guid><description>SQLite runs in every phone and browser. Turso extends it to the server and edge with replication, branching, and a network protocol. Here&apos;s when it makes sense.</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Backend</category><category>Database</category><category>SQLite</category><category>Edge</category><category>Cloud</category><category>Performance</category><author>Anurag Verma</author></item><item><title>AI-Automated Client Reporting: How Agencies Are Cutting 5 Hours Per Client Per Month</title><link>https://blog.codercops.com/blog/ai-automated-client-reporting-agency-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-automated-client-reporting-agency-2026/</guid><description>Manually compiling monthly reports is one of the highest-effort, lowest-value activities in a web agency. Here&apos;s how to replace most of that work with automated pipelines.</description><pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate><category>Business</category><category>Agency</category><category>Business</category><category>AI</category><category>Automation</category><category>Productivity</category><author>Anurag Verma</author></item><item><title>Building CLI Tools with TypeScript in 2026: A Practical Guide</title><link>https://blog.codercops.com/blog/building-cli-tools-typescript-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/building-cli-tools-typescript-2026/</guid><description>Command-line tools are underrated as developer products. TypeScript makes them maintainable. Here&apos;s the full picture: argument parsing, interactive prompts, output formatting, and distribution.</description><pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>TypeScript</category><category>Developer Tools</category><category>Node.js</category><category>JavaScript</category><category>Backend</category><category>Productivity</category><author>Anurag Verma</author></item><item><title>The JavaScript Temporal API: Finally a Date Object That Works</title><link>https://blog.codercops.com/blog/javascript-temporal-api-dates-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/javascript-temporal-api-dates-2026/</guid><description>The Date object has been broken for 30 years. Temporal is its replacement, now shipping in browsers and Node.js. Here&apos;s what actually changed and how to use it.</description><pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>JavaScript</category><category>Web Development</category><category>TypeScript</category><category>Developer Tools</category><category>Frontend</category><category>Backend</category><author>Anurag Verma</author></item><item><title>Postgres Query Optimization for Application Developers</title><link>https://blog.codercops.com/blog/postgres-query-optimization-application-developers-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/postgres-query-optimization-application-developers-2026/</guid><description>Most slow queries come from a small set of fixable problems: missing indexes, N+1 patterns, and over-fetching. This is the practical diagnostic and fix guide.</description><pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Backend</category><category>PostgreSQL</category><category>Performance</category><category>Database</category><category>Production</category><category>Architecture</category><author>Anurag Verma</author></item><item><title>Storybook in 2026: The Practical Case for Component-Driven Development</title><link>https://blog.codercops.com/blog/storybook-component-driven-development-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/storybook-component-driven-development-2026/</guid><description>Storybook 8 is faster and less painful to configure than it used to be. More importantly, the workflow shift it enables — building components in isolation — solves real problems on real teams.</description><pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Frontend</category><category>Web Development</category><category>Design</category><category>Developer Tools</category><category>TypeScript</category><category>React</category><author>Anurag Verma</author></item><item><title>Blue-Green and Canary Deployments: A Production Guide for Engineering Teams</title><link>https://blog.codercops.com/blog/blue-green-canary-deployments-production-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/blue-green-canary-deployments-production-2026/</guid><description>Blue-green and canary deployments give you a way to release software without taking down your service or discovering a bug when it&apos;s already affecting everyone. Here&apos;s how they work and when to use each.</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>DevOps</category><category>Infrastructure</category><category>Production</category><category>Backend</category><category>Architecture</category><author>Anurag Verma</author></item><item><title>NestJS in 2026: The Enterprise Node.js Framework Most Teams Overlook</title><link>https://blog.codercops.com/blog/nestjs-enterprise-nodejs-framework-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/nestjs-enterprise-nodejs-framework-2026/</guid><description>NestJS has been growing quietly for years. If your Node.js backend is a pile of Express middleware with no clear structure, NestJS offers a path forward without changing languages.</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Backend</category><category>Node.js</category><category>TypeScript</category><category>JavaScript</category><category>Architecture</category><author>Anurag Verma</author></item><item><title>Product-Led Growth for SaaS: How Developer Tools Get to Enterprise Without a Sales Army</title><link>https://blog.codercops.com/blog/product-led-growth-saas-developer-tools-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/product-led-growth-saas-developer-tools-2026/</guid><description>PLG is not a marketing strategy. It&apos;s an architectural decision about where conversion happens. Here&apos;s what it looks like in practice and which patterns actually move revenue.</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate><category>Business</category><category>Business</category><category>SaaS</category><category>Agency</category><category>Pricing</category><category>Career</category><author>Anurag Verma</author></item><item><title>Test-Driven Development With AI Coding Assistants: Does TDD Still Make Sense in 2026?</title><link>https://blog.codercops.com/blog/test-driven-development-ai-assistants-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/test-driven-development-ai-assistants-2026/</guid><description>AI tools write code fast. TDD asks you to slow down and write tests first. These two impulses seem to be in tension. Here&apos;s how they actually work together.</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Testing</category><category>Developer Tools</category><category>JavaScript</category><category>TypeScript</category><category>Python</category><category>TDD</category><author>Anurag Verma</author></item><item><title>WebGPU in 2026: What You Can Actually Build With GPU Compute in the Browser</title><link>https://blog.codercops.com/blog/webgpu-browser-gpu-compute-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/webgpu-browser-gpu-compute-2026/</guid><description>WebGPU is now available across Chrome, Firefox, and Safari. It&apos;s not just a graphics API. It&apos;s a general-purpose GPU compute layer that changes what&apos;s possible in a browser tab.</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>JavaScript</category><category>Performance</category><category>Frontend</category><category>Browser APIs</category><author>Anurag Verma</author></item><item><title>Conventional Commits and Automated Releases: The Setup That Pays for Itself</title><link>https://blog.codercops.com/blog/conventional-commits-semantic-release-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/conventional-commits-semantic-release-2026/</guid><description>Standardized commit messages unlock automatic changelogs, version bumps, and release notes. Here&apos;s the full setup — from writing commits to shipping releases without manual steps.</description><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Developer Tools</category><category>DevOps</category><category>Automation</category><category>JavaScript</category><category>Git</category><category>Productivity</category><author>Anurag Verma</author></item><item><title>CSS Architecture in 2026: Choosing Between Tailwind, CSS Modules, and CSS-in-JS</title><link>https://blog.codercops.com/blog/css-styling-systems-decision-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/css-styling-systems-decision-guide-2026/</guid><description>Three different approaches to styling a web application — Tailwind, CSS Modules, and CSS-in-JS libraries — and the team contexts where each one actually makes sense.</description><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>CSS</category><category>Frontend</category><category>Web Development</category><category>JavaScript</category><category>Performance</category><category>Design</category><author>Anurag Verma</author></item><item><title>Developer Portfolio in 2026: What Gets Noticed When Everyone Claims AI Experience</title><link>https://blog.codercops.com/blog/developer-portfolio-ai-projects-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/developer-portfolio-ai-projects-2026/</guid><description>AI projects flood every portfolio. Here&apos;s what actually distinguishes a developer&apos;s work from the crowd — and why the way you document your decisions matters more than the tech stack you picked.</description><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate><category>Career</category><category>Career</category><category>Developer Tools</category><category>AI</category><category>Productivity</category><category>Business</category><author>Anurag Verma</author></item><item><title>eBPF in 2026: The Observability Superpower Hiding in Your Linux Kernel</title><link>https://blog.codercops.com/blog/ebpf-linux-observability-application-developers-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ebpf-linux-observability-application-developers-2026/</guid><description>eBPF lets you attach programs to any kernel hook — network packets, system calls, function calls — without patching the kernel or rebooting. Here&apos;s what application developers actually need to know.</description><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>DevOps</category><category>Infrastructure</category><category>Backend</category><category>Performance</category><category>Linux</category><category>Observability</category><author>Anurag Verma</author></item><item><title>Tailscale for Distributed Dev Teams: Private Networks Without the VPN Pain</title><link>https://blog.codercops.com/blog/tailscale-distributed-teams-private-networking-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/tailscale-distributed-teams-private-networking-2026/</guid><description>Tailscale creates a private mesh network across any combination of cloud servers, developer laptops, and office machines — without port forwarding, firewall rules, or dedicated VPN hardware.</description><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>DevOps</category><category>Infrastructure</category><category>Security</category><category>Remote Work</category><category>Networking</category><category>Cloud</category><author>Anurag Verma</author></item><item><title>Project Post-Mortems for Agencies: The Debrief Habit That Makes Teams Better</title><link>https://blog.codercops.com/blog/agency-project-post-mortems-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/agency-project-post-mortems-2026/</guid><description>Most agencies finish a project, invoice the client, and move immediately to the next one. The ones that improve fastest do one more thing: they sit down and ask what actually happened.</description><pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate><category>Business</category><category>Business</category><category>Agency</category><category>Career</category><category>Productivity</category><category>Project Management</category><author>Anurag Verma</author></item><item><title>Building Chrome Extensions in 2026: A Practical Manifest V3 Guide</title><link>https://blog.codercops.com/blog/chrome-extensions-manifest-v3-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/chrome-extensions-manifest-v3-guide-2026/</guid><description>Manifest V3 changed how Chrome extensions work. Here&apos;s what actually matters for developers building extensions today: service workers, declarativeNetRequest, and the gotchas nobody warns you about.</description><pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>JavaScript</category><category>Browser APIs</category><category>Chrome</category><category>Developer Tools</category><category>Frontend</category><author>Anurag Verma</author></item><item><title>Document AI for Agencies: Extracting Structure from PDFs, Forms, and Contracts</title><link>https://blog.codercops.com/blog/document-ai-pdf-extraction-agencies-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/document-ai-pdf-extraction-agencies-2026/</guid><description>Clients ask agencies to &apos;do something with these PDFs&apos; more often than you&apos;d think. Here&apos;s how to actually build document extraction pipelines that work in production: OCR, vision models, and structured output.</description><pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Integration</category><category>Python</category><category>LLM</category><category>Automation</category><category>Agency</category><category>Backend</category><category>Machine Learning</category><author>Anurag Verma</author></item><item><title>Local-First Software in 2026: CRDTs, Sync Engines, and When the Complexity Is Worth It</title><link>https://blog.codercops.com/blog/local-first-crdt-sync-engines-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/local-first-crdt-sync-engines-2026/</guid><description>Local-first means your app works offline and syncs when connected. The technology (CRDTs and sync engines) is mature enough to use. The question is whether your use case actually needs it.</description><pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Architecture</category><category>JavaScript</category><category>Performance</category><category>Backend</category><category>Production</category><author>Anurag Verma</author></item><item><title>Web Animation in 2026: GSAP, Framer Motion, and When to Use the Platform</title><link>https://blog.codercops.com/blog/web-animation-gsap-framer-motion-css-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/web-animation-gsap-framer-motion-css-2026/</guid><description>Three animation options dominate web development right now: CSS, Framer Motion, and GSAP. Here&apos;s how to pick the right one for your project and why the native platform is better than you might expect.</description><pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Frontend</category><category>JavaScript</category><category>CSS</category><category>Performance</category><category>Design</category><author>Anurag Verma</author></item><item><title>CSS View Transitions and Scroll-Driven Animations: What&apos;s Now Baseline in 2026</title><link>https://blog.codercops.com/blog/css-view-transitions-scroll-animations-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/css-view-transitions-scroll-animations-2026/</guid><description>Two browser APIs that used to require JavaScript libraries are now available in all major browsers. Here&apos;s what the View Transitions API and scroll-driven animations can do, with working code.</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Frontend</category><category>CSS</category><category>Performance</category><category>Browser</category><category>JavaScript</category><author>Anurag Verma</author></item><item><title>DuckDB in Practice: Analytical Queries Without a Data Warehouse</title><link>https://blog.codercops.com/blog/duckdb-analytics-local-queries-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/duckdb-analytics-local-queries-2026/</guid><description>DuckDB runs OLAP queries directly in your process, on files on your laptop, without a server. Here&apos;s how to use it and when it beats spinning up BigQuery or Redshift.</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><category>Technology</category><category>Python</category><category>Data Science</category><category>Developer Tools</category><category>Backend</category><category>Performance</category><category>2026</category><author>Anurag Verma</author></item><item><title>Headless CMS in 2026: Sanity, Contentful, Strapi, and Payload Compared</title><link>https://blog.codercops.com/blog/headless-cms-comparison-sanity-contentful-strapi-payload-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/headless-cms-comparison-sanity-contentful-strapi-payload-2026/</guid><description>Every agency project with a marketing team needs a CMS. The options have changed a lot. Here&apos;s how Sanity, Contentful, Strapi, and Payload stack up on the criteria that actually matter.</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>CMS</category><category>Architecture</category><category>Agency</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>The Modern Developer&apos;s Local Tooling in 2026: Terminal, Git, and the Productivity Stack</title><link>https://blog.codercops.com/blog/modern-developer-local-tooling-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/modern-developer-local-tooling-2026/</guid><description>The command line tools most developers use today are a decade old. Here&apos;s what&apos;s replaced them and why: terminals, Git UIs, shell configuration, and the small tools that compound into significant time savings.</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><category>Technology</category><category>Developer Tools</category><category>Productivity</category><category>Career</category><category>Python</category><category>JavaScript</category><author>Anurag Verma</author></item><item><title>Postgres Row Level Security in Practice: Multi-Tenant Data Without Application Guards</title><link>https://blog.codercops.com/blog/postgres-row-level-security-multitenant-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/postgres-row-level-security-multitenant-2026/</guid><description>Row Level Security moves data isolation into the database where it belongs. Here&apos;s how to set it up for a multi-tenant SaaS, handle common edge cases, and avoid the traps that break it.</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Backend</category><category>PostgreSQL</category><category>Security</category><category>Architecture</category><category>Production</category><category>SaaS</category><author>Anurag Verma</author></item><item><title>AI Video Generation in 2026: What Agencies Need to Know Before Pitching It to Clients</title><link>https://blog.codercops.com/blog/ai-video-generation-agency-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-video-generation-agency-guide-2026/</guid><description>AI video tools have moved from toy to production-grade in 18 months. Here&apos;s what&apos;s real, what still fails, and how to have an honest conversation with a client about it.</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Integration</category><category>Video</category><category>Agency</category><category>Generative AI</category><category>Content Creation</category><category>2026</category><author>Anurag Verma</author></item><item><title>Browser-Use Agents: Automating the Web When APIs Don&apos;t Exist</title><link>https://blog.codercops.com/blog/browser-use-agents-web-automation-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/browser-use-agents-web-automation-2026/</guid><description>A growing class of AI agent frameworks can control a browser the way a human does — clicking, typing, navigating. Here&apos;s what works in production, what breaks, and when to actually reach for these tools.</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Integration</category><category>Automation</category><category>Agent</category><category>Web Development</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>Go for Web APIs in 2026: An Honest Assessment</title><link>https://blog.codercops.com/blog/go-web-apis-honest-assessment-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/go-web-apis-honest-assessment-2026/</guid><description>Go has real strengths for backend API work, and some persistent limitations. Here&apos;s what teams actually gain and give up when they choose it over Node.js or Python for web APIs.</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Backend</category><category>Go</category><category>API</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>Multi-Cloud vs Single Cloud in 2026: An Honest Cost-Benefit Analysis</title><link>https://blog.codercops.com/blog/multi-cloud-vs-single-cloud-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/multi-cloud-vs-single-cloud-2026/</guid><description>Multi-cloud gets pitched as the default choice for serious companies. The reality is more nuanced — and for most teams, the complexity cost is higher than the lock-in risk it&apos;s supposed to prevent.</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Cloud &amp; Infrastructure</category><category>AWS</category><category>Architecture</category><category>DevOps</category><category>Infrastructure</category><category>2026</category><author>Anurag Verma</author></item><item><title>Writing Technical Specifications That Clients Will Actually Sign Off On</title><link>https://blog.codercops.com/blog/technical-specifications-client-signoff-agency-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/technical-specifications-client-signoff-agency-2026/</guid><description>A spec that doesn&apos;t get signed is a spec that doesn&apos;t protect anyone. Here&apos;s how agencies structure technical specifications that move projects forward instead of stalling them.</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><category>Business</category><category>Agency</category><category>Business</category><category>Project Management</category><category>Client Communication</category><category>Pricing</category><category>2026</category><author>Anurag Verma</author></item><item><title>Adding Search to Your SaaS: Typesense vs Meilisearch vs Algolia in 2026</title><link>https://blog.codercops.com/blog/full-text-search-typesense-meilisearch-algolia-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/full-text-search-typesense-meilisearch-algolia-2026/</guid><description>A hands-on comparison of Typesense, Meilisearch, and Algolia for production SaaS search in 2026 — covering self-hosting, performance, pricing, and real implementation patterns.</description><pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Backend</category><category>Performance</category><category>Developer Tools</category><category>TypeScript</category><category>Production</category><author>Anurag Verma</author></item><item><title>Modern Web Development Best Practices</title><link>https://blog.codercops.com/blog/modern-web-development-best-practices/</link><guid isPermaLink="true">https://blog.codercops.com/blog/modern-web-development-best-practices/</guid><description>Essential practices for building fast, accessible, and maintainable web applications in 2026.</description><pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Development</category><category>Performance</category><category>Best Practices</category><author>Anurag Verma</author></item><item><title>Product Analytics in 2026: PostHog, Amplitude, and What Teams Actually Track</title><link>https://blog.codercops.com/blog/product-analytics-posthog-amplitude-mixpanel-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/product-analytics-posthog-amplitude-mixpanel-2026/</guid><description>A practical comparison of PostHog, Amplitude, and Mixpanel for SaaS teams in 2026 — covering pricing, self-hosting, event tracking patterns, and what metrics actually move products forward.</description><pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate><category>Business</category><category>Business</category><category>SaaS</category><category>Developer Tools</category><category>Web Development</category><category>Production</category><author>Anurag Verma</author></item><item><title>Stripe Billing for SaaS in 2026: Subscriptions, Webhooks, and the Meter API</title><link>https://blog.codercops.com/blog/stripe-saas-billing-subscriptions-webhooks-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/stripe-saas-billing-subscriptions-webhooks-2026/</guid><description>A practical guide to building SaaS billing with Stripe in 2026 — covering subscription plans, the Meter API for usage-based pricing, webhook reliability, and the Customer Portal.</description><pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Backend</category><category>SaaS</category><category>TypeScript</category><category>API</category><category>Production</category><author>Anurag Verma</author></item><item><title>Transactional Email in 2026: Resend, SES, and Getting Deliverability Right</title><link>https://blog.codercops.com/blog/transactional-email-resend-ses-deliverability-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/transactional-email-resend-ses-deliverability-2026/</guid><description>A practical guide to transactional email for web apps in 2026 — comparing Resend, Amazon SES, and SendGrid, with a focus on SPF/DKIM/DMARC setup and the common deliverability mistakes teams make.</description><pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Backend</category><category>Production</category><category>DevOps</category><category>Infrastructure</category><author>Anurag Verma</author></item><item><title>Zod in Production TypeScript: Schema Validation Across the Full Stack</title><link>https://blog.codercops.com/blog/zod-typescript-schema-validation-production-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/zod-typescript-schema-validation-production-2026/</guid><description>How Zod became the standard for runtime type validation in TypeScript apps — API contracts, form validation, environment variables, and the patterns that make schemas a source of truth across your stack.</description><pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>TypeScript</category><category>Web Development</category><category>Backend</category><category>Developer Tools</category><category>Production</category><author>Anurag Verma</author></item><item><title>Fine-Tuning vs RAG in 2026: A Decision Guide for Teams Building with LLMs</title><link>https://blog.codercops.com/blog/fine-tuning-vs-rag-llm-decision-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/fine-tuning-vs-rag-llm-decision-guide-2026/</guid><description>Both approaches customize LLM behavior for your use case, but they solve different problems. Here is how to decide which one you need, how to know when to use both, and what teams consistently get wrong.</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>LLM</category><category>Machine Learning</category><category>AI Integration</category><category>Production</category><category>Backend</category><author>Anurag Verma</author></item><item><title>OpenTelemetry for Web Apps in 2026: What to Instrument and What to Skip</title><link>https://blog.codercops.com/blog/opentelemetry-web-apps-production-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/opentelemetry-web-apps-production-guide-2026/</guid><description>OpenTelemetry is the observability standard now. Most tutorials show you how to install the SDK and emit traces. Fewer explain which signals actually matter for web applications and which add noise without helping you debug anything.</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Infrastructure</category><category>DevOps</category><category>Backend</category><category>Performance</category><category>Cloud &amp; Infrastructure</category><category>Developer Tools</category><author>Anurag Verma</author></item><item><title>Playwright E2E Testing in 2026: The Setup That Actually Scales</title><link>https://blog.codercops.com/blog/playwright-e2e-testing-web-apps-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/playwright-e2e-testing-web-apps-2026/</guid><description>Most E2E test suites start fast and grow painful. Playwright solves most of that, but only if you set it up right from the start. Here is what actually works in production.</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Testing</category><category>Developer Tools</category><category>JavaScript</category><category>TypeScript</category><category>Web Development</category><category>CI/CD</category><author>Anurag Verma</author></item><item><title>Scope Creep Is a Process Problem: How Agencies Protect Projects Without Burning Clients</title><link>https://blog.codercops.com/blog/scope-creep-agency-project-protection-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/scope-creep-agency-project-protection-2026/</guid><description>Scope creep feels like a client problem until you realize the same clients cause it on every project while other clients never do. The difference is process, not personality.</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate><category>Business</category><category>Agency</category><category>Business</category><category>Career</category><category>Pricing</category><category>Project Management</category><author>Anurag Verma</author></item><item><title>Transactional Email Engineering: Why Your Emails Land in Spam and How to Fix It</title><link>https://blog.codercops.com/blog/transactional-email-deliverability-dns-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/transactional-email-deliverability-dns-2026/</guid><description>Password resets, invoices, and notification emails are infrastructure. Most developers treat them as an afterthought until a client asks why their welcome emails are disappearing. Here is the full picture.</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Backend</category><category>Infrastructure</category><category>Web Development</category><category>Production</category><category>Developer Tools</category><author>Anurag Verma</author></item><item><title>LangGraph, CrewAI, and AutoGen: Picking an AI Agent Framework in 2026</title><link>https://blog.codercops.com/blog/ai-agent-frameworks-langgraph-crewai-autogen-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-agent-frameworks-langgraph-crewai-autogen-2026/</guid><description>Three leading agent orchestration frameworks, three different mental models. Here&apos;s when each one earns its place, what each costs you in complexity, and what the choice looks like when you&apos;re debugging at 2am.</description><pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Agents</category><category>LLM</category><category>Python</category><category>AI Integration</category><category>Architecture</category><category>2026</category><author>Anurag Verma</author></item><item><title>AI Contract Clauses Every Agency Needs to Review Before Signing</title><link>https://blog.codercops.com/blog/ai-contract-clauses-agency-clients-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-contract-clauses-agency-clients-2026/</guid><description>AI projects introduce IP, liability, and data training questions that standard software contracts don&apos;t address. Here&apos;s the language clients send and what it actually means for an agency taking the work.</description><pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate><category>Business</category><category>Business</category><category>Agency</category><category>AI Integration</category><category>Contracts</category><category>Legal</category><category>2026</category><author>Anurag Verma</author></item><item><title>Product Analytics for Developer Teams: PostHog vs Mixpanel vs Amplitude in 2026</title><link>https://blog.codercops.com/blog/product-analytics-posthog-mixpanel-amplitude-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/product-analytics-posthog-mixpanel-amplitude-2026/</guid><description>Most teams pick an analytics tool based on a free trial and then live with that choice for years. Here&apos;s an honest comparison of PostHog, Mixpanel, and Amplitude so you pick the right one before the data gets messy.</description><pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate><category>Technology</category><category>Analytics</category><category>Developer Tools</category><category>Product</category><category>SaaS</category><category>Business</category><category>2026</category><author>Anurag Verma</author></item><item><title>React Native&apos;s New Architecture in 2026: What the Fabric and JSI Migration Actually Took</title><link>https://blog.codercops.com/blog/react-native-new-architecture-fabric-jsi-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/react-native-new-architecture-fabric-jsi-2026/</guid><description>React Native&apos;s new architecture shipped as stable and has been default since RN 0.76. Here&apos;s what the Fabric renderer and JSI bridge replacement changed, what the migration looks like in practice, and where the remaining rough edges are.</description><pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate><category>Technology</category><category>React Native</category><category>Mobile</category><category>JavaScript</category><category>iOS</category><category>Android</category><category>2026</category><author>Anurag Verma</author></item><item><title>Stripe in 2026: The Payment APIs Every Web Agency Should Know</title><link>https://blog.codercops.com/blog/stripe-payment-apis-web-agencies-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/stripe-payment-apis-web-agencies-2026/</guid><description>Stripe&apos;s API surface has grown well beyond checkout forms. Here&apos;s the realistic breakdown of which Stripe products matter for agency work, which are overkill, and where teams consistently get burned.</description><pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Stripe</category><category>Payments</category><category>API</category><category>Backend</category><category>SaaS</category><author>Anurag Verma</author></item><item><title>AI Agent Memory: Patterns for Giving Agents Persistence Across Sessions</title><link>https://blog.codercops.com/blog/ai-agent-memory-patterns-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-agent-memory-patterns-2026/</guid><description>An agent that forgets everything when the session ends is a limited tool. Here are the practical patterns for building different kinds of memory into your agents.</description><pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Integration</category><category>LLM</category><category>Backend</category><category>Architecture</category><category>AI</category><category>Production</category><author>Anurag Verma</author></item><item><title>CSS Container Queries in Production: Components That Adapt to Their Context</title><link>https://blog.codercops.com/blog/css-container-queries-production-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/css-container-queries-production-2026/</guid><description>Media queries ask &apos;how wide is the viewport?&apos; Container queries ask &apos;how wide is my parent?&apos; That shift changes how you think about reusable components.</description><pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>CSS</category><category>Web Development</category><category>Frontend</category><category>Performance</category><category>Design</category><category>JavaScript</category><author>Anurag Verma</author></item><item><title>Lit and Web Components in 2026: The Framework-Agnostic Layer Worth Knowing</title><link>https://blog.codercops.com/blog/lit-web-components-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/lit-web-components-2026/</guid><description>If your design system needs to work in React, Vue, and a legacy jQuery app simultaneously, Web Components are the only native answer. Lit makes them practical to write.</description><pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Frontend</category><category>JavaScript</category><category>Design</category><category>TypeScript</category><category>Open Source</category><author>Anurag Verma</author></item><item><title>Sandboxed Code Execution for AI Agents: E2B, Modal, and Firecracker in Practice</title><link>https://blog.codercops.com/blog/sandboxed-code-execution-ai-agents-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/sandboxed-code-execution-ai-agents-2026/</guid><description>When your AI agent needs to run the code it writes, you can&apos;t let it touch your production servers. Here&apos;s how the main isolation options work and when to use each.</description><pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Integration</category><category>Security</category><category>Infrastructure</category><category>Developer Tools</category><category>Backend</category><category>LLM</category><author>Anurag Verma</author></item><item><title>White-Label Web Development: How Agencies Build Capacity Without Hiring</title><link>https://blog.codercops.com/blog/white-label-agency-partnerships-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/white-label-agency-partnerships-2026/</guid><description>Every agency hits the same wall: more work than the team can handle, but not enough volume to justify a full-time hire. White-label partnerships are how the ones that survive it manage growth.</description><pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate><category>Business</category><category>Business</category><category>Agency</category><category>Career</category><category>Pricing</category><category>Productivity</category><author>Anurag Verma</author></item><item><title>Figma AI in 2026: First Draft, AI Grid, and What Changed for Design Handoff</title><link>https://blog.codercops.com/blog/figma-ai-design-tools-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/figma-ai-design-tools-2026/</guid><description>Figma shipped real AI features at Config 2025 and teams have been using them for nearly a year. Here is what actually works, what still doesn&apos;t, and how design workflows at agencies have changed.</description><pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate><category>Design</category><category>Design</category><category>Figma</category><category>AI Integration</category><category>UI/UX</category><category>Frontend</category><category>Design Systems</category><author>Anurag Verma</author></item><item><title>KEDA, VPA, and Goldilocks: Kubernetes Autoscaling Beyond the HPA in 2026</title><link>https://blog.codercops.com/blog/kubernetes-autoscaling-keda-vpa-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/kubernetes-autoscaling-keda-vpa-2026/</guid><description>HPA scales on CPU and memory. But most production workloads don&apos;t scale well on those signals. KEDA, VPA, and Goldilocks fill the gaps that HPA leaves open.</description><pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Kubernetes</category><category>DevOps</category><category>Infrastructure</category><category>Cloud &amp; Infrastructure</category><category>Performance</category><category>Backend</category><author>Anurag Verma</author></item><item><title>OAuth 2.0 and PKCE: The Web Auth Patterns Every SPA Developer Needs in 2026</title><link>https://blog.codercops.com/blog/oauth2-pkce-jwt-web-auth-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/oauth2-pkce-jwt-web-auth-2026/</guid><description>The implicit flow is dead, and most tutorials still teach it. Here is how authorization code flow with PKCE actually works, how tokens should be stored, and where most SPA auth implementations go wrong.</description><pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Security</category><category>Authentication</category><category>Web Development</category><category>TypeScript</category><category>Backend</category><category>API</category><author>Anurag Verma</author></item><item><title>Open Source Licensing for Agencies: What MIT, Apache 2.0, and GPL Mean When You Ship Client Code</title><link>https://blog.codercops.com/blog/open-source-licensing-agencies-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/open-source-licensing-agencies-2026/</guid><description>Most agency developers don&apos;t think about the license of npm packages they install until a client&apos;s legal team asks. Here is what the major licenses actually require and where the real risks sit.</description><pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate><category>Business</category><category>Business</category><category>Open Source</category><category>Agency</category><category>Legal</category><category>Career</category><category>Developer Tools</category><author>Anurag Verma</author></item><item><title>Technical SEO for JavaScript Apps in 2026: What Google Actually Renders</title><link>https://blog.codercops.com/blog/technical-seo-javascript-apps-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/technical-seo-javascript-apps-2026/</guid><description>Google&apos;s crawler runs JavaScript, but not the same way a browser does. The gap between what your JavaScript app renders and what gets indexed is where most SPA SEO problems hide.</description><pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>SEO</category><category>Performance</category><category>Frontend</category><category>JavaScript</category><category>Next.js</category><author>Anurag Verma</author></item><item><title>AI in E-Commerce: What&apos;s Actually Working in 2026</title><link>https://blog.codercops.com/blog/ai-ecommerce-what-works-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-ecommerce-what-works-2026/</guid><description>Past the chatbot hype, AI is genuinely improving specific e-commerce outcomes. Here are the implementations producing measurable results, and the ones that still mostly disappoint.</description><pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Integration</category><category>Business</category><category>E-Commerce</category><category>Machine Learning</category><category>Production</category><category>2026</category><author>Anurag Verma</author></item><item><title>AI-Assisted Technical Documentation: Keeping Docs Accurate When Code Changes Fast</title><link>https://blog.codercops.com/blog/ai-technical-documentation-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-technical-documentation-2026/</guid><description>Bad documentation is usually not a writing problem — it&apos;s a maintenance problem. AI tools are changing the equation by making initial doc generation cheap and doc refresh practical at scale.</description><pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Developer Tools</category><category>AI Integration</category><category>Productivity</category><category>Backend</category><category>Documentation</category><category>2026</category><author>Anurag Verma</author></item><item><title>Developer Burnout in the AI Era: What&apos;s Different This Time</title><link>https://blog.codercops.com/blog/developer-burnout-ai-era-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/developer-burnout-ai-era-2026/</guid><description>Burnout among developers isn&apos;t new. But the specific pressures of 2026 — AI-driven productivity expectations, skills anxiety, and the blurring of output and identity — create a different texture of exhaustion.</description><pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate><category>Career</category><category>Career</category><category>Developer Tools</category><category>Productivity</category><category>2026</category><category>Mental Health</category><author>Anurag Verma</author></item><item><title>PostgreSQL Performance Tuning: EXPLAIN ANALYZE, Indexes, and Query Debugging</title><link>https://blog.codercops.com/blog/postgresql-performance-tuning-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/postgresql-performance-tuning-2026/</guid><description>The queries that destroy production Postgres databases share a small set of root causes. Here is how to find them, understand what EXPLAIN ANALYZE is telling you, and fix them without guessing.</description><pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Database</category><category>PostgreSQL</category><category>Backend</category><category>Performance</category><category>Production</category><category>Infrastructure</category><author>Anurag Verma</author></item><item><title>Progressive Web Apps in 2026: What Actually Works on iOS and Android</title><link>https://blog.codercops.com/blog/progressive-web-apps-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/progressive-web-apps-2026/</guid><description>PWAs got a second wind when iOS 16.4 unlocked push notifications and iOS 17 improved install behavior. Three years later, the gap between PWA and native is narrow enough to matter.</description><pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>PWA</category><category>Mobile</category><category>Performance</category><category>JavaScript</category><category>Frontend</category><author>Anurag Verma</author></item><item><title>The Vercel AI SDK in 2026: Streaming, Tool Calls, and Multi-Step Agents</title><link>https://blog.codercops.com/blog/vercel-ai-sdk-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/vercel-ai-sdk-2026/</guid><description>The Vercel AI SDK has become the default for building AI features in JavaScript apps. Here is what it actually does, how its core primitives work, and where the sharp edges still live.</description><pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Integration</category><category>JavaScript</category><category>TypeScript</category><category>Web Development</category><category>LLM</category><category>Developer Tools</category><author>Anurag Verma</author></item><item><title>Agency Retainer Models: Pricing Ongoing Work Without Burning Out</title><link>https://blog.codercops.com/blog/agency-retainer-pricing-models-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/agency-retainer-pricing-models-2026/</guid><description>Retainer contracts promise stable revenue. In practice, they often create scope creep, pricing resentment, and capacity problems. Here is how to structure them so they actually work for both sides.</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><category>Business</category><category>Agency</category><category>Business</category><category>Pricing</category><category>Revenue</category><category>Client Management</category><category>Career</category><author>Anurag Verma</author></item><item><title>Effect TS: Typed Error Handling in TypeScript That Actually Scales</title><link>https://blog.codercops.com/blog/effect-ts-typed-error-handling-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/effect-ts-typed-error-handling-2026/</guid><description>JavaScript error handling is broken by default — exceptions are untyped, async errors are easy to miss, and side effects are invisible in function signatures. Effect TS fixes all three. Here is how it works.</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>TypeScript</category><category>JavaScript</category><category>Backend</category><category>Developer Tools</category><category>Production</category><category>Architecture</category><author>Anurag Verma</author></item><item><title>LLM Hallucination in Production: Mitigation Strategies That Actually Work</title><link>https://blog.codercops.com/blog/llm-hallucination-mitigation-production-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/llm-hallucination-mitigation-production-2026/</guid><description>Hallucination is not a bug that gets patched in the next model release. It is a property of how language models work. Here are the patterns that actually reduce it in production systems, and what they cost.</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>LLM</category><category>Production</category><category>AI Integration</category><category>RAG</category><category>Developer Tools</category><author>Anurag Verma</author></item><item><title>Pinia in 2026: Vue State Management After Vuex</title><link>https://blog.codercops.com/blog/pinia-vue-state-management-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/pinia-vue-state-management-2026/</guid><description>Vuex was Vue&apos;s state management library for years. Pinia replaced it as the official recommendation and changed how Vue apps manage shared state. Here is how Pinia works and where it fits in a Vue 3 application.</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Vue</category><category>JavaScript</category><category>Frontend</category><category>State Management</category><category>TypeScript</category><category>Developer Tools</category><author>Anurag Verma</author></item><item><title>Hono in 2026: The Web Framework Built for the Edge</title><link>https://blog.codercops.com/blog/hono-edge-web-framework-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/hono-edge-web-framework-2026/</guid><description>Hono started as a tiny router for Cloudflare Workers and grew into the default choice for edge APIs. Here is what it does well, where it fits, and why the &apos;runs everywhere&apos; claim is actually true.</description><pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>JavaScript</category><category>TypeScript</category><category>Backend</category><category>Edge Computing</category><category>Developer Tools</category><author>Anurag Verma</author></item><item><title>INP Is a Core Web Vital Now. Here Is What&apos;s Still Failing and How to Fix It.</title><link>https://blog.codercops.com/blog/inp-core-web-vitals-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/inp-core-web-vitals-guide-2026/</guid><description>Interaction to Next Paint replaced First Input Delay in 2024, and most sites still haven&apos;t caught up. INP is harder to optimize because it measures every interaction, not just the first one.</description><pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Performance</category><category>Frontend</category><category>JavaScript</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>LLM Routing in Production: OpenRouter, LiteLLM, and When Provider Failover Pays Off</title><link>https://blog.codercops.com/blog/llm-routing-openrouter-litellm-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/llm-routing-openrouter-litellm-2026/</guid><description>Single-provider AI dependencies are a reliability risk. Routing layers like LiteLLM and OpenRouter let you fall back across providers, cap costs, and try smaller models first. Here is the architecture and when it actually matters.</description><pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Integration</category><category>LLM</category><category>Production</category><category>Infrastructure</category><category>Backend</category><category>Developer Tools</category><author>Anurag Verma</author></item><item><title>Neon Postgres: Serverless Database Branching Changes How Teams Work</title><link>https://blog.codercops.com/blog/neon-postgres-serverless-branching-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/neon-postgres-serverless-branching-2026/</guid><description>Neon separates storage from compute to make Postgres behave like a serverless resource. The branching feature is what actually changes the development workflow — here&apos;s how it works and when it&apos;s worth the migration.</description><pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Database</category><category>PostgreSQL</category><category>Cloud &amp; Infrastructure</category><category>Developer Tools</category><category>Backend</category><category>Production</category><author>Anurag Verma</author></item><item><title>TanStack Query in 2026: Server State Management That Gets Out of Your Way</title><link>https://blog.codercops.com/blog/tanstack-query-server-state-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/tanstack-query-server-state-2026/</guid><description>Client state is easy. Server state — data that lives on a backend, changes over time, and needs to stay in sync — is where most React apps make a mess. TanStack Query handles it without ceremony.</description><pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>React</category><category>TypeScript</category><category>Frontend</category><category>Developer Tools</category><category>Performance</category><author>Anurag Verma</author></item><item><title>CSS Anchor Positioning: Tooltips and Popovers Without JavaScript</title><link>https://blog.codercops.com/blog/css-anchor-positioning-tooltips-popovers-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/css-anchor-positioning-tooltips-popovers-2026/</guid><description>CSS Anchor Positioning lets you position one element relative to another using only CSS. No Popper.js, no JavaScript positioning logic, no layout recalculation on scroll. Here&apos;s how it works.</description><pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>CSS</category><category>Frontend</category><category>Web Development</category><category>Design</category><category>2026</category><author>Anurag Verma</author></item><item><title>gRPC in 2026: When to Use It Instead of REST or GraphQL</title><link>https://blog.codercops.com/blog/grpc-production-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/grpc-production-guide-2026/</guid><description>gRPC has been available for years but many teams default to REST without thinking through the tradeoffs. Here&apos;s how gRPC works, where it fits, and where it doesn&apos;t.</description><pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>API</category><category>gRPC</category><category>Backend</category><category>Architecture</category><category>Infrastructure</category><category>2026</category><author>Anurag Verma</author></item><item><title>k6 Load Testing: Performance Testing Your APIs Before Users Find the Problems</title><link>https://blog.codercops.com/blog/k6-load-testing-api-performance-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/k6-load-testing-api-performance-guide-2026/</guid><description>k6 is a developer-friendly load testing tool with JavaScript scripting, CI integration, and clear metrics. Here&apos;s how to write meaningful load tests, interpret the results, and catch performance regressions before they reach production.</description><pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Performance</category><category>Testing</category><category>DevOps</category><category>API</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>Python&apos;s Free-Threaded Mode: What the GIL Removal Actually Means for Your Code</title><link>https://blog.codercops.com/blog/python-free-threaded-mode-gil-removal-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/python-free-threaded-mode-gil-removal-2026/</guid><description>Python 3.13 shipped an experimental mode that removes the Global Interpreter Lock. Here&apos;s what the GIL actually does, what free-threaded Python changes, and what it still doesn&apos;t fix.</description><pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate><category>Technology</category><category>Python</category><category>Performance</category><category>Backend</category><category>Concurrency</category><category>2026</category><author>Anurag Verma</author></item><item><title>Tauri 2.0: Build Desktop and Mobile Apps with Web Tech, Without the Electron Bloat</title><link>https://blog.codercops.com/blog/tauri-2-desktop-mobile-apps-rust-web-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/tauri-2-desktop-mobile-apps-rust-web-2026/</guid><description>Tauri 2.0 added iOS and Android support while keeping what made 1.x compelling: tiny binaries, Rust backend, and native OS webviews instead of a bundled Chromium. Here&apos;s how it works and when to use it.</description><pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Rust</category><category>Desktop</category><category>Frontend</category><category>JavaScript</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>AI-Assisted Code Review: What the Tools Catch and Where Humans Still Win</title><link>https://blog.codercops.com/blog/ai-code-review-tools-workflows-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-code-review-tools-workflows-2026/</guid><description>CodeRabbit, GitHub Copilot code review, and similar tools have changed the first-pass review. Here&apos;s what they actually catch, where they fail, and the workflow that combines both effectively.</description><pubDate>Sun, 17 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Integration</category><category>Developer Tools</category><category>Code Review</category><category>DevOps</category><category>Productivity</category><author>Anurag Verma</author></item><item><title>Database Connection Pooling in 2026: PgBouncer, Supabase, and Prisma Accelerate</title><link>https://blog.codercops.com/blog/database-connection-pooling-production-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/database-connection-pooling-production-2026/</guid><description>Connection exhaustion is one of the most common production failures for apps that scale. Here&apos;s how pooling works, which tool fits which setup, and the configuration decisions that matter.</description><pubDate>Sun, 17 May 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>PostgreSQL</category><category>Backend</category><category>Performance</category><category>Production</category><category>Database</category><category>Infrastructure</category><author>Anurag Verma</author></item><item><title>pgvector in Practice: Semantic Search in Postgres Without a Separate Vector DB</title><link>https://blog.codercops.com/blog/pgvector-semantic-search-postgres-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/pgvector-semantic-search-postgres-2026/</guid><description>Add similarity search to your existing Postgres database using pgvector. Real setup, indexing strategies, and when you actually need a dedicated vector database.</description><pubDate>Sun, 17 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>PostgreSQL</category><category>AI Integration</category><category>LLM</category><category>Backend</category><category>Database</category><category>Semantic Search</category><author>Anurag Verma</author></item><item><title>Python 3.14: What&apos;s New and What Actually Matters</title><link>https://blog.codercops.com/blog/python-3-14-whats-new-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/python-3-14-whats-new-2026/</guid><description>Python 3.14 shipped in October 2025. Seven months in, the features worth caring about have become clear. Here&apos;s what changed, what to upgrade for, and what to ignore.</description><pubDate>Sun, 17 May 2026 00:00:00 GMT</pubDate><category>Technology</category><category>Python</category><category>Python 3.14</category><category>Developer Tools</category><category>Programming</category><category>Backend</category><author>Anurag Verma</author></item><item><title>Secrets Management in Production: The Patterns That Actually Work</title><link>https://blog.codercops.com/blog/secrets-management-production-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/secrets-management-production-2026/</guid><description>From .env files to Vault to AWS Secrets Manager: a practical guide to storing credentials, API keys, and certificates without waking up to a breach notification.</description><pubDate>Sun, 17 May 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Security</category><category>DevOps</category><category>Cloud &amp; Infrastructure</category><category>Backend</category><category>Production</category><author>Anurag Verma</author></item><item><title>shadcn/ui in 2026: The Component Library That Refuses to Be a Dependency</title><link>https://blog.codercops.com/blog/shadcn-ui-component-library-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/shadcn-ui-component-library-2026/</guid><description>shadcn/ui is now the default starting point for React UIs. Here&apos;s what it actually is, why copy-paste beats npm install, and how to use it without accumulating a mess.</description><pubDate>Sun, 17 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>React</category><category>Frontend</category><category>UI</category><category>Tailwind CSS</category><category>TypeScript</category><author>Anurag Verma</author></item><item><title>HTTP Caching in Practice: Cache-Control, ETags, and CDN Invalidation</title><link>https://blog.codercops.com/blog/http-caching-cache-control-etags-cdn-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/http-caching-cache-control-etags-cdn-2026/</guid><description>HTTP caching is one of the highest-leverage performance optimizations available, and one of the most consistently misunderstood. Here is how it actually works, why stale content happens, and how to design a caching strategy that does not surprise you in production.</description><pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Performance</category><category>HTTP</category><category>CDN</category><category>Caching</category><category>Backend</category><category>2026</category><author>Anurag Verma</author></item><item><title>Incident Response for Small Engineering Teams: SRE Without a Dedicated Ops Team</title><link>https://blog.codercops.com/blog/incident-response-small-teams-sre-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/incident-response-small-teams-sre-2026/</guid><description>Site reliability engineering was designed for teams of hundreds. Most of its principles translate directly to teams of 5. Here is what a practical incident response process looks like when nobody has &apos;SRE&apos; in their title.</description><pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>SRE</category><category>DevOps</category><category>Infrastructure</category><category>Production</category><category>On-Call</category><category>Cloud &amp; Infrastructure</category><author>Anurag Verma</author></item><item><title>SaaS Pricing Models That Actually Retain Customers: Usage-Based, Seat-Based, and Hybrid</title><link>https://blog.codercops.com/blog/saas-pricing-models-usage-based-seat-based-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/saas-pricing-models-usage-based-seat-based-2026/</guid><description>Choosing the wrong pricing model doesn&apos;t just slow growth — it creates misalignment that drives churn. Here is how the main SaaS pricing models actually work, where each one breaks down, and how to pick the right one for your product.</description><pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate><category>Business</category><category>SaaS</category><category>Pricing</category><category>Business</category><category>Product</category><category>Revenue</category><category>Growth</category><author>Anurag Verma</author></item><item><title>Secrets Management in 2026: Vault, Doppler, AWS Secrets Manager, and When .env Is Fine</title><link>https://blog.codercops.com/blog/secrets-management-vault-doppler-aws-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/secrets-management-vault-doppler-aws-2026/</guid><description>Leaked credentials are the most preventable category of security breach. Here is an honest look at when you need a dedicated secrets manager, which tool to pick, and what to do if you&apos;re still on .env files.</description><pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>Security</category><category>Cybersecurity</category><category>DevOps</category><category>Infrastructure</category><category>Developer Tools</category><category>Production</category><author>Anurag Verma</author></item><item><title>Service Mesh in 2026: Do You Actually Need Istio, Linkerd, or Cilium?</title><link>https://blog.codercops.com/blog/service-mesh-2026-istio-linkerd-cilium/</link><guid isPermaLink="true">https://blog.codercops.com/blog/service-mesh-2026-istio-linkerd-cilium/</guid><description>Service meshes promise secure, observable microservice communication. But most teams that adopt one do so before they need it. Here is how to decide, and what each option actually costs you.</description><pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Service Mesh</category><category>Kubernetes</category><category>Infrastructure</category><category>DevOps</category><category>Microservices</category><category>Cloud &amp; Infrastructure</category><author>Anurag Verma</author></item><item><title>The Agency Client Onboarding Playbook: What We Do in the First 30 Days</title><link>https://blog.codercops.com/blog/agency-client-onboarding-first-30-days-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/agency-client-onboarding-first-30-days-2026/</guid><description>Project kickoffs are where agency relationships are won or lost. The wrong start leads to scope creep, missed expectations, and a client who stops responding. Here&apos;s the exact onboarding process we use.</description><pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate><category>Business</category><category>Agency</category><category>Business</category><category>Client Management</category><category>2026</category><author>Anurag Verma</author></item><item><title>API Versioning Strategies That Don&apos;t Break Clients: URL, Header, and Content Negotiation</title><link>https://blog.codercops.com/blog/api-versioning-strategies-production-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/api-versioning-strategies-production-guide-2026/</guid><description>Breaking API changes are inevitable. How you handle versioning determines whether clients trust your platform or avoid integrating with it. Here&apos;s a practical comparison of URL versioning, header versioning, and content negotiation.</description><pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>API</category><category>Web Development</category><category>Backend</category><category>Architecture</category><category>REST</category><category>2026</category><author>Anurag Verma</author></item><item><title>Event-Driven Architecture in Practice: Kafka, Redis Streams, and When Each Fits</title><link>https://blog.codercops.com/blog/event-driven-architecture-kafka-redis-streams-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/event-driven-architecture-kafka-redis-streams-2026/</guid><description>Message queues and event streams solve different problems. Kafka is not always the right answer. Here&apos;s how to think through event-driven patterns and choose the right tool for your production workload.</description><pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Architecture</category><category>Kafka</category><category>Redis</category><category>Infrastructure</category><category>Backend</category><category>2026</category><author>Anurag Verma</author></item><item><title>Multi-Tenancy for SaaS: Database-per-Tenant, Schema, and Row-Level Security Compared</title><link>https://blog.codercops.com/blog/multi-tenancy-saas-architecture-patterns-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/multi-tenancy-saas-architecture-patterns-2026/</guid><description>Every SaaS team eventually faces the multi-tenancy decision. The wrong choice creates migration pain later. Here&apos;s how to think through database-per-tenant, schema-per-tenant, and row-level security based on what your product actually needs.</description><pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Architecture</category><category>Database</category><category>PostgreSQL</category><category>SaaS</category><category>Backend</category><category>2026</category><author>Anurag Verma</author></item><item><title>SQL Window Functions: The Analytics Queries Your ORM Won&apos;t Write for You</title><link>https://blog.codercops.com/blog/sql-window-functions-analytics-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/sql-window-functions-analytics-guide-2026/</guid><description>Running totals, rankings, moving averages, lag and lead comparisons: window functions handle the analytics queries that would otherwise require application-side loops or multiple round-trips. Here&apos;s how they work.</description><pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>SQL</category><category>Database</category><category>PostgreSQL</category><category>Analytics</category><category>Backend</category><category>Tutorial</category><category>2026</category><author>Anurag Verma</author></item><item><title>Drizzle ORM: TypeScript-First Database Access That Gets Out of Your Way</title><link>https://blog.codercops.com/blog/drizzle-orm-typescript-database-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/drizzle-orm-typescript-database-2026/</guid><description>Drizzle ORM has become the go-to choice for TypeScript projects that want type safety without the overhead of a heavy ORM. Here&apos;s how it works, how to migrate from Prisma, and when to use it.</description><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>TypeScript</category><category>Database</category><category>ORM</category><category>JavaScript</category><category>Backend</category><category>2026</category><author>Anurag Verma</author></item><item><title>LLM Observability in 2026: What to Track and Which Tools to Use</title><link>https://blog.codercops.com/blog/llm-observability-langfuse-helicone-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/llm-observability-langfuse-helicone-2026/</guid><description>Building an AI feature is only half the work. Once it&apos;s in production, you need to know when it&apos;s drifting, what it&apos;s costing, and where it&apos;s failing. Here&apos;s how to instrument LLM applications properly.</description><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>LLM</category><category>AI</category><category>Observability</category><category>Production</category><category>AI Integration</category><category>2026</category><author>Anurag Verma</author></item><item><title>Polars vs Pandas in 2026: When to Switch and What to Expect</title><link>https://blog.codercops.com/blog/polars-vs-pandas-data-pipelines-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/polars-vs-pandas-data-pipelines-2026/</guid><description>Polars has hit stable 1.x and is showing up in production data pipelines everywhere. Here&apos;s an honest comparison with pandas, where Polars wins, where it doesn&apos;t, and a migration walkthrough.</description><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate><category>Technology</category><category>Python</category><category>Data Science</category><category>Polars</category><category>Pandas</category><category>Performance</category><category>2026</category><author>Anurag Verma</author></item><item><title>Tailwind CSS v4: What Changed and How to Migrate</title><link>https://blog.codercops.com/blog/tailwind-css-v4-migration-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/tailwind-css-v4-migration-guide-2026/</guid><description>Tailwind v4 moves configuration from JavaScript to CSS, drops the content array, and ships a faster engine. Here&apos;s what the breaking changes actually mean for a real project migration.</description><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>CSS</category><category>Tailwind</category><category>Frontend</category><category>Web Development</category><category>2026</category><author>Anurag Verma</author></item><item><title>Vitest in 2026: The Testing Setup That Replaced Jest for Our Team</title><link>https://blog.codercops.com/blog/vitest-replace-jest-modern-testing-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/vitest-replace-jest-modern-testing-2026/</guid><description>Vitest runs faster, works natively with ESM and TypeScript, and uses the same API as Jest. If you&apos;re still on Jest in a Vite-based project, here&apos;s the case for switching and exactly how to do it.</description><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate><category>Technology</category><category>Testing</category><category>JavaScript</category><category>TypeScript</category><category>Developer Tools</category><category>Vitest</category><category>2026</category><author>Anurag Verma</author></item><item><title>Biome in 2026: One Tool to Replace ESLint and Prettier</title><link>https://blog.codercops.com/blog/biome-javascript-linter-formatter-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/biome-javascript-linter-formatter-2026/</guid><description>Biome is a Rust-based JavaScript toolchain that handles linting, formatting, and imports in a single binary. We&apos;ve been running it in production projects since late 2025. Here&apos;s what the migration from ESLint and Prettier actually looks like.</description><pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>JavaScript</category><category>TypeScript</category><category>Developer Tools</category><category>Frontend</category><category>Performance</category><category>Productivity</category><category>2026</category><author>Anurag Verma</author></item><item><title>Container Security in 2026: Image Scanning, SBOMs, and What Teams Actually Do</title><link>https://blog.codercops.com/blog/container-security-image-scanning-runtime-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/container-security-image-scanning-runtime-2026/</guid><description>Running containers in production without scanning them is the equivalent of shipping code without running tests. Here&apos;s how teams scan images, generate SBOMs, and add runtime protection, from the CI step to the cluster.</description><pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>Security</category><category>DevOps</category><category>Docker</category><category>Cybersecurity</category><category>DevSecOps</category><category>Infrastructure</category><category>2026</category><author>Anurag Verma</author></item><item><title>OpenAPI-First API Development: Write the Contract Before the Code</title><link>https://blog.codercops.com/blog/openapi-first-api-development-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/openapi-first-api-development-2026/</guid><description>Code-first API development produces documentation as an afterthought. OpenAPI-first flips that: you write the spec, generate the server stubs and client SDKs, and enforce the contract at every layer. Here&apos;s how it works in practice.</description><pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>API Design</category><category>TypeScript</category><category>Backend</category><category>Web Development</category><category>Developer Tools</category><category>Production</category><category>2026</category><author>Anurag Verma</author></item><item><title>Server-Sent Events vs WebSockets in 2026: Picking the Right Real-Time Transport</title><link>https://blog.codercops.com/blog/server-sent-events-vs-websockets-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/server-sent-events-vs-websockets-2026/</guid><description>Not every real-time feature needs WebSockets. Server-Sent Events handle most push scenarios with far less complexity. Here&apos;s how to choose, and what each approach looks like in actual code.</description><pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Real-time</category><category>JavaScript</category><category>Backend</category><category>Performance</category><category>2026</category><author>Anurag Verma</author></item><item><title>Temporal for Durable Workflows: How We Finally Stopped Losing Background Jobs</title><link>https://blog.codercops.com/blog/temporal-durable-workflows-production-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/temporal-durable-workflows-production-2026/</guid><description>Background jobs that crash mid-execution lose all their state. Temporal solves this by making workflows durable state machines that survive process restarts, deploys, and outages. Here&apos;s what it looks like in TypeScript and Python.</description><pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Backend</category><category>Infrastructure</category><category>Node.js</category><category>Python</category><category>Production</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>API Rate Limiting: Token Bucket, Sliding Window, and Redis Patterns</title><link>https://blog.codercops.com/blog/api-rate-limiting-patterns-redis-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/api-rate-limiting-patterns-redis-2026/</guid><description>Every public API needs rate limiting, but the algorithm you choose shapes the user experience and the failure modes. Here&apos;s how each approach works and when to use it.</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>API</category><category>Backend</category><category>Redis</category><category>Performance</category><category>Architecture</category><category>Web Development</category><category>2026</category><author>Anurag Verma</author></item><item><title>Passkeys Are Ready: Implementing Passwordless Auth in Your Web App</title><link>https://blog.codercops.com/blog/passkeys-passwordless-auth-webauthn-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/passkeys-passwordless-auth-webauthn-2026/</guid><description>Passkeys are no longer an experimental feature. Apple, Google, and Microsoft all support them natively. Here&apos;s what WebAuthn actually looks like in code and when passkeys make sense for your app.</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>Security</category><category>Authentication</category><category>WebAuthn</category><category>Cybersecurity</category><category>Web Development</category><category>2026</category><author>Anurag Verma</author></item><item><title>Playwright in 2026: End-to-End Testing That Survives Code Changes</title><link>https://blog.codercops.com/blog/playwright-e2e-testing-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/playwright-e2e-testing-guide-2026/</guid><description>Most E2E test suites break as fast as the features they cover. Here&apos;s how to write Playwright tests that hold up when the UI changes, the data changes, and the team keeps shipping.</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Testing</category><category>Playwright</category><category>Web Development</category><category>JavaScript</category><category>TypeScript</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>How to Write a Technical Proposal That Wins Agency Work</title><link>https://blog.codercops.com/blog/technical-proposal-writing-agency-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/technical-proposal-writing-agency-2026/</guid><description>Most technical proposals lose because they describe what will be built, not why the client should trust you to build it. Here&apos;s how to write one that actually wins.</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><category>Business</category><category>Agency</category><category>Business</category><category>Pricing</category><category>Client Management</category><category>Career</category><category>2026</category><author>Anurag Verma</author></item><item><title>GitHub Actions in 2026: Faster Pipelines, Smaller Bills</title><link>https://blog.codercops.com/blog/github-actions-optimization-speed-cost-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/github-actions-optimization-speed-cost-2026/</guid><description>Most teams treat their CI pipeline as a black box that occasionally fails. A few hours of optimization can cut your CI time by 40-60% and your GitHub Actions bill by a similar margin. Here&apos;s exactly how to do it.</description><pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>GitHub Actions</category><category>CI/CD</category><category>DevOps</category><category>Performance</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>LLM Evals in Practice: Testing AI Features Before They Go Wrong</title><link>https://blog.codercops.com/blog/llm-eval-testing-ai-features-production-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/llm-eval-testing-ai-features-production-2026/</guid><description>Unit tests tell you if your code does what you wrote. They don&apos;t tell you if your AI feature does what users need. Here&apos;s how to build an evaluation pipeline that catches the failures that matter before users do.</description><pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>LLM</category><category>AI</category><category>Testing</category><category>Python</category><category>Production</category><category>2026</category><author>Anurag Verma</author></item><item><title>Terraform vs OpenTofu vs Pulumi: Picking Your IaC Tool in 2026</title><link>https://blog.codercops.com/blog/terraform-opentofu-pulumi-iac-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/terraform-opentofu-pulumi-iac-2026/</guid><description>HashiCorp moved Terraform to a Business Source License in August 2023. OpenTofu forked it under the MPL. Pulumi took a different path entirely. Two and a half years on, the dust has settled enough to make a clear-headed choice.</description><pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Terraform</category><category>Infrastructure</category><category>DevOps</category><category>Cloud</category><category>Open Source</category><category>2026</category><author>Anurag Verma</author></item><item><title>Valkey in 2026: What Happened When Redis Changed Its License</title><link>https://blog.codercops.com/blog/valkey-redis-fork-open-source-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/valkey-redis-fork-open-source-2026/</guid><description>In March 2024, Redis Ltd. relicensed Redis under a source-available license. Within weeks, the Linux Foundation forked it as Valkey. Two years on, here&apos;s how the split played out and what it means for teams choosing an in-memory data store today.</description><pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Redis</category><category>Valkey</category><category>Open Source</category><category>Infrastructure</category><category>Backend</category><category>2026</category><author>Anurag Verma</author></item><item><title>Writing AI IDE Rules That Actually Work: Cursor, Windsurf, and Copilot</title><link>https://blog.codercops.com/blog/ai-ide-rules-cursor-windsurf-copilot-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-ide-rules-cursor-windsurf-copilot-2026/</guid><description>The AI IDE tools everyone uses have a feature most developers set up once and never tune: custom rules. Here&apos;s how to write rules that change how the tool generates code, not just what it says it will do.</description><pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Developer Tools</category><category>Cursor</category><category>Productivity</category><category>2026</category><author>Anurag Verma</author></item><item><title>Caching LLM Responses: When It Helps, When It Hurts, and How to Implement It</title><link>https://blog.codercops.com/blog/caching-llm-responses-strategies-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/caching-llm-responses-strategies-2026/</guid><description>LLM calls are slow and expensive. Caching them is the obvious move. But caching the wrong responses breaks the user experience in ways that are subtle and hard to debug. Here&apos;s a practical guide to doing it right.</description><pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>LLM</category><category>Caching</category><category>Performance</category><category>AI</category><category>Backend</category><category>2026</category><author>Anurag Verma</author></item><item><title>Feature Flags for AI Features: Shipping Safely When Outputs Are Non-Deterministic</title><link>https://blog.codercops.com/blog/feature-flags-ai-features-production-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/feature-flags-ai-features-production-2026/</guid><description>Rolling back a bad API endpoint takes seconds. Rolling back a bad LLM integration is harder — the damage may already be in your logs, your users&apos; inboxes, or your clients&apos; feeds. Feature flags are how you ship AI features without betting everything on launch day.</description><pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Feature Flags</category><category>Production</category><category>Developer Tools</category><category>LLM</category><category>2026</category><author>Anurag Verma</author></item><item><title>HTTP/3 and QUIC in 2026: When to Enable It and What to Expect</title><link>https://blog.codercops.com/blog/http3-quic-web-performance-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/http3-quic-web-performance-2026/</guid><description>HTTP/3 is in production at every major CDN and supported by all modern browsers. Whether it actually helps your application depends on factors most guides don&apos;t explain.</description><pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Performance</category><category>HTTP</category><category>Networking</category><category>2026</category><author>Anurag Verma</author></item><item><title>LLM API Costs Are Out of Control: A Production Guide to Cutting Your Bill</title><link>https://blog.codercops.com/blog/llm-api-cost-optimization-production-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/llm-api-cost-optimization-production-2026/</guid><description>AI features ship fast. Then the monthly API bill arrives. Here&apos;s a systematic approach to understanding and reducing LLM costs without breaking the product.</description><pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>LLM</category><category>Cost Optimization</category><category>API</category><category>Production</category><category>2026</category><author>Anurag Verma</author></item><item><title>LLM Structured Outputs in 2026: Reliable JSON Without the Parser Nightmares</title><link>https://blog.codercops.com/blog/llm-structured-outputs-reliable-json-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/llm-structured-outputs-reliable-json-2026/</guid><description>Getting a language model to return valid, schema-conforming JSON is harder than it looks. Here&apos;s what works in production, from native structured output APIs to library-level validation.</description><pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>LLM</category><category>AI</category><category>JSON</category><category>Python</category><category>Backend</category><category>2026</category><author>Anurag Verma</author></item><item><title>Scoping AI Projects for Clients: The Questions That Prevent Expensive Mistakes</title><link>https://blog.codercops.com/blog/scoping-ai-projects-client-discovery-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/scoping-ai-projects-client-discovery-2026/</guid><description>Most AI project failures start at the scoping stage. The client wants &apos;AI integration.&apos; The agency quotes a price. Nobody defines what that actually means. Here&apos;s how to scope these projects properly.</description><pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate><category>Business</category><category>Agency</category><category>AI</category><category>Business</category><category>Client Management</category><category>Pricing</category><category>2026</category><author>Anurag Verma</author></item><item><title>What an AI Feature Actually Costs: The Budget Lines Nobody Plans For</title><link>https://blog.codercops.com/blog/true-cost-ai-features-production-budget-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/true-cost-ai-features-production-budget-2026/</guid><description>Every AI integration budget starts with API costs and ends with surprises. Here&apos;s what production AI features actually cost once you account for everything the initial estimate missed.</description><pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate><category>Business</category><category>Business</category><category>AI</category><category>Agency</category><category>Pricing</category><category>LLM</category><category>2026</category><author>Anurag Verma</author></item><item><title>uv: How We Replaced pip, poetry, and pyenv With One Tool</title><link>https://blog.codercops.com/blog/uv-python-package-manager-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/uv-python-package-manager-2026/</guid><description>uv is a Python package manager written in Rust that handles dependencies, virtual environments, and Python version management. We&apos;ve been using it across all our projects since early 2026. Here&apos;s what actually changed.</description><pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate><category>Technology</category><category>Python</category><category>Developer Tools</category><category>uv</category><category>Package Manager</category><category>Productivity</category><category>2026</category><author>Anurag Verma</author></item><item><title>Zero-Downtime Database Migrations: A Field Guide for Production Systems</title><link>https://blog.codercops.com/blog/zero-downtime-database-migrations-production-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/zero-downtime-database-migrations-production-2026/</guid><description>ALTER TABLE locks your database. Your migration takes longer than expected. Users get errors. Here&apos;s how to handle schema changes that don&apos;t interrupt production traffic.</description><pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Database</category><category>PostgreSQL</category><category>Performance</category><category>Production</category><category>Backend</category><category>2026</category><author>Anurag Verma</author></item><item><title>Fixed Price vs Time and Materials: The Contract Decision That Shapes Every Project</title><link>https://blog.codercops.com/blog/fixed-price-vs-time-materials-agency-contracts/</link><guid isPermaLink="true">https://blog.codercops.com/blog/fixed-price-vs-time-materials-agency-contracts/</guid><description>The choice between fixed-price and time-and-materials contracts is one of the most consequential decisions in an agency-client relationship. Each model transfers risk differently. Here&apos;s how to decide which one fits your project.</description><pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate><category>Business</category><category>Agency</category><category>Business</category><category>Pricing</category><category>Contracts</category><category>Freelance</category><category>2026</category><author>Anurag Verma</author></item><item><title>OpenTelemetry for AI Applications: Observability When Your Stack Thinks for Itself</title><link>https://blog.codercops.com/blog/opentelemetry-observability-ai-apps-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/opentelemetry-observability-ai-apps-2026/</guid><description>Traditional monitoring tells you a request took 800ms. It doesn&apos;t tell you the LLM spent 600ms on a bad prompt, returned a hallucinated answer, and burned $0.04 in tokens. Here&apos;s how to actually instrument AI applications with OpenTelemetry.</description><pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>OpenTelemetry</category><category>Observability</category><category>AI</category><category>Monitoring</category><category>Cloud</category><category>2026</category><author>Anurag Verma</author></item><item><title>Prompt Injection in 2026: The Attack Your AI App Probably Isn&apos;t Defending Against</title><link>https://blog.codercops.com/blog/prompt-injection-attacks-ai-apps-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/prompt-injection-attacks-ai-apps-2026/</guid><description>Prompt injection is the SQL injection of the AI era. As LLMs ship into production apps by the millions, attackers are learning how to hijack them through the data they consume. Here&apos;s what the attack looks like and how to defend against it.</description><pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>Security</category><category>AI</category><category>LLM</category><category>Cybersecurity</category><category>Prompt Injection</category><category>2026</category><author>Anurag Verma</author></item><item><title>WebRTC in 2026: Adding Real-Time Features Without the Pain</title><link>https://blog.codercops.com/blog/webrtc-real-time-features-web-apps-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/webrtc-real-time-features-web-apps-2026/</guid><description>Video calls, live collaboration, real-time audio — features clients want more than ever. WebRTC makes them possible, but the gap between a working demo and a production deployment is wider than the documentation suggests. Here&apos;s what that gap looks like.</description><pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>WebRTC</category><category>Real-time</category><category>JavaScript</category><category>Web Development</category><category>WebSockets</category><category>2026</category><author>Anurag Verma</author></item><item><title>Are Website Developers in Demand in 2026? (And How Many Hours Do They Actually Work?)</title><link>https://blog.codercops.com/blog/are-website-developers-in-demand-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/are-website-developers-in-demand-2026/</guid><description>The honest read on web developer demand after AI&apos;s impact, which roles are hot, which are cooling, and what the working week actually looks like across employment types.</description><pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate><category>Career</category><category>Career</category><category>Web Development</category><category>Job Market</category><category>AI Impact</category><category>2026</category><author>Anurag Verma</author></item><item><title>How Much Do Web Design and Development Agencies Actually Make? (2026)</title><link>https://blog.codercops.com/blog/how-much-do-web-design-development-agencies-make-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/how-much-do-web-design-development-agencies-make-2026/</guid><description>Real revenue, profit margins, and owner take-home for solo, boutique, mid-size, and enterprise web agencies, including the messy parts most income reports skip.</description><pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate><category>Business</category><category>Agency</category><category>Business</category><category>Revenue</category><category>Career</category><category>Web Development</category><category>2026</category><author>Anurag Verma</author></item><item><title>How Much Is Website Development? A Quick 2026 Answer With Real Ranges</title><link>https://blog.codercops.com/blog/how-much-is-website-development-quick-answer-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/how-much-is-website-development-quick-answer-2026/</guid><description>A short, direct answer to &apos;how much is website development&apos; with bracket ranges by project type, the four levers that move the price, and where to read the deeper breakdown.</description><pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Pricing</category><category>Cost</category><category>Buyer Guide</category><category>2026</category><author>Anurag Verma</author></item><item><title>How Often Should Your Website Be Updated? A Realistic 2026 Cadence Guide</title><link>https://blog.codercops.com/blog/how-often-should-websites-be-updated-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/how-often-should-websites-be-updated-2026/</guid><description>Five different things people mean by &apos;update&apos; (content, dependencies, performance, design, full rebuild) and how often each should actually happen.</description><pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Maintenance</category><category>Performance</category><category>Strategy</category><category>2026</category><author>Anurag Verma</author></item><item><title>Website Development Companies Near Me: Local vs. Remote in 2026</title><link>https://blog.codercops.com/blog/website-development-companies-near-me-local-vs-remote-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/website-development-companies-near-me-local-vs-remote-2026/</guid><description>When proximity actually matters, when it doesn&apos;t, and how to evaluate local agencies without falling for the &apos;we have an office in your city&apos; theatre.</description><pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Agency</category><category>Buyer Guide</category><category>Local SEO</category><category>Business</category><category>2026</category><author>Anurag Verma</author></item><item><title>From Copilots to Agents: How Autonomous AI Is Changing How We Build Software</title><link>https://blog.codercops.com/blog/ai-agents-changing-software-development-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-agents-changing-software-development-2026/</guid><description>AI coding has moved past autocomplete. In 2026, autonomous agents read tickets, write code, run tests, fix failures, and submit PRs — all without human intervention. Here is what this actually looks like in practice and what it means for engineering teams.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Agents</category><category>Autonomous Coding</category><category>SDLC</category><category>Software Engineering</category><category>Claude Code</category><category>2026</category><author>Anurag Verma</author></item><item><title>7 AI Coding Mistakes That Are Quietly Destroying Codebases — And How We Fix Them</title><link>https://blog.codercops.com/blog/ai-coding-mistakes-nobody-talks-about-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-coding-mistakes-nobody-talks-about-2026/</guid><description>AI coding tools accelerate development. They also introduce subtle, systemic problems that most teams do not notice until it is too late. Here are the 7 AI-specific mistakes we have seen across 11 client projects, and the patterns we use to prevent them.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><category>Best Practices</category><category>AI Coding Mistakes</category><category>Technical Debt</category><category>Code Quality</category><category>Software Engineering</category><category>Best Practices</category><category>2026</category><author>Anurag Verma</author></item><item><title>Is AI Actually Replacing Junior Developers? The 2026 Reality Check.</title><link>https://blog.codercops.com/blog/ai-replacing-junior-developers-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-replacing-junior-developers-2026/</guid><description>Junior developer hiring is down 30% since 2024. AI tools now handle the grunt work that used to train entry-level engineers. But the real story is more complicated — and more important — than the headlines suggest.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><category>Industry Trends</category><category>AI</category><category>Junior Developers</category><category>Tech Careers</category><category>Software Engineering</category><category>Hiring</category><category>2026</category><author>Anurag Verma</author></item><item><title>B2B Website Agency Guide: What to Demand Beyond Visual Design</title><link>https://blog.codercops.com/blog/b2b-website-agency-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/b2b-website-agency-guide-2026/</guid><description>How to choose a B2B website agency that can support long buying cycles, multiple stakeholders, and demand generation outcomes.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>B2B</category><category>Web Development</category><category>Agency</category><category>Demand Generation</category><category>Conversion</category><category>2026</category><author>Anurag Verma</author></item><item><title>The Best AI Coding Tools in 2026: What We Actually Use and Why</title><link>https://blog.codercops.com/blog/best-ai-coding-tools-2026-engineers-guide/</link><guid isPermaLink="true">https://blog.codercops.com/blog/best-ai-coding-tools-2026-engineers-guide/</guid><description>We tested every major AI coding tool on real client projects. Here is our honest breakdown of Claude Code, Cursor, GitHub Copilot, Windsurf, and more — with actual workflow recommendations for different types of developers.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><category>Developer Tools</category><category>AI Tools</category><category>Claude Code</category><category>Cursor</category><category>GitHub Copilot</category><category>Windsurf</category><category>Developer Productivity</category><category>2026</category><author>Anurag Verma</author></item><item><title>The AI Workflow That Lets Our 3-Person Team Compete with 30-Person Companies</title><link>https://blog.codercops.com/blog/best-ai-workflow-saas-founders-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/best-ai-workflow-saas-founders-2026/</guid><description>How SaaS founders are using AI agents, automation hubs, and agentic workflows to run lean teams that punch above their weight. Our complete workflow with tools, costs, and real results.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><category>Business Strategy</category><category>SaaS Founders</category><category>AI Workflow</category><category>Business Automation</category><category>Lean Startups</category><category>Productivity</category><category>2026</category><author>Anurag Verma</author></item><item><title>Can AI Build Full-Stack Apps in 2026? We Tested the Top Platforms.</title><link>https://blog.codercops.com/blog/can-ai-build-full-stack-apps-now-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/can-ai-build-full-stack-apps-now-2026/</guid><description>Bolt.new, Lovable, Replit Agent, and v0 all promise &apos;prompt to production.&apos; We built the same application on each platform and here is what actually happened — the good, the broken, and the security nightmares.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Full-Stack Development</category><category>AI App Builders</category><category>Bolt.new</category><category>Lovable</category><category>Replit Agent</category><category>v0</category><category>2026</category><author>Anurag Verma</author></item><item><title>Cursor vs. GitHub Copilot vs. Claude Code: An Honest Comparison for 2026</title><link>https://blog.codercops.com/blog/cursor-vs-github-copilot-vs-claude-code-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/cursor-vs-github-copilot-vs-claude-code-2026/</guid><description>Three tools, three philosophies, three different answers to &apos;how should AI help me code?&apos; We tested all three on real projects and here is the breakdown — including when to use each and when to use all three together.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><category>Developer Tools</category><category>Cursor</category><category>GitHub Copilot</category><category>Claude Code</category><category>AI Comparison</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>Denver Website Design Agency: How to Choose the Right Partner in 2026</title><link>https://blog.codercops.com/blog/denver-website-design-agency-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/denver-website-design-agency-guide-2026/</guid><description>A practical Denver website design agency guide covering local fit, process maturity, pricing expectations, and performance-first delivery.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Denver</category><category>Website Design</category><category>Agency</category><category>Web Development</category><category>Local SEO</category><category>2026</category><author>Anurag Verma</author></item><item><title>Ecommerce Website Development Agency: What Actually Improves Conversion in 2026</title><link>https://blog.codercops.com/blog/ecommerce-website-development-agency-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ecommerce-website-development-agency-guide-2026/</guid><description>A practical framework for selecting an ecommerce website development agency, with checkout UX, speed, mobile conversion, and platform trade-offs.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Ecommerce</category><category>Web Development</category><category>Conversion</category><category>CRO</category><category>Agency</category><category>2026</category><author>Anurag Verma</author></item><item><title>Federal Agency Website Funding Restoration: What Digital Teams Should Do Next</title><link>https://blog.codercops.com/blog/federal-agency-website-funding-restoration-digital-teams-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/federal-agency-website-funding-restoration-digital-teams-2026/</guid><description>A practical response framework for public-sector digital teams after federal website funding restoration orders, with resilience, accessibility, and vendor continuity priorities.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><category>Technology</category><category>Public Sector</category><category>Government Websites</category><category>Digital Strategy</category><category>Accessibility</category><category>Risk Management</category><category>2026</category><author>Anurag Verma</author></item><item><title>The Future of the Software Engineer: What Survives, What Dies, and What Emerges</title><link>https://blog.codercops.com/blog/future-software-engineers-after-ai-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/future-software-engineers-after-ai-2026/</guid><description>AI writes 41% of the world&apos;s code. Senior engineers report 2x productivity. Junior hiring is down 30%. So what does the future actually look like for software engineers? Here is our honest assessment — informed by what we see every day building software with AI tools.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><category>Industry Trends</category><category>Future of Software Engineering</category><category>AI Era</category><category>Tech Careers</category><category>Software Architecture</category><category>2026</category><author>Anurag Verma</author></item><item><title>How Our Developers Actually Use AI in Production — No Hype, Just the Real Workflow</title><link>https://blog.codercops.com/blog/how-developers-use-ai-production-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/how-developers-use-ai-production-2026/</guid><description>Forget the demos. Here is how our 7-person engineering team uses AI tools on real client projects every day — the prompts we write, the mistakes we catch, and the time we actually save.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><category>Developer Tools</category><category>Production Code</category><category>AI Workflows</category><category>Developer Productivity</category><category>Software Engineering</category><category>2026</category><author>Anurag Verma</author></item><item><title>Vibe Coding Explained: What It Actually Is, What It Is Not, and Why It Matters</title><link>https://blog.codercops.com/blog/vibe-coding-explained-natural-language-programming-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/vibe-coding-explained-natural-language-programming-2026/</guid><description>Andrej Karpathy coined &apos;vibe coding&apos; in 2025. By 2026 it has become the most misunderstood term in software development. Here is what it actually means, how it works, when to use it, and when it will get you fired.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Vibe Coding</category><category>Natural Language Programming</category><category>Andrej Karpathy</category><category>AI Coding</category><category>2026</category><author>Anurag Verma</author></item><item><title>Website Development Agency USA: 2026 Buyer Guide for High-Impact Builds</title><link>https://blog.codercops.com/blog/website-development-agency-usa-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/website-development-agency-usa-2026/</guid><description>How to choose a website development agency in the USA with clear evaluation criteria, pricing models, red flags, and ROI-focused decision checkpoints.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Agency</category><category>USA</category><category>Buyer Guide</category><category>Business</category><category>2026</category><author>Anurag Verma</author></item><item><title>Website Optimization Agency Playbook: Speed, SEO, and Conversion in 2026</title><link>https://blog.codercops.com/blog/website-optimization-agency-playbook-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/website-optimization-agency-playbook-2026/</guid><description>A practical guide to selecting a website optimization agency and building a 30/60/90-day roadmap across Core Web Vitals, UX, analytics, and conversion.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Website Optimization</category><category>Core Web Vitals</category><category>SEO</category><category>Conversion</category><category>Agency</category><category>2026</category><author>Anurag Verma</author></item><item><title>Google Workspace Gets a Major AI Boost: Gemini Now Powers Docs, Sheets, Slides &amp; Drive</title><link>https://blog.codercops.com/blog/google-workspace-gemini-ai-docs-sheets-slides-drive/</link><guid isPermaLink="true">https://blog.codercops.com/blog/google-workspace-gemini-ai-docs-sheets-slides-drive/</guid><description>Explore Google&apos;s latest Workspace update with Gemini AI enhancing Docs, Sheets, Slides, and Drive, empowering users to leverage AI capabilities for more efficient productivity.</description><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Integration</category><category>Google Workspace</category><category>Gemini AI</category><category>Productivity</category><category>Technology</category><author>Anurag Verma</author></item><item><title>Navigating the AI Storage Tax: Rising NAND &amp; RAM Costs in Cloud Infrastructure</title><link>https://blog.codercops.com/blog/navigating-ai-storage-tax-rising-nand-ram-costs/</link><guid isPermaLink="true">https://blog.codercops.com/blog/navigating-ai-storage-tax-rising-nand-ram-costs/</guid><description>Explore the financial impact of the AI storage tax and the sharp rise in NAND and RAM costs, affecting enterprise IT budgets and cloud infrastructure strategies.</description><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>AI Storage Tax</category><category>Cloud Infrastructure</category><category>NAND</category><category>RAM</category><category>Enterprise IT</category><author>Anurag Verma</author></item><item><title>Samsung Galaxy Z TriFold Discontinued: Challenges in the Foldable Market</title><link>https://blog.codercops.com/blog/samsung-galaxy-z-trifold-discontinued-challenges-foldable-market/</link><guid isPermaLink="true">https://blog.codercops.com/blog/samsung-galaxy-z-trifold-discontinued-challenges-foldable-market/</guid><description>Samsung halts Galaxy Z TriFold sales in South Korea after just three months, highlighting challenges in the foldable smartphone market amid this innovative era.</description><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><category>Business</category><category>Samsung</category><category>Foldable Phones</category><category>Smartphones</category><category>Market Dynamics</category><category>Product Lifecycle</category><author>Anurag Verma</author></item><item><title>Chrome Emergency Patch: Urgent Need to Address Skia Engine Zero-Day Vulnerability</title><link>https://blog.codercops.com/blog/chrome-emergency-patch-skia-engine-zero-day-vulnerability/</link><guid isPermaLink="true">https://blog.codercops.com/blog/chrome-emergency-patch-skia-engine-zero-day-vulnerability/</guid><description>Explore the urgent security patch from Google for a critical Skia engine vulnerability (CVE‑2026‑3909) in Chrome, being actively exploited through malicious web pages.</description><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>Chrome</category><category>Zero-Day</category><category>Skia Engine</category><category>Vulnerability</category><category>CVE-2026-3909</category><author>Anurag Verma</author></item><item><title>The Emergence of AI in Developing Affordable Energy Solutions</title><link>https://blog.codercops.com/blog/emergence-of-ai-affordable-energy-solutions/</link><guid isPermaLink="true">https://blog.codercops.com/blog/emergence-of-ai-affordable-energy-solutions/</guid><description>Explore how AI innovations are revolutionizing affordable and sustainable energy solutions, focusing on recent advancements in renewable energy tech by companies pushing the boundaries of sustainable development.</description><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><category>Science</category><category>AI</category><category>Renewable Energy</category><category>Sustainability</category><category>Innovation</category><category>Technology Trends</category><author>Anurag Verma</author></item><item><title>IBM&apos;s Project Debater: The First AI to Successfully Participate in Human Debates</title><link>https://blog.codercops.com/blog/ibms-project-debater-ai-human-debates/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ibms-project-debater-ai-human-debates/</guid><description>Explore IBM&apos;s Project Debater, the groundbreaking AI that joins human debates, transforming how we perceive machine capability in natural language processing and argumentation.</description><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><category>AI &amp; ML</category><category>AI</category><category>NLP</category><category>IBM</category><category>Project Debater</category><category>Technology</category><author>Anurag Verma</author></item><item><title>Amazon Partners with Cerebras to Revolutionize AI Inference with Wafer-Scale Chips</title><link>https://blog.codercops.com/blog/amazon-cerebras-revolutionize-ai-inference-wafer-scale-chips/</link><guid isPermaLink="true">https://blog.codercops.com/blog/amazon-cerebras-revolutionize-ai-inference-wafer-scale-chips/</guid><description>Explore the groundbreaking partnership between Amazon AWS and Cerebras, aiming to redefine AI inference with high-performance wafer-scale chips, signaling a major shift in AI deployment at scale.</description><pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate><category>Industry News</category><category>AI</category><category>AWS</category><category>Cerebras</category><category>Inference</category><category>Wafer-Scale</category><author>Anurag Verma</author></item><item><title>Leveraging AutoML for Faster AI Development: Key Trends and Innovations in 2026</title><link>https://blog.codercops.com/blog/leveraging-automl-for-faster-ai-development-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/leveraging-automl-for-faster-ai-development-2026/</guid><description>Explore how AutoML is accelerating AI development in 2026 with new tools, techniques, and trends that businesses need to know.</description><pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate><category>AI &amp; ML</category><category>AutoML</category><category>AI Development</category><category>Technology Trends</category><category>Machine Learning</category><category>2026</category><author>Anurag Verma</author></item><item><title>Post-Cloud Era: Embracing Serverless Edge Computing for Optimized Performance</title><link>https://blog.codercops.com/blog/post-cloud-era-serverless-edge-computing-optimized-performance/</link><guid isPermaLink="true">https://blog.codercops.com/blog/post-cloud-era-serverless-edge-computing-optimized-performance/</guid><description>Explore the shift towards serverless edge computing in the post-cloud era, focusing on performance improvements, cost savings, and real-world case studies of enterprises leveraging this technology.</description><pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Edge Computing</category><category>Serverless</category><category>Cloud Computing</category><category>Infrastructure</category><category>Performance Optimization</category><author>Anurag Verma</author></item><item><title>ZeroDayBench: Benchmarking LLM Agents for Security Flaw Patching Challenges</title><link>https://blog.codercops.com/blog/zerodaybench-benchmarking-llm-agents-security-flaw-patching/</link><guid isPermaLink="true">https://blog.codercops.com/blog/zerodaybench-benchmarking-llm-agents-security-flaw-patching/</guid><description>Explore ZeroDayBench—A new benchmark testing the efficacy of leading LLM agents in discovering and patching unseen security vulnerabilities.</description><pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate><category>AI &amp; ML</category><category>LLM</category><category>Cybersecurity</category><category>Zero-Day</category><category>AI Research</category><category>Security</category><author>Anurag Verma</author></item><item><title>Hackbat: Revolutionizing Embedded Security with Open-Source Hardware</title><link>https://blog.codercops.com/blog/hackbat-revolutionizing-embedded-security-open-source-hardware/</link><guid isPermaLink="true">https://blog.codercops.com/blog/hackbat-revolutionizing-embedded-security-open-source-hardware/</guid><description>Explore Hackbat, the open-source hardware platform launching in Q2 2026, set to redefine embedded security by offering full auditability and eliminating reliance on closed-source devices.</description><pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate><category>Technology</category><category>Embedded Security</category><category>Open-Source</category><category>Hardware</category><category>Auditability</category><category>Rust</category><author>Anurag Verma</author></item><item><title>The 2026 Global RAM Shortage: What Every Developer Needs to Know</title><link>https://blog.codercops.com/blog/global-ram-shortage-developer-impact-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/global-ram-shortage-developer-impact-2026/</guid><description>RAM prices surged 90% in Q1 2026 as AI data centers consume 70% of global memory. Here&apos;s how the shortage impacts developers, hardware costs, and what you can do about it.</description><pubDate>Sat, 07 Mar 2026 00:00:00 GMT</pubDate><category>Industry News</category><category>Hardware</category><category>AI</category><category>Developer Tools</category><category>Infrastructure</category><category>Career</category><author>Anurag Verma</author></item><item><title>The Low-Code/No-Code Explosion: A $44.5B Market Developers Can&apos;t Ignore</title><link>https://blog.codercops.com/blog/low-code-no-code-platforms-2026-developer-guide/</link><guid isPermaLink="true">https://blog.codercops.com/blog/low-code-no-code-platforms-2026-developer-guide/</guid><description>Gartner&apos;s $44.5B projection for low-code has arrived. Here&apos;s how platforms like Retool, Bubble, and FlutterFlow are reshaping development, and what it means for professional developers.</description><pubDate>Sat, 07 Mar 2026 00:00:00 GMT</pubDate><category>Industry News</category><category>Low-Code</category><category>No-Code</category><category>Development Tools</category><category>Career</category><category>Automation</category><author>Anurag Verma</author></item><item><title>Node.js vs Deno vs Bun in 2026: The JavaScript Runtime Wars</title><link>https://blog.codercops.com/blog/nodejs-vs-deno-vs-bun-runtime-wars-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/nodejs-vs-deno-vs-bun-runtime-wars-2026/</guid><description>Bun hits 52K req/sec, Deno 2 achieves full npm compatibility, and Node.js remains the enterprise standard. A practical comparison with benchmarks, code examples, and migration guides.</description><pubDate>Sat, 07 Mar 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>JavaScript</category><category>Node.js</category><category>Deno</category><category>Bun</category><category>Runtime</category><category>Performance</category><author>Anurag Verma</author></item><item><title>WASI 0.3 Arrives: Native Async Makes WebAssembly a Real Server-Side Contender</title><link>https://blog.codercops.com/blog/wasi-03-native-async-webassembly-server-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/wasi-03-native-async-webassembly-server-2026/</guid><description>WASI 0.3 dropped in February 2026 with native async I/O, stream types, and full socket support. Here&apos;s why this changes everything for server-side WebAssembly.</description><pubDate>Sat, 07 Mar 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>WebAssembly</category><category>WASI</category><category>Rust</category><category>Server-Side</category><category>Edge Computing</category><author>Anurag Verma</author></item><item><title>Xcode 26.3 and Apple&apos;s Big Bet on Agentic Coding</title><link>https://blog.codercops.com/blog/xcode-26-agentic-coding-apple-developer-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/xcode-26-agentic-coding-apple-developer-2026/</guid><description>Apple shipped native agentic coding in Xcode 26.3, letting AI agents autonomously write, test, and refactor Swift code. Here&apos;s what it means for iOS and macOS developers.</description><pubDate>Sat, 07 Mar 2026 00:00:00 GMT</pubDate><category>Industry News</category><category>Apple</category><category>Xcode</category><category>AI</category><category>Swift</category><category>iOS Development</category><category>Agentic Coding</category><author>Anurag Verma</author></item><item><title>Agentic AI in 2026: Inside Google&apos;s Agent Leap Report and the Rise of Autonomous AI</title><link>https://blog.codercops.com/blog/agentic-ai-2026-google-agent-leap-report/</link><guid isPermaLink="true">https://blog.codercops.com/blog/agentic-ai-2026-google-agent-leap-report/</guid><description>Google&apos;s 2026 AI Agent Trends report declares this the year of the &apos;agent leap.&apos; We break down what it means, compare Claude Code, Devin, Operator, and Mariner, and explore what agentic AI means for developers and businesses.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Agentic AI</category><category>AI Agents</category><category>Google</category><category>Claude Code</category><category>Devin</category><category>Enterprise AI</category><category>Automation</category><category>2026</category><author>Anurag Verma</author></item><item><title>AI-Powered Cybersecurity in 2026: Anomaly Detection Changes Everything</title><link>https://blog.codercops.com/blog/ai-powered-cybersecurity-anomaly-detection-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-powered-cybersecurity-anomaly-detection-2026/</guid><description>How AI is transforming threat detection, anomaly detection, and automated incident response in 2026. Real-world examples, platform comparisons, and what developers and businesses need to know.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>Cybersecurity</category><category>AI Security</category><category>Anomaly Detection</category><category>Threat Detection</category><category>CrowdStrike</category><category>Enterprise Security</category><category>2026</category><author>Anurag Verma</author></item><item><title>ClawdHub and the AI Skill Malware Crisis: Supply Chain Attacks Just Found Their Next Target</title><link>https://blog.codercops.com/blog/ai-skill-malware-clawdhub-supply-chain-attack-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-skill-malware-clawdhub-supply-chain-attack-2026/</guid><description>Malicious AI skills and poisoned CLAUDE.md files are the new supply chain attack vector. We break down the ClawdHub incident, how MCP server exploits work, and what developers must do now.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>Supply Chain Attack</category><category>AI Security</category><category>Malware</category><category>Claude Code</category><category>MCP</category><category>2026</category><author>Anurag Verma</author></item><item><title>Astro 6 Beta — CSP Nonces, Declarative Web Components, and Architecture Tradeoffs</title><link>https://blog.codercops.com/blog/astro-6-beta-csp-nonces-declarative-web-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/astro-6-beta-csp-nonces-declarative-web-2026/</guid><description>Astro 6 beta ships CSP nonce support, declarative web components, improved server islands, and Vite 7. We break down the architecture decisions and tradeoffs.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Astro</category><category>CSP</category><category>Web Components</category><category>Server Islands</category><category>Web Development</category><category>2026</category><author>Anurag Verma</author></item><item><title>Best AI Coding Models Compared: The Definitive February 2026 Guide</title><link>https://blog.codercops.com/blog/best-ai-coding-models-compared-february-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/best-ai-coding-models-compared-february-2026/</guid><description>We benchmarked and compared every major AI coding model -- Claude Opus 4.6, GPT-5.3 Codex, Gemini 2.5 Pro, DeepSeek V3, Qwen3-Coder, and more. Benchmarks, pricing, strengths, and which model to pick for your workflow.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Coding</category><category>Claude</category><category>GPT-5</category><category>Gemini</category><category>DeepSeek</category><category>Code Generation</category><category>Developer Tools</category><category>Benchmarks</category><category>2026</category><author>Anurag Verma</author></item><item><title>Claude Code Security Vulnerabilities: What AI Coding Tools Get Wrong About Trust</title><link>https://blog.codercops.com/blog/claude-code-security-vulnerabilities-ai-tool-lessons-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/claude-code-security-vulnerabilities-ai-tool-lessons-2026/</guid><description>An honest analysis of Claude Code&apos;s security model, prompt injection risks, sandbox escapes, and supply chain threats in agentic coding tools. Lessons every developer and tool builder should learn in 2026.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>Claude Code</category><category>Security</category><category>AI Tools</category><category>Prompt Injection</category><category>Cybersecurity</category><category>2026</category><author>Anurag Verma</author></item><item><title>Claude Sonnet 4.6 vs Opus 4.6: Which Model Should You Actually Use in 2026?</title><link>https://blog.codercops.com/blog/claude-sonnet-4-6-vs-opus-4-6-comparison-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/claude-sonnet-4-6-vs-opus-4-6-comparison-2026/</guid><description>A data-driven comparison of Claude Sonnet 4.6 and Opus 4.6 covering benchmarks, pricing, speed, coding performance, and real-world use cases. We help developers choose the right Anthropic model for their needs.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Claude</category><category>Anthropic</category><category>Sonnet</category><category>Opus</category><category>AI Models</category><category>Benchmarks</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>The Cloudflare Outage of February 2026 — A Postmortem and the Architecture Lessons Nobody Tells You</title><link>https://blog.codercops.com/blog/cloudflare-outage-feb-2026-postmortem-architecture-lessons/</link><guid isPermaLink="true">https://blog.codercops.com/blog/cloudflare-outage-feb-2026-postmortem-architecture-lessons/</guid><description>Analyzing the February 2026 Cloudflare edge network outage: cascading failures, bypassed canary deployments, R2 and Workers impact. Real architecture lessons for building resilient distributed systems.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Cloudflare</category><category>Outage</category><category>Postmortem</category><category>Infrastructure</category><category>Reliability</category><category>2026</category><author>Anurag Verma</author></item><item><title>Context Engineering Killed Prompt Engineering: What Actually Works in 2026</title><link>https://blog.codercops.com/blog/context-engineering-replaced-prompt-engineering-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/context-engineering-replaced-prompt-engineering-2026/</guid><description>Prompt engineering is dead. Context engineering -- managing system prompts, RAG results, tool outputs, memory, and conversation history -- is the skill that matters now. Here is what changed and why.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Context Engineering</category><category>Prompt Engineering</category><category>AI</category><category>LLM</category><category>MCP</category><category>2026</category><author>Anurag Verma</author></item><item><title>DeepSeek V4&apos;s Engram Architecture: How Million-Token Context Actually Works</title><link>https://blog.codercops.com/blog/deepseek-v4-engram-architecture-million-token-context/</link><guid isPermaLink="true">https://blog.codercops.com/blog/deepseek-v4-engram-architecture-million-token-context/</guid><description>A technical deep dive into DeepSeek V4&apos;s Engram conditional memory, Manifold-Constrained Hyper-Connections, and Sparse Attention -- the three innovations enabling million-token context at a fraction of the cost. Benchmarks, architecture diagrams, and what it means for your stack.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>DeepSeek</category><category>AI Architecture</category><category>Engram</category><category>MoE</category><category>LLM</category><category>Context Window</category><category>Open Source</category><category>2026</category><author>Anurag Verma</author></item><item><title>DevSecOps SBOMs in Practice — Our Exact Pipeline for Supply Chain Security in 2026</title><link>https://blog.codercops.com/blog/devsecops-sbom-supply-chain-automation-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/devsecops-sbom-supply-chain-automation-2026/</guid><description>A step-by-step methodology for implementing Software Bill of Materials (SBOM) generation, dependency scanning, and vulnerability management in your CI/CD pipeline.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>DevSecOps</category><category>SBOM</category><category>Supply Chain</category><category>Security</category><category>CI/CD</category><category>2026</category><author>Anurag Verma</author></item><item><title>Digital Healthcare Platforms: The $500B Developer Opportunity in 2026</title><link>https://blog.codercops.com/blog/digital-healthcare-platforms-developer-opportunities-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/digital-healthcare-platforms-developer-opportunities-2026/</guid><description>From FHIR APIs and telemedicine to AI diagnostics and remote patient monitoring, the digital health market is creating massive opportunities for software developers. Here&apos;s where to build.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Technology</category><category>Healthcare</category><category>Digital Health</category><category>Telemedicine</category><category>FHIR</category><category>API Development</category><category>Health Tech</category><category>AI Diagnostics</category><category>2026</category><author>Anurag Verma</author></item><item><title>Edge Computing Meets AI: Real-Time Intelligence at the Edge in 2026</title><link>https://blog.codercops.com/blog/edge-computing-ai-real-time-intelligence-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/edge-computing-ai-real-time-intelligence-2026/</guid><description>How running AI models at the edge enables real-time intelligence for IoT, autonomous vehicles, and smart manufacturing. A developer guide to edge AI platforms, frameworks, and opportunities in 2026.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Technology</category><category>Edge Computing</category><category>AI</category><category>IoT</category><category>Real-Time</category><category>NVIDIA</category><category>Infrastructure</category><category>Cloud Computing</category><category>2026</category><author>Anurag Verma</author></item><item><title>EV Charging Infrastructure: A $100B Developer Opportunity in 2026</title><link>https://blog.codercops.com/blog/ev-charging-infrastructure-developer-opportunities-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ev-charging-infrastructure-developer-opportunities-2026/</guid><description>The EV charging software market is exploding. Learn how developers can build with OCPP, fleet management APIs, payment integration, and smart grid optimization in this booming $100B+ infrastructure sector.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Technology</category><category>EV Charging</category><category>Electric Vehicles</category><category>OCPP</category><category>API Development</category><category>Smart Grid</category><category>Infrastructure</category><category>Green Tech</category><category>2026</category><author>Anurag Verma</author></item><item><title>The February 2026 AI Model War: GPT-5.3, Claude 4.6, Gemini 3.1 &amp; More</title><link>https://blog.codercops.com/blog/february-2026-ai-model-war-gpt5-claude-gemini-deepseek/</link><guid isPermaLink="true">https://blog.codercops.com/blog/february-2026-ai-model-war-gpt5-claude-gemini-deepseek/</guid><description>February 2026 saw an unprecedented wave of AI model releases from OpenAI, Anthropic, Google, and others. We break down GPT-5.3 Codex, Claude Opus and Sonnet 4.6, Gemini 3.1 Pro, DeepSeek V4, and every major launch -- with benchmarks, pricing, and practical guidance.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>GPT-5</category><category>Claude</category><category>Gemini</category><category>DeepSeek</category><category>Llama</category><category>LLM</category><category>Model Comparison</category><category>2026</category><author>Anurag Verma</author></item><item><title>iPhone 17 vs iPhone 16: The AI Features That Actually Matter for Developers</title><link>https://blog.codercops.com/blog/iphone-17-vs-16-ai-features-comparison-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/iphone-17-vs-16-ai-features-comparison-2026/</guid><description>A deep dive into Apple Intelligence improvements from iPhone 16 to iPhone 17. We compare the A19 Neural Engine, Foundation Models framework, Visual Intelligence upgrades, and what iOS developers should build for next.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Technology</category><category>iPhone</category><category>Apple</category><category>AI</category><category>Apple Intelligence</category><category>Mobile Development</category><category>iOS</category><category>Neural Engine</category><category>2026</category><author>Anurag Verma</author></item><item><title>Low-Code Hits $44 Billion. Is Traditional Coding Actually Dying?</title><link>https://blog.codercops.com/blog/low-code-44-billion-traditional-coding-dying-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/low-code-44-billion-traditional-coding-dying-2026/</guid><description>Gartner projects the low-code market will reach $44.5 billion in 2026, with 75% of new apps built on low-code platforms. We analyze where these tools excel, where they fail, and what developers should actually do about it.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Low Code</category><category>No Code</category><category>Web Development</category><category>Retool</category><category>Bubble</category><category>Software Development</category><category>Industry Trends</category><category>2026</category><author>Anurag Verma</author></item><item><title>Multi-Agent Orchestration with Claude Agent SDK and MCP: A Production Architecture Guide</title><link>https://blog.codercops.com/blog/multi-agent-orchestration-claude-sdk-mcp-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/multi-agent-orchestration-claude-sdk-mcp-2026/</guid><description>How we built production multi-agent systems using Claude Agent SDK and Model Context Protocol. Covers orchestrator-worker patterns, handoff strategies, error handling, and real-world architecture decisions.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Agents</category><category>Claude SDK</category><category>MCP</category><category>Multi-Agent</category><category>Architecture</category><category>2026</category><author>Anurag Verma</author></item><item><title>MySQL&apos;s Open Letter to Oracle — The Battle for Open Source Database Governance</title><link>https://blog.codercops.com/blog/mysql-community-oracle-open-letter-open-source-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/mysql-community-oracle-open-letter-open-source-2026/</guid><description>Nearly 200 developers urged Oracle to rethink MySQL&apos;s future. We break down the open letter, the governance crisis, the rise of PostgreSQL and alternatives, and what developers should do next.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Technology</category><category>MySQL</category><category>Oracle</category><category>Open Source</category><category>PostgreSQL</category><category>Database</category><category>MariaDB</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>Next.js 16 — Turbopack, React Compiler, and Cache Components: A Hands-On Migration Guide</title><link>https://blog.codercops.com/blog/nextjs-16-turbopack-react-compiler-cache-components/</link><guid isPermaLink="true">https://blog.codercops.com/blog/nextjs-16-turbopack-react-compiler-cache-components/</guid><description>Learn how to migrate to Next.js 16 with Turbopack as the default bundler, React Compiler integration, and cache components. Step-by-step guide with code examples.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Next.js</category><category>React</category><category>Turbopack</category><category>React Compiler</category><category>Web Development</category><category>2026</category><author>Anurag Verma</author></item><item><title>February 2026 Security Roundup: OpenSSL RCE, Foxit Zero-Days, and 5 Critical CVEs You Must Patch Now</title><link>https://blog.codercops.com/blog/openssl-rce-foxit-zero-days-february-2026-security/</link><guid isPermaLink="true">https://blog.codercops.com/blog/openssl-rce-foxit-zero-days-february-2026-security/</guid><description>A comprehensive security briefing covering February 2026&apos;s most critical vulnerabilities including OpenSSL RCE, Foxit PDF Reader zero-days, Chrome V8 exploits, and Linux kernel privilege escalation.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>Security</category><category>CVE</category><category>OpenSSL</category><category>Zero-Day</category><category>Vulnerability</category><category>2026</category><author>Anurag Verma</author></item><item><title>Perplexity&apos;s Model Council: How Multi-AI Consensus Is Redefining Search</title><link>https://blog.codercops.com/blog/perplexity-model-council-multi-ai-consensus-search/</link><guid isPermaLink="true">https://blog.codercops.com/blog/perplexity-model-council-multi-ai-consensus-search/</guid><description>Perplexity launches Model Council, a multi-AI consensus feature that queries GPT, Claude, and Gemini simultaneously and synthesizes one verified answer. Here is how it works and why it matters.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Perplexity</category><category>AI Search</category><category>Model Council</category><category>Multi-AI</category><category>Consensus</category><category>Search Engine</category><category>2026</category><author>Anurag Verma</author></item><item><title>Platform Engineering in 2026: The Internal Developer Platform Maturity Report</title><link>https://blog.codercops.com/blog/platform-engineering-internal-developer-platforms-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/platform-engineering-internal-developer-platforms-2026/</guid><description>Data-driven analysis of platform engineering adoption in 2026. Compare Backstage, Port, and Cortex IDPs, golden paths, self-service infrastructure, and how to measure platform success with DORA metrics.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Platform Engineering</category><category>IDP</category><category>DevOps</category><category>Backstage</category><category>Developer Experience</category><category>2026</category><author>Anurag Verma</author></item><item><title>RAG in 2026: Beyond Naive Vector Search to Production Architectures</title><link>https://blog.codercops.com/blog/rag-2026-vector-search-sparse-attention-vectorless/</link><guid isPermaLink="true">https://blog.codercops.com/blog/rag-2026-vector-search-sparse-attention-vectorless/</guid><description>A systematic comparison of modern RAG approaches in 2026: ColBERT, SPLADE, hybrid search, contextual retrieval, and late interaction models. Benchmarks, architecture tradeoffs, and when RAG beats fine-tuning.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>RAG</category><category>Vector Search</category><category>LLM</category><category>AI Engineering</category><category>Retrieval</category><category>2026</category><author>Anurag Verma</author></item><item><title>Your GPU Deserves Better Than Gaming: A Practical Guide to Running LLMs Locally in 2026</title><link>https://blog.codercops.com/blog/running-llms-consumer-gpus-practical-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/running-llms-consumer-gpus-practical-guide-2026/</guid><description>A hands-on guide to running Llama 4, Qwen3, Phi-4, and Mistral on consumer GPUs like the RTX 4090 and 5090. Covers quantization formats, inference engines, VRAM needs, and when local beats API calls.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>LLM</category><category>GPU</category><category>Local AI</category><category>Ollama</category><category>Quantization</category><category>2026</category><author>Anurag Verma</author></item><item><title>Rust 1.94 and the LLD Default — How Rust Is Reshaping Systems Programming in 2026</title><link>https://blog.codercops.com/blog/rust-1-94-lld-linker-kernel-modules-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/rust-1-94-lld-linker-kernel-modules-2026/</guid><description>Rust 1.94 makes LLD the default linker, Linux kernel modules mature in Rust, and Edition 2024 migration accelerates. A technical breakdown of Rust&apos;s 2026 trajectory.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Technology</category><category>Rust</category><category>Linux Kernel</category><category>LLD</category><category>Systems Programming</category><category>2026</category><author>Anurag Verma</author></item><item><title>Small Language Models in Production: Deploying Phi-4, Qwen, and Gemma at the Edge</title><link>https://blog.codercops.com/blog/small-language-models-production-phi4-qwen-edge-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/small-language-models-production-phi4-qwen-edge-2026/</guid><description>A practical guide to deploying Small Language Models (SLMs) like Phi-4, Qwen2.5, Gemma 3, and Llama 3.2 in production. Benchmarks, quantization, edge deployment patterns, and when SLMs beat large models.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>SLM</category><category>Phi-4</category><category>Qwen</category><category>Edge AI</category><category>Machine Learning</category><category>2026</category><author>Anurag Verma</author></item><item><title>Supabase Blocked in India: How ISP DNS Poisoning Just Broke Millions of Developer Projects</title><link>https://blog.codercops.com/blog/supabase-blocked-india-isp-dns-developer-impact-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/supabase-blocked-india-isp-dns-developer-impact-2026/</guid><description>India&apos;s major ISPs began DNS-poisoning *.supabase.co domains on Feb 24, 2026, breaking auth, databases, and Edge Functions for millions of developers — including our own infrastructure at CODERCOPS.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Technology</category><category>Supabase</category><category>India</category><category>DNS Blocking</category><category>ISP</category><category>Developer Tools</category><category>Censorship</category><category>2026</category><author>Anurag Verma</author></item><item><title>Svelte 5.49 and SvelteKit Remote Functions Changed How Our Team Builds Web Apps</title><link>https://blog.codercops.com/blog/svelte-5-49-sveltekit-remote-functions-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/svelte-5-49-sveltekit-remote-functions-2026/</guid><description>Svelte 5.49 runes and SvelteKit remote functions transform server-client communication. A practical guide with migration stories, code examples, and React comparisons.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Svelte</category><category>SvelteKit</category><category>Runes</category><category>Remote Functions</category><category>Web Development</category><category>2026</category><author>Anurag Verma</author></item><item><title>Thinking Models in 2026: The Adaptive Reasoning Revolution</title><link>https://blog.codercops.com/blog/thinking-models-adaptive-reasoning-revolution-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/thinking-models-adaptive-reasoning-revolution-2026/</guid><description>Models that think before they answer are reshaping AI engineering. We break down how extended thinking, reasoning budgets, and chain-of-thought inference work across Claude, OpenAI o3, Gemini, and DeepSeek-R1 — and when you should actually use them.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Thinking Models</category><category>Reasoning</category><category>Chain of Thought</category><category>Claude</category><category>OpenAI</category><category>AI Engineering</category><category>2026</category><author>Anurag Verma</author></item><item><title>TypeScript 6 Beta — The Go Rewrite That Changes Everything</title><link>https://blog.codercops.com/blog/typescript-6-beta-last-javascript-release-go-rewrite/</link><guid isPermaLink="true">https://blog.codercops.com/blog/typescript-6-beta-last-javascript-release-go-rewrite/</guid><description>TypeScript 6 beta rewrites the compiler in Go, delivering 10x faster builds. We analyze benchmarks, ecosystem impact, editor support, and the migration path from TS 5.8.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>TypeScript</category><category>Go</category><category>Compiler</category><category>Web Development</category><category>Performance</category><category>2026</category><author>Anurag Verma</author></item><item><title>Vibe Coding in 2026: Is It Actually Replacing Traditional Programming?</title><link>https://blog.codercops.com/blog/vibe-coding-replacing-traditional-programming-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/vibe-coding-replacing-traditional-programming-2026/</guid><description>Andrej Karpathy coined &apos;vibe coding&apos; a year ago. Now 92% of US developers use AI tools daily and 41% of code is AI-generated. We break down the tools, the real results, the security risks, and what this means for professional developers.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Vibe Coding</category><category>AI Coding</category><category>Cursor</category><category>Claude Code</category><category>Copilot</category><category>Programming</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>WASI 0.3 Brings Native Async I/O to WebAssembly — What It Means for Server Workloads in 2026</title><link>https://blog.codercops.com/blog/wasi-0-3-native-async-io-webassembly-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/wasi-0-3-native-async-io-webassembly-2026/</guid><description>WASI 0.3 introduces native async I/O, stream types, and full socket support to WebAssembly. We analyze the Component Model changes, language support, and why this release finally makes Wasm viable for production server workloads.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>WASI</category><category>WebAssembly</category><category>Async</category><category>Component Model</category><category>Infrastructure</category><category>2026</category><author>Anurag Verma</author></item><item><title>Running WebAssembly Workloads in Kubernetes: A Production-Ready Tutorial with SpinKube</title><link>https://blog.codercops.com/blog/wasm-kubernetes-production-tutorial-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/wasm-kubernetes-production-tutorial-2026/</guid><description>Learn how to deploy WebAssembly applications on Kubernetes using SpinKube and containerd-wasm-shim. Step-by-step tutorial covering cluster setup, Spin app deployment, monitoring, and production readiness.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>WebAssembly</category><category>Kubernetes</category><category>SpinKube</category><category>Tutorial</category><category>Cloud Native</category><category>2026</category><author>Anurag Verma</author></item><item><title>WebAssembly vs Docker: The Replacement That Never Happened (And Why That&apos;s the Point)</title><link>https://blog.codercops.com/blog/webassembly-vs-docker-coexistence-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/webassembly-vs-docker-coexistence-2026/</guid><description>Everyone said WebAssembly would kill Docker. Two years later, they coexist — and the teams using both are shipping faster. A reality check on Wasm, containers, and the containerd shim approach.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>WebAssembly</category><category>Docker</category><category>Containers</category><category>DevOps</category><category>Cloud</category><category>2026</category><author>Anurag Verma</author></item><item><title>Zig 0.16 Is Not Replacing C. It Is Making C Developers Realize They Deserve Better.</title><link>https://blog.codercops.com/blog/zig-0-16-language-replacing-c-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/zig-0-16-language-replacing-c-2026/</guid><description>Zig 0.16 drops with async rewrite, improved comptime, and growing production adoption at Bun, TigerBeetle, and Uber. Why C developers should stop ignoring this language in 2026.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Technology</category><category>Zig</category><category>C</category><category>Systems Programming</category><category>Bun</category><category>Performance</category><category>2026</category><author>Anurag Verma</author></item><item><title>Running a Tech Studio from India for Global Clients — What They Don&apos;t Tell You</title><link>https://blog.codercops.com/blog/running-tech-studio-india-global-clients-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/running-tech-studio-india-global-clients-2026/</guid><description>The timezone juggling, the cultural code-switching, the payment friction, and the surprising advantages. An honest founder&apos;s perspective on building an India-based agency serving US, UK, and Australian clients.</description><pubDate>Fri, 27 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>India</category><category>Remote Work</category><category>Agency</category><category>Business</category><category>Founder</category><category>2026</category><author>Anurag Verma</author></item><item><title>India AI Impact Summit 2026 — Inside the Event That Wants to Redefine India&apos;s Role in Global AI</title><link>https://blog.codercops.com/blog/india-ai-impact-summit-2026-redefining-global-ai/</link><guid isPermaLink="true">https://blog.codercops.com/blog/india-ai-impact-summit-2026-redefining-global-ai/</guid><description>A deep dive into the India AI Impact Summit 2026 at Bharat Mandapam — $200B in pledged investments, sovereign AI models, the MANAV framework, and what it all means for builders and founders.</description><pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate><category>AI &amp; ML</category><category>AI</category><category>India</category><category>Summit</category><category>Startups</category><category>Policy</category><category>Infrastructure</category><author>CODERCOPS Team</author></item><item><title>Why We Chose to Be an AI-First Agency (Not Just an Agency That Uses AI)</title><link>https://blog.codercops.com/blog/why-we-chose-ai-first-agency-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/why-we-chose-ai-first-agency-2026/</guid><description>Every agency claims to &apos;use AI&apos; now. But there&apos;s a fundamental difference between bolting AI onto existing workflows and building an agency around AI from the ground up. Here&apos;s why we made that choice and what it actually means.</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Agency</category><category>Strategy</category><category>Business</category><category>Thought Leadership</category><category>2026</category><author>Anurag Verma</author></item><item><title>Async Django in 2026 -- An Honest Assessment of What Actually Works</title><link>https://blog.codercops.com/blog/async-django-2026-honest-assessment/</link><guid isPermaLink="true">https://blog.codercops.com/blog/async-django-2026-honest-assessment/</guid><description>Async Django is production-ready in 2026, but landmines still exist. Four real projects, benchmarks, and a framework for deciding when async actually helps.</description><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Django</category><category>Python</category><category>Async</category><category>Performance</category><category>Backend</category><category>Production</category><category>2026</category><author>Anurag Verma</author></item><item><title>Django + HTMX -- Building Interactive Apps Without the JavaScript Bloat</title><link>https://blog.codercops.com/blog/django-htmx-interactive-apps-without-javascript/</link><guid isPermaLink="true">https://blog.codercops.com/blog/django-htmx-interactive-apps-without-javascript/</guid><description>We rebuilt a React SPA as a Django + HTMX app. 847KB of JavaScript became 48KB. Here is every pattern, rough edge, and performance win from the migration.</description><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Django</category><category>HTMX</category><category>Python</category><category>Frontend</category><category>Backend</category><category>Tutorial</category><category>2026</category><author>Anurag Verma</author></item><item><title>Django 6.0&apos;s Built-in Tasks Framework -- We Ripped Out Celery and Here Is What Happened</title><link>https://blog.codercops.com/blog/django-6-built-in-tasks-framework/</link><guid isPermaLink="true">https://blog.codercops.com/blog/django-6-built-in-tasks-framework/</guid><description>We migrated three production projects from Celery to Django&apos;s new Tasks framework. Two went smoothly. One was a disaster. Here is everything we learned.</description><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Django</category><category>Python</category><category>Backend</category><category>Celery</category><category>Architecture</category><category>Production</category><category>2026</category><author>Anurag Verma</author></item><item><title>Django as Your AI Backend -- Serving ML Models Without the Microservices Tax</title><link>https://blog.codercops.com/blog/django-ai-ml-backend-production/</link><guid isPermaLink="true">https://blog.codercops.com/blog/django-ai-ml-backend-production/</guid><description>The network latency between your Django app and your FastAPI ML service is probably longer than inference itself. Here is how to serve models from Django directly.</description><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Django</category><category>Python</category><category>AI</category><category>Machine Learning</category><category>Backend</category><category>Production</category><category>2026</category><author>Anurag Verma</author></item><item><title>DRF vs FastAPI -- An Honest Comparison From Someone Who Ships Both</title><link>https://blog.codercops.com/blog/django-rest-framework-vs-fastapi-honest-comparison/</link><guid isPermaLink="true">https://blog.codercops.com/blog/django-rest-framework-vs-fastapi-honest-comparison/</guid><description>Most DRF vs FastAPI comparisons are written by people who only use one. We ship both in production. Here is what actually matters and when to choose each.</description><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Django</category><category>FastAPI</category><category>Python</category><category>REST</category><category>API</category><category>Backend</category><category>Framework</category><category>2026</category><author>Anurag Verma</author></item><item><title>How We Built a High-Performance Food Delivery Platform — The Colleatz Case Study</title><link>https://blog.codercops.com/blog/colleatz-food-delivery-performance-case-study-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/colleatz-food-delivery-performance-case-study-2026/</guid><description>Building a modern food delivery platform with real-time order tracking, smart cart systems, and mobile-first design using Next.js, FastAPI, and MongoDB. Here is what we learned about performance at scale.</description><pubDate>Mon, 23 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Case Study</category><category>E-commerce</category><category>Next.js</category><category>FastAPI</category><category>MongoDB</category><category>Performance</category><category>2026</category><author>Anurag Verma</author></item><item><title>Agentic AI Hit the Trough of Disillusionment — And That&apos;s the Best Thing That Could Have Happened</title><link>https://blog.codercops.com/blog/agentic-ai-hype-cycle-trough-disillusionment-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/agentic-ai-hype-cycle-trough-disillusionment-2026/</guid><description>Gartner predicted AI agents would enter the trough of disillusionment in 2026. They were right. After a year of failed deployments, runaway costs, and overpromised demos, the market is finally getting serious about what agents can actually do.</description><pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Agents</category><category>Agentic AI</category><category>Hype Cycle</category><category>Gartner</category><category>Production AI</category><category>2026</category><author>Anurag Verma</author></item><item><title>AI Went From Our Tool to Our Teammate — Here&apos;s What That Transition Actually Felt Like</title><link>https://blog.codercops.com/blog/ai-human-collaboration-augmented-intelligence-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-human-collaboration-augmented-intelligence-2026/</guid><description>We have been using AI tools at CODERCOPS for over two years now. The shift from &apos;helpful autocomplete&apos; to &apos;genuine collaborator&apos; happened gradually, then all at once. Here is what changed, what surprised us, and what we got wrong.</description><pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Collaboration</category><category>Developer Experience</category><category>Productivity</category><category>Future of Work</category><category>2026</category><author>Anurag Verma</author></item><item><title>AI Is Being Used to Hack You — And to Protect You. Here&apos;s Where the Arms Race Stands in 2026</title><link>https://blog.codercops.com/blog/ai-powered-cybersecurity-defense-threat-detection-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-powered-cybersecurity-defense-threat-detection-2026/</guid><description>AI-generated phishing, deepfake CEO fraud, automated vulnerability exploitation — the attacks got smarter. But so did the defenses. We break down both sides of the AI cybersecurity arms race and what developers should actually do about it.</description><pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>Cybersecurity</category><category>AI Security</category><category>Threat Detection</category><category>Phishing</category><category>DevSecOps</category><category>2026</category><author>Anurag Verma</author></item><item><title>Cloud-Native in 2026: Microservices, Serverless, and What Teams Actually Need</title><link>https://blog.codercops.com/blog/cloud-native-microservices-serverless-containers-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/cloud-native-microservices-serverless-containers-2026/</guid><description>Everyone says go cloud-native. But what does that actually mean in 2026? We break down microservices, serverless, and containers — and why most teams should start simpler than they think.</description><pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Cloud Native</category><category>Microservices</category><category>Serverless</category><category>Kubernetes</category><category>Docker</category><category>2026</category><author>Anurag Verma</author></item><item><title>Edge AI in 2026: Why Running Models on Tiny Devices Is Bigger Than You Think</title><link>https://blog.codercops.com/blog/edge-ai-on-device-intelligence-iot-sensors-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/edge-ai-on-device-intelligence-iot-sensors-2026/</guid><description>Not everything needs the cloud. Edge AI is putting real intelligence on devices, sensors, and cameras — with millisecond latency and zero internet dependency. Here is where the technology actually stands.</description><pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Edge AI</category><category>IoT</category><category>TinyML</category><category>On-Device AI</category><category>Machine Learning</category><category>2026</category><author>Anurag Verma</author></item><item><title>Micro-Frontends in 2026: When They Work, When They Don&apos;t, and What We Actually Use</title><link>https://blog.codercops.com/blog/micro-frontends-module-federation-architecture-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/micro-frontends-module-federation-architecture-2026/</guid><description>Micro-frontends have matured past the hype phase. We break down Module Federation 2.0, composition patterns, and the real-world scenarios where splitting your frontend actually pays off.</description><pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Micro-Frontends</category><category>Module Federation</category><category>Frontend Architecture</category><category>Web Development</category><category>2026</category><author>Anurag Verma</author></item><item><title>Web3 Beyond the Hype: The Blockchain Use Cases That Actually Survived 2025</title><link>https://blog.codercops.com/blog/web3-beyond-crypto-practical-blockchain-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/web3-beyond-crypto-practical-blockchain-2026/</guid><description>Strip away the crypto speculation and NFT mania. What is left of Web3 in 2026? Turns out, quite a lot — supply chain tracking, digital identity, smart contracts, and decentralized storage are quietly solving real problems.</description><pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate><category>Technology</category><category>Web3</category><category>Blockchain</category><category>Smart Contracts</category><category>Decentralized</category><category>Supply Chain</category><category>2026</category><author>Anurag Verma</author></item><item><title>Zero Trust in 2026: What It Actually Looks Like When You Stop Trusting Your Network</title><link>https://blog.codercops.com/blog/zero-trust-architecture-never-trust-always-verify-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/zero-trust-architecture-never-trust-always-verify-2026/</guid><description>Zero Trust is the most overused term in cybersecurity. But the architecture behind it is real, and after high-profile breaches in 2025-2026, everyone is finally taking it seriously. Here is what implementation actually looks like.</description><pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>Zero Trust</category><category>Cybersecurity</category><category>Network Security</category><category>Cloud Security</category><category>2026</category><author>Anurag Verma</author></item><item><title>Astro 5 in Production — SSR, Supabase, and the Architecture Behind Our Website</title><link>https://blog.codercops.com/blog/astro-5-in-production/</link><guid isPermaLink="true">https://blog.codercops.com/blog/astro-5-in-production/</guid><description>A deep dive into how we built codercops.com with Astro 5 SSR, Supabase as a CMS, Git-based content, and Edge Functions. Architecture decisions and lessons learned.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Astro</category><category>Supabase</category><category>SSR</category><category>Web Development</category><category>Architecture</category><category>2026</category><author>Anurag Verma</author></item><item><title>Building AI Agents That Actually Work — Patterns, Pitfalls, and Production Lessons</title><link>https://blog.codercops.com/blog/building-ai-agents-that-actually-work/</link><guid isPermaLink="true">https://blog.codercops.com/blog/building-ai-agents-that-actually-work/</guid><description>Most AI agents fail in production. Here are the architecture patterns, error handling strategies, and guardrails we use to build agents that actually ship.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Agents</category><category>LangGraph</category><category>Claude</category><category>Production</category><category>2026</category><author>Anurag Verma</author></item><item><title>Build a Real-Time Dashboard with Supabase Realtime, Astro, and D3 — A Complete Tutorial</title><link>https://blog.codercops.com/blog/build-realtime-dashboard-supabase-astro-d3/</link><guid isPermaLink="true">https://blog.codercops.com/blog/build-realtime-dashboard-supabase-astro-d3/</guid><description>Step-by-step tutorial to build a live-updating analytics dashboard using Supabase Realtime subscriptions, Astro SSR, and D3.js charts. Full code included.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Supabase</category><category>Astro</category><category>D3.js</category><category>Real-Time</category><category>Tutorial</category><category>2026</category><author>Anurag Verma</author></item><item><title>Building a Content Pipeline with Supabase, Git, and Edge Functions — Our Exact Setup</title><link>https://blog.codercops.com/blog/building-content-pipeline-supabase-git-edge-functions/</link><guid isPermaLink="true">https://blog.codercops.com/blog/building-content-pipeline-supabase-git-edge-functions/</guid><description>How we built a Git-to-Supabase content pipeline with SHA-256 delta sync, Edge Functions, and GitHub Actions. Full architecture and code walkthrough.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Supabase</category><category>Git</category><category>Edge Functions</category><category>Content Management</category><category>Architecture</category><category>2026</category><author>Anurag Verma</author></item><item><title>Claude Code Changed How We Ship Software — Our First 90 Days</title><link>https://blog.codercops.com/blog/claude-code-changed-how-we-ship-software/</link><guid isPermaLink="true">https://blog.codercops.com/blog/claude-code-changed-how-we-ship-software/</guid><description>After 90 days of using Claude Code across our entire engineering team, here is what actually changed — the good, the bad, and the productivity numbers.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Claude</category><category>Anthropic</category><category>Developer Tools</category><category>Productivity</category><category>AI</category><category>2026</category><author>Anurag Verma</author></item><item><title>Claude Sonnet 4.6 — Opus-Level AI at One-Fifth the Cost. Here Is Everything That Changed.</title><link>https://blog.codercops.com/blog/claude-sonnet-4-6-everything-you-need-to-know/</link><guid isPermaLink="true">https://blog.codercops.com/blog/claude-sonnet-4-6-everything-you-need-to-know/</guid><description>Claude Sonnet 4.6 matches Opus performance at Sonnet pricing. Full breakdown of benchmarks, features, adaptive thinking, and what it means for developers.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Claude</category><category>Anthropic</category><category>LLM</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>Deploy a Production AI Chatbot in 30 Minutes with Claude API and Vercel</title><link>https://blog.codercops.com/blog/deploy-production-ai-chatbot-30-minutes/</link><guid isPermaLink="true">https://blog.codercops.com/blog/deploy-production-ai-chatbot-30-minutes/</guid><description>A step-by-step guide to deploying a production-ready AI chatbot with streaming responses, conversation memory, and rate limiting using Claude API and Vercel.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Claude</category><category>Anthropic</category><category>Chatbot</category><category>Vercel</category><category>AI</category><category>2026</category><author>Anurag Verma</author></item><item><title>Designing for Developers — Why Your SaaS Dashboard Looks Like Every Other One</title><link>https://blog.codercops.com/blog/designing-for-developers/</link><guid isPermaLink="true">https://blog.codercops.com/blog/designing-for-developers/</guid><description>Developer tool UIs have converged into a boring monoculture. Here is why it happened, the anti-patterns killing your UX, and how to design dashboards developers actually love.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>Design</category><category>Design</category><category>UX</category><category>Developer Tools</category><category>SaaS</category><category>Dashboard</category><category>2026</category><author>Anurag Verma</author></item><item><title>A Developer&apos;s Guide to SOC 2 Compliance — What Actually Matters and What Does Not</title><link>https://blog.codercops.com/blog/developers-guide-to-soc2-compliance/</link><guid isPermaLink="true">https://blog.codercops.com/blog/developers-guide-to-soc2-compliance/</guid><description>SOC 2 is not as scary as it sounds. Here is what engineering teams actually need to implement, the tools that automate 80% of it, and what to skip.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>Security</category><category>Compliance</category><category>SOC 2</category><category>Enterprise</category><category>Engineering</category><category>2026</category><author>Anurag Verma</author></item><item><title>Edge Functions vs Serverless vs Containers — A Cost and Performance Shootout</title><link>https://blog.codercops.com/blog/edge-functions-vs-serverless-vs-containers/</link><guid isPermaLink="true">https://blog.codercops.com/blog/edge-functions-vs-serverless-vs-containers/</guid><description>We benchmarked Supabase Edge Functions, Vercel Serverless, and Fly.io containers head-to-head. Here are the real cold start times, throughput, and costs.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>Edge Computing</category><category>Serverless</category><category>Containers</category><category>Cloud Computing</category><category>Performance</category><category>2026</category><author>Anurag Verma</author></item><item><title>Fine-Tuning vs Prompting vs RAG — A Decision Framework That Actually Works</title><link>https://blog.codercops.com/blog/fine-tuning-vs-prompting-vs-rag/</link><guid isPermaLink="true">https://blog.codercops.com/blog/fine-tuning-vs-prompting-vs-rag/</guid><description>Stop guessing which AI approach to use. This decision framework with real cost, latency, and accuracy comparisons helps you pick the right one every time.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Fine-Tuning</category><category>RAG</category><category>Prompting</category><category>LLM</category><category>2026</category><author>Anurag Verma</author></item><item><title>From Freelancer to Agency Owner — The Uncomfortable Truths After Year One</title><link>https://blog.codercops.com/blog/freelancer-to-agency-owner/</link><guid isPermaLink="true">https://blog.codercops.com/blog/freelancer-to-agency-owner/</guid><description>The real story of going from solo freelancer to running a tech agency. Revenue, hiring mistakes, client nightmares, and the systems that finally made it work.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>Career</category><category>Agency</category><category>Freelancing</category><category>Business</category><category>Founder</category><category>Career</category><category>2026</category><author>Anurag Verma</author></item><item><title>Galgotias University Got Kicked Out of India&apos;s Biggest AI Summit. Here Is What Actually Happened.</title><link>https://blog.codercops.com/blog/galgotias-university-ai-summit-controversy/</link><guid isPermaLink="true">https://blog.codercops.com/blog/galgotias-university-ai-summit-controversy/</guid><description>Galgotias University was removed from the India AI Impact Summit 2026 after presenting a Chinese-made Unitree Go2 robot dog as their own creation &apos;Orion.&apos; The full story, the second drone scandal, and what this says about Indian tech education.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>Industry News</category><category>India</category><category>AI</category><category>Education</category><category>Technology</category><category>AI Summit</category><category>2026</category><author>Anurag Verma</author></item><item><title>Git Workflows for Small Teams — Keep It Simple, Ship Faster</title><link>https://blog.codercops.com/blog/git-workflows-for-small-teams/</link><guid isPermaLink="true">https://blog.codercops.com/blog/git-workflows-for-small-teams/</guid><description>Trunk-based, Git Flow, GitHub Flow — we have tried them all. Here is the simple Git workflow that works for teams under 10 and the mistakes to avoid.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Git</category><category>DevOps</category><category>Workflow</category><category>Engineering</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>GSoC 2026: The Complete Guide That Actually Gets You Selected (185 Organizations, Stipends, Timeline, and Strategy)</title><link>https://blog.codercops.com/blog/gsoc-2026-complete-guide/</link><guid isPermaLink="true">https://blog.codercops.com/blog/gsoc-2026-complete-guide/</guid><description>Google Summer of Code 2026 accepted 185 organizations. Here is everything you need to know — eligibility, timeline, stipends up to $6,600, how to write a winning proposal, and the mistakes that get you rejected.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>Career</category><category>GSoC</category><category>Open Source</category><category>Career</category><category>Google</category><category>Programming</category><category>2026</category><author>Anurag Verma</author></item><item><title>Is n8n Dead in 2026? $2.5 Billion Valuation, 200K Users, and the Problems Nobody Talks About</title><link>https://blog.codercops.com/blog/is-n8n-dead-in-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/is-n8n-dead-in-2026/</guid><description>n8n just raised $180M at a $2.5B valuation. But behind the hype, real problems are emerging — security vulnerabilities, AI agent limitations, fair-code licensing, and a 58x revenue multiple that makes no sense. Here is the full picture.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>Technology</category><category>n8n</category><category>Automation</category><category>AI Agents</category><category>No-Code</category><category>Workflow Automation</category><category>2026</category><author>Anurag Verma</author></item><item><title>Decentralized IP Protection on Blockchain — Lessons from Building Lore Web3</title><link>https://blog.codercops.com/blog/lore-web3-ip-protection-blockchain-case-study-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/lore-web3-ip-protection-blockchain-case-study-2026/</guid><description>How we built a Web3 platform for creators to register, protect, and monetize intellectual property using Ethereum smart contracts, IPFS storage, and AI-powered content tools. 12,500+ IP assets registered.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Case Study</category><category>Web3</category><category>Blockchain</category><category>Ethereum</category><category>IPFS</category><category>Next.js</category><category>2026</category><author>Anurag Verma</author></item><item><title>Next.js 15 vs Astro 5 vs Remix — Choosing the Right Framework in 2026</title><link>https://blog.codercops.com/blog/nextjs-15-vs-astro-5-vs-remix/</link><guid isPermaLink="true">https://blog.codercops.com/blog/nextjs-15-vs-astro-5-vs-remix/</guid><description>We have built production apps with all three. Here is an honest comparison of Next.js 15, Astro 5, and Remix covering performance, DX, and when to use each.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Next.js</category><category>Astro</category><category>Remix</category><category>JavaScript</category><category>Frontend</category><category>2026</category><author>Anurag Verma</author></item><item><title>The npm Packages We Install in Every Project — And Why Each One Earned Its Spot</title><link>https://blog.codercops.com/blog/npm-packages-we-install-in-every-project/</link><guid isPermaLink="true">https://blog.codercops.com/blog/npm-packages-we-install-in-every-project/</guid><description>Our curated list of npm packages that make it into every CODERCOPS project. Each one battle-tested across 30+ production apps with alternatives we considered.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>npm</category><category>JavaScript</category><category>Developer Tools</category><category>Node.js</category><category>Web Development</category><category>2026</category><author>Anurag Verma</author></item><item><title>RAG Is Dead, Long Live RAG — What Contextual Retrieval Actually Looks Like in 2026</title><link>https://blog.codercops.com/blog/rag-is-dead-long-live-rag/</link><guid isPermaLink="true">https://blog.codercops.com/blog/rag-is-dead-long-live-rag/</guid><description>Naive RAG is broken. Here is how contextual retrieval, hybrid search, and intelligent chunking are reshaping how we build AI applications in 2026.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>RAG</category><category>Vector Search</category><category>LLM</category><category>Retrieval</category><category>2026</category><author>Anurag Verma</author></item><item><title>Server Components Are Everywhere Now — React, Vue, Astro, and What It Means for Data Fetching</title><link>https://blog.codercops.com/blog/server-components-are-everywhere-now/</link><guid isPermaLink="true">https://blog.codercops.com/blog/server-components-are-everywhere-now/</guid><description>Server components have gone from React experiment to cross-framework standard. Here is how they work in React, Vue, Astro, and Svelte — and what changes for your apps.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>React</category><category>Vue.js</category><category>Astro</category><category>Server Components</category><category>Frontend</category><category>2026</category><author>Anurag Verma</author></item><item><title>The State of CSS in 2026 — Container Queries, Scroll Animations, and What You Can Finally Drop</title><link>https://blog.codercops.com/blog/state-of-css-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/state-of-css-2026/</guid><description>CSS has changed more in the last 2 years than the previous 10. Here is what is production-ready, what to adopt now, and what you can stop using.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>CSS</category><category>Frontend</category><category>Web Development</category><category>Design</category><category>Performance</category><category>2026</category><author>Anurag Verma</author></item><item><title>5 VS Code Extensions That Replaced My Entire Workflow in 2026</title><link>https://blog.codercops.com/blog/vscode-extensions-that-replaced-my-workflow/</link><guid isPermaLink="true">https://blog.codercops.com/blog/vscode-extensions-that-replaced-my-workflow/</guid><description>These 5 VS Code extensions eliminated 3 separate tools from my workflow. Each one with setup tips, settings tweaks, and why it beats the alternatives.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>VS Code</category><category>Developer Tools</category><category>Productivity</category><category>Extensions</category><category>Development</category><category>2026</category><author>Anurag Verma</author></item><item><title>We Replaced Our Entire QA Pipeline with AI. Here Is What Happened.</title><link>https://blog.codercops.com/blog/we-replaced-our-qa-pipeline-with-ai/</link><guid isPermaLink="true">https://blog.codercops.com/blog/we-replaced-our-qa-pipeline-with-ai/</guid><description>We automated visual regression testing, test generation, and bug triage with AI. Here are the real results after 6 months — including what still needs humans.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Testing</category><category>QA</category><category>Automation</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>WebAssembly Is Quietly Taking Over — 5 Production Use Cases Beyond the Browser</title><link>https://blog.codercops.com/blog/webassembly-quietly-taking-over/</link><guid isPermaLink="true">https://blog.codercops.com/blog/webassembly-quietly-taking-over/</guid><description>WebAssembly is not just for browser apps anymore. From edge computing to plugin systems, here are 5 production use cases reshaping how we build software.</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><category>Technology</category><category>WebAssembly</category><category>WASM</category><category>Edge Computing</category><category>Performance</category><category>Rust</category><category>2026</category><author>Anurag Verma</author></item><item><title>Building a Natural Language Database Query Tool — The QueryLytic Case Study</title><link>https://blog.codercops.com/blog/querylytic-natural-language-database-queries-case-study-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/querylytic-natural-language-database-queries-case-study-2026/</guid><description>How we built an AI-powered interface that lets non-technical users query any database using plain English, eliminating SQL expertise requirements and democratizing data access.</description><pubDate>Thu, 19 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Case Study</category><category>AI</category><category>NLP</category><category>Database</category><category>React</category><category>Python</category><category>2026</category><author>Anurag Verma</author></item><item><title>The EU AI Act Hits Full Force in August. Here Is What Developers Actually Need to Do.</title><link>https://blog.codercops.com/blog/eu-ai-act-compliance-deadline-august-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/eu-ai-act-compliance-deadline-august-2026/</guid><description>Full enforcement of the EU AI Act begins August 2, 2026, with fines up to 35 million euros. Most development teams are not ready. This is the practical compliance guide they need.</description><pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>EU AI Act</category><category>Compliance</category><category>Regulation</category><category>GDPR</category><category>2026</category><author>Anurag Verma</author></item><item><title>How We Built an AI-Powered Mental Wellness Platform in 12 Weeks — The Venting Spot Story</title><link>https://blog.codercops.com/blog/venting-spot-mental-wellness-platform-case-study-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/venting-spot-mental-wellness-platform-case-study-2026/</guid><description>From concept to launch: building a 24/7 anonymous mental wellness platform with AI-powered listener matching, real-time encrypted chat, and affordable therapy access using Next.js, Django, and Azure.</description><pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Case Study</category><category>Healthcare</category><category>AI</category><category>Next.js</category><category>Django</category><category>Azure</category><category>2026</category><author>Anurag Verma</author></item><item><title>Vue 3.6 Vapor Mode Removes the Virtual DOM. That Changes More Than You Think.</title><link>https://blog.codercops.com/blog/vue-36-vapor-mode-no-virtual-dom-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/vue-36-vapor-mode-no-virtual-dom-2026/</guid><description>Vue 3.6 introduces Vapor Mode, compiling templates directly to DOM operations and skipping the virtual DOM entirely. We break down the benchmarks, the tradeoffs, and what this means for the vdom debate.</description><pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Vue.js</category><category>Vapor Mode</category><category>Virtual DOM</category><category>JavaScript</category><category>Frontend</category><category>2026</category><author>Anurag Verma</author></item><item><title>Angular&apos;s Quiet Comeback: Signals, Zoneless, and Why Enterprise Teams Are Paying Attention Again</title><link>https://blog.codercops.com/blog/angular-21-signals-zoneless-renaissance-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/angular-21-signals-zoneless-renaissance-2026/</guid><description>Angular 21 ships with signals-based reactivity, zoneless change detection, and a dramatically simplified developer experience. After years of decline, enterprise teams are reconsidering. Here is what changed.</description><pubDate>Mon, 16 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Angular</category><category>Signals</category><category>Zoneless</category><category>Enterprise</category><category>Frontend</category><category>2026</category><author>Anurag Verma</author></item><item><title>AWS and Google Cloud Are Partnering on Multicloud. Here Is Why That Matters.</title><link>https://blog.codercops.com/blog/aws-google-cloud-multicloud-alliance-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/aws-google-cloud-multicloud-alliance-2026/</guid><description>AWS and Google Cloud announced cross-cloud interconnect integration with encrypted-by-default networking. After years of vendor lock-in wars, competitors are collaborating. We break down what it means and what it does not.</description><pubDate>Sun, 15 Feb 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>AWS</category><category>Google Cloud</category><category>Multicloud</category><category>Cloud Computing</category><category>Infrastructure</category><category>2026</category><author>Anurag Verma</author></item><item><title>Low-Code vs Custom Development: An Honest Decision Framework for 2026</title><link>https://blog.codercops.com/blog/low-code-vs-custom-development-decision-framework-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/low-code-vs-custom-development-decision-framework-2026/</guid><description>The low-code market will hit $264B by 2032, but that does not mean every app should be built on Bubble or Retool. Here is a framework for knowing when low-code saves you money and when it costs you everything.</description><pubDate>Sat, 14 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Low-Code</category><category>No-Code</category><category>Custom Development</category><category>Web Development</category><category>Strategy</category><category>2026</category><author>Anurag Verma</author></item><item><title>Post-Quantum Cryptography Is Not a Future Problem. Here Is Your Migration Roadmap.</title><link>https://blog.codercops.com/blog/post-quantum-cryptography-developer-migration-roadmap-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/post-quantum-cryptography-developer-migration-roadmap-2026/</guid><description>NIST finalized post-quantum standards in 2024. Harvest-now-decrypt-later attacks are already happening. If your migration plan starts with &apos;we will deal with it when quantum computers arrive,&apos; you are already behind.</description><pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>Quantum Computing</category><category>Cryptography</category><category>Security</category><category>Post-Quantum</category><category>NIST</category><category>2026</category><author>Anurag Verma</author></item><item><title>Your Code Has a Carbon Footprint. Here Is How to Measure and Reduce It.</title><link>https://blog.codercops.com/blog/green-software-engineering-carbon-aware-apps-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/green-software-engineering-carbon-aware-apps-2026/</guid><description>Data centers consume 2-3% of global electricity and that number is climbing fast. Green software engineering is no longer a nice-to-have -- it is becoming a regulatory and commercial requirement.</description><pubDate>Thu, 12 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Green Software</category><category>Sustainability</category><category>Carbon Footprint</category><category>Cloud Computing</category><category>Performance</category><category>2026</category><author>Anurag Verma</author></item><item><title>How AI Is Replacing Jobs in 2026 — A Data-Driven Reality Check</title><link>https://blog.codercops.com/blog/ai-replacing-jobs-data-driven-reality-check-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-replacing-jobs-data-driven-reality-check-2026/</guid><description>From Google&apos;s voluntary exit program to widespread automation, here&apos;s a data-driven look at how AI is reshaping the job market in 2026 and what workers can do.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Jobs</category><category>Automation</category><category>Workforce</category><category>Google</category><category>Future of Work</category><category>2026</category><author>Anurag Verma</author></item><item><title>AI Sovereignty — Why 93% of Executives Say It&apos;s Mission-Critical in 2026</title><link>https://blog.codercops.com/blog/ai-sovereignty-mission-critical-executives-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-sovereignty-mission-critical-executives-2026/</guid><description>93% of executives say AI sovereignty is mission-critical in 2026. Learn what AI sovereignty means, why it matters, and how to build a sovereign AI strategy.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Sovereignty</category><category>Governance</category><category>Data Privacy</category><category>Policy</category><category>2026</category><author>Anurag Verma</author></item><item><title>Artemis II Launches February 2026 — NASA&apos;s First Crewed Moon Mission in 50+ Years</title><link>https://blog.codercops.com/blog/artemis-ii-nasa-crewed-moon-mission-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/artemis-ii-nasa-crewed-moon-mission-2026/</guid><description>NASA&apos;s Artemis II is sending astronauts around the Moon in February 2026 — the first crewed lunar mission since Apollo 17. Here&apos;s everything you need to know.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>Science</category><category>NASA</category><category>Artemis</category><category>Moon</category><category>Space Exploration</category><category>Science</category><category>2026</category><author>Anurag Verma</author></item><item><title>Autonomous Vehicles Go Global in 2026 — Waymo, WeRide &amp; the Self-Driving Revolution</title><link>https://blog.codercops.com/blog/autonomous-vehicles-waymo-weride-self-driving-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/autonomous-vehicles-waymo-weride-self-driving-2026/</guid><description>Self-driving cars are going global in 2026. Waymo expands to London &amp; NYC while Chinese competitors enter Dubai &amp; Singapore. Here&apos;s the full rollout tracker.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>Technology</category><category>Autonomous Vehicles</category><category>Waymo</category><category>Self-Driving</category><category>WeRide</category><category>Transportation</category><category>2026</category><author>Anurag Verma</author></item><item><title>Bharat-VISTAAR — India&apos;s AI Platform for Farmers &amp; the Agritech Opportunity</title><link>https://blog.codercops.com/blog/bharat-vistaar-ai-platform-farmers-agritech-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/bharat-vistaar-ai-platform-farmers-agritech-2026/</guid><description>Budget 2026 launches Bharat-VISTAAR, a multilingual AI platform for Indian farmers. Here&apos;s how it works and why agritech startups should pay attention.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Agriculture</category><category>Agritech</category><category>India</category><category>Budget 2026</category><category>Farming</category><category>2026</category><author>Anurag Verma</author></item><item><title>Biopharma SHAKTI — India&apos;s Rs 10,000 Cr Bet on Biopharmaceutical Innovation</title><link>https://blog.codercops.com/blog/biopharma-shakti-india-biopharmaceutical-innovation-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/biopharma-shakti-india-biopharmaceutical-innovation-2026/</guid><description>Budget 2026 launches Biopharma SHAKTI with Rs 10,000 Cr outlay for biopharmaceutical innovation. Here&apos;s what it covers and who can benefit.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>Business</category><category>Biopharma</category><category>India</category><category>Healthcare</category><category>Budget 2026</category><category>Innovation</category><category>2026</category><author>Anurag Verma</author></item><item><title>CAR-T Therapy, Personalized Cancer Vaccines &amp; the Future of Immunotherapy in 2026</title><link>https://blog.codercops.com/blog/car-t-therapy-cancer-immunotherapy-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/car-t-therapy-cancer-immunotherapy-2026/</guid><description>2026 brings breakthroughs in CAR-T therapy, personalized cancer vaccines &amp; regulatory T cell therapy. Here&apos;s what&apos;s changing in cancer treatment this year.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>Science</category><category>Cancer</category><category>Immunotherapy</category><category>CAR-T</category><category>Healthcare</category><category>Medicine</category><category>2026</category><author>Anurag Verma</author></item><item><title>Digital Health in Rural India — Telemedicine, AI Diagnostics &amp; the $17B Opportunity</title><link>https://blog.codercops.com/blog/digital-health-rural-india-telemedicine-ai-diagnostics/</link><guid isPermaLink="true">https://blog.codercops.com/blog/digital-health-rural-india-telemedicine-ai-diagnostics/</guid><description>India spends just 2.1% of GDP on healthcare while its digital health market surges. Explore how telemedicine and AI diagnostics are transforming rural health access.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>Technology</category><category>Digital Health</category><category>Telemedicine</category><category>AI</category><category>Rural India</category><category>Healthcare</category><category>2026</category><author>Anurag Verma</author></item><item><title>DevSecOps in 2026: Why Every Serious Team Now Ships a Software Bill of Materials</title><link>https://blog.codercops.com/blog/devsecops-sbom-supply-chain-security-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/devsecops-sbom-supply-chain-security-2026/</guid><description>Supply chain attacks have surged 742% since 2019. SBOMs are now legally mandated for federal software and EU market access. Here is how to implement them without slowing down your CI/CD pipeline.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>DevSecOps</category><category>SBOM</category><category>Supply Chain</category><category>Security</category><category>CI/CD</category><category>2026</category><author>Anurag Verma</author></item><item><title>Ethical AI in India — Governance, Bias &amp; the Road to Responsible Innovation</title><link>https://blog.codercops.com/blog/ethical-ai-india-governance-bias-responsible-innovation/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ethical-ai-india-governance-bias-responsible-innovation/</guid><description>India&apos;s AI market hits $17B by 2027 but lacks comprehensive data privacy laws. Explore the ethical AI challenges India faces and frameworks for responsible innovation.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Ethics</category><category>Governance</category><category>Bias</category><category>India</category><category>Responsible AI</category><category>2026</category><author>Anurag Verma</author></item><item><title>India&apos;s Gaganyaan Mission — Everything About ISRO&apos;s First Orbital Spacecraft Test</title><link>https://blog.codercops.com/blog/gaganyaan-isro-india-space-mission-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/gaganyaan-isro-india-space-mission-2026/</guid><description>ISRO&apos;s Gaganyaan orbital spacecraft will conduct an uncrewed test in 2026 — a milestone for India&apos;s space program. Here&apos;s the complete mission guide.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>Science</category><category>ISRO</category><category>Gaganyaan</category><category>India</category><category>Space</category><category>Science</category><category>2026</category><author>Anurag Verma</author></item><item><title>Google Asks Employees to Go All In on AI or Take Voluntary Exit</title><link>https://blog.codercops.com/blog/google-ai-voluntary-exit-all-in-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/google-ai-voluntary-exit-all-in-2026/</guid><description>Google&apos;s CBO Philipp Schindler offers voluntary exit packages to employees not embracing AI. Here&apos;s what this means for tech workers and the industry in 2026.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Google</category><category>Layoffs</category><category>Workforce</category><category>Tech Industry</category><category>2026</category><author>Anurag Verma</author></item><item><title>India AI Impact Buildathon 2026 — How to Participate &amp; Why It Matters</title><link>https://blog.codercops.com/blog/india-ai-impact-buildathon-participate-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/india-ai-impact-buildathon-participate-guide-2026/</guid><description>India AI Impact Buildathon 2026 is the country&apos;s biggest AI challenge. Here&apos;s how to participate, what to expect, and why this signals India&apos;s AI ambition.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Hackathon</category><category>India</category><category>Buildathon</category><category>Competition</category><category>2026</category><author>Anurag Verma</author></item><item><title>India&apos;s $67.5 Billion Data Centre Boom — Microsoft, Amazon &amp; Google&apos;s AI Race</title><link>https://blog.codercops.com/blog/india-data-centre-boom-microsoft-amazon-google-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/india-data-centre-boom-microsoft-amazon-google-2026/</guid><description>Microsoft ($17.5B), Amazon ($35B) &amp; Google ($15B) are investing $67.5B in India&apos;s data centres. Here&apos;s what this AI infrastructure race means for India&apos;s tech future.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Data Centres</category><category>India</category><category>Microsoft</category><category>Amazon</category><category>Google</category><category>Infrastructure</category><category>2026</category><author>Anurag Verma</author></item><item><title>India&apos;s $125B Renewable Energy Market — Clean Energy Innovations to Watch</title><link>https://blog.codercops.com/blog/india-renewable-energy-market-clean-energy-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/india-renewable-energy-market-clean-energy-2026/</guid><description>India&apos;s $125B renewable energy market is booming with solar farming, waste solutions &amp; green finance. Explore the clean energy innovations driving India&apos;s net-zero goal.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>Science</category><category>Renewable Energy</category><category>India</category><category>Solar</category><category>Clean Energy</category><category>Sustainability</category><category>2026</category><author>Anurag Verma</author></item><item><title>India&apos;s AI Market to Hit $17 Billion by 2027 — Where the Growth Is Coming From</title><link>https://blog.codercops.com/blog/india-ai-market-17-billion-growth-sectors-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/india-ai-market-17-billion-growth-sectors-2026/</guid><description>India&apos;s AI market is projected to reach $17B by 2027 with 45% YoY growth. Explore the sector-by-sector breakdown of AI adoption in banking, healthcare &amp; education.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>India</category><category>Market Analysis</category><category>NASSCOM</category><category>Investment</category><category>2026</category><author>Anurag Verma</author></item><item><title>9 Indian AI Startups to Watch in 2026 — From Othor AI to Trupeer</title><link>https://blog.codercops.com/blog/indian-ai-startups-to-watch-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/indian-ai-startups-to-watch-2026/</guid><description>Discover 9 emerging Indian AI startups from Bengaluru, Gurugram &amp; Kerala that are driving AI innovation in 2026. From agentic AI to content creation tools.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Startups</category><category>India</category><category>Bengaluru</category><category>Innovation</category><category>2026</category><author>Anurag Verma</author></item><item><title>India Semiconductor Mission 2.0 — Rs 40,000 Cr Push for Electronics Manufacturing</title><link>https://blog.codercops.com/blog/india-semiconductor-mission-2-electronics-manufacturing-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/india-semiconductor-mission-2-electronics-manufacturing-2026/</guid><description>India Semiconductor Mission 2.0 increases ECMS outlay to Rs 40,000 Cr. Here&apos;s what changed from 1.0 to 2.0 and the investment opportunities it creates.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>Technology</category><category>Semiconductor</category><category>India</category><category>Manufacturing</category><category>Electronics</category><category>Budget 2026</category><category>2026</category><author>Anurag Verma</author></item><item><title>Lenskart IPO Lock-In Expires — Rs 30,000 Crore Share Unlock &amp; What Investors Should Know</title><link>https://blog.codercops.com/blog/lenskart-ipo-lock-in-share-unlock-investors-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/lenskart-ipo-lock-in-share-unlock-investors-2026/</guid><description>Lenskart shares worth Rs 30,000 crore are being unlocked post lock-in period. With analyst targets of Rs 500-535, here&apos;s what investors need to know.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>Business</category><category>Lenskart</category><category>IPO</category><category>Stock Market</category><category>India</category><category>Investing</category><category>2026</category><author>Anurag Verma</author></item><item><title>Nancy Grace Roman Space Telescope — The Successor to Hubble Launches in 2026</title><link>https://blog.codercops.com/blog/nancy-grace-roman-space-telescope-hubble-successor-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/nancy-grace-roman-space-telescope-hubble-successor-2026/</guid><description>NASA&apos;s Nancy Grace Roman Space Telescope launches in autumn 2026 with 100x Hubble&apos;s field of view. Discover what this next-gen observatory will reveal about the universe.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>Science</category><category>NASA</category><category>Space Telescope</category><category>Hubble</category><category>Astronomy</category><category>Science</category><category>2026</category><author>Anurag Verma</author></item><item><title>Nuclear Energy &amp; AI — Why Data Centre Demand Is Reigniting the Nuclear Debate</title><link>https://blog.codercops.com/blog/nuclear-energy-ai-data-centres-power-demand-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/nuclear-energy-ai-data-centres-power-demand-2026/</guid><description>AI data centres are consuming massive energy, reigniting the nuclear power debate. Explore how nuclear energy could power the AI revolution in 2026.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>Science</category><category>Nuclear Energy</category><category>AI</category><category>Data Centres</category><category>Clean Energy</category><category>Power</category><category>2026</category><author>Anurag Verma</author></item><item><title>Physical AI Is Here — How Robots, Drones &amp; Autonomous Systems Are Changing Industries</title><link>https://blog.codercops.com/blog/physical-ai-robots-drones-autonomous-systems-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/physical-ai-robots-drones-autonomous-systems-2026/</guid><description>Physical AI enables robots, drones &amp; smart equipment to operate autonomously. See how Amazon, BMW &amp; others are deploying embodied AI in 2026.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Robotics</category><category>Drones</category><category>Automation</category><category>Amazon</category><category>Manufacturing</category><category>2026</category><author>Anurag Verma</author></item><item><title>SHE-Mark &amp; SHE Marts — Budget 2026&apos;s Push for Women-Led Businesses in India</title><link>https://blog.codercops.com/blog/she-mark-she-marts-women-entrepreneurs-budget-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/she-mark-she-marts-women-entrepreneurs-budget-2026/</guid><description>Budget 2026 introduces SHE-Mark certification and SHE Marts for women-led businesses. Here&apos;s what it means and how women entrepreneurs can benefit.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>Business</category><category>Women</category><category>Entrepreneurship</category><category>Budget 2026</category><category>India</category><category>SHE-Mark</category><category>MSME</category><category>2026</category><author>Anurag Verma</author></item><item><title>Union Budget 2026 for Startups — Rs 10,000 Cr SME Fund, Semiconductor Mission 2.0 &amp; More</title><link>https://blog.codercops.com/blog/union-budget-2026-startups-sme-fund-semiconductor/</link><guid isPermaLink="true">https://blog.codercops.com/blog/union-budget-2026-startups-sme-fund-semiconductor/</guid><description>Budget 2026 brings Rs 10,000 Cr SME fund, Semiconductor Mission 2.0, Biopharma SHAKTI &amp; more for startups. Complete founder&apos;s guide to every announcement.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>Business</category><category>Budget 2026</category><category>Startups</category><category>India</category><category>SME</category><category>Semiconductor</category><category>MSME</category><category>2026</category><author>Anurag Verma</author></item><item><title>UPI Crosses 14 Billion Monthly Transactions — India&apos;s Fintech Revolution in Numbers</title><link>https://blog.codercops.com/blog/upi-14-billion-transactions-fintech-india-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/upi-14-billion-transactions-fintech-india-2026/</guid><description>UPI transactions exceed 14 billion monthly. Digital lending to hit $350B by 2030. Explore India&apos;s fintech revolution with key stats and trends for 2026.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>Business</category><category>UPI</category><category>Fintech</category><category>Digital Payments</category><category>India</category><category>NPCI</category><category>2026</category><author>Anurag Verma</author></item><item><title>What Is 6G? Everything You Need to Know About Next-Gen Connectivity</title><link>https://blog.codercops.com/blog/what-is-6g-technology-next-gen-connectivity/</link><guid isPermaLink="true">https://blog.codercops.com/blog/what-is-6g-technology-next-gen-connectivity/</guid><description>6G technology promises faster speeds, ultra-low latency &amp; AI-integrated networks. Learn what 6G is, when it&apos;s coming, and how it differs from 5G.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>Technology</category><category>6G</category><category>5G</category><category>Wireless</category><category>Connectivity</category><category>IoT</category><category>Technology</category><category>2026</category><author>Anurag Verma</author></item><item><title>GDPR Just Got Its Biggest Update Since 2018. Here Is What Changed for Developers.</title><link>https://blog.codercops.com/blog/gdpr-2026-digital-omnibus-reforms-developers-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/gdpr-2026-digital-omnibus-reforms-developers-2026/</guid><description>The European Commission&apos;s Digital Omnibus proposal rewrites key GDPR provisions for the first time in eight years. We break down every change that matters for development teams shipping products in the EU.</description><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>GDPR</category><category>Privacy</category><category>Compliance</category><category>EU</category><category>Data Protection</category><category>2026</category><author>Anurag Verma</author></item><item><title>GitOps Meets FinOps: How Teams Are Finally Getting Infrastructure Cost and Reliability Right</title><link>https://blog.codercops.com/blog/gitops-finops-infrastructure-cost-reliability-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/gitops-finops-infrastructure-cost-reliability-2026/</guid><description>GitOps adoption hit 64% in 2025, and the next evolution is integrating real-time cost visibility into every infrastructure pull request. We break down why GitOps plus FinOps is the operational model serious teams are adopting in 2026.</description><pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate><category>Cloud &amp; Infrastructure</category><category>GitOps</category><category>FinOps</category><category>DevOps</category><category>Infrastructure</category><category>Cloud Costs</category><category>2026</category><author>Anurag Verma</author></item><item><title>NASA Uses Claude AI for Mars Rover Autonomous Navigation: A Technical Deep Dive</title><link>https://blog.codercops.com/blog/nasa-claude-ai-mars-rover-navigation-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/nasa-claude-ai-mars-rover-navigation-2026/</guid><description>NASA&apos;s Perseverance rover completed the first AI-planned drive on Mars using Anthropic&apos;s Claude. Here&apos;s the technical breakdown of how vision-language models are transforming space exploration.</description><pubDate>Sun, 08 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>NASA</category><category>Claude</category><category>Space</category><category>Autonomous Systems</category><category>2026</category><author>Anurag Verma</author></item><item><title>The 2026 Tech Layoff Paradox: Companies Are Firing Developers and Complaining About Talent Shortages Simultaneously</title><link>https://blog.codercops.com/blog/tech-layoffs-2026-developer-demand-paradox/</link><guid isPermaLink="true">https://blog.codercops.com/blog/tech-layoffs-2026-developer-demand-paradox/</guid><description>Tech layoffs continue in 2026 while companies report severe talent shortages. We analyze the data behind this paradox, AI&apos;s role in reshaping developer demand, and which skills are actually in demand.</description><pubDate>Sun, 08 Feb 2026 00:00:00 GMT</pubDate><category>Industry News</category><category>Tech Layoffs</category><category>Career</category><category>Job Market</category><category>AI</category><category>Developer Jobs</category><category>2026</category><author>Anurag Verma</author></item><item><title>TypeScript 7.0 Rewrites the Compiler in Go. The Performance Numbers Are Absurd.</title><link>https://blog.codercops.com/blog/typescript-7-go-compiler-performance-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/typescript-7-go-compiler-performance-2026/</guid><description>Anders Hejlsberg announced the Go-based TypeScript compiler in March 2025. With TypeScript 7.0 on track for mid-2026, early benchmarks show 10x faster type-checking. We unpack what this means for your projects.</description><pubDate>Sun, 08 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>TypeScript</category><category>Go</category><category>Compiler</category><category>Performance</category><category>JavaScript</category><category>2026</category><author>Anurag Verma</author></item><item><title>AI Regulation in 2026: The Federal vs. State Laws Showdown</title><link>https://blog.codercops.com/blog/ai-regulation-federal-vs-state-laws-march-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-regulation-federal-vs-state-laws-march-2026/</guid><description>With 38 states passing AI legislation and a federal executive order pushing for preemption, AI developers face a fragmented regulatory landscape. Here&apos;s your comprehensive guide to compliance in 2026.</description><pubDate>Sat, 07 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Regulation</category><category>Policy</category><category>EU AI Act</category><category>Compliance</category><category>2026</category><author>Anurag Verma</author></item><item><title>Big Tech&apos;s $650 Billion AI Bet: Breaking Down the Largest Infrastructure Spending Spree in History</title><link>https://blog.codercops.com/blog/big-tech-650-billion-ai-infrastructure-spending-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/big-tech-650-billion-ai-infrastructure-spending-2026/</guid><description>Microsoft, Google, Amazon, and Meta are collectively spending $650 billion on AI infrastructure in 2026. We break down what each company is building, why the numbers keep climbing, and what it means for developers.</description><pubDate>Sat, 07 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Big Tech</category><category>Infrastructure</category><category>Cloud Computing</category><category>Investment</category><category>2026</category><author>Anurag Verma</author></item><item><title>84% of Developers Now Use AI Tools, But Trust Is at an All-Time Low: What the Data Really Says</title><link>https://blog.codercops.com/blog/developer-ai-adoption-84-percent-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/developer-ai-adoption-84-percent-2026/</guid><description>The 2025 Stack Overflow Developer Survey reveals a paradox: AI tool adoption has hit 84%, but developer trust in AI accuracy has plummeted. We analyze the findings, the tools developers actually use, and what the trust gap means.</description><pubDate>Sat, 07 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Developer Tools</category><category>Survey</category><category>Stack Overflow</category><category>Productivity</category><category>2026</category><author>Anurag Verma</author></item><item><title>Vite Won the Tooling War. Here Is the Modern JavaScript Stack in 2026.</title><link>https://blog.codercops.com/blog/vite-vitest-modern-javascript-toolchain-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/vite-vitest-modern-javascript-toolchain-2026/</guid><description>Vite started as a dev server experiment by Evan You. In 2026, it is the default build tool for nearly every major framework. We trace how it won, what the modern JS toolchain looks like, and where Webpack fits now.</description><pubDate>Sat, 07 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Vite</category><category>Vitest</category><category>Webpack</category><category>JavaScript</category><category>Build Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>Accessibility in 2026 — A Developer&apos;s Guide to WCAG Compliance</title><link>https://blog.codercops.com/blog/accessibility-wcag-compliance-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/accessibility-wcag-compliance-guide-2026/</guid><description>Web accessibility is legally required and ethically essential. Here&apos;s a practical guide to building accessible applications with WCAG 2.2 compliance.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Design</category><category>Accessibility</category><category>WCAG</category><category>A11y</category><category>Web Development</category><category>2026</category><author>Anurag Verma</author></item><item><title>Alphabet&apos;s $180 Billion AI Bet — Google Parent Doubles CapEx While Stock Sinks</title><link>https://blog.codercops.com/blog/alphabet-180-billion-ai-spending-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/alphabet-180-billion-ai-spending-2026/</guid><description>Alphabet announced $175-185 billion in 2026 capital expenditure, nearly double 2025 spending. Stock dropped 5% as investors question Big Tech&apos;s AI spending sustainability, despite Google Cloud revenue spiking 48%.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Google</category><category>Alphabet</category><category>AI</category><category>Infrastructure</category><category>Investing</category><category>2026</category><author>Anurag Verma</author></item><item><title>Amazon&apos;s $200 Billion CapEx Spooks Investors — Stock Drops 10% Despite Revenue Beat</title><link>https://blog.codercops.com/blog/amazon-200-billion-capex-ai-infrastructure-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/amazon-200-billion-capex-ai-infrastructure-2026/</guid><description>Amazon reported quarterly revenue beating estimates but stock dropped 10% after-hours as investors digest the company&apos;s $200 billion capital expenditure plan for 2026, driven by aggressive AI infrastructure investment.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Amazon</category><category>AWS</category><category>AI</category><category>Infrastructure</category><category>Investing</category><category>2026</category><author>Anurag Verma</author></item><item><title>API Design in 2026 — GraphQL vs REST vs tRPC, and When to Use Each</title><link>https://blog.codercops.com/blog/api-design-graphql-rest-trpc-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/api-design-graphql-rest-trpc-2026/</guid><description>The API landscape has matured beyond the GraphQL vs REST debate. Here&apos;s how to choose between REST, GraphQL, tRPC, and gRPC based on your actual requirements.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>API</category><category>GraphQL</category><category>REST</category><category>tRPC</category><category>Backend</category><category>2026</category><author>Anurag Verma</author></item><item><title>Big Tech Earnings Week — $600B in AI CapEx and Growing Investor Skepticism</title><link>https://blog.codercops.com/blog/big-tech-ai-earnings-capex-investor-fear-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/big-tech-ai-earnings-capex-investor-fear-2026/</guid><description>Alphabet, Amazon, and Meta collectively announced over $600 billion in 2026 AI capital expenditure. Stocks dropped across the board as investors question whether returns will ever justify the spending.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Big Tech</category><category>Investing</category><category>Alphabet</category><category>Amazon</category><category>Meta</category><category>2026</category><author>Anurag Verma</author></item><item><title>Build vs Buy — A Framework for Engineering Decisions in 2026</title><link>https://blog.codercops.com/blog/build-vs-buy-decisions-engineering-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/build-vs-buy-decisions-engineering-2026/</guid><description>Every engineering team faces build vs buy decisions constantly. Here&apos;s a practical framework for making these decisions without analysis paralysis.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Business</category><category>Engineering</category><category>Architecture</category><category>Decision Making</category><category>Build vs Buy</category><category>2026</category><author>Anurag Verma</author></item><item><title>Claude Opus 4.6 Is Here — Agent Teams, 1 Million Token Context, and a Direct Challenge to OpenAI</title><link>https://blog.codercops.com/blog/claude-opus-4-6-agent-teams-million-context-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/claude-opus-4-6-agent-teams-million-context-2026/</guid><description>Anthropic just dropped Claude Opus 4.6 with game-changing features: agent teams that work in parallel, a 1 million token context window, and benchmarks that put OpenAI on notice. Here&apos;s everything you need to know.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Claude</category><category>Anthropic</category><category>AI</category><category>Opus 4.6</category><category>Agent Teams</category><category>2026</category><author>Anurag Verma</author></item><item><title>Cloudflare Acquires Astro: What It Means for Developers and the Web Framework Ecosystem</title><link>https://blog.codercops.com/blog/cloudflare-acquires-astro-framework-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/cloudflare-acquires-astro-framework-2026/</guid><description>Cloudflare has acquired The Astro Technology Company, bringing the popular open-source web framework under its umbrella. We analyze the acquisition, its impact on Astro developers, and Cloudflare&apos;s broader web platform strategy.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Cloudflare</category><category>Astro</category><category>Web Development</category><category>Acquisition</category><category>Edge Computing</category><category>2026</category><author>Anurag Verma</author></item><item><title>Cursor vs Windsurf vs GitHub Copilot: The Definitive AI IDE Comparison for 2026</title><link>https://blog.codercops.com/blog/cursor-vs-windsurf-vs-copilot-agentic-ide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/cursor-vs-windsurf-vs-copilot-agentic-ide-2026/</guid><description>A comprehensive head-to-head comparison of Cursor, Windsurf (Codeium), and GitHub Copilot Workspace in 2026. We compare agentic capabilities, pricing, codebase understanding, and real-world performance.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Cursor</category><category>Windsurf</category><category>Copilot</category><category>AI IDE</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>Dark Mode Implementation — A Complete Developer&apos;s Guide for 2026</title><link>https://blog.codercops.com/blog/dark-mode-implementation-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/dark-mode-implementation-guide-2026/</guid><description>Dark mode is expected by users, but implementing it correctly involves more than swapping colors. Here&apos;s how to build a robust, accessible dark mode that users will love.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Design</category><category>Dark Mode</category><category>CSS</category><category>UI</category><category>Design</category><category>2026</category><author>Anurag Verma</author></item><item><title>Database Trends 2026 — Postgres Everywhere, SQLite Renaissance, and Vector Databases for AI</title><link>https://blog.codercops.com/blog/database-trends-postgres-sqlite-vector-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/database-trends-postgres-sqlite-vector-2026/</guid><description>The database landscape is consolidating around Postgres while SQLite finds new life at the edge. Meanwhile, vector databases have become essential infrastructure for AI applications.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Database</category><category>PostgreSQL</category><category>SQLite</category><category>Vector Database</category><category>AI</category><category>2026</category><author>Anurag Verma</author></item><item><title>Design Systems in 2026 — Component Libraries, Tokens, and What Actually Works</title><link>https://blog.codercops.com/blog/design-systems-2026-component-libraries/</link><guid isPermaLink="true">https://blog.codercops.com/blog/design-systems-2026-component-libraries/</guid><description>Design systems have matured from experimental to essential. Here&apos;s how to build, maintain, and scale a design system that actually gets used.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Design</category><category>Design Systems</category><category>UI</category><category>Components</category><category>Design</category><category>2026</category><author>Anurag Verma</author></item><item><title>Developer Career Paths in 2026 — IC, Management, and Everything In Between</title><link>https://blog.codercops.com/blog/developer-career-paths-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/developer-career-paths-2026/</guid><description>The traditional developer career ladder is fragmenting. IC tracks, management, staff-plus roles, and hybrid paths offer different ways to grow. Here&apos;s how to navigate them.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Career</category><category>Career</category><category>Developer</category><category>Engineering Management</category><category>Leadership</category><category>2026</category><author>Anurag Verma</author></item><item><title>Developer Productivity Metrics — Understanding DORA, SPACE, and What Actually Matters in 2026</title><link>https://blog.codercops.com/blog/developer-productivity-metrics-dora-space-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/developer-productivity-metrics-dora-space-2026/</guid><description>Measuring developer productivity is notoriously difficult. DORA and SPACE frameworks offer research-backed approaches, but implementation is where most teams fail.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Business</category><category>Developer Experience</category><category>Productivity</category><category>DORA</category><category>SPACE</category><category>Engineering</category><category>2026</category><author>Anurag Verma</author></item><item><title>Edge Functions vs Traditional Serverless — When to Use Which in 2026</title><link>https://blog.codercops.com/blog/edge-functions-vs-serverless-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/edge-functions-vs-serverless-2026/</guid><description>Cloudflare Workers, Vercel Edge Functions, and Deno Deploy compete with AWS Lambda and traditional serverless. Here&apos;s how to choose the right compute model for your workload.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Edge Computing</category><category>Serverless</category><category>Cloudflare</category><category>Vercel</category><category>AWS Lambda</category><category>2026</category><author>Anurag Verma</author></item><item><title>Freelancing vs Agency vs Full-Time — Choosing Your Developer Career Path in 2026</title><link>https://blog.codercops.com/blog/freelancing-vs-agency-vs-fulltime-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/freelancing-vs-agency-vs-fulltime-2026/</guid><description>The developer employment landscape offers more options than ever. Here&apos;s an honest comparison of freelancing, agency work, and full-time employment to help you decide.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Career</category><category>Career</category><category>Freelancing</category><category>Agency</category><category>Employment</category><category>2026</category><author>Anurag Verma</author></item><item><title>Gemini Hits 750 Million Users — Google&apos;s AI App Is Now a Platform</title><link>https://blog.codercops.com/blog/gemini-750-million-users-apple-deal-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/gemini-750-million-users-apple-deal-2026/</guid><description>Google&apos;s Gemini app has crossed 750 million monthly active users, approaching ChatGPT scale. Combined with the Apple Siri deal, Google is positioning Gemini as the default AI layer for billions of devices.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Google</category><category>Gemini</category><category>AI</category><category>Apple</category><category>ChatGPT</category><category>2026</category><author>Anurag Verma</author></item><item><title>Microsoft Creates &apos;Quality Czar&apos; Role — Satya Nadella Says AI Makes Reliability Failures Too Costly</title><link>https://blog.codercops.com/blog/microsoft-quality-chief-charlie-bell-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/microsoft-quality-chief-charlie-bell-2026/</guid><description>Microsoft CEO Satya Nadella appointed Charlie Bell as the company&apos;s first engineering quality chief, citing the rising cost of reliability failures as AI becomes embedded in critical workflows.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Microsoft</category><category>AI</category><category>Quality</category><category>Engineering</category><category>Leadership</category><category>2026</category><author>Anurag Verma</author></item><item><title>Mobile-First Design in 2026 — Beyond Responsive, Toward Adaptive Experiences</title><link>https://blog.codercops.com/blog/mobile-first-responsive-design-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/mobile-first-responsive-design-2026/</guid><description>Mobile-first design has evolved. It&apos;s no longer just about responsive layouts — it&apos;s about designing experiences that adapt to device capabilities, context, and user preferences.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Design</category><category>Mobile</category><category>Responsive Design</category><category>CSS</category><category>UX</category><category>2026</category><author>Anurag Verma</author></item><item><title>Monorepo Tooling in 2026 — Turborepo vs Nx vs pnpm Workspaces</title><link>https://blog.codercops.com/blog/monorepo-tooling-turborepo-nx-pnpm-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/monorepo-tooling-turborepo-nx-pnpm-2026/</guid><description>Monorepos are mainstream, but choosing between Turborepo, Nx, and pnpm workspaces is confusing. Here&apos;s a practical guide to picking the right tool for your team.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Monorepo</category><category>Turborepo</category><category>Nx</category><category>pnpm</category><category>DevOps</category><category>2026</category><author>Anurag Verma</author></item><item><title>The AI Agent Authorization Gap — Why Your CFO&apos;s Bot Might Be Leaking Data to Junior Staff</title><link>https://blog.codercops.com/blog/okta-ai-agent-authorization-gap-security-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/okta-ai-agent-authorization-gap-security-2026/</guid><description>Okta warns of a critical &apos;authorization gap&apos; where AI agents retrieve data with elevated permissions but post to shared spaces where anyone can see. Four major vendors already hit with CVSS 9.3+ vulnerabilities.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>AI</category><category>Security</category><category>Okta</category><category>Enterprise</category><category>Authorization</category><category>2026</category><author>Anurag Verma</author></item><item><title>Open Source Sustainability — The Funding Crisis and Path Forward in 2026</title><link>https://blog.codercops.com/blog/open-source-sustainability-funding-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/open-source-sustainability-funding-2026/</guid><description>Open source powers the modern internet, but maintainer burnout and funding challenges threaten its future. Here&apos;s the state of open source sustainability and emerging solutions.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Business</category><category>Open Source</category><category>Sustainability</category><category>Funding</category><category>Developer Community</category><category>2026</category><author>Anurag Verma</author></item><item><title>Remote Hiring Best Practices — Building Effective Global Engineering Teams in 2026</title><link>https://blog.codercops.com/blog/remote-hiring-global-teams-best-practices-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/remote-hiring-global-teams-best-practices-2026/</guid><description>Remote work is permanent. Here&apos;s how to hire, onboard, and manage distributed engineering teams across time zones, cultures, and employment structures.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Business</category><category>Remote Work</category><category>Hiring</category><category>Management</category><category>Teams</category><category>2026</category><author>Anurag Verma</author></item><item><title>Remix 3 Moves Beyond React: The Post-React Era Begins</title><link>https://blog.codercops.com/blog/remix-3-ditches-react-post-react-era-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/remix-3-ditches-react-post-react-era-2026/</guid><description>Remix 3 drops React for a Preact fork and web-standards-first architecture. Here&apos;s why this matters, what it means for React developers, and whether the post-React era is truly upon us.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Remix</category><category>React</category><category>Web Development</category><category>Frameworks</category><category>JavaScript</category><category>2026</category><author>Anurag Verma</author></item><item><title>Startup Tech Stack Decisions — What to Choose in 2026 and Why</title><link>https://blog.codercops.com/blog/startup-tech-stack-decisions-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/startup-tech-stack-decisions-2026/</guid><description>Choosing a tech stack is one of the earliest and most consequential decisions for a startup. Here&apos;s a practical guide to making choices you won&apos;t regret.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Business</category><category>Startup</category><category>Tech Stack</category><category>Architecture</category><category>Decision Making</category><category>2026</category><author>Anurag Verma</author></item><item><title>Tech Interview Trends in 2026 — What&apos;s Changed and How to Prepare</title><link>https://blog.codercops.com/blog/tech-interview-trends-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/tech-interview-trends-2026/</guid><description>Tech interviews are evolving. Take-home projects, AI-assisted coding, and system design are reshaping how companies evaluate developers. Here&apos;s what to expect.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Career</category><category>Interviews</category><category>Career</category><category>Hiring</category><category>Tech Industry</category><category>2026</category><author>Anurag Verma</author></item><item><title>Technical Debt Management — Practical Strategies for Engineering Teams in 2026</title><link>https://blog.codercops.com/blog/technical-debt-management-strategies-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/technical-debt-management-strategies-2026/</guid><description>Every codebase has technical debt. The question is whether you manage it intentionally or let it manage you. Here&apos;s how to identify, prioritize, and pay down debt systematically.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Technical Debt</category><category>Engineering</category><category>Code Quality</category><category>Management</category><category>2026</category><author>Anurag Verma</author></item><item><title>WebAssembly in 2026 — WASM Has Escaped the Browser and It&apos;s Everywhere</title><link>https://blog.codercops.com/blog/webassembly-wasm-2026-beyond-browser/</link><guid isPermaLink="true">https://blog.codercops.com/blog/webassembly-wasm-2026-beyond-browser/</guid><description>WebAssembly is no longer just a browser technology. Server-side WASM, the component model, and WASI are reshaping how we build and deploy software across cloud, edge, and embedded systems.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>WebAssembly</category><category>WASM</category><category>Backend</category><category>Edge Computing</category><category>2026</category><author>Anurag Verma</author></item><item><title>Anthropic&apos;s Super Bowl Gambit — Claude Will Never Show You Ads</title><link>https://blog.codercops.com/blog/anthropic-ad-free-pledge-super-bowl-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/anthropic-ad-free-pledge-super-bowl-2026/</guid><description>Anthropic spent millions on Super Bowl commercials pledging Claude will remain ad-free forever, taking direct aim at OpenAI&apos;s ad-supported ChatGPT model. A business model war is brewing.</description><pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Anthropic</category><category>Claude</category><category>OpenAI</category><category>Advertising</category><category>Business</category><category>2026</category><author>Anurag Verma</author></item><item><title>Apple&apos;s Siri Is Getting Google Gemini — The Unlikely Partnership That Changes Everything</title><link>https://blog.codercops.com/blog/apple-siri-google-gemini-partnership-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/apple-siri-google-gemini-partnership-2026/</guid><description>Apple and Google announced a multi-year deal to power next-gen Siri with Gemini AI. iOS 26.4 beta in February brings conversational Siri, with full release in March. The AI assistant wars just got complicated.</description><pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Apple</category><category>Google</category><category>Siri</category><category>Gemini</category><category>AI</category><category>iOS</category><category>2026</category><author>Anurag Verma</author></item><item><title>Apple Acquires Q.ai for $2 Billion — Betting Big on AI Audio</title><link>https://blog.codercops.com/blog/apple-qai-acquisition-ai-audio-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/apple-qai-acquisition-ai-audio-2026/</guid><description>Apple confirmed its acquisition of Israeli AI audio startup Q.ai for nearly $2 billion. The deal brings advanced audio AI technology that could transform Siri, AirPods, and Apple&apos;s entire audio ecosystem.</description><pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Apple</category><category>AI</category><category>Audio</category><category>Acquisition</category><category>Q.ai</category><category>2026</category><author>Anurag Verma</author></item><item><title>Astro 6 Beta: First-Class Edge Computing with Cloudflare Workers Changes Everything</title><link>https://blog.codercops.com/blog/astro-6-beta-edge-computing-cloudflare-workers-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/astro-6-beta-edge-computing-cloudflare-workers-2026/</guid><description>Astro 6 Beta brings a redesigned dev server, first-class Cloudflare Workers support, live content collections, and major performance improvements. Here&apos;s what developers need to know about migrating from Astro 5.</description><pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Astro</category><category>Edge Computing</category><category>Cloudflare Workers</category><category>Web Development</category><category>2026</category><author>Anurag Verma</author></item><item><title>AT&amp;T Data Breach Resurfaces — 176 Million Records Including 148 Million Social Security Numbers</title><link>https://blog.codercops.com/blog/att-data-breach-176-million-records-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/att-data-breach-176-million-records-2026/</guid><description>A massive AT&amp;T dataset containing 176 million records has resurfaced on dark web forums. The breach includes 148 million Social Security numbers, names, addresses, and phone numbers spanning years of customer data.</description><pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>Cybersecurity</category><category>Data Breach</category><category>AT&amp;T</category><category>Privacy</category><category>2026</category><author>Anurag Verma</author></item><item><title>Claude Cowork Plugins Turn AI Into Domain Experts — Legal, Finance, Sales, Marketing</title><link>https://blog.codercops.com/blog/claude-cowork-enterprise-plugins-mcp-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/claude-cowork-enterprise-plugins-mcp-2026/</guid><description>Anthropic launches domain-specific plugins for Claude Cowork with MCP integrations for Slack, Figma, Salesforce, and more. AI agents now work like specialized teammates across business functions.</description><pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Claude</category><category>Anthropic</category><category>Enterprise</category><category>MCP</category><category>Automation</category><category>2026</category><author>Anurag Verma</author></item><item><title>Claude Sonnet 5 &apos;Fennec&apos; Is Here — 82.1% SWE-Bench Sets New Coding Benchmark</title><link>https://blog.codercops.com/blog/claude-sonnet-5-fennec-release-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/claude-sonnet-5-fennec-release-2026/</guid><description>Anthropic releases Claude Sonnet 5 codenamed Fennec with 82.1% SWE-Bench score, surpassing Opus 4.5. Optimized for Google&apos;s Antigravity TPU with 1M token context at $3/M input tokens.</description><pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Claude</category><category>Anthropic</category><category>Sonnet 5</category><category>Coding</category><category>2026</category><author>Anurag Verma</author></item><item><title>DeepSeek V4: Inside the 1-Trillion Parameter Open-Source Model Poised to Reshape AI</title><link>https://blog.codercops.com/blog/deepseek-v4-trillion-parameters-february-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/deepseek-v4-trillion-parameters-february-2026/</guid><description>DeepSeek&apos;s V4 model brings 1 trillion parameters, Engram conditional memory, and open-source weights under Apache 2.0. We break down the architecture, coding benchmarks, geopolitical implications, and what it means for developers.</description><pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>DeepSeek</category><category>Open Source</category><category>LLM</category><category>China</category><category>2026</category><author>Anurag Verma</author></item><item><title>How Goldman Sachs Deployed Claude AI Across 12,000 Employees: An Enterprise AI Case Study</title><link>https://blog.codercops.com/blog/goldman-sachs-claude-ai-enterprise-case-study-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/goldman-sachs-claude-ai-enterprise-case-study-2026/</guid><description>Goldman Sachs partnered with Anthropic to build autonomous AI agents for accounting and compliance. Here&apos;s how they did it, what they learned, and what other enterprises can take from this deployment.</description><pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Claude</category><category>Enterprise</category><category>Goldman Sachs</category><category>Case Study</category><category>2026</category><author>Anurag Verma</author></item><item><title>jQuery 4.0 Is Released -- And It Still Matters</title><link>https://blog.codercops.com/blog/jquery-4-release-still-matters-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/jquery-4-release-still-matters-2026/</guid><description>jQuery 4.0.0 dropped on January 17, 2026 -- the first major version in nearly a decade. Here&apos;s what&apos;s new, why jQuery still matters, and who should care about this release.</description><pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>jQuery</category><category>JavaScript</category><category>Web Development</category><category>Libraries</category><category>2026</category><author>Anurag Verma</author></item><item><title>Microsoft Unveils Maia 2 — Its Second-Gen AI Chip Takes Aim at NVIDIA&apos;s Developer Empire</title><link>https://blog.codercops.com/blog/microsoft-maia-ai-chip-nvidia-challenge-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/microsoft-maia-ai-chip-nvidia-challenge-2026/</guid><description>Microsoft announced its second-generation Maia AI chip with software tools designed to challenge NVIDIA&apos;s CUDA dominance. The chip powers Azure AI workloads and signals Microsoft&apos;s push for AI infrastructure independence.</description><pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Microsoft</category><category>AI</category><category>Chips</category><category>NVIDIA</category><category>Azure</category><category>2026</category><author>Anurag Verma</author></item><item><title>Moonshot AI&apos;s Kimi K2.5 — A Trillion-Parameter Open-Source Model From China Challenges US Labs</title><link>https://blog.codercops.com/blog/moonshot-kimi-k25-trillion-parameter-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/moonshot-kimi-k25-trillion-parameter-2026/</guid><description>Chinese startup Moonshot AI released Kimi K2.5, an open-source model with 1 trillion parameters approaching frontier performance. The model challenges the assumption that only US labs can build world-class AI.</description><pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Moonshot</category><category>Kimi</category><category>Open Source</category><category>China</category><category>2026</category><author>Anurag Verma</author></item><item><title>Skyryse Raises $300M for SkyOS — The First FAA-Certified AI Flight System</title><link>https://blog.codercops.com/blog/skyryse-aviation-os-faa-certification-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/skyryse-aviation-os-faa-certification-2026/</guid><description>Aviation startup Skyryse closed a $300M Series C at $1.15B valuation for SkyOS, an AI-powered flight system that makes any aircraft flyable by anyone. FAA certification underway for helicopters and fixed-wing.</description><pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Aviation</category><category>AI</category><category>Skyryse</category><category>Startups</category><category>Funding</category><category>2026</category><author>Anurag Verma</author></item><item><title>Anthropic&apos;s AI Legal Tool Triggers $285 Billion &apos;SaaSpocalypse&apos; — What Happened and What It Means</title><link>https://blog.codercops.com/blog/anthropic-legal-ai-saaspocalypse-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/anthropic-legal-ai-saaspocalypse-2026/</guid><description>Anthropic launched an AI legal plugin for Claude Cowork and software stocks crashed. Thomson Reuters dropped 6.5%, RELX fell 9.6%, and traders called it the &apos;SaaSpocalypse.&apos; Here&apos;s why one product announcement wiped out hundreds of billions in market value.</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Anthropic</category><category>SaaS</category><category>Legal Tech</category><category>Stock Market</category><category>2026</category><author>Anurag Verma</author></item><item><title>Deepfake Job Seekers Are Infiltrating Companies — And Most Hiring Processes Cannot Detect Them</title><link>https://blog.codercops.com/blog/deepfake-job-seekers-hiring-fraud-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/deepfake-job-seekers-hiring-fraud-2026/</guid><description>By 2028, 1 in 4 job candidates will be fake. North Korean operatives have infiltrated 300+ US companies using AI-generated personas. Deepfake job fraud is the hiring crisis nobody prepared for.</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Cybersecurity</category><category>Deepfake</category><category>Hiring</category><category>Remote Work</category><category>2026</category><author>Anurag Verma</author></item><item><title>Google&apos;s Project Genie Turns Text Into Playable Worlds — And Gaming Stocks Are Tumbling</title><link>https://blog.codercops.com/blog/google-project-genie-ai-playable-worlds-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/google-project-genie-ai-playable-worlds-2026/</guid><description>Google DeepMind launched Project Genie, an AI that generates interactive 3D worlds from text prompts in real time. Gaming publishers are rattled, and the technology points toward a future where world models replace game engines.</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Google</category><category>Gaming</category><category>World Models</category><category>DeepMind</category><category>2026</category><author>Anurag Verma</author></item><item><title>GPT-5.3 Codex vs Claude Opus 4.6: The AI Coding War of 2026, Compared</title><link>https://blog.codercops.com/blog/gpt-53-codex-vs-claude-opus-46-ai-coding-war-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/gpt-53-codex-vs-claude-opus-46-ai-coding-war-2026/</guid><description>OpenAI and Anthropic released their flagship coding models on the same day. We compare GPT-5.3 Codex and Claude Opus 4.6 across benchmarks, pricing, developer experience, and real-world coding tasks.</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>GPT-5</category><category>Claude</category><category>Coding</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>Microsoft Launches AI QuickStart Programme for Small Businesses: A Developer&apos;s Guide</title><link>https://blog.codercops.com/blog/microsoft-ai-quickstart-programme-smb-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/microsoft-ai-quickstart-programme-smb-guide-2026/</guid><description>Microsoft&apos;s new AI QuickStart Programme aims to help 1,000 SMBs deploy enterprise-ready AI solutions in under three months. Here&apos;s what&apos;s included and how developers can capitalize on the opportunity.</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Microsoft</category><category>AI</category><category>Small Business</category><category>Azure</category><category>Enterprise</category><category>2026</category><author>Anurag Verma</author></item><item><title>OpenAI Is Retiring GPT-4o on February 13 — The End of an Era for ChatGPT&apos;s Most Beloved Model</title><link>https://blog.codercops.com/blog/openai-retiring-gpt4o-models-gpt52-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/openai-retiring-gpt4o-models-gpt52-2026/</guid><description>OpenAI is retiring GPT-4o, GPT-4.1, GPT-4.1 mini, and o4-mini from ChatGPT on February 13, 2026. Only 0.1% of users still choose GPT-4o daily, but the model&apos;s retirement marks the end of the GPT-4 generation.</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>OpenAI</category><category>ChatGPT</category><category>GPT-4o</category><category>GPT-5</category><category>2026</category><author>Anurag Verma</author></item><item><title>SpaceX Acquires xAI in $1.25 Trillion Mega-Merger: Musk&apos;s Bet on AI in Orbit</title><link>https://blog.codercops.com/blog/spacex-xai-trillion-dollar-merger-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/spacex-xai-trillion-dollar-merger-2026/</guid><description>Elon Musk merged SpaceX and xAI in the largest corporate merger in history, valued at $1.25 trillion. The combined entity plans orbital data centers, a mid-2026 IPO, and a vertically integrated AI-space stack.</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>SpaceX</category><category>xAI</category><category>Elon Musk</category><category>Merger</category><category>2026</category><author>Anurag Verma</author></item><item><title>Vercel&apos;s $300M Series F at $9.3B Valuation: The V0 Bet and the Future of AI-Powered Development</title><link>https://blog.codercops.com/blog/vercel-300m-series-f-v0-ai-development-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/vercel-300m-series-f-v0-ai-development-2026/</guid><description>Vercel raised $300M at a $9.3B valuation to scale its AI Cloud platform and V0 development agent. We analyze what the funding means, how V0 is reshaping development workflows, and the competitive landscape.</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Vercel</category><category>Next.js</category><category>V0</category><category>AI</category><category>Funding</category><category>2026</category><author>Anurag Verma</author></item><item><title>Waymo Raises $16 Billion at $126 Billion Valuation — Robotaxis Are Going Global</title><link>https://blog.codercops.com/blog/waymo-16-billion-robotaxi-expansion-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/waymo-16-billion-robotaxi-expansion-2026/</guid><description>Alphabet&apos;s Waymo raised $16 billion in the largest autonomous driving funding round ever, more than doubling its valuation to $126 billion. The company plans expansion to 20+ cities including Tokyo and London.</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Waymo</category><category>Autonomous Driving</category><category>Robotaxi</category><category>Alphabet</category><category>2026</category><author>Anurag Verma</author></item><item><title>What Happens After Launch: Our 90-Day Post-Deployment Playbook</title><link>https://blog.codercops.com/blog/what-happens-after-launch-90-day-post-deployment-playbook-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/what-happens-after-launch-90-day-post-deployment-playbook-2026/</guid><description>Most agencies disappear after deployment. Here is our exact 90-day post-launch process — from day-one monitoring to month-three handoff — with the checklists, tools, and escalation paths we use for every project.</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Post-Launch</category><category>Deployment</category><category>Process</category><category>DevOps</category><category>Agency</category><category>2026</category><author>Anurag Verma</author></item><item><title>AI-Powered Web Development: Why the Best Agencies Are Going AI-First in 2026</title><link>https://blog.codercops.com/blog/ai-powered-web-development-agencies-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-powered-web-development-agencies-2026/</guid><description>The line between web development and AI development has dissolved. The best agencies now ship web apps with built-in intelligence — chatbots, predictive features, automated workflows. Here&apos;s what this shift means.</description><pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Web Development</category><category>LLM</category><category>Chatbots</category><category>Agency</category><category>2026</category><author>Anurag Verma</author></item><item><title>Apple Partners with Google to Integrate Gemini into Siri: What Developers Need to Know</title><link>https://blog.codercops.com/blog/apple-google-gemini-siri-ai-partnership-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/apple-google-gemini-siri-ai-partnership-2026/</guid><description>Apple and Google have announced a landmark partnership to power Siri with Gemini 2.5 Pro. Here&apos;s what this $1 billion deal means for iOS developers, API access, and the competitive AI landscape in 2026.</description><pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Apple</category><category>Google</category><category>Gemini</category><category>Siri</category><category>AI</category><category>2026</category><author>Anurag Verma</author></item><item><title>Best Web Development Agencies for Startups and Businesses in 2026</title><link>https://blog.codercops.com/blog/best-web-development-agencies-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/best-web-development-agencies-2026/</guid><description>A comprehensive, honest comparison of the top web development agencies in 2026. We break down specialties, tech stacks, pricing, and ideal client fit — so you can choose the right partner for your project.</description><pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Agencies</category><category>Startups</category><category>Business</category><category>Guide</category><category>2026</category><author>Anurag Verma</author></item><item><title>Claude Opus 4.6 Found 500+ Zero-Day Vulnerabilities: How AI Is Revolutionizing Security Research</title><link>https://blog.codercops.com/blog/claude-opus-46-zero-day-security-breakthrough-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/claude-opus-46-zero-day-security-breakthrough-2026/</guid><description>Anthropic&apos;s Claude Opus 4.6 discovered over 500 previously unknown high-severity vulnerabilities in open-source software. Here&apos;s what this means for cybersecurity, developers, and the future of AI-powered security research.</description><pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Claude</category><category>Anthropic</category><category>Cybersecurity</category><category>Zero-Day</category><category>2026</category><author>Anurag Verma</author></item><item><title>How to Choose a Web Development Agency in 2026: The Complete Decision Framework</title><link>https://blog.codercops.com/blog/how-to-choose-web-development-agency-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/how-to-choose-web-development-agency-2026/</guid><description>Hiring a web development agency? Here&apos;s the framework we wish every client used before contacting us. Covers evaluation criteria, red flags, questions to ask, and how to get the best results from your agency partnership.</description><pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Agency</category><category>Guide</category><category>Business</category><category>Hiring</category><category>2026</category><author>Anurag Verma</author></item><item><title>Managing 130+ Blog Posts with a Separate Content Repository</title><link>https://blog.codercops.com/blog/managing-130-blog-posts-separate-content-repo-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/managing-130-blog-posts-separate-content-repo-2026/</guid><description>How we split our agency website into two repos — one for code, one for content — and why this architecture scales better than a monolith. With our exact Git submodule setup, GitHub Actions validation, and content workflow.</description><pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Content Management</category><category>Git</category><category>Architecture</category><category>Engineering</category><category>Astro</category><category>2026</category><author>Anurag Verma</author></item><item><title>Building a Modern Web Application in 2026: The Technology Stack Decision Guide</title><link>https://blog.codercops.com/blog/modern-web-app-tech-stack-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/modern-web-app-tech-stack-guide-2026/</guid><description>Astro vs Next.js vs Remix. PostgreSQL vs MongoDB. Vercel vs AWS. Every technology choice in your web application has tradeoffs. Here&apos;s a practical guide to making the right decisions for your project.</description><pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Tech Stack</category><category>React</category><category>Next.js</category><category>Astro</category><category>Node.js</category><category>2026</category><author>Anurag Verma</author></item><item><title>React 19 Server Components Critical Vulnerability (CVE-2025-55182): What Every Developer Needs to Know</title><link>https://blog.codercops.com/blog/react-19-critical-security-vulnerability-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/react-19-critical-security-vulnerability-2026/</guid><description>A CVSS 10.0 remote code execution vulnerability in React Server Components has been actively exploited in the wild. Here&apos;s the full breakdown of React2Shell, the follow-up DoS CVE, patching guidance, and lessons for React developers.</description><pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>React</category><category>Security</category><category>CVE</category><category>Web Development</category><category>JavaScript</category><category>2026</category><author>Anurag Verma</author></item><item><title>Web Development Costs in 2026: What to Expect and How to Budget</title><link>https://blog.codercops.com/blog/web-development-costs-pricing-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/web-development-costs-pricing-guide-2026/</guid><description>From $800 landing pages to $500K enterprise platforms — here&apos;s the real breakdown of web development costs in 2026, with pricing by project type, region, and technology stack.</description><pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>Pricing</category><category>Budget</category><category>Business</category><category>Guide</category><category>2026</category><author>Anurag Verma</author></item><item><title>The Agentic IDE Wars: Cursor vs Windsurf vs Copilot vs Antigravity</title><link>https://blog.codercops.com/blog/agentic-ide-wars-cursor-windsurf-copilot-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/agentic-ide-wars-cursor-windsurf-copilot-2026/</guid><description>The era of autocomplete copilots is over. AI IDEs now manage entire repos, refactor architectures, and ship features from natural language. Here&apos;s how the four major players compare in 2026.</description><pubDate>Mon, 02 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>IDE</category><category>Cursor</category><category>Windsurf</category><category>GitHub Copilot</category><category>Development</category><category>2026</category><author>Anurag Verma</author></item><item><title>Google&apos;s Search Monopoly Is Cracking: The AI Search Wars of 2026</title><link>https://blog.codercops.com/blog/ai-search-wars-google-perplexity-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-search-wars-google-perplexity-2026/</guid><description>Google&apos;s share has dipped below 90% for the first time since 2015. Perplexity processes 1.5 billion queries monthly. 37% of consumers use AI chatbots instead of Google. The search revolution is here.</description><pubDate>Mon, 02 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Search</category><category>Google</category><category>Perplexity</category><category>ChatGPT</category><category>SEO</category><category>2026</category><author>Anurag Verma</author></item><item><title>MCP Won: How Anthropic&apos;s Protocol Became the Universal Standard for AI</title><link>https://blog.codercops.com/blog/model-context-protocol-mcp-standard-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/model-context-protocol-mcp-standard-2026/</guid><description>From internal experiment to Linux Foundation governance in 14 months. Model Context Protocol now has 97M+ monthly SDK downloads, support from every major AI company, and the first official extensions shipping. Here&apos;s the full MCP story.</description><pubDate>Mon, 02 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>MCP</category><category>Anthropic</category><category>Open Source</category><category>API</category><category>Development</category><category>2026</category><author>Anurag Verma</author></item><item><title>The Great RTO Showdown: Remote Work Is Winning the War It&apos;s Supposedly Losing</title><link>https://blog.codercops.com/blog/return-to-office-vs-remote-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/return-to-office-vs-remote-2026/</guid><description>30% of companies mandate 5-day RTO. 87% of candidates demand remote options. Office occupancy sits at 50%. The data tells a different story than the headlines. Here&apos;s what&apos;s actually happening in 2026.</description><pubDate>Mon, 02 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Remote Work</category><category>RTO</category><category>Corporate Culture</category><category>Tech Industry</category><category>2026</category><author>Anurag Verma</author></item><item><title>Vibe Coding Changed How We Build Software. Here&apos;s What Nobody Tells You.</title><link>https://blog.codercops.com/blog/vibe-coding-revolution-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/vibe-coding-revolution-2026/</guid><description>41% of global code is now AI-generated. Senior devs report 81% productivity gains. But 63% have spent more time debugging AI code than writing it themselves. The vibe coding revolution has a fine print.</description><pubDate>Mon, 02 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Vibe Coding</category><category>AI</category><category>Development</category><category>Productivity</category><category>Cursor</category><category>2026</category><author>Anurag Verma</author></item><item><title>AI-Discovered Drugs Are Entering Clinical Trials: 2026 Is Biotech&apos;s Proving Year</title><link>https://blog.codercops.com/blog/ai-drug-discovery-clinical-trials-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-drug-discovery-clinical-trials-2026/</guid><description>For the first time, multiple drug candidates discovered and optimized entirely by AI are reaching mid-to-late-stage clinical trials. Here&apos;s what&apos;s happening in AI-driven drug discovery and why 2026 could be a landmark year.</description><pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Drug Discovery</category><category>Biotech</category><category>Healthcare</category><category>Clinical Trials</category><category>2026</category><author>Anurag Verma</author></item><item><title>The Big Tech AI Arms Race: $300 Billion and Counting</title><link>https://blog.codercops.com/blog/big-tech-ai-arms-race-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/big-tech-ai-arms-race-2026/</guid><description>Meta plans $135B in AI spending, OpenAI eyes a historic IPO, Amazon bets $50B, and a stealth startup raises $480M at seed. The 2026 AI investment frenzy is rewriting the rules of tech competition.</description><pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Big Tech</category><category>Investment</category><category>OpenAI</category><category>Meta</category><category>Amazon</category><category>Startups</category><category>2026</category><author>Anurag Verma</author></item><item><title>From Clawdbot to Moltbot to OpenClaw: The Wildest Week in Open-Source AI</title><link>https://blog.codercops.com/blog/clawdbot-moltbot-openclaw-viral-saga-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/clawdbot-moltbot-openclaw-viral-saga-2026/</guid><description>A trademark dispute, crypto scammers, 100K GitHub stars, a social network for AI agents, and a security crisis — the Clawdbot saga has everything. Here&apos;s the full story of the viral AI assistant that broke the internet.</description><pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Open Source</category><category>Moltbot</category><category>Clawdbot</category><category>OpenClaw</category><category>AI Agents</category><category>Security</category><category>2026</category><author>Anurag Verma</author></item><item><title>The 2026 Layoff Wave: AI, Automation, and the Reshaping of Corporate America</title><link>https://blog.codercops.com/blog/corporate-layoffs-ai-automation-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/corporate-layoffs-ai-automation-2026/</guid><description>UPS cuts 30,000 jobs, Dow eliminates 4,500, Nike automates distribution, Home Depot mandates RTO. The corporate layoff wave of 2026 is driven by AI and automation — here&apos;s what&apos;s actually happening.</description><pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Automation</category><category>Layoffs</category><category>Corporate</category><category>Workforce</category><category>2026</category><author>Anurag Verma</author></item><item><title>Grok&apos;s Deepfake Scandal and the AI Ethics Crisis of 2026</title><link>https://blog.codercops.com/blog/grok-deepfake-ai-ethics-crisis-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/grok-deepfake-ai-ethics-crisis-2026/</guid><description>Grok&apos;s &apos;digital undressing&apos; controversy, viral political deepfakes, and the growing AI ethics crisis. What happened, why it matters, and what the tech industry needs to do about it.</description><pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Ethics</category><category>Deepfakes</category><category>Grok</category><category>Regulation</category><category>Privacy</category><category>2026</category><author>Anurag Verma</author></item><item><title>Our Discovery Call Process: The 7 Questions We Ask Every Client</title><link>https://blog.codercops.com/blog/our-discovery-call-process-7-questions-every-client-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/our-discovery-call-process-7-questions-every-client-2026/</guid><description>Before we write a single line of code, we run a structured discovery call. Here are the exact 7 questions we ask, why each one matters, and how the answers shape every project decision that follows.</description><pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Process</category><category>Discovery</category><category>Client Management</category><category>Agency</category><category>2026</category><author>Anurag Verma</author></item><item><title>Smart Glasses Finally Go Mainstream: CES 2026 Was the Tipping Point</title><link>https://blog.codercops.com/blog/smart-glasses-mainstream-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/smart-glasses-mainstream-2026/</guid><description>From ASUS gaming AR to RayNeo&apos;s phoneless glasses and Samsung&apos;s creaseless foldable, CES 2026 marked the moment wearable displays went from niche to inevitable. Here&apos;s the full landscape.</description><pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Smart Glasses</category><category>AR</category><category>CES 2026</category><category>Wearable Tech</category><category>Samsung</category><category>Hardware</category><category>2026</category><author>Anurag Verma</author></item><item><title>World Models: The AI Breakthrough That Could Change Everything</title><link>https://blog.codercops.com/blog/world-models-ai-next-frontier-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/world-models-ai-next-frontier-2026/</guid><description>Yann LeCun left Meta to build world models with a $5B valuation target. Google DeepMind launched real-time 3D world models. Here&apos;s why researchers believe this is AI&apos;s next major leap.</description><pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>World Models</category><category>LeCun</category><category>DeepMind</category><category>Robotics</category><category>Research</category><category>2026</category><author>Anurag Verma</author></item><item><title>Hiring a Tech Agency in India: Red Flags and Green Flags from an Insider</title><link>https://blog.codercops.com/blog/hiring-tech-agency-india-red-flags-green-flags-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/hiring-tech-agency-india-red-flags-green-flags-2026/</guid><description>India has 50,000+ IT service providers. Most are mediocre. Here&apos;s an honest insider&apos;s guide to identifying the great ones — from portfolio evaluation to contract negotiation, with specific warning signs.</description><pubDate>Sat, 31 Jan 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>India</category><category>Agency</category><category>Hiring Guide</category><category>Outsourcing</category><category>Business</category><category>2026</category><author>Anurag Verma</author></item><item><title>When AI Agents Go Rogue: The Security Crisis Nobody&apos;s Ready For</title><link>https://blog.codercops.com/blog/ai-agent-security-gone-rogue-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-agent-security-gone-rogue-2026/</guid><description>AI agents are being deployed everywhere, but their security surface is wildly underexplored. From tool poisoning to memory injection, here&apos;s the threat landscape developers must understand in 2026.</description><pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Security</category><category>Agentic AI</category><category>Cybersecurity</category><category>DevSecOps</category><category>2026</category><author>Anurag Verma</author></item><item><title>Getting Claude-Pilled: Why Claude Code Is Going Viral and What It Actually Does</title><link>https://blog.codercops.com/blog/claude-code-getting-claude-pilled-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/claude-code-getting-claude-pilled-2026/</guid><description>Claude Code by Anthropic went viral in January 2026. Developers and non-developers alike are getting Claude-pilled. Here is an honest breakdown of what it does, how it compares, and whether the hype holds up.</description><pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Claude Code</category><category>Anthropic</category><category>Developer Tools</category><category>CLI</category><category>Coding Assistants</category><category>Cursor</category><category>GitHub Copilot</category><category>2026</category><author>Anurag Verma</author></item><item><title>Cursor Just Built a Web Browser with 1 Million Lines of AI-Generated Code</title><link>https://blog.codercops.com/blog/cursor-autonomous-agents-million-lines-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/cursor-autonomous-agents-million-lines-2026/</guid><description>Cursor revealed how hundreds of concurrent AI agents built a full web browser from scratch. Planner/worker architecture, GPT-5.2 vs Opus 4.5 benchmarks, and what industrial-scale AI coding actually looks like in practice.</description><pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Cursor</category><category>Autonomous Agents</category><category>Developer Tools</category><category>GPT-5.2</category><category>AI Coding</category><category>2026</category><author>Anurag Verma</author></item><item><title>DeepSeek and Qwen Just Captured 15% of the Global AI Market</title><link>https://blog.codercops.com/blog/deepseek-qwen-open-source-ai-surge-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/deepseek-qwen-open-source-ai-surge-2026/</guid><description>DeepSeek and Alibaba&apos;s Qwen surged from 1% to 15% global AI market share in a single year. With 700M+ Hugging Face downloads, open-source AI from China is reshaping enterprise choices, developer workflows, and the competitive landscape.</description><pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Open Source</category><category>DeepSeek</category><category>Qwen</category><category>LLM</category><category>Hugging Face</category><category>Machine Learning</category><category>Enterprise AI</category><author>Anurag Verma</author></item><item><title>Falcon-H1R: How a 7B Model Is Beating AI Models 7x Its Size</title><link>https://blog.codercops.com/blog/falcon-h1r-tiny-model-beating-giants-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/falcon-h1r-tiny-model-beating-giants-2026/</guid><description>TII&apos;s Falcon-H1R 7B scores 88.1% on AIME-24 math, outperforming 15B models. Built on a hybrid Transformer-Mamba architecture, it signals a new era for efficient AI. Here&apos;s what it means for developers.</description><pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Falcon-H1R</category><category>Mamba</category><category>Machine Learning</category><category>Open Source</category><category>Small Language Models</category><category>TII</category><category>2026</category><author>Anurag Verma</author></item><item><title>Why Indian Startups Are Choosing AI-First MVPs Over Traditional Web Apps</title><link>https://blog.codercops.com/blog/indian-startups-choosing-ai-first-mvps-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/indian-startups-choosing-ai-first-mvps-2026/</guid><description>The Indian startup ecosystem has shifted. Investors want AI-native products. Users expect intelligent features. Here&apos;s how the MVP playbook has changed in 2026 and what it means for founders.</description><pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Startup</category><category>MVP</category><category>AI</category><category>India</category><category>Product Development</category><category>2026</category><author>Anurag Verma</author></item><item><title>Meta Just Acquired Manus AI for $2-3 Billion — Here&apos;s Why That Changes Everything</title><link>https://blog.codercops.com/blog/meta-acquires-manus-ai-agent-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/meta-acquires-manus-ai-agent-2026/</guid><description>Meta is buying Singapore-based Manus AI to supercharge Meta AI and WhatsApp. This deal reshapes the agentic AI race between Meta, Google, OpenAI, and Microsoft. Here&apos;s what it means for developers.</description><pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Meta</category><category>Manus AI</category><category>Agentic AI</category><category>WhatsApp</category><category>Acquisitions</category><category>2026</category><author>Anurag Verma</author></item><item><title>MIT&apos;s 10 Breakthrough Technologies of 2026 — A Developer&apos;s Take</title><link>https://blog.codercops.com/blog/mit-10-breakthrough-technologies-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/mit-10-breakthrough-technologies-2026/</guid><description>MIT Technology Review dropped its annual list of breakthrough technologies for 2026. From AI coding tools to quantum leaps, here is what actually matters to developers and what is just noise.</description><pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>MIT</category><category>Breakthrough Technologies</category><category>AI</category><category>Quantum Computing</category><category>Robotics</category><category>Developer Tools</category><category>2026</category><author>Anurag Verma</author></item><item><title>Physical AI at CES 2026: When Robots Finally Left the Screen</title><link>https://blog.codercops.com/blog/physical-ai-ces-2026-robots-real-world/</link><guid isPermaLink="true">https://blog.codercops.com/blog/physical-ai-ces-2026-robots-real-world/</guid><description>CES 2026 made physical AI real. Atlas got human hands, LG&apos;s CLOiD folds laundry, Bosch built an agentic kitchen, and NVIDIA&apos;s Cosmos trains it all. Here is what developers should actually pay attention to.</description><pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>CES 2026</category><category>Physical AI</category><category>Robotics</category><category>NVIDIA Cosmos</category><category>Boston Dynamics</category><category>Edge AI</category><category>Solid-State Batteries</category><category>Developer Tools</category><author>Anurag Verma</author></item><item><title>Digital India 2026: The Government Tech Stack Opportunities Nobody&apos;s Talking About</title><link>https://blog.codercops.com/blog/digital-india-2026-govtech-opportunities-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/digital-india-2026-govtech-opportunities-2026/</guid><description>India&apos;s digital public infrastructure is the most ambitious in the world — UPI, Aadhaar, DigiLocker, ONDC. Here&apos;s where the next wave of GovTech opportunities lies for agencies and startups.</description><pubDate>Thu, 29 Jan 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Digital India</category><category>GovTech</category><category>UPI</category><category>Aadhaar</category><category>ONDC</category><category>Startup</category><category>2026</category><author>Anurag Verma</author></item><item><title>How to Set Up Clawdbot: The Complete Guide to Your Own Personal AI Assistant</title><link>https://blog.codercops.com/blog/clawdbot-setup-guide-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/clawdbot-setup-guide-2026/</guid><description>Clawdbot turns your messaging apps into a powerful AI assistant that remembers everything and takes real actions. Here&apos;s the complete setup guide for macOS, Linux, and Windows — from installation to daily use.</description><pubDate>Wed, 28 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Clawdbot</category><category>Open Source</category><category>AI Assistant</category><category>Automation</category><category>2026</category><author>Anurag Verma</author></item><item><title>RAG vs Fine-Tuning vs Prompt Engineering: Which AI Strategy Fits Your Product?</title><link>https://blog.codercops.com/blog/rag-vs-fine-tuning-vs-prompt-engineering-ai-strategy-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/rag-vs-fine-tuning-vs-prompt-engineering-ai-strategy-2026/</guid><description>Three approaches to customizing AI for your use case, with cost comparisons, performance benchmarks, implementation timelines, and a decision framework. The guide we wish existed when we started.</description><pubDate>Wed, 28 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>RAG</category><category>Fine-Tuning</category><category>Prompt Engineering</category><category>AI Strategy</category><category>LLM</category><category>2026</category><author>Anurag Verma</author></item><item><title>Agentic AI in 2026: Why Workflow Orchestration Is the Real Game Changer</title><link>https://blog.codercops.com/blog/agentic-ai-workflow-orchestration-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/agentic-ai-workflow-orchestration-2026/</guid><description>Forget simple chatbots. Agentic AI is rewriting how businesses operate by orchestrating entire workflows end-to-end. Here&apos;s what&apos;s actually happening, why it matters, and how to get started.</description><pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Agentic AI</category><category>Automation</category><category>Workflow</category><category>Enterprise</category><category>2026</category><author>Anurag Verma</author></item><item><title>AI Governance in 2026: Navigating the Patchwork of Laws, Risks, and Responsibilities</title><link>https://blog.codercops.com/blog/ai-governance-regulation-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-governance-regulation-2026/</guid><description>The AI regulatory landscape is fragmented, evolving, and confusing. Here&apos;s a practical guide to what you need to know about AI governance in 2026, whether you&apos;re building AI products or deploying them.</description><pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Regulation</category><category>Governance</category><category>Compliance</category><category>EU AI Act</category><category>2026</category><author>Anurag Verma</author></item><item><title>AI and the Labor Market in 2026: What&apos;s Actually Happening Beyond the Headlines</title><link>https://blog.codercops.com/blog/ai-labor-market-impact-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-labor-market-impact-2026/</guid><description>AI job fears jumped from 28% to 40% in two years. The IMF calls it a tsunami. But the full picture is more nuanced than the headlines suggest. Here&apos;s what the data actually shows.</description><pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Jobs</category><category>Labor Market</category><category>Future of Work</category><category>Economy</category><category>2026</category><author>Anurag Verma</author></item><item><title>AI Meets Stablecoins: How Agentic Commerce Is Quietly Reshaping Online Payments</title><link>https://blog.codercops.com/blog/ai-stablecoins-agentic-commerce-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-stablecoins-agentic-commerce-2026/</guid><description>The convergence of autonomous AI agents and stablecoin-powered payments is creating a new model for online commerce. Here&apos;s what agentic commerce is, why it matters, and where it&apos;s headed.</description><pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Stablecoins</category><category>Fintech</category><category>Commerce</category><category>Blockchain</category><category>2026</category><author>Anurag Verma</author></item><item><title>The Great Adaptation: Why 2026 Is the Make-or-Break Year for AI Upskilling</title><link>https://blog.codercops.com/blog/great-adaptation-ai-upskilling-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/great-adaptation-ai-upskilling-2026/</guid><description>Randstad calls it &apos;the great adaptation.&apos; 97% of investors penalize firms that don&apos;t upskill on AI. Here&apos;s what effective AI upskilling looks like and why most companies are getting it wrong.</description><pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Upskilling</category><category>Future of Work</category><category>Training</category><category>Leadership</category><category>2026</category><author>Anurag Verma</author></item><item><title>Multimodal AI in 2026: When Machines Learn to See, Hear, and Act Together</title><link>https://blog.codercops.com/blog/multimodal-ai-digital-workers-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/multimodal-ai-digital-workers-2026/</guid><description>Multimodal AI models that combine vision, language, and action are creating a new category of digital workers. Here&apos;s what&apos;s real, what&apos;s hype, and how developers can start building with them.</description><pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Multimodal</category><category>Computer Vision</category><category>NLP</category><category>Digital Workers</category><category>2026</category><author>Anurag Verma</author></item><item><title>The Rise of Smaller, Domain-Specific AI Models: Why Bigger Isn&apos;t Always Better</title><link>https://blog.codercops.com/blog/smaller-domain-specific-ai-models-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/smaller-domain-specific-ai-models-2026/</guid><description>The AI industry is shifting from massive general-purpose models to smaller, specialized ones that outperform giants in specific tasks. Here&apos;s why this matters and how to take advantage of it.</description><pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Open Source</category><category>Machine Learning</category><category>SLM</category><category>DeepSeek</category><category>2026</category><author>Anurag Verma</author></item><item><title>Voice-First AI Interfaces: Why 2026 Is the Year Conversational UX Goes Mainstream</title><link>https://blog.codercops.com/blog/voice-first-ai-interfaces-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/voice-first-ai-interfaces-2026/</guid><description>Voice AI accuracy hit 97% in 2026. Response latency dropped below 200ms. The technology is finally ready — but most teams are building voice interfaces wrong. Here&apos;s what actually works.</description><pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Voice AI</category><category>Conversational UX</category><category>AI</category><category>Interface Design</category><category>2026</category><author>Anurag Verma</author></item><item><title>The Rise of AI-Native Testing: How We QA Products Built with LLMs</title><link>https://blog.codercops.com/blog/ai-native-testing-qa-llm-products-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-native-testing-qa-llm-products-2026/</guid><description>Traditional test suites break when outputs are non-deterministic. Here&apos;s how we test AI-powered features — from LLM output validation to regression testing for prompt changes, with real frameworks and examples.</description><pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Testing</category><category>QA</category><category>AI</category><category>LLM</category><category>Development</category><category>2026</category><author>Anurag Verma</author></item><item><title>AI Chip Wars 2026: NVIDIA vs AMD vs Intel for Developers</title><link>https://blog.codercops.com/blog/ai-chip-comparison-nvidia-amd-intel-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-chip-comparison-nvidia-amd-intel-2026/</guid><description>A comprehensive comparison of AI chips from NVIDIA, AMD, and Intel in 2026. Understand Blackwell, Ryzen AI, and Panther Lake architectures, benchmarks, and which to choose for your ML workloads.</description><pubDate>Sat, 24 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>NVIDIA</category><category>AMD</category><category>Intel</category><category>AI Chips</category><category>GPU</category><category>NPU</category><category>Developer Hardware</category><author>Anurag Verma</author></item><item><title>Astro 5 for Agency Websites: Why We Moved Away from Next.js for Our Own Site</title><link>https://blog.codercops.com/blog/astro-5-agency-websites-why-we-ditched-nextjs-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/astro-5-agency-websites-why-we-ditched-nextjs-2026/</guid><description>We build client projects in Next.js daily. But for our own agency website, we chose Astro 5. Here&apos;s the performance data, developer experience comparison, and architectural reasoning behind that decision.</description><pubDate>Sat, 24 Jan 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Astro</category><category>Next.js</category><category>Web Development</category><category>Performance</category><category>Framework</category><category>2026</category><author>Anurag Verma</author></item><item><title>Building AI Agent Teams That Actually Work in Production</title><link>https://blog.codercops.com/blog/building-ai-agent-teams-production-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/building-ai-agent-teams-production-2026/</guid><description>Multi-agent systems sound great in demos but break in production. Here&apos;s how to architect, orchestrate, and monitor AI agent teams that reliably handle complex workflows — patterns from real deployments.</description><pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Agents</category><category>Multi-Agent</category><category>Architecture</category><category>Production</category><category>LLM</category><category>2026</category><author>Anurag Verma</author></item><item><title>MCP Servers in Practice: Building AI Tool Integrations That Actually Work</title><link>https://blog.codercops.com/blog/mcp-servers-practical-guide-ai-tool-integration-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/mcp-servers-practical-guide-ai-tool-integration-2026/</guid><description>Model Context Protocol is the new standard for connecting AI to external tools. Here&apos;s a practical guide to building, deploying, and debugging MCP servers — with real code examples from production.</description><pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>MCP</category><category>AI</category><category>Tool Integration</category><category>Claude</category><category>Development</category><category>2026</category><author>Anurag Verma</author></item><item><title>Physical AI &amp; Robotics Development: Getting Started in 2026</title><link>https://blog.codercops.com/blog/physical-ai-robotics-development-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/physical-ai-robotics-development-2026/</guid><description>A developer&apos;s introduction to Physical AI and robotics development in 2026. Learn about NVIDIA Cosmos, Isaac Sim, ROS 2 integration, and how to go from simulation to real-world deployment.</description><pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Physical AI</category><category>Robotics</category><category>NVIDIA Cosmos</category><category>ROS</category><category>Simulation</category><category>Isaac Sim</category><author>Anurag Verma</author></item><item><title>The True Cost of Building an MVP: India vs US vs Eastern Europe (2026 Data)</title><link>https://blog.codercops.com/blog/mvp-development-cost-india-vs-us-vs-eastern-europe-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/mvp-development-cost-india-vs-us-vs-eastern-europe-2026/</guid><description>Real pricing data for MVP development across 6 regions, with hourly rates, project costs, and quality comparisons. Plus a framework for choosing the right geography for your startup.</description><pubDate>Wed, 21 Jan 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>MVP</category><category>Startup</category><category>Pricing</category><category>India</category><category>Outsourcing</category><category>2026</category><author>Anurag Verma</author></item><item><title>AI Infrastructure in 2026: The Power Behind the Models</title><link>https://blog.codercops.com/blog/ai-infrastructure-data-centers-explained/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-infrastructure-data-centers-explained/</guid><description>Understanding the AI infrastructure landscape in 2026 - from xAI&apos;s massive data centers to the chip supply chain. Learn how infrastructure decisions affect API pricing, latency, and your development choices.</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Infrastructure</category><category>Data Centers</category><category>NVIDIA</category><category>xAI</category><category>OpenAI</category><category>Cloud Computing</category><author>Anurag Verma</author></item><item><title>How to Evaluate an AI Integration Partner: A CTO&apos;s Checklist for 2026</title><link>https://blog.codercops.com/blog/how-to-evaluate-ai-integration-partner-cto-checklist-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/how-to-evaluate-ai-integration-partner-cto-checklist-2026/</guid><description>Choosing the wrong AI partner wastes 6 months and $50K+. Here is the evaluation framework our CTO clients wish they had before their first engagement — 23 questions across technical depth, process, and culture.</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Integration</category><category>CTO</category><category>Evaluation</category><category>Checklist</category><category>Business</category><category>2026</category><author>Anurag Verma</author></item><item><title>Building AI-Powered Applications in 2026: A Practical Guide</title><link>https://blog.codercops.com/blog/building-ai-applications-2026-guide/</link><guid isPermaLink="true">https://blog.codercops.com/blog/building-ai-applications-2026-guide/</guid><description>A comprehensive guide to building production-ready AI applications in 2026. Compare GPT-4.5, Claude Opus 4.5, and Gemini 2.0, learn best practices for prompt engineering, and optimize costs.</description><pubDate>Sun, 18 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Development</category><category>OpenAI</category><category>Claude</category><category>LLMs</category><category>API Integration</category><category>2026</category><author>Anurag Verma</author></item><item><title>Landing Page That Converts: What $800 Gets You in 2026</title><link>https://blog.codercops.com/blog/landing-page-that-converts-what-800-dollars-gets-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/landing-page-that-converts-what-800-dollars-gets-2026/</guid><description>A detailed breakdown of what goes into a conversion-optimized landing page at different price points — from $800 starter pages to $2,500 premium builds. With real conversion benchmarks and examples.</description><pubDate>Sun, 18 Jan 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Landing Page</category><category>Web Development</category><category>Conversion</category><category>Pricing</category><category>Business</category><category>2026</category><author>Anurag Verma</author></item><item><title>AI Chatbot Development: Build vs Buy in 2026 (Complete Cost Breakdown)</title><link>https://blog.codercops.com/blog/ai-chatbot-build-vs-buy-cost-breakdown-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-chatbot-build-vs-buy-cost-breakdown-2026/</guid><description>Should you build a custom AI chatbot or use an off-the-shelf solution? We break down the real costs of Dialogflow, Rasa, custom OpenAI builds, and agency development — with monthly TCO projections.</description><pubDate>Sat, 17 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI Chatbot</category><category>Build vs Buy</category><category>Cost Analysis</category><category>Business</category><category>2026</category><author>Anurag Verma</author></item><item><title>The AI Infrastructure Era: Inside Tech&apos;s $3 Trillion Data Center Race</title><link>https://blog.codercops.com/blog/ai-infrastructure-era-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-infrastructure-era-2026/</guid><description>Meta Compute, OpenAI&apos;s 750MW deal, and a projected $3 trillion investment in AI infrastructure. The biggest story in tech isn&apos;t about models—it&apos;s about who controls the compute.</description><pubDate>Fri, 16 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Infrastructure</category><category>Data Centers</category><category>Cloud Computing</category><category>Meta</category><category>OpenAI</category><author>Anurag Verma</author></item><item><title>What 11 Client Projects Taught Us About Shipping AI Products</title><link>https://blog.codercops.com/blog/lessons-from-11-client-projects-shipping-ai-products-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/lessons-from-11-client-projects-shipping-ai-products-2026/</guid><description>Patterns, anti-patterns, and hard-won lessons from delivering AI-integrated products across healthcare, e-commerce, Web3, career tech, and data analytics. The stuff nobody blogs about.</description><pubDate>Fri, 16 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Product Development</category><category>Lessons Learned</category><category>Agency</category><category>2026</category><author>Anurag Verma</author></item><item><title>NVIDIA Vera Rubin and DLSS 4.5: What Developers and Gamers Need to Know</title><link>https://blog.codercops.com/blog/nvidia-vera-rubin-dlss-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/nvidia-vera-rubin-dlss-2026/</guid><description>NVIDIA announces Vera Rubin architecture in production and DLSS 4.5 with Transformer-based Super Resolution. Here&apos;s the complete breakdown of what&apos;s new and what it means for gaming and AI workloads.</description><pubDate>Fri, 16 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>NVIDIA</category><category>GPU</category><category>DLSS</category><category>Gaming</category><category>AI</category><category>Vera Rubin</category><category>RTX</category><author>Anurag Verma</author></item><item><title>Physical AI and Humanoid Robots: The Biggest Story from CES 2026</title><link>https://blog.codercops.com/blog/physical-ai-humanoid-robots-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/physical-ai-humanoid-robots-2026/</guid><description>NVIDIA&apos;s Cosmos, LG&apos;s household robot, and the rise of Physical AI dominated CES 2026. Here&apos;s what developers need to know about robots entering our homes and workplaces.</description><pubDate>Fri, 16 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Robotics</category><category>NVIDIA</category><category>CES 2026</category><category>Physical AI</category><category>Humanoid Robots</category><author>Anurag Verma</author></item><item><title>Repository Intelligence: How AI Coding Tools Are Evolving Beyond Autocomplete in 2026</title><link>https://blog.codercops.com/blog/repository-intelligence-ai-coding-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/repository-intelligence-ai-coding-2026/</guid><description>GitHub announces Repository Intelligence - AI that understands code relationships, history, and context. Learn how this evolution changes developer workflows and what it means for the future of AI-assisted programming.</description><pubDate>Fri, 16 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>GitHub</category><category>Developer Tools</category><category>Repository Intelligence</category><category>Coding Assistants</category><author>Anurag Verma</author></item><item><title>Why Small Language Models Are Winning in 2026: The Shift from GPT Giants to Efficient AI</title><link>https://blog.codercops.com/blog/small-language-models-slm-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/small-language-models-slm-2026/</guid><description>The AI industry is pivoting from massive models to efficient SLMs offering 10-30x reductions in latency and cost. Learn why smaller is better and how to leverage SLMs in your applications.</description><pubDate>Fri, 16 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>SLM</category><category>Machine Learning</category><category>Efficiency</category><category>Small Language Models</category><category>LLM</category><author>Anurag Verma</author></item><item><title>CES 2026: What Developers Need to Know</title><link>https://blog.codercops.com/blog/ces-2026-developer-highlights/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ces-2026-developer-highlights/</guid><description>The essential developer takeaways from CES 2026 - from NVIDIA&apos;s Cosmos platform to AMD&apos;s Ryzen AI processors and Intel&apos;s Panther Lake. Here&apos;s what matters for your next project.</description><pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>CES 2026</category><category>NVIDIA</category><category>AMD</category><category>Intel</category><category>AI Hardware</category><category>Developer Tools</category><author>Anurag Verma</author></item><item><title>Our Tech Stack in 2026: What We Use and Why We Chose It</title><link>https://blog.codercops.com/blog/our-tech-stack-2026-what-we-use-why/</link><guid isPermaLink="true">https://blog.codercops.com/blog/our-tech-stack-2026-what-we-use-why/</guid><description>Astro for the website, Vercel for deployment, Airtable as CRM, Satori for OG images, a separate content repo with GitHub Actions CI — here&apos;s every tool in our stack and the reasoning behind each choice.</description><pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Tech Stack</category><category>Astro</category><category>Vercel</category><category>Tooling</category><category>Infrastructure</category><category>2026</category><author>Anurag Verma</author></item><item><title>SOLID Principles: A Fun Guide That Actually Makes Sense</title><link>https://blog.codercops.com/blog/solid-principles-complete-guide/</link><guid isPermaLink="true">https://blog.codercops.com/blog/solid-principles-complete-guide/</guid><description>Learn the 5 SOLID principles of clean code through real-world analogies, humor, and simple examples. No PhD required - just common sense and a sense of humor.</description><pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>SOLID</category><category>Software Design</category><category>Clean Code</category><category>Best Practices</category><category>Architecture</category><author>Anurag Verma</author></item><item><title>CES 2026: AI, Robotics, and the Future of Technology</title><link>https://blog.codercops.com/blog/ces-2026-ai-robotics-future/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ces-2026-ai-robotics-future/</guid><description>A deep dive into the biggest announcements from CES 2026 - from NVIDIA&apos;s Rubin platform to humanoid robots entering our homes. Here&apos;s everything developers need to know.</description><pubDate>Fri, 09 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>CES</category><category>AI</category><category>Robotics</category><category>NVIDIA</category><category>Technology</category><author>Anurag Verma</author></item><item><title>8 Web Development Trends That Will Define 2026</title><link>https://blog.codercops.com/blog/web-development-trends-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/web-development-trends-2026/</guid><description>From AI-first development to meta-frameworks dominance, discover the key trends shaping web development in 2026 and how to stay ahead of the curve.</description><pubDate>Thu, 08 Jan 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Web Development</category><category>JavaScript</category><category>AI</category><category>Trends</category><category>Frontend</category><author>Anurag Verma</author></item><item><title>AI Coding Assistants in 2026: The Complete Developer&apos;s Guide</title><link>https://blog.codercops.com/blog/ai-coding-assistants-2026-guide/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-coding-assistants-2026-guide/</guid><description>GitHub Copilot vs Cursor vs Claude Code - which AI assistant actually saves you time? A practical comparison based on real-world testing and developer workflows.</description><pubDate>Wed, 07 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>GitHub Copilot</category><category>Claude</category><category>Cursor</category><category>Developer Tools</category><author>Anurag Verma</author></item><item><title>React 19: Everything You Need to Know</title><link>https://blog.codercops.com/blog/react-19-complete-guide/</link><guid isPermaLink="true">https://blog.codercops.com/blog/react-19-complete-guide/</guid><description>A comprehensive guide to React 19&apos;s new features including Server Components, Actions API, React Compiler, and the new hooks that are changing how we build React applications.</description><pubDate>Tue, 06 Jan 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>React</category><category>JavaScript</category><category>Frontend</category><category>Server Components</category><category>Web Development</category><author>Anurag Verma</author></item><item><title>TypeScript 5.8: What&apos;s New and Why It Matters</title><link>https://blog.codercops.com/blog/typescript-5-8-new-features/</link><guid isPermaLink="true">https://blog.codercops.com/blog/typescript-5-8-new-features/</guid><description>TypeScript 5.8 brings improved type checking, direct Node.js execution, and better JavaScript interoperability. Here&apos;s everything developers need to know.</description><pubDate>Mon, 05 Jan 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>TypeScript</category><category>JavaScript</category><category>Node.js</category><category>Programming</category><author>Anurag Verma</author></item><item><title>Next.js 15 &amp; 16: The Complete App Router Guide</title><link>https://blog.codercops.com/blog/nextjs-15-16-app-router-guide/</link><guid isPermaLink="true">https://blog.codercops.com/blog/nextjs-15-16-app-router-guide/</guid><description>Master Next.js App Router with this comprehensive guide covering Server Components, Partial Pre-rendering, typed routes, and the latest features in Next.js 15 and 16.</description><pubDate>Sun, 04 Jan 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Next.js</category><category>React</category><category>App Router</category><category>Full-Stack</category><category>Vercel</category><author>Anurag Verma</author></item><item><title>Quantum Computing in 2026: What Developers Need to Know</title><link>https://blog.codercops.com/blog/quantum-computing-2026-developers/</link><guid isPermaLink="true">https://blog.codercops.com/blog/quantum-computing-2026-developers/</guid><description>From IBM&apos;s quantum roadmap to Google&apos;s error correction breakthroughs, quantum computing is reaching an inflection point. Here&apos;s what it means for software developers.</description><pubDate>Sat, 03 Jan 2026 00:00:00 GMT</pubDate><category>AI Integration</category><category>Quantum Computing</category><category>IBM</category><category>Google</category><category>Future Tech</category><category>Innovation</category><author>Anurag Verma</author></item><item><title>Edge Computing in 2026: Cloudflare vs Vercel vs Netlify</title><link>https://blog.codercops.com/blog/edge-computing-cloudflare-vercel-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/edge-computing-cloudflare-vercel-2026/</guid><description>A deep dive into edge computing platforms, comparing Cloudflare Workers, Vercel Edge Functions, and Netlify Edge. Learn when to use each and how to optimize for the edge.</description><pubDate>Fri, 02 Jan 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Edge Computing</category><category>Cloudflare</category><category>Vercel</category><category>Serverless</category><category>Performance</category><author>Anurag Verma</author></item><item><title>The Rust Revolution: Why Big Tech is Betting on Rust in 2026</title><link>https://blog.codercops.com/blog/rust-programming-2026-revolution/</link><guid isPermaLink="true">https://blog.codercops.com/blog/rust-programming-2026-revolution/</guid><description>Microsoft, Google, and Amazon are migrating critical systems to Rust. Learn why Rust is becoming the default choice for systems programming and how to get started.</description><pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate><category>Web Development</category><category>Rust</category><category>Systems Programming</category><category>Memory Safety</category><category>Performance</category><category>Career</category><author>Anurag Verma</author></item><item><title>Cybersecurity for Developers: Essential Practices for 2026</title><link>https://blog.codercops.com/blog/cybersecurity-developers-2026/</link><guid isPermaLink="true">https://blog.codercops.com/blog/cybersecurity-developers-2026/</guid><description>From supply chain attacks to AI-powered threats, learn the essential security practices every developer must know in 2026 to build secure applications.</description><pubDate>Tue, 30 Dec 2025 00:00:00 GMT</pubDate><category>Web Development</category><category>Security</category><category>Cybersecurity</category><category>Best Practices</category><category>OWASP</category><category>DevSecOps</category><author>Anurag Verma</author></item><item><title>Getting Started with Design Systems</title><link>https://blog.codercops.com/blog/getting-started-with-design-systems/</link><guid isPermaLink="true">https://blog.codercops.com/blog/getting-started-with-design-systems/</guid><description>A practical guide to creating and implementing design systems that scale with your team and product.</description><pubDate>Mon, 15 Jan 2024 00:00:00 GMT</pubDate><category>Web Development</category><category>Design</category><category>UI/UX</category><category>Process</category><author>Anurag Verma</author></item><item><title>Setting Up Your Full-Stack Development Environment with Python, Django, and React</title><link>https://blog.codercops.com/blog/fullstack-development-environment-python-django-react/</link><guid isPermaLink="true">https://blog.codercops.com/blog/fullstack-development-environment-python-django-react/</guid><description>Step-by-step guide to configuring a complete full-stack development environment with Python, Django backend, and React frontend.</description><pubDate>Tue, 09 May 2023 00:00:00 GMT</pubDate><category>Web Development</category><category>Django</category><category>React</category><category>Python</category><category>Full-Stack</category><category>Web Development</category><category>Tutorial</category><author>Anurag Verma</author></item><item><title>Variables and Data Types in Python: A Beginner&apos;s Guide</title><link>https://blog.codercops.com/blog/python-variables-data-types-beginners-guide/</link><guid isPermaLink="true">https://blog.codercops.com/blog/python-variables-data-types-beginners-guide/</guid><description>Learn Python variables and data types — integers, floats, strings, booleans, lists, tuples, and dictionaries with clear examples.</description><pubDate>Sat, 25 Feb 2023 00:00:00 GMT</pubDate><category>Technology</category><category>Python</category><category>Variables</category><category>Data Types</category><category>Beginners</category><category>Programming</category><category>Tutorial</category><author>Anurag Verma</author></item><item><title>Overfitting and Underfitting in Machine Learning: Causes and Solutions</title><link>https://blog.codercops.com/blog/overfitting-underfitting-machine-learning-solutions/</link><guid isPermaLink="true">https://blog.codercops.com/blog/overfitting-underfitting-machine-learning-solutions/</guid><description>Understand overfitting and underfitting in ML models with practical solutions including cross-validation, regularization, early stopping, and data augmentation.</description><pubDate>Thu, 16 Feb 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Overfitting</category><category>Underfitting</category><category>Machine Learning</category><category>Regularization</category><category>Cross-Validation</category><category>Model Selection</category><author>Anurag Verma</author></item><item><title>Exploratory Data Analysis Using Scatter Plots and Line of Best Fit</title><link>https://blog.codercops.com/blog/exploratory-data-analysis-scatter-plots-boston-housing/</link><guid isPermaLink="true">https://blog.codercops.com/blog/exploratory-data-analysis-scatter-plots-boston-housing/</guid><description>Perform EDA on the Boston Housing dataset using scatter plots and regression lines to identify relationships between features and housing prices.</description><pubDate>Wed, 15 Feb 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>EDA</category><category>Scatter Plot</category><category>Data Visualization</category><category>Python</category><category>Boston Housing</category><category>Regression</category><author>Anurag Verma</author></item><item><title>Dimensionality Reduction: An Introduction to Methods and Applications</title><link>https://blog.codercops.com/blog/dimensionality-reduction-methods-applications-guide/</link><guid isPermaLink="true">https://blog.codercops.com/blog/dimensionality-reduction-methods-applications-guide/</guid><description>Explore dimensionality reduction techniques — PCA, LDA, t-SNE, and autoencoders — for improving model performance and data visualization.</description><pubDate>Tue, 14 Feb 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Dimensionality Reduction</category><category>PCA</category><category>t-SNE</category><category>Machine Learning</category><category>Data Science</category><category>LDA</category><author>Anurag Verma</author></item><item><title>Random Forest: Advantages for Greener and More Accurate Machine Learning</title><link>https://blog.codercops.com/blog/random-forest-advantages-greener-machine-learning/</link><guid isPermaLink="true">https://blog.codercops.com/blog/random-forest-advantages-greener-machine-learning/</guid><description>Discover the key advantages of Random Forest algorithms — high accuracy, resistance to overfitting, feature importance, and handling missing data.</description><pubDate>Mon, 13 Feb 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Random Forest</category><category>Machine Learning</category><category>Ensemble Methods</category><category>Classification</category><category>Data Science</category><author>Anurag Verma</author></item><item><title>GridSearchCV in Scikit-learn: A Comprehensive Guide to Hyperparameter Tuning</title><link>https://blog.codercops.com/blog/gridsearchcv-scikit-learn-hyperparameter-tuning-guide/</link><guid isPermaLink="true">https://blog.codercops.com/blog/gridsearchcv-scikit-learn-hyperparameter-tuning-guide/</guid><description>Master hyperparameter tuning with GridSearchCV using KNN, Random Forest, and SVM models with custom scoring functions.</description><pubDate>Fri, 10 Feb 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>GridSearchCV</category><category>Hyperparameter Tuning</category><category>Scikit-learn</category><category>Machine Learning</category><category>Python</category><category>Model Selection</category><author>Anurag Verma</author></item><item><title>Sentiment Analysis of Twitter Data Using Naive Bayes Algorithm</title><link>https://blog.codercops.com/blog/sentiment-analysis-twitter-data-naive-bayes/</link><guid isPermaLink="true">https://blog.codercops.com/blog/sentiment-analysis-twitter-data-naive-bayes/</guid><description>Build a sentiment analysis pipeline with text preprocessing, TF-IDF vectorization, and Multinomial Naive Bayes classification on Twitter data.</description><pubDate>Wed, 08 Feb 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>NLP</category><category>Sentiment Analysis</category><category>Naive Bayes</category><category>Python</category><category>Machine Learning</category><category>Text Classification</category><author>Anurag Verma</author></item><item><title>Centroid-Based Clustering: A Powerful Machine Learning Technique</title><link>https://blog.codercops.com/blog/centroid-based-clustering-machine-learning-technique/</link><guid isPermaLink="true">https://blog.codercops.com/blog/centroid-based-clustering-machine-learning-technique/</guid><description>Learn how centroid-based clustering algorithms like K-means partition datasets into meaningful groups based on distance metrics.</description><pubDate>Tue, 07 Feb 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Clustering</category><category>K-Means</category><category>Machine Learning</category><category>Unsupervised Learning</category><category>Data Science</category><author>Anurag Verma</author></item><item><title>Clustering Algorithms: Understanding Types, Applications, and When to Use Them</title><link>https://blog.codercops.com/blog/clustering-algorithms-types-applications-guide/</link><guid isPermaLink="true">https://blog.codercops.com/blog/clustering-algorithms-types-applications-guide/</guid><description>A guide to clustering algorithm types — partition-based, hierarchical, density-based, and model-based — with use cases and selection criteria.</description><pubDate>Mon, 06 Feb 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Clustering</category><category>Machine Learning</category><category>K-Means</category><category>DBSCAN</category><category>Hierarchical Clustering</category><category>Data Science</category><author>Anurag Verma</author></item><item><title>Time Series Prediction: Methods, Models, and Applications</title><link>https://blog.codercops.com/blog/time-series-prediction-methods-arima-guide/</link><guid isPermaLink="true">https://blog.codercops.com/blog/time-series-prediction-methods-arima-guide/</guid><description>Explore time series forecasting methods including ARIMA, exponential smoothing, and seasonal decomposition for real-world prediction tasks.</description><pubDate>Sun, 05 Feb 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Time Series</category><category>ARIMA</category><category>Forecasting</category><category>Data Science</category><category>Python</category><category>Statistics</category><author>Anurag Verma</author></item><item><title>Decision Trees: Advantages, Disadvantages, and Applications</title><link>https://blog.codercops.com/blog/decision-trees-advantages-disadvantages-applications/</link><guid isPermaLink="true">https://blog.codercops.com/blog/decision-trees-advantages-disadvantages-applications/</guid><description>Understand decision tree algorithms for classification and regression, their pros and cons, and build an Iris classifier with Python code.</description><pubDate>Sat, 04 Feb 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Decision Trees</category><category>Classification</category><category>Machine Learning</category><category>Python</category><category>Scikit-learn</category><category>Algorithms</category><author>Anurag Verma</author></item><item><title>Support Vector Machines (SVM): Theory and Hands-On Classification</title><link>https://blog.codercops.com/blog/support-vector-machines-svm-classification-python/</link><guid isPermaLink="true">https://blog.codercops.com/blog/support-vector-machines-svm-classification-python/</guid><description>Learn SVM theory including hyperplanes and the kernel trick, then build a classifier on the breast cancer dataset using scikit-learn.</description><pubDate>Fri, 03 Feb 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>SVM</category><category>Classification</category><category>Machine Learning</category><category>Python</category><category>Scikit-learn</category><category>Kernel Methods</category><author>Anurag Verma</author></item><item><title>Predicting Diabetes Outcomes with Logistic Regression: A Hands-On Guide</title><link>https://blog.codercops.com/blog/predicting-diabetes-logistic-regression-hands-on/</link><guid isPermaLink="true">https://blog.codercops.com/blog/predicting-diabetes-logistic-regression-hands-on/</guid><description>Build a logistic regression model to predict diabetes outcomes using the Pima Indians dataset, covering sigmoid functions, feature scaling, and evaluation.</description><pubDate>Thu, 02 Feb 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Logistic Regression</category><category>Classification</category><category>Python</category><category>Healthcare</category><category>Machine Learning</category><category>Scikit-learn</category><author>Anurag Verma</author></item><item><title>KNN Classification: A Hands-On Guide with Python and Scikit-learn</title><link>https://blog.codercops.com/blog/knn-classification-hands-on-python-scikit-learn/</link><guid isPermaLink="true">https://blog.codercops.com/blog/knn-classification-hands-on-python-scikit-learn/</guid><description>Implement K-Nearest Neighbors classification using scikit-learn with data visualization, model training, and performance evaluation on real datasets.</description><pubDate>Wed, 01 Feb 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>KNN</category><category>Classification</category><category>Python</category><category>Scikit-learn</category><category>Machine Learning</category><category>Tutorial</category><author>Anurag Verma</author></item><item><title>The K-Nearest Neighbors Algorithm for Regression and Classification</title><link>https://blog.codercops.com/blog/k-nearest-neighbors-algorithm-regression-classification/</link><guid isPermaLink="true">https://blog.codercops.com/blog/k-nearest-neighbors-algorithm-regression-classification/</guid><description>Understand the KNN algorithm — how it works, distance metrics, choosing K, and its applications in both classification and regression tasks.</description><pubDate>Tue, 31 Jan 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>KNN</category><category>Machine Learning</category><category>Classification</category><category>Regression</category><category>Algorithms</category><category>Python</category><author>Anurag Verma</author></item><item><title>Uncovering the Best Email Spam Classifier: A Comparative Study of ML Algorithms</title><link>https://blog.codercops.com/blog/email-spam-classifier-comparative-study-ml-algorithms/</link><guid isPermaLink="true">https://blog.codercops.com/blog/email-spam-classifier-comparative-study-ml-algorithms/</guid><description>Compare Naive Bayes, SVM, Decision Tree, and Random Forest for email spam detection with a complete Python pipeline from data loading to evaluation.</description><pubDate>Mon, 30 Jan 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Spam Detection</category><category>NLP</category><category>Machine Learning</category><category>Python</category><category>Scikit-learn</category><category>Classification</category><author>Anurag Verma</author></item><item><title>10 Techniques for Improving Machine Learning Models</title><link>https://blog.codercops.com/blog/10-techniques-improving-machine-learning-models/</link><guid isPermaLink="true">https://blog.codercops.com/blog/10-techniques-improving-machine-learning-models/</guid><description>Learn Occam&apos;s Razor, regularization, pruning, ensemble methods, cross-validation, Bayesian model selection, genetic algorithms, and more to boost ML performance.</description><pubDate>Sat, 28 Jan 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Machine Learning</category><category>Model Optimization</category><category>Regularization</category><category>Ensemble Methods</category><category>Cross-Validation</category><author>Anurag Verma</author></item><item><title>Evaluation Metrics for Classification and Regression: A Comprehensive Guide</title><link>https://blog.codercops.com/blog/evaluation-metrics-classification-regression-guide/</link><guid isPermaLink="true">https://blog.codercops.com/blog/evaluation-metrics-classification-regression-guide/</guid><description>Master MAE, MSE, R², RMSE, accuracy, precision, recall, F1-score, AUC-ROC, and confusion matrices with formulas and Python code examples.</description><pubDate>Fri, 27 Jan 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Evaluation Metrics</category><category>Classification</category><category>Regression</category><category>Machine Learning</category><category>Python</category><category>Scikit-learn</category><author>Anurag Verma</author></item><item><title>Bias vs Variance: The Key to Successful Predictive Modeling</title><link>https://blog.codercops.com/blog/bias-vs-variance-predictive-modeling-tradeoff/</link><guid isPermaLink="true">https://blog.codercops.com/blog/bias-vs-variance-predictive-modeling-tradeoff/</guid><description>Understand the bias-variance tradeoff in machine learning with mathematical formulas, visual explanations, and strategies to find the right balance.</description><pubDate>Thu, 26 Jan 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Bias-Variance</category><category>Machine Learning</category><category>Overfitting</category><category>Statistics</category><category>Model Selection</category><author>Anurag Verma</author></item><item><title>Predicting Medical Costs Using Multivariate Linear Regression in Python</title><link>https://blog.codercops.com/blog/predicting-medical-costs-multivariate-linear-regression/</link><guid isPermaLink="true">https://blog.codercops.com/blog/predicting-medical-costs-multivariate-linear-regression/</guid><description>Build an insurance cost prediction model using multivariate linear regression with one-hot encoding, evaluation metrics, and residual analysis.</description><pubDate>Wed, 25 Jan 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Linear Regression</category><category>Python</category><category>Healthcare</category><category>Machine Learning</category><category>Data Science</category><category>Prediction</category><author>Anurag Verma</author></item><item><title>Transforming Categorical Data: A Practical Guide for Machine Learning</title><link>https://blog.codercops.com/blog/transforming-categorical-data-encoding-machine-learning/</link><guid isPermaLink="true">https://blog.codercops.com/blog/transforming-categorical-data-encoding-machine-learning/</guid><description>Master 7 encoding techniques for categorical variables — one-hot, label, dummy, binning, count, frequency, and target encoding with Python examples.</description><pubDate>Tue, 24 Jan 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Feature Engineering</category><category>Categorical Data</category><category>Machine Learning</category><category>Python</category><category>Data Preprocessing</category><author>Anurag Verma</author></item><item><title>Linear Regression in Python: From Data to Model</title><link>https://blog.codercops.com/blog/linear-regression-python-data-to-model/</link><guid isPermaLink="true">https://blog.codercops.com/blog/linear-regression-python-data-to-model/</guid><description>Build a linear regression model from scratch using scikit-learn, with data visualization, feature selection, and model evaluation metrics.</description><pubDate>Mon, 23 Jan 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Linear Regression</category><category>Python</category><category>Scikit-learn</category><category>Machine Learning</category><category>Data Science</category><author>Anurag Verma</author></item><item><title>Reinforcement Learning: A Comprehensive Introduction</title><link>https://blog.codercops.com/blog/reinforcement-learning-introduction-q-learning-sarsa/</link><guid isPermaLink="true">https://blog.codercops.com/blog/reinforcement-learning-introduction-q-learning-sarsa/</guid><description>Explore reinforcement learning fundamentals — agents, environments, states, actions, Q-learning, SARSA, Actor-Critic, and deep RL approaches.</description><pubDate>Sun, 22 Jan 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Reinforcement Learning</category><category>Q-Learning</category><category>SARSA</category><category>Machine Learning</category><category>Deep RL</category><author>Anurag Verma</author></item><item><title>Unsupervised Learning: Techniques, Types, and Applications</title><link>https://blog.codercops.com/blog/unsupervised-learning-techniques-types-applications/</link><guid isPermaLink="true">https://blog.codercops.com/blog/unsupervised-learning-techniques-types-applications/</guid><description>Understand unsupervised learning methods including clustering, dimensionality reduction, anomaly detection, and generative models with practical examples.</description><pubDate>Sat, 21 Jan 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Unsupervised Learning</category><category>Clustering</category><category>Machine Learning</category><category>PCA</category><category>Data Science</category><author>Anurag Verma</author></item><item><title>Calculus for Data Science: An Introduction with Python</title><link>https://blog.codercops.com/blog/calculus-data-science-introduction-python/</link><guid isPermaLink="true">https://blog.codercops.com/blog/calculus-data-science-introduction-python/</guid><description>Explore derivatives, integrals, multivariate calculus, optimization, and differential equations with Python implementations using SymPy and NumPy.</description><pubDate>Tue, 17 Jan 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Calculus</category><category>Mathematics</category><category>Data Science</category><category>Python</category><category>SymPy</category><category>Optimization</category><author>Anurag Verma</author></item><item><title>Statistics for Data Science with Practice in Python</title><link>https://blog.codercops.com/blog/statistics-data-science-practice-python/</link><guid isPermaLink="true">https://blog.codercops.com/blog/statistics-data-science-practice-python/</guid><description>Learn essential statistics concepts — mean, median, mode, variance, standard deviation, percentiles, quartiles, and z-scores with Python implementations.</description><pubDate>Sat, 14 Jan 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Statistics</category><category>Data Science</category><category>Python</category><category>NumPy</category><category>Mathematics</category><category>Probability</category><author>Anurag Verma</author></item><item><title>Linear Algebra for Data Science: Vectors, Matrices, and Operations with NumPy</title><link>https://blog.codercops.com/blog/linear-algebra-data-science-vectors-matrices-numpy/</link><guid isPermaLink="true">https://blog.codercops.com/blog/linear-algebra-data-science-vectors-matrices-numpy/</guid><description>Understand vectors, matrices, transpose, inverse, determinant, trace, dot product, and eigenvalues with NumPy implementations for data science.</description><pubDate>Fri, 13 Jan 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Linear Algebra</category><category>NumPy</category><category>Data Science</category><category>Mathematics</category><category>Python</category><category>Matrices</category><author>Anurag Verma</author></item><item><title>A Comprehensive Guide to Relational Database Management Systems and SQL</title><link>https://blog.codercops.com/blog/comprehensive-guide-rdbms-sql-python/</link><guid isPermaLink="true">https://blog.codercops.com/blog/comprehensive-guide-rdbms-sql-python/</guid><description>Master SQL from basics to advanced — SELECT, JOIN, GROUP BY, ORDER BY, indexes, date functions, and more using SQLite with Python.</description><pubDate>Thu, 12 Jan 2023 00:00:00 GMT</pubDate><category>Technology</category><category>SQL</category><category>Database</category><category>RDBMS</category><category>SQLite</category><category>Python</category><category>Tutorial</category><author>Anurag Verma</author></item><item><title>Data Visualization in Data Science: An Overview of Matplotlib and Seaborn</title><link>https://blog.codercops.com/blog/data-visualization-matplotlib-seaborn-overview/</link><guid isPermaLink="true">https://blog.codercops.com/blog/data-visualization-matplotlib-seaborn-overview/</guid><description>Learn to create compelling data visualizations using Matplotlib and Seaborn — line plots, scatter plots, bar charts, histograms, heatmaps, and more.</description><pubDate>Wed, 11 Jan 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Matplotlib</category><category>Seaborn</category><category>Data Visualization</category><category>Python</category><category>Data Science</category><category>Charts</category><author>Anurag Verma</author></item><item><title>Mastering Pandas: A Comprehensive Guide with Exercises</title><link>https://blog.codercops.com/blog/mastering-pandas-comprehensive-guide-exercises/</link><guid isPermaLink="true">https://blog.codercops.com/blog/mastering-pandas-comprehensive-guide-exercises/</guid><description>Master Pandas for data manipulation — reading data, selecting columns, grouping, merging DataFrames, handling missing values, and working with dates.</description><pubDate>Tue, 10 Jan 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Pandas</category><category>Python</category><category>Data Science</category><category>Data Analysis</category><category>Tutorial</category><category>DataFrame</category><author>Anurag Verma</author></item><item><title>NumPy 101: A Beginner&apos;s Guide to Data Science with Python</title><link>https://blog.codercops.com/blog/numpy-101-beginners-guide-data-science-python/</link><guid isPermaLink="true">https://blog.codercops.com/blog/numpy-101-beginners-guide-data-science-python/</guid><description>Learn NumPy essentials — arrays, shapes, reshaping, slicing, stacking, broadcasting, universal functions, and image processing with practical examples.</description><pubDate>Mon, 09 Jan 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>NumPy</category><category>Python</category><category>Data Science</category><category>Arrays</category><category>Tutorial</category><category>Beginners</category><author>Anurag Verma</author></item><item><title>Take Your Python Skills to the Next Level with Built-in Data Structures</title><link>https://blog.codercops.com/blog/python-built-in-data-structures-comprehensive-guide/</link><guid isPermaLink="true">https://blog.codercops.com/blog/python-built-in-data-structures-comprehensive-guide/</guid><description>A deep dive into Python lists, tuples, sets, dictionaries, and functions with comprehensive code examples and practical exercises.</description><pubDate>Sat, 07 Jan 2023 00:00:00 GMT</pubDate><category>Technology</category><category>Python</category><category>Data Structures</category><category>Lists</category><category>Dictionaries</category><category>Programming</category><category>Tutorial</category><author>Anurag Verma</author></item><item><title>Master the Basics of Python: A Step-by-Step Guide</title><link>https://blog.codercops.com/blog/master-python-basics-step-by-step-guide/</link><guid isPermaLink="true">https://blog.codercops.com/blog/master-python-basics-step-by-step-guide/</guid><description>Learn Python fundamentals including identifiers, data types (int, float, str, list, tuple, set, dict), operators, and basic operations with hands-on examples.</description><pubDate>Fri, 06 Jan 2023 00:00:00 GMT</pubDate><category>Technology</category><category>Python</category><category>Beginners</category><category>Programming</category><category>Data Types</category><category>Tutorial</category><author>Anurag Verma</author></item><item><title>Complete Data Science Roadmap: From Beginner to Expert in 100 Days</title><link>https://blog.codercops.com/blog/complete-data-science-roadmap-100-days-bootcamp/</link><guid isPermaLink="true">https://blog.codercops.com/blog/complete-data-science-roadmap-100-days-bootcamp/</guid><description>A structured 100-day data science bootcamp roadmap covering Python, statistics, machine learning, deep learning, and real-world projects.</description><pubDate>Thu, 05 Jan 2023 00:00:00 GMT</pubDate><category>Career</category><category>Data Science</category><category>Roadmap</category><category>Career</category><category>Python</category><category>Machine Learning</category><category>Bootcamp</category><author>Anurag Verma</author></item><item><title>Regression Modeling 101: Understanding Different Types and Choosing the Right One</title><link>https://blog.codercops.com/blog/regression-modeling-101-types-choosing-right-model/</link><guid isPermaLink="true">https://blog.codercops.com/blog/regression-modeling-101-types-choosing-right-model/</guid><description>A comprehensive guide covering 10 regression types — linear, polynomial, logistic, ridge, lasso, elastic net, and more — with Python code examples and selection criteria.</description><pubDate>Wed, 04 Jan 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>Regression</category><category>Machine Learning</category><category>Python</category><category>Scikit-learn</category><category>Data Science</category><category>Statistics</category><author>Anurag Verma</author></item><item><title>The Power of List Comprehensions in Python</title><link>https://blog.codercops.com/blog/python-list-comprehensions-power-guide/</link><guid isPermaLink="true">https://blog.codercops.com/blog/python-list-comprehensions-power-guide/</guid><description>Master Python list comprehensions including syntax, filtering, nested comprehensions, and dictionary/set comprehensions with practical code examples.</description><pubDate>Tue, 03 Jan 2023 00:00:00 GMT</pubDate><category>Technology</category><category>Python</category><category>List Comprehensions</category><category>Programming</category><category>Beginners</category><category>Data Structures</category><author>Anurag Verma</author></item><item><title>Exploring the Intersection of AI and AR/VR Technology</title><link>https://blog.codercops.com/blog/ai-ar-vr-intersection-technology-applications/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ai-ar-vr-intersection-technology-applications/</guid><description>Discover how artificial intelligence and machine learning are transforming augmented and virtual reality applications in gaming, education, and beyond.</description><pubDate>Mon, 02 Jan 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>AR</category><category>VR</category><category>Machine Learning</category><category>Technology</category><category>Gaming</category><author>Anurag Verma</author></item><item><title>Unraveling the Confusion: A Primer on AI, ML, and Deep Learning</title><link>https://blog.codercops.com/blog/understanding-ai-ml-dl-differences-explained/</link><guid isPermaLink="true">https://blog.codercops.com/blog/understanding-ai-ml-dl-differences-explained/</guid><description>Understand the key differences between artificial intelligence, machine learning, and deep learning with clear definitions, examples, and real-world applications.</description><pubDate>Sun, 01 Jan 2023 00:00:00 GMT</pubDate><category>AI Integration</category><category>AI</category><category>Machine Learning</category><category>Deep Learning</category><category>Beginners</category><category>Data Science</category><author>Anurag Verma</author></item><item><title>Mastering OpenCV: A Comprehensive Introduction to Computer Vision with Python</title><link>https://blog.codercops.com/blog/mastering-opencv-computer-vision-python-introduction/</link><guid isPermaLink="true">https://blog.codercops.com/blog/mastering-opencv-computer-vision-python-introduction/</guid><description>Learn OpenCV fundamentals including image I/O, pixel manipulation, color conversion, resizing, filtering, edge detection, and feature detection with SIFT and SURF.</description><pubDate>Sat, 31 Dec 2022 00:00:00 GMT</pubDate><category>AI Integration</category><category>OpenCV</category><category>Computer Vision</category><category>Python</category><category>Image Processing</category><category>SIFT</category><category>Edge Detection</category><author>Anurag Verma</author></item><item><title>Divide and Conquer: A Powerful Strategy for Solving Complex Problems</title><link>https://blog.codercops.com/blog/divide-and-conquer-algorithm-strategy-python/</link><guid isPermaLink="true">https://blog.codercops.com/blog/divide-and-conquer-algorithm-strategy-python/</guid><description>Understand the divide and conquer algorithmic paradigm through the maximum subarray sum problem, with Python implementation and step-by-step analysis.</description><pubDate>Fri, 30 Dec 2022 00:00:00 GMT</pubDate><category>Technology</category><category>Algorithms</category><category>Divide and Conquer</category><category>Python</category><category>Data Structures</category><category>Problem Solving</category><author>Anurag Verma</author></item><item><title>Data Detective: Tips and Tricks for Effective Exploratory Data Analysis</title><link>https://blog.codercops.com/blog/data-detective-exploratory-data-analysis-tips-tricks/</link><guid isPermaLink="true">https://blog.codercops.com/blog/data-detective-exploratory-data-analysis-tips-tricks/</guid><description>A comprehensive guide to EDA covering visualization techniques, summary statistics, correlation analysis, data cleaning, PCA, anomaly detection, and feature engineering.</description><pubDate>Thu, 29 Dec 2022 00:00:00 GMT</pubDate><category>AI Integration</category><category>EDA</category><category>Data Science</category><category>Python</category><category>Pandas</category><category>Matplotlib</category><category>Data Analysis</category><author>Anurag Verma</author></item><item><title>The Ultimate Guide to Bit Manipulation in Python</title><link>https://blog.codercops.com/blog/ultimate-guide-bit-manipulation-python/</link><guid isPermaLink="true">https://blog.codercops.com/blog/ultimate-guide-bit-manipulation-python/</guid><description>Master bitwise operations, bitmasking, bit manipulation tricks, and bit-based algorithms for competitive programming and software engineering interviews.</description><pubDate>Wed, 28 Dec 2022 00:00:00 GMT</pubDate><category>Technology</category><category>Bit Manipulation</category><category>Algorithms</category><category>Python</category><category>Competitive Programming</category><category>Data Structures</category><author>Anurag Verma</author></item><item><title>Gender Determination with Morphometry of Eyes Using Deep Learning</title><link>https://blog.codercops.com/blog/gender-determination-morphometry-eyes-deep-learning/</link><guid isPermaLink="true">https://blog.codercops.com/blog/gender-determination-morphometry-eyes-deep-learning/</guid><description>Build a CNN model using ResNet50 transfer learning to classify gender from eye images, covering data preprocessing, model architecture, and evaluation.</description><pubDate>Tue, 27 Dec 2022 00:00:00 GMT</pubDate><category>AI Integration</category><category>Computer Vision</category><category>Transfer Learning</category><category>ResNet50</category><category>CNN</category><category>Deep Learning</category><category>Python</category><author>Anurag Verma</author></item><item><title>How to Write a Research Paper in AI, Machine Learning, and Deep Learning</title><link>https://blog.codercops.com/blog/how-to-write-research-paper-ai-ml-deep-learning/</link><guid isPermaLink="true">https://blog.codercops.com/blog/how-to-write-research-paper-ai-ml-deep-learning/</guid><description>A step-by-step guide to writing and publishing research papers in artificial intelligence, machine learning, and deep learning — from ideation to submission.</description><pubDate>Mon, 26 Dec 2022 00:00:00 GMT</pubDate><category>Career</category><category>Research</category><category>AI</category><category>Machine Learning</category><category>Academic Writing</category><category>Career</category><author>Anurag Verma</author></item><item><title>Time Series Forecasting of Stock Data Using LSTM Deep Learning</title><link>https://blog.codercops.com/blog/time-series-stock-forecasting-lstm-deep-learning/</link><guid isPermaLink="true">https://blog.codercops.com/blog/time-series-stock-forecasting-lstm-deep-learning/</guid><description>Learn to predict stock prices using Long Short-Term Memory (LSTM) networks in Python with TensorFlow, from data preprocessing to building and evaluating the model.</description><pubDate>Sun, 25 Dec 2022 00:00:00 GMT</pubDate><category>AI Integration</category><category>LSTM</category><category>Time Series</category><category>Deep Learning</category><category>Stock Market</category><category>TensorFlow</category><category>Python</category><author>Anurag Verma</author></item><item><title>Transfer Learning for Fruits Classification with ResNet50 and TensorFlow</title><link>https://blog.codercops.com/blog/transfer-learning-fruits-classification-resnet50-tensorflow/</link><guid isPermaLink="true">https://blog.codercops.com/blog/transfer-learning-fruits-classification-resnet50-tensorflow/</guid><description>A hands-on guide to building a fruit image classifier using transfer learning with ResNet50 in TensorFlow and Keras, achieving high accuracy on the Fruits-360 dataset.</description><pubDate>Fri, 23 Dec 2022 00:00:00 GMT</pubDate><category>AI Integration</category><category>Transfer Learning</category><category>TensorFlow</category><category>Keras</category><category>ResNet50</category><category>Computer Vision</category><category>Python</category><author>Anurag Verma</author></item></channel></rss>