Search icon CANCEL
Subscription
0
Cart icon
Your Cart (0 item)
Close icon
You have no products in your basket yet
Save more on your purchases! discount-offer-chevron-icon
Savings automatically calculated. No voucher code required.
Arrow left icon
Explore Products
Best Sellers
New Releases
Books
Videos
Audiobooks
Learning Hub
Newsletter Hub
Free Learning
Arrow right icon
timer SALE ENDS IN
0 Days
:
00 Hours
:
00 Minutes
:
00 Seconds

WebDevPro

58 Articles
Kinnari Chohan
19 Jan 2026
9 min read
Save for later

WebDevPro #123: Looking Back at 2025 and January in Focus

Kinnari Chohan
19 Jan 2026
9 min read
Crafting the Web: Tips, Tools, and Trends for Developers Advertise with Us|Sign Up to the Newsletter @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } WebDevPro #123 Looking Back at 2025 and January in Focus Crafting the Web: Tips, Tools, and Trends for Developers Hi , Welcome back to the first WebDevPro issue of the year. We’re reopening with a tighter promise: a sharper take on what’s happening in web development, and what’s actually worth your attention. The web moved fast in 2025, but the real story was the direction the updates were pointed in. Everyday development got more structured, more AI-assisted, and more performance-aware, and the teams that adapted early are already moving differently. Last year we sent 42 issues to 40,000+ subscribers. This year, we want each edition to feel useful within the first minute: the ideas you can carry into your codebase, the shifts that change how you build, and the updates you should act on before they turn into surprises. This edition is a reset and a catch-up in one. We’re bringing back pieces from past issues that still hold up when you’re dealing with async complexity, messy failure modes, and production AI features. Then we compress 2025 into the shifts that mattered, followed by a short news corner to get you current. Let’s get started! Most popular articles from our past newsletters Taming Asynchronous Control Flow in Node.js: From Callback Hell to Elegant Patterns (Originally sent: August 06, 2025) Starting from the classic “callback hell” problem, this article showed how simple techniques like early returns and modular functions can clean up asynchronous code. It then introduced essential async control patterns, including sequential execution, concurrency, race condition prevention, and limited parallelism using queues, all grounded in practical Node.js examples. Even as async and await improve readability, the underlying coordination problems have not gone away. APIs are more distributed, users are more impatient, and systems are more parallel. Knowing how to control flow, limit concurrency, and avoid race conditions remains critical for building resilient applications. Rethinking Error Handling with Information Architecture (Originally sent: September 15, 2025) Errors are not all the same, and this article made a strong case for treating them differently. By classifying errors into user, system, and contextual types, it reframed error handling as an information architecture and UX problem rather than a purely technical one. The piece explored how clear messaging, thoughtful fallback navigation, and consistent structure help users recover when things go wrong, without losing trust or orientation. As products grow more complex and AI-driven systems introduce new failure modes, error states have become more visible and more consequential. Designing for breakdowns, empty states, and partial failures is now a core part of resilient UX. This article’s focus on graceful degradation, user-centered language, and recovery paths feels increasingly relevant in a world where systems fail in subtle, contextual ways rather than simply crashing. Building an AI Email Enhancer with React 19 and Vercel AI SDK (Originally sent: September 29, 2025) This article explored how modern React and AI tooling come together in a real-world feature. It walked through building a type-safe AI email enhancer using React 19 Server Functions, useActionState, Zod validation, and the Vercel AI SDK. Beyond the mechanics, it showed how server-first form handling and structured AI responses can turn raw input into polished communication with minimal friction. As AI features move from experimentation into core product workflows, reliability and developer experience have become non-negotiable. This piece focused on exactly that. By emphasizing type safety, server-side execution, and predictable form behavior, it anticipated a shift toward AI integrations that are trustworthy, maintainable, and production-ready. In 2026, this approach feels less like a demo and more like the baseline for serious AI-powered web apps. The shifts that defined 2025 TypeScript became GitHub’s #1 language: In August 2025, TypeScript crossed a symbolic threshold: it became the most used language on GitHub by contributor counts, overtaking both Python and JavaScript. TypeScript isn’t “just nicer types” anymore. It’s the default foundation for modern web app scale, and it fits the direction frameworks and AI-assisted coding are already pulling teams toward: more structure, fewer runtime surprises, and codebases that stay maintainable as they grow. AI became a baseline developer skill, not a differentiator:In August 2025, TypeScript crossed a symbolic threshold: it became the most used language on GitHub by contributor counts, overtaking both Python and JavaScript. TypeScript isn’t “just nicer types” anymore. It’s the default foundation for modern web app scale, and it fits the direction frameworks and AI-assisted coding are already pulling teams toward: more structure, fewer runtime surprises, and codebases that stay maintainable as they grow. WebAssembly 2.0 made the browser a serious performance platform: With Wasm 2.0 marked “official,” the story is less “new tech” and more “this is stable enough to bet on.” WebAssembly keeps showing up where JavaScript naturally struggles: graphics-heavy experiences, compute-intensive features, and workloads that want near-native performance without leaving the browser. As Wasm matures, it quietly expands what “web app” can mean, turning the browser into a practical runtime for edge-case performance rather than a hard constraint teams work around. Tech jobs in 2025 quietly stabilized, even as layoffs stayed part of the story: After the brutal reset in 2022 and 2023, 2025 looked less like a rebound and more like a steady return to normal. Open roles kept inching up across startups and public tech companies, while layoffs were far less sweeping than the 2023 peak and increasingly concentrated in specific companies. The story of 2025 wasn’t a hiring frenzy, it was selective job creation and early signs that technical hiring is rebuilding momentum. JavaScript turned 30:Last year, our favorite semicolon-optional, closure-loving, eventually-async language turned 30. It’s officially old enough to rent a car, and it’s still picking up new features every year. Thirty years of function-scope confusion, a brief era where jQuery felt mandatory, and endless hours untangling asynchronous code. Through all of it, JavaScript stepped out of the browser, powered the rise of Node.js, and now runs everywhere from edge runtimes and cloud platforms to tiny devices. This week’s news corner JavaScript Rising Stars 2025 points to a new center of gravity: workflows: n8n emerged as the clear breakout winner, jumping from fifth place last year to number one with a record setting surge in GitHub stars, reflecting growing demand for AI powered automation and low code workflows. React continues to anchor the frontend world, reclaiming the top framework spot, while projects like shadcn/ui and react-bits underline the momentum around composable, design forward UI systems. On the backend, newcomer Motia signals a potential shift toward unified full-stack frameworks that collapse APIs, workflows, and AI agents into a single abstraction, making this year’s rankings less about incremental wins and more about where modern JavaScript development is heading next. Node.js shipped coordinated security releases across active lines: Node.js pushed security updates for v20.x, v22.x, v24.x, and v25.x on January 13, 2026, addressing multiple vulnerabilities across the active release lines. If you’re running Node in production, this is the kind of patch cycle you treat like a sprint task, not a “later” item. The practical move: check your runtime versions, plan a fast upgrade window, and make sure your dependency chain (especially anything touching HTTP, permissions, or request parsing) gets the same level of scrutiny. Angular 21.1 is landing, and the RC is already hinting at the direction: Angular 21.1 is expected imminently, and the 21.1.0-rc.0 release is a useful preview of what the team is tightening up next. Even if you don’t jump on minors day one, RC notes are a strong early warning system: they show what’s being stabilized, what’s being nudged into “new default” territory, and what might create friction in apps that sit a little off the happy path. Claude Code added Tool Search, making “tool use” feel less manual:Tool Search is now showing up in the Claude ecosystem, and it changes the ergonomics of agentic coding. Instead of you hard-wiring a small set of tools into context, the system can discover and select from a broader tool universe without blowing up the prompt budget. The result is less ceremony around “which tool do I expose,” and more momentum when you’re moving between code, docs, and actions. What do you want more of in 2026? Hit reply and tell us! Aaand that’s a wrap! This issue is a reset around one idea: web dev is rewarding teams that build with clearer contracts and tighter guardrails. From async control and resilient error states to TypeScript’s rise, production-ready AI workflows, and WebAssembly getting practical, the direction is the same. Even this week’s updates fit the pattern: patch Node, track Angular’s next release, and watch how tool-first coding is evolving. Before you close this tab, pick one default you’ve been relying on and tighten it. If something surprises you, hit reply and tell us what you learned. Cheers! Editor-in-chief, Kinnari Chohan Have any ideas you want to see in the next article? Hit Reply! SUBSCRIBE FOR MORE AND SHARE IT WITH A FRIEND! *{box-sizing:border-box}body{margin:0;padding:0}a[x-apple-data-detectors]{color:inherit!important;text-decoration:inherit!important}#MessageViewBody a{color:inherit;text-decoration:none}p{line-height:inherit}.desktop_hide,.desktop_hide table{mso-hide:all;display:none;max-height:0;overflow:hidden}.image_block img+div{display:none}sub,sup{font-size:75%;line-height:0}#converted-body .list_block ol,#converted-body .list_block ul,.body [class~=x_list_block] ol,.body [class~=x_list_block] ul,u+.body .list_block ol,u+.body .list_block ul{padding-left:20px} @media (max-width: 100%;display:block}.mobile_hide{min-height:0;max-height:0;max-width: 100%;overflow:hidden;font-size:0}.desktop_hide,.desktop_hide table{display:table!important;max-height:none!important}} @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} }
Read more
  • 0
  • 0

Kinnari Chohan
02 Feb 2026
9 min read
Save for later

WebDevPro #124: Why Modern JavaScript Feels Fragmented, Plus This Week’s Updates

Kinnari Chohan
02 Feb 2026
9 min read
Crafting the Web: Tips, Tools, and Trends for Developers Advertise with Us|Sign Up to the Newsletter @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } WebDevPro #124 Why Modern JavaScript Feels Fragmented, Plus This Week’s Updates Crafting the Web: Tips, Tools, and Trends for Developers Webinar: How to Build Faster with AI Agents Learn how full‑stack developers boost productivity by 50% with AI agents that automate layout, styling, and component generation through RAG and LLM pipelines. See how orchestration and spec‑driven workflows keep you in control of quality and consistency. Save your seat! Welcome to this week’s issue of WebDevPro! Before we get into the updates and tools, let’s start with a familiar moment. Imagine this. You’re deep in a JavaScript codebase, following a clean map and filter chain, when you suddenly land in a class full of mutable state and lifecycle methods. Same language, different mental model. That shift is easy to miss, but over time, it adds real cognitive overhead. Modern JavaScript often feels more complicated than it needs to be, even when the syntax itself is familiar. JavaScript doesn’t neatly transition from one programming style to another as projects grow. Instead, it accumulates them. You might begin with step-by-step procedural code, adopt functional patterns along the way, and later introduce object-based structures to manage scale. In practice, most real-world codebases blend all three. In this issue, we'll start with a deep dive into JavaScript, looking at how that layering came to be, why it can make code harder to reason about, and how to approach those tradeoffs with more intention. Then we will move on to the key updates from the past week, and wrap up with a tool worth adding to your workflow. Procedural thinking as the foundation For many developers, procedural logic is the starting point. Programs are expressed as a sequence of steps executed in a clear and predictable order. Control flow is explicit, and it is easy to follow how data moves through the program. Loops and conditional statements play a central role in this style. They make execution order visible and help explain how decisions affect program behavior. for (let i = 0; i < items.length; i++) { if (items[i].active) { handle(items[i]) } } This approach emphasizes execution order and state changes. It works well when programs are small and logic is linear. Importantly, this style never disappears. Even as programs grow, procedural code remains a valid and familiar tool. Introducing functional patterns As programs become more complex, functional patterns begin to appear more frequently. Array methods and callbacks provide a more concise way to work with collections and reduce repetitive looping logic. Instead of describing how a loop executes, this style focuses on what transformation is applied to the data. items .filter(item => item.active) .forEach(handle) Here, intent is clearer, but control flow is less explicit. Readers must understand how each method behaves and how functions are applied. For some, this improves readability. For others, it introduces a new layer of abstraction that requires adjustment. Crucially, this style does not replace procedural logic. Both approaches coexist, and developers are expected to move between them as needed. Shifting toward composition As functional ideas are reinforced, composition becomes more prominent. Functions are treated as reusable building blocks that can be passed around and combined. This encourages thinking in terms of data flow rather than execution steps. Logic is expressed by chaining operations together, which can make intent clearer while obscuring the underlying sequence of events. At this stage, developers are often working with at least two distinct paradigms simultaneously: procedural control flow and functional composition. Object-based organization for larger programs As programs grow further, object-based organization emerges as a way to manage complexity. Classes and objects group related data and behavior, providing a structural model for larger systems. class ItemHandler { handle(item) { if (item.active) { // ... } } } This approach shifts the focus again. Instead of steps or transformations, code is organized around responsibilities and roles. Object-based organization can improve clarity in large programs, but it introduces a third way of thinking. Procedural, functional, and object-oriented styles now coexist within the same language and often within the same codebase. Accumulation instead of replacement A defining characteristic of JavaScript is that new paradigms are added without removing older ones. Procedural logic remains valid even as functional patterns appear. Functional composition continues to be useful when object-based structures are introduced. Nothing is deprecated at the architectural level. Every style remains available, and developers are free to choose the approach that fits the problem at hand. This cumulative nature explains why JavaScript codebases often contain a mixture of paradigms. The language supports each style equally and does not enforce a single architectural direction. Understanding the resulting tension As paradigms accumulate, readers and developers must constantly adjust how they interpret code. Different sections of a program may require different mental models depending on the style being used. This flexibility is powerful, but it increases cognitive load. Understanding a program requires not only knowledge of syntax, but also awareness of which paradigm is currently in play. Maintaining consistency becomes more challenging as programs grow. The same language constructs can support multiple architectural interpretations depending on context. Final words JavaScript is not broken. It is intentionally flexible. The challenge is not choosing the right paradigm, but navigating multiple paradigms at once. When procedural logic, functional composition, and object-based organization coexist, developers must be deliberate about how and when each style is used. Understanding how these paradigms accumulate rather than replace one another helps explain why modern JavaScript can feel complex even when the individual concepts are familiar. Want to go deeper? JavaScript from Beginner to Professional is a solid pick for developers transitioning into JavaScript. It uses more than 100 practical exercises and projects to develop real, working JavaScript skills. This Week in the News ⚙️ Node.js v25.5.0 Is Out:Node.js has shipped v25.5.0, continuing the steady pace of updates ahead of the next LTS release. This one focuses on runtime fixes and smaller improvements rather than headline features. If you like keeping an eye on where Node is heading next, this release is worth skimming through. 🧱 The Boring JavaScript Stack Reaches v1.0: The Boring JavaScript Stack has officially hit v1.0, and the name is very much intentional. It is an opinionated full-stack starter built with Sails, Inertia, Tailwind CSS, plus your choice of Vue, React, or Svelte. The goal here is fewer decisions, less setup churn, and getting to actual product code faster. 🧠 A Conversation with Anders Hejlsberg: Last week’s interview with Anders Hejlsberg offers a thoughtful look into the mindset of one of the most influential language designers behind C# and TypeScript. The discussion touches on language evolution, long-term trade-offs, and what it takes to design tools that scale with both developers and ecosystems. For an overview of the conversation, Aaron Winston summarizes Hejlsberg's lessons from C# and TypeScript on fast feedback loops, scaling software, open source visibility, and building tools that last. Beyond the Headlines 🐢 Fixing TypeScript Performance Problems:If your TypeScript project has started to feel slow, this article will feel very familiar. It walks through common causes of sluggish builds and editor lag in larger TS codebases. There are practical fixes here that teams can apply without rewriting everything from scratch. 🧭 JavaScript Frameworks Heading Into 2026: This is a community-driven look at how JavaScript frameworks are shaping up as we move toward 2026. It talks less about hype cycles and more about adoption, trade-offs, and long-term sustainability. A good read if you are thinking about whether to stick, switch, or wait with your current stack. 🅰️ Angular Community Stories and Signal Forms: The Angular team shares new community stories along with real-world code samples. There is also an update on Signal Forms, which builds on Angular’s signals model for handling reactive forms. If you work on form-heavy Angular apps, this is a useful glimpse into where things are going. 🤖 How Cursor Shipped Its Coding Agent: This post breaks down how Cursor built and shipped its AI coding agent. It goes into architectural decisions, trade-offs, and the realities of putting an AI-assisted dev tool into production. A solid behind-the-scenes read if you are curious about how modern developer tools are actually built. Tool of the Week ⚡Bun Gets Faster with v1.3.7 Bun shipped v1.3.7 last week with a JavaScriptCore update that brings noticeable performance gains, including faster async and await handling and ARM64 improvements. There’s also a new option to generate profiling data in Markdown for easier sharing, along with native support for JSON5 and JSONL. If you are curious why Bun keeps gaining traction, this article is still a good explainer on what’s driving its adoption. That’s all for this week. Have any ideas you want to see in the next article? Hit Reply! Cheers! Editor-in-chief, Kinnari Chohan SUBSCRIBE FOR MORE AND SHARE IT WITH A FRIEND! *{box-sizing:border-box}body{margin:0;padding:0}a[x-apple-data-detectors]{color:inherit!important;text-decoration:inherit!important}#MessageViewBody a{color:inherit;text-decoration:none}p{line-height:inherit}.desktop_hide,.desktop_hide table{mso-hide:all;display:none;max-height:0;overflow:hidden}.image_block img+div{display:none}sub,sup{font-size:75%;line-height:0}#converted-body .list_block ol,#converted-body .list_block ul,.body [class~=x_list_block] ol,.body [class~=x_list_block] ul,u+.body .list_block ol,u+.body .list_block ul{padding-left:20px} @media (max-width: 100%;display:block}.mobile_hide{min-height:0;max-height:0;max-width: 100%;overflow:hidden;font-size:0}.desktop_hide,.desktop_hide table{display:table!important;max-height:none!important}} @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} }
Read more
  • 0
  • 0

Kinnari Chohan
09 Feb 2026
3 min read
Save for later

WebDevPro #125: Where AI actually saves time in modern development workflows

Kinnari Chohan
09 Feb 2026
3 min read
Crafting the Web: Tips, Tools, and Trends for Developers Advertise with Us|Sign Up to the Newsletter @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } WebDevPro #125 Where AI actually saves time in modern development workflows Crafting the Web: Tips, Tools, and Trends for Developers Hi , Welcome to this week’s issue of WebDevPro! Aditya Agarwal, Facebook’s 10th employee and former CTO of Dropbox, sparked a wider conversation in the developer community this week after sharing a personal reflection about coding with Claude, Anthropic’s AI assistant. After a weekend building with Claude, he wrote: “It was very clear that we will never ever write code by hand again.” Then he admitted something more surprising: He felt happy, but also disoriented. Now that isn’t a prediction for “someday.” It’s a workflow shift happening right now. The real challenge for most teams isn’t access to AI. It’s integration. How do you apply AI to scaffolding, debugging, refactoring, UI generation, and delivery pipelines without disrupting your stack or compromising quality? That’s why this upcoming Progress workshop stood out to us. It’s designed to help developers integrate AI into real workflows, without losing control over quality, security, or governance. Webinar: AI for Developers – How to Achieve a 50% Productivity Boost If interested, sign up here This session breaks down technical workflows, architectural considerations, and hands-on demos showing how AI can augment development tasks, without requiring framework changes or replatforming. We’ll cover topics you care about: AI‑Assisted Component Scaffolding How AI can generate baseline UI components, form logic, data-binding structures, and reduce initial setup time. Debugging & Refactoring Using AI Agents Techniques for leveraging AI to identify bottlenecks, suggest optimized patterns, and modernize legacy code. AI‑Enhanced UI Development with Kendo UI & Telerik Practical examples of generating boilerplate, bindings, CRUD screens, tests, and documentation directly from your existing tech stack. Integrating AI into Dev Workflows Where AI fits into CI/CD, code reviews, architectural planning, prototyping, and cross-team collaboration. How Teams Achieve Measurable Gains (up to 50%) Real scenarios showing reduced time spent on repetitive implementation tasks, improved code consistency, and faster iteration cycles. Security & Practical Limitations What to automate, what not to automate, and how to ensure AI‑generated code aligns with team standards. Who should attend: Senior devs building complex front‑end or full‑stack applications Dev leads and architects driving technical decision‑making Teams exploring AI adoption without changing their existing stack Register & Save Your Seat! 👉 Join the webinar and see how AI can be embedded into real engineering workflows. 📅 February 26, 2026 ⏰ 9:30 PM GMT+5:30 Secure your spot! SUBSCRIBE FOR MORE AND SHARE IT WITH A FRIEND! *{box-sizing:border-box}body{margin:0;padding:0}a[x-apple-data-detectors]{color:inherit!important;text-decoration:inherit!important}#MessageViewBody a{color:inherit;text-decoration:none}p{line-height:inherit}.desktop_hide,.desktop_hide table{mso-hide:all;display:none;max-height:0;overflow:hidden}.image_block img+div{display:none}sub,sup{font-size:75%;line-height:0}#converted-body .list_block ol,#converted-body .list_block ul,.body [class~=x_list_block] ol,.body [class~=x_list_block] ul,u+.body .list_block ol,u+.body .list_block ul{padding-left:20px} @media (max-width: 100%;display:block}.mobile_hide{min-height:0;max-height:0;max-width: 100%;overflow:hidden;font-size:0}.desktop_hide,.desktop_hide table{display:table!important;max-height:none!important}} @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} }
Read more
  • 0
  • 0

Kinnari Chohan
16 Feb 2026
11 min read
Save for later

WebDevPro #126: Using AI in Development Without Losing Architectural Control

Kinnari Chohan
16 Feb 2026
11 min read
Crafting the Web: Tips, Tools, and Trends for Developers Advertise with Us|Sign Up to the Newsletter @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } WebDevPro #126 Using AI in Development Without Losing Architectural Control Crafting the Web: Tips, Tools, and Trends for Developers Webinar: How to Build Faster with AI Agents Learn how full‑stack developers boost productivity by 50% with AI agents that automate layout, styling, and component generation through RAG and LLM pipelines. See how orchestration and spec‑driven workflows keep you in control of quality and consistency. Save your seat! Welcome to this week’s issue of WebDevPro. If you’ve written any meaningful amount of code recently, AI is already part of your workflow. It finishes your lines, scaffolds components, suggests refactors, and removes a lot of the friction from day-to-day implementation. At the same time, more teams are shipping AI-powered capabilities directly into their products. The productivity gains are real. Development moves faster. Experimentation becomes easier. But speed introduces a structural question that doesn’t get talked about enough. When implementation becomes this easy, AI can start shaping architecture by default. Not through dramatic failures, but through small decisions that slip in unnoticed. A suggestion becomes a pattern. A pattern becomes the norm. Over time, structure starts drifting, responsibilities blur, and the codebase becomes harder to reason about. This piece looks at how to prevent that. We’ll look at practical ways to keep architectural control while still using AI heavily: how to set guardrails before generating code, where AI logic should live once it becomes part of your product, and what to review so “correct” output doesn’t slowly weaken your design. AI should accelerate implementation, not quietly define structure or responsibility. When Implementation Speed Becomes the Default When AI integrates into the development environment, the nature of coding changes. Developers move from writing every line manually to reviewing and selecting generated suggestions. That shift is efficient, but it also changes what drives consistency in a codebase. Suggestions are generated from generalized patterns. They can be correct, but correctness is not the same as architectural alignment. A project’s structure depends on decisions that hold across features, not on what looks plausible inside a single file. Encode Guardrails Before You Generate One practical way to preserve architectural control is to define expectations before generation. In practice, this means writing down the constraints that matter in your codebase so the assistant consistently reinforces them. For example, a strong instruction set begins by defining the development role clearly: You are an expert in TypeScript, Angular, and scalable web application development. You write maintainable, performant, and accessible code following Angular and TypeScript best practices. From there, it becomes easier to add concrete constraints that prevent structural drift. Even a small rule can make a difference, such as discouraging weak typing: Avoid the any type; use unknown when type is uncertain This kind of guidance does not guarantee perfect output. It does something more important: it keeps the assistant working within a defined standard instead of inventing one through suggestion. When AI Becomes Part of the Application The architectural stakes rise when AI is not only assisting development but also powering feature behavior. At that point, the questions are no longer about scaffolding. They become questions of placement, responsibility, and cohesion. One useful pattern is to configure AI behavior deliberately through a system instruction and then route all interaction through a structured interface. Example model configuration and system instruction: const instructions = ` Welcome to citypass. You are a superstar agent for this car parking validator. You will assist users by submitting parking tickets. You can convert date phrases to ISO strings and act as a geocode service to convert a location or address to coordinates long/lat. `; const ai = getAI(firebaseApp); const model = getGenerativeModel(ai, { model: 'gemini-2.5-flash', systemInstruction: instructions, tools: [toolset] }); this.chat = model.startChat(); This approach makes two architectural decisions explicit. First, AI behavior is constrained by a clear instruction. Second, interaction happens through a controlled interface instead of being scattered across unrelated parts of the application. A Practical Boundary: UI for Input, Services for Processing When AI is exposed to users, architectural control often comes down to a simple boundary. The UI collects input and shows results. The AI processing stays encapsulated behind an interface that can be tested and evolved. A clean example is offering an “AI Creator” entry point near an existing workflow, opening a modal to capture a prompt: Ticket creation flow with an AI Creator entry point used to capture user input for AI-assisted ticket creation. AI Creator button and modal markup: <button nz-button nzType="link" type="button" (click)="isVisible.set(true)" >AI Creator </button> <nz-modal [(nzVisible)]="isVisible" nzTitle="AI Creator" (nzOnCancel)="isVisible.set(false)" (nzOnOk)="ok()"> <ng-container *nzModalContent> <textarea [(ngModel)]="prompt" rows="3" placeholder="Enter ticket details" nz-input> </textarea> </ng-container> </nz-modal> This interface design matters because responsibility stays clear. The component manages interaction and user input. The AI-driven work happens only when the user explicitly triggers it, and the application can decide where that processing belongs. The Drift Risk: Structure by Convenience AI rarely causes dramatic architectural failures. The more common risk is incremental drift. A generated approach is accepted, then repeated, and then becomes the default. Over time, similar features are built with slightly different patterns, responsibilities move across layers, and ownership becomes less obvious. This is why the guiding principle needs to be visible early in the workflow: AI should accelerate implementation, not make architectural decisions. Maintaining Architectural Control Architectural control in an AI-assisted workflow comes from a small set of repeatable practices: Define expectations before generation so the assistant reinforces standards Encapsulate AI-enabled behavior behind clear interfaces Review generated code for placement and responsibility, not only for correctness These practices keep speed from rewriting structure. Final words AI can absolutely increase velocity. It can also unlock product capabilities that would have been expensive or slow to build even a year ago. But long-term maintainability still comes down to structure. The difference is that AI changes how structure gets created. It can reinforce good decisions, or it can quietly introduce new patterns through convenience, repetition, and speed. That’s why boundaries matter. When they’re clear, AI becomes a multiplier for discipline. When they’re loose, drift becomes the default. AI should accelerate implementation, not quietly define structure or responsibility. Architectural control isn’t about resisting AI. It’s about staying deliberate while moving fast. Want to learn more? Get your copy of Angular Projects, 4th Edition now! This Week in the News 🧩TypeScript 6.0 beta and roadmap shift: TypeScript 6.0 beta introduces incremental improvements across type checking and configuration while laying groundwork for the long-discussed native rewrite in Go that promises serious performance gains. The team is clearly thinking beyond syntax tweaks and focusing on compiler architecture, which signals that large codebases and build speed are now central to the TypeScript story. For teams pushing monorepos or heavy CI pipelines, this roadmap matters more than any single feature flag. 📊 State of JavaScript 2025 survey results: The State of JavaScript 2025 survey provides a broad snapshot of how developers are working across the JS ecosystem. TypeScript continues to see strong adoption, reinforcing its position as a standard part of modern JavaScript development. In tooling, newer build systems and faster runtimes are gaining momentum, reflecting a clear preference for performance-focused developer experience. The survey also compares usage, satisfaction, and interest across frameworks, testing tools, browser APIs, and runtimes, highlighting which technologies feel stable and which are generating curiosity. Overall, the results show an ecosystem that is maturing around modern defaults while steadily evolving toward faster tooling and more streamlined workflows. ⚛️ State of React 2025: The State of React 2025 survey offers a data-backed look at how developers are building with React today. Core tooling remains strong: Next.js, React Router, and Redux continue to see widespread usage, while TanStack Query and Axios are common choices for data handling. On the build side, Vite has emerged as the dominant tool, reflecting the ecosystem’s shift toward faster development workflows. UI libraries like MUI and shadcn/ui show meaningful adoption, and modern state solutions such as Redux Toolkit are preferred when external state is needed. The results also highlight a practical trend: many teams still rely primarily on built-in React APIs for state management, reaching for external libraries only as complexity grows. Beyond the Headlines ⚡Running Next.js at Enterprise Scale:Next.js scales well, but enterprise usage needs more than default settings. This piece breaks down what changes when you’re running Next.js under real traffic: defining clear SLOs/SLAs, instrumenting performance monitoring, and understanding the framework’s request lifecycle so you can spot bottlenecks early. It also highlights practical architecture choices like using CDNs and caching effectively, picking the right rendering strategy (SSG vs SSR) per route, and planning for horizontal scaling with shared caches and load balancing. 🐢 Is Claude Code losing its engineering edge:This post critiques recent shifts in Claude Code’s behavior, arguing that guardrails and simplifications are reducing its usefulness for experienced developers who value precision and depth. It reflects a broader tension in AI tooling between safety, accessibility, and raw capability. For developers relying on AI as a serious engineering assistant, subtle model behavior changes can have an outsized impact on trust and workflow. 🧭 Debugging workflows that actually benefit from AI: An exploration of AI-assisted debugging workflows that break down how you can leverage models to trace issues, interpret stack traces, and accelerate root-cause analysis without feeling like you’re guessing at prompts. ⚛️ React Server Components performance insights: This piece examines how React Server Components behave in real world performance scenarios, moving past high level explanations to measure tradeoffs in rendering, hydration, and network boundaries. It challenges simplistic assumptions about automatic speed gains and highlights where architectural decisions still matter. For teams evaluating RSC adoption, the nuance here is critical before refactoring large parts of an app around the paradigm. Tool of the Week 🌀🛠️ OpenClaw — The AI Agent That Does Work for You OpenClaw is an open-source autonomous AI agent that goes beyond chat: it can execute real tasks like managing email, calendars, messaging apps, and other workflows by integrating with platforms such as WhatsApp, Telegram, and Slack. Developed by Austrian engineer Peter Steinberger, it grew from an experimental project into one of the fastest-adopted agent tools in the community because of its ability to act instead of just respond. Since its introduction in November, OpenClaw has seen a viral rise, surpassing 100,000 stars on GitHub and attracting 2 million visitors in a single week, signaling strong developer curiosity around agent-based systems. This week, OpenClaw made headlines when creator Peter Steinberger announced he’s joining OpenAI. Sam Altman highlighted Steinberger’s expertise in multi-agent systems as strategically important for building the next generation of personal AI assistants, and OpenClaw will continue as an open-source foundation supported by OpenAI. This move signals how quickly agent-centric tooling is becoming a central focus for major AI platforms. For anyone interested in trying OpenClaw yourself or seeing it in action, this tutorial walks through setup and use:📺 OpenClaw Full Tutorial for Beginners. That’s all for this week. Have any ideas you want to see in the next article? Hit Reply! Cheers! Editor-in-chief, Kinnari Chohan SUBSCRIBE FOR MORE AND SHARE IT WITH A FRIEND! *{box-sizing:border-box}body{margin:0;padding:0}a[x-apple-data-detectors]{color:inherit!important;text-decoration:inherit!important}#MessageViewBody a{color:inherit;text-decoration:none}p{line-height:inherit}.desktop_hide,.desktop_hide table{mso-hide:all;display:none;max-height:0;overflow:hidden}.image_block img+div{display:none}sub,sup{font-size:75%;line-height:0}#converted-body .list_block ol,#converted-body .list_block ul,.body [class~=x_list_block] ol,.body [class~=x_list_block] ul,u+.body .list_block ol,u+.body .list_block ul{padding-left:20px} @media (max-width: 100%;display:block}.mobile_hide{min-height:0;max-height:0;max-width: 100%;overflow:hidden;font-size:0}.desktop_hide,.desktop_hide table{display:table!important;max-height:none!important}} @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} }
Read more
  • 0
  • 0

Kinnari Chohan
23 Feb 2026
12 min read
Save for later

WebDevPro #127: Design Patterns as Decision Frameworks, Not Recipes

Kinnari Chohan
23 Feb 2026
12 min read
Crafting the Web: Tips, Tools, and Trends for Developers Advertise with Us|Sign Up to the Newsletter @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } WebDevPro #127 Design Patterns as Decision Frameworks, Not Recipes Crafting the Web: Tips, Tools, and Trends for Developers Unblocked: The context layer your AI tools are missing Give your agents the understanding they need to generate reliable code, reviews, and answers. Unblocked builds context from your team’s code, PR history, conversations, documentation, planning tools, and runtime signals. It surfaces the insights that matter so AI outputs reflect how your system actually works. See how it works Welcome to this week’s issue of WebDevPro. If you’ve been building and maintaining systems for a while, you’ve probably felt the friction that doesn’t show up in code reviews. And here’s something that doesn’t get said often enough: most engineering pain isn’t caused by bad code. It’s caused by unexamined decisions. Nobody deliberately optimizes for rigidity. Nobody sets out to make performance worse or future changes harder. But when trade-offs aren’t made explicit, that’s exactly where teams end up. You notice it when: A small requirement change forces a wide refactor A performance issue appears under load and the root cause isn’t obvious “Best practice” debates stall because everyone is arguing from instinct, not intent We’re often handed rules like these: Use strict equality Avoid blocking I/O Prefer Map over Object Use Set for deduplication Be careful with parseInt These guidelines are useful, especially early on. They prevent common mistakes. But over time, following rules without understanding the trade-offs turns into habit, not judgment. This week’s issue looks at patterns differently. Not as templates to apply or badges of clean code, but as decision frameworks. By the end of this article, you’ll start seeing what a piece of code is really optimizing for, notice the hidden costs behind everyday implementation choices, think more deliberately about where change should happen, and reframe conversations from “Is this correct?” to “What are we trading off?” That shift from applying rules to making deliberate trade-offs is where engineering starts to feel intentional. And that’s what we’re unpacking today. Code Shape and the Cost of Change Most problematic code works. That’s why it survives. createUser(name, email, password, phoneNumber, role = 'guest') There’s nothing obviously wrong here. Until the domain changes. Add a required field. Deprecate one parameter. Split roles into multiple variants. Now you’re updating dozens of call sites and hoping argument order wasn’t misused somewhere. Switching to object parameters: createUser({ name, email, password, phoneNumber, role = 'guest' }) This changes what the API optimizes for. Specifically, order stops mattering, adding fields becomes safer, and call sites become self-documenting. This is design thinking at the function level. You’re choosing a shape that absorbs change instead of amplifying it. Hidden Transformations and Predictability Loose equality in JavaScript produces results that surprise people: false == 0 // true '' == false // true [] == false // true These aren’t bugs; they follow the language’s coercion rules. The issue is that the conversion happens implicitly. When a comparison behaves unexpectedly, it looks like a logic error, not a type conversion chain. Using === keeps comparisons explicit. It removes hidden work. Parsing has similar edges. parseInt(0.0000005) // 5 parseInt converts its input to a string, then parses from the start until it hits an invalid character. A number like 0.0000005 may be represented as "5e-7", so parsing stops at "e". This is documented behavior. The problem isn’t the function. It’s assuming there are no intermediate transformations. The broader lesson: implicit conversions reduce clarity. When behavior depends on hidden steps, bugs become harder to reason about. Runtime Reality: Blocking Work and Delegation Node.js executes JavaScript on a single main thread that drives the event loop. CPU-heavy synchronous code blocks that thread. While it runs, nothing else progresses. That’s why synchronous work in request handlers can reduce throughput and increase latency under load. Asynchronous APIs often help because some operations can be delegated to the system or to worker threads (for example, many crypto operations have asynchronous variants). The main thread remains free to coordinate. But async alone doesn’t solve architectural problems. Performance often improves more by reducing how often expensive work runs than by simply changing it to async. Caching, batching, and eliminating redundant computation frequently have a bigger impact than switching APIs. The real pattern isn’t “async good, sync bad.” It’s understanding where your runtime is serial and designing accordingly. Data Structures as Cost Models Choosing between Object, Map, Array, and Set is about workload and not preference. Objects fit well when: keys are known and stable you’re modeling record-like data JSON serialization matters Maps fit well when: keys are dynamic frequent insertions and deletions occur iteration order must be preserved non-string keys are required Arrays excel at ordered data and transformations. Sets excel at uniqueness and fast membership checks. No structure is universally better. Each implies a different cost model. When you align structure with usage patterns, the code becomes simpler and more predictable. Classic Patterns: Controlling Where Change Happens Design patterns get introduced as diagrams. Boxes, arrows, interfaces. In practice, nobody reaches for Strategy because they love abstractions. They reach for it because some piece of logic keeps changing and it’s starting to infect everything around it. Pricing rules change. Validation rules change. Feature flags change. If that logic is scattered across the system, every update becomes a small cleanup project. Strategy just gives that volatility a place to live. Observer shows up when components are getting too aware of each other. One module updates something and suddenly three others need to react. Hard-coded calls turn into a web of dependencies. Events or observers aren’t about elegance. They’re about reducing how much each part needs to know. Adapter is what you write when an external API doesn’t quite fit your model, and you don’t want your entire codebase shaped by someone else’s decisions. It’s a boundary. A buffer. None of these patterns are impressive on their own. What they’re really doing is controlling where change hurts. They add indirection, yes. That indirection costs something. But in return, you stop paying interest every time requirements shift. That’s the trade. Containment Over Cleverness There’s always a moment when modifying a prototype feels like a clever shortcut. You add a helper to Array.prototype so you don’t have to import a utility everywhere. You tweak Object.prototype to normalize something globally. It works. It even feels elegant. The catch is that you’ve quietly changed the rules for the entire runtime. Now every array in the system has that extra method. Every object inherits the behavior whether it asked for it or not. If something breaks, the failure won’t point back to your “nice little improvement.” It’ll surface somewhere unrelated, and debugging it will take longer than the shortcut saved. In small scripts, this might be fine. In shared codebases, libraries, or long-lived services, it’s a different story. The blast radius is bigger than it looks. Most engineers grow out of this not because someone tells them it’s wrong, but because they’ve spent a day tracing a bug back to a global modification they forgot existed. After that, containment starts to feel a lot more attractive than cleverness. Final words: Making Trade-offs Explicit The deepest anti-pattern isn’t picking the “wrong” API but rather building for neatness today in places that are guaranteed to change later. That’s why patterns matter. Not because they’re clever, but because they force the trade-offs into the open: CPU vs latency memory vs speed coupling vs flexibility simplicity now vs adaptability later Used like recipes, patterns turn rigid fast. Used like decision frameworks, they do something much more valuable: they make teams talk about consequences instead of preferences. You spend less time arguing about “best practices,” and more time agreeing on what kind of system you’re actually building. That’s the shift from following rules to developing engineering judgment. This Week in the News 🧩TypeScript 6.0 Beta Is Here and 7.0 Will Change More Than You Think: TypeScript 6.0 is now in beta and while it looks like a transitional release, it lays the groundwork for the Go-based TypeScript 7. Some changes may subtly affect existing projects, especially around deprecated behaviors and internal shifts. This is the release to test against early so you are not caught off guard when 7.0 lands with deeper architectural changes. 🌐 WebMCP and EPP Show Where Chrome Wants the Web to Go Next: With WebMCP and EPP, Chrome is exploring structured communication between web apps and external processes. This could reshape how developer tools, AI agents, and browser-based apps coordinate capabilities. If you care about automation-heavy workflows or AI-assisted development, this signals where the platform is heading. 🔗 npm Just Made Supply Chain Security Harder to Ignore: npm 11.10.0 rolls out bulk trusted publishing configuration and stronger lifecycle script protections. Teams managing multiple packages can now streamline trusted publishing, while script security improvements reduce risk from malicious or unexpected install-time behavior. Worth reading if you maintain libraries or ship production packages regularly. 🛠️ Interop 2026 Aims to Remove More Cross Browser Headaches: Interop is a yearly cross-browser effort where engine teams align on specific platform features and work together to close gaps in behavior and support. Interop 2026 is now announced, continuing the collaboration between WebKit, Chromium, and Gecko with a fresh set of focus areas. For developers, it is one of the most reliable signals of which web platform fixes are actually likely to land across all major browsers. Beyond the Headlines ⚡Node vs Deno vs Bun Benchmarks Show Where the Real Gaps Are: Fresh performance benchmarks compare Node.js, Deno, and Bun across real-world scenarios rather than synthetic micro tests. The results challenge a few common assumptions about which runtime is “fastest” and where that speed actually matters. Worth reading before you make runtime decisions based purely on hype or benchmark screenshots. 🧠 Performance Is Not a Technical Problem: This essay argues that most performance issues stem from priorities, incentives, and product decisions rather than raw engineering limits. It reframes optimization as a cultural and organizational question, not just a profiling exercise. A sharp perspective shift for anyone working on growing codebases where “we’ll fix it later” keeps winning. ♟️What Deep Blue Still Teaches Us About AI Hype: Simon Willison revisits IBM’s Deep Blue moment and connects it to today’s AI narratives. The piece explores how milestone victories shape public perception, funding, and expectations long after the headlines fade. A thoughtful read for developers navigating the current AI wave and trying to separate signal from spectacle. 🧵 HTTP in Node.js Gets Tricky Fast and This Guide Explains Why: Making an HTTP request in Node.js looks simple until you hit retries, timeouts, streaming, backpressure, and error handling in real production code. This deep dive breaks down the patterns that help you move beyond quick fixes and build request logic that stays reliable under load. It’s also a great preview of the thinking behind Node.js Design Patterns, one of the most practical books for developers building serious Node.js systems. Tool of the Week 🧮 Excelize Makes Spreadsheet Automation in Go Feel Like a Superpower If you’ve ever had to generate Excel reports, clean up spreadsheets, or build export pipelines, you already know the pain: most tooling is either fragile or wildly overcomplicated. Excelize, built by Ri Xuis an open-source Go library that makes working with real .xlsx files feel straightforward, from formatting and formulas to charts and large-file handling. The most interesting part is the story behind it. The write-up on how Excelize was builtshows what it takes to make “boring” infrastructure reliable: handling OpenXML edge cases, keeping the API Go-friendly, and evolving features without breaking existing users. It’s a strong example of how long-term OSS gets built, one painful spreadsheet at a time. Good developer tooling rarely starts as “let’s build a library.” It starts as “this keeps hurting, let’s fix it properly.” Excelize is the result of sticking with that fix long enough to turn it into real infrastructure. That’s all for this week. Have any ideas you want to see in the next article? Hit Reply! Cheers! Editor-in-chief, Kinnari Chohan Brought to you in cooperation with Unblocked: SUBSCRIBE FOR MORE AND SHARE IT WITH A FRIEND! *{box-sizing:border-box}body{margin:0;padding:0}a[x-apple-data-detectors]{color:inherit!important;text-decoration:inherit!important}#MessageViewBody a{color:inherit;text-decoration:none}p{line-height:inherit}.desktop_hide,.desktop_hide table{mso-hide:all;display:none;max-height:0;overflow:hidden}.image_block img+div{display:none}sub,sup{font-size:75%;line-height:0}#converted-body .list_block ol,#converted-body .list_block ul,.body [class~=x_list_block] ol,.body [class~=x_list_block] ul,u+.body .list_block ol,u+.body .list_block ul{padding-left:20px} @media (max-width: 100%;display:block}.mobile_hide{min-height:0;max-height:0;max-width: 100%;overflow:hidden;font-size:0}.desktop_hide,.desktop_hide table{display:table!important;max-height:none!important}} @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} }
Read more
  • 0
  • 0

Kinnari Chohan
02 Mar 2026
15 min read
Save for later

WebDevPro #128: TypeScript Under Pressure in Evolving Full Stack Systems

Kinnari Chohan
02 Mar 2026
15 min read
Crafting the Web: Tips, Tools, and Trends for Developers Advertise with Us|Sign Up to the Newsletter @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } WebDevPro #128 TypeScript Under Pressure in Evolving Full Stack Systems Crafting the Web: Tips, Tools, and Trends for Developers Most Spring Boot projects stop at REST APIs Real systems require service discovery, API gateways, centralized configuration, and built-in resilience. In this live, hands-on workshop, you’ll build a working microservices system end-to-end, define service boundaries, wire up discovery, configure a gateway, and handle failures properly. 🎟 Register now and get 40% off with code SAVE40 Welcome to this week’s issue of WebDevPro. This issue looks at a common transition in modern engineering: taking a fast proof of concept and turning it into something that can survive real change. Consider a small internal AI support chatbot. The architecture is simple. A React frontend collects messages and sends them to an Express POST /api/chat endpoint. The server returns a short reply. The goal here is speed, not durability. To move quickly, the frontend stores messages as any[]. The backend reads req.body.messages from untyped JSON and returns a response like: { "reply": "You said: hello" } There is no formal contract between frontend and backend. The agreement lives in shared understanding: reply is a string, and messages is an array of objects with role and content. When both sides are written close together, this feels stable. Then the requirements change. The reply must now include structured data: the assistant’s message, references, and follow-up questions. The backend evolves and begins returning an object under reply instead of a string. The frontend does not change. The build passes. The browser fails at runtime because React attempts to render an object as if it were a string. Nothing in the type system flagged the mismatch because nothing at the boundary defined what the response was supposed to be. This is where TypeScript either acts as a safety mechanism under change or becomes a thin layer of annotations. What follows is a practical look at how that same chatbot evolves into a production-safe system by making contracts explicit and boundaries deliberate. Phase One: Turning Assumptions into a Shared Contract The chatbot did not break because the change was complex. It broke because the change was invisible to the type system. On the frontend, state was typed as any[]. The API response was treated as whatever res.json() returned. On the backend, req.body was used without an explicit shape. From TypeScript’s perspective, there was nothing concrete to compare, so the change in response structure did not register as a problem. The fix was not adding defensive conditionals in the UI. It was introducing a shared domain contract and making both sides depend on it. Instead of allowing the frontend and backend to “just agree,” the system defines explicit types for: ChatMessage ChatRequest ChatReply ChatResponse These types live in a shared module that both the frontend and backend import. The frontend state becomes ChatMessage[]. The API call returns Promise<ChatResponse>. The backend handler constructs a value that must satisfy ChatResponse. At that point, the contract stops being an assumption and becomes code. If someone changes the shape of reply again, the compiler will force every dependent piece of code to reconcile with that change. The mismatch that previously appeared in the browser now appears during build. In practical terms, this shifts the feedback loop. Instead of discovering drift during manual testing or after deployment, the team discovers it the moment they try to compile. That difference seems small, but over time it fundamentally changes how safely a system can evolve. Phase Two: Making the Network Boundary Honest Introducing shared types stabilizes collaboration between frontend and backend. It does not solve everything. There is still one place where untyped data enters the system: the network boundary. On the backend, req.body arrives as raw JSON. On the frontend, res.json() returns data that TypeScript cannot inspect at runtime. Even with shared contracts, the system is still trusting external input. In the chatbot’s case, this matters more as the system grows. Deployments may not always be perfectly synchronized. A proxy or middleware layer might alter payloads. A partial rollout could temporarily mix versions of frontend and backend. Shared types alone cannot guard against that. The practical adjustment is simple but important: treat boundary data as unknown until it is validated. Instead of assuming that req.body matches ChatRequest, the backend checks that it actually does. Instead of assuming that res.json() returns a valid ChatResponse, the frontend verifies the shape before proceeding. These checks do not need to be elaborate. Lightweight type guards are enough to confirm that required properties exist and have the correct types. Once the data passes that validation step, the rest of the system can rely on strong typing with confidence. This introduces a clear separation of responsibilities: Outside the boundary, data is untrusted. Inside the boundary, data is guaranteed to match the domain contract. In day to day development, this prevents subtle corruption. Rather than allowing malformed data to move deeper into the UI or business logic, the system fails immediately at the edge. Errors become explicit and local instead of diffused and harder to trace. The chatbot remains small, but its architecture becomes more deliberate. The boundary is no longer a blind spot; it becomes a controlled entry point. Phase Three: Containing Vendor Volatility As the chatbot matures, another requirement arrives: support more than one LLM provider. This is a common inflection point. Early on, it is convenient to wire the backend directly to a single SDK. The response from the provider flows straight through the server and into the UI. It feels efficient. It also quietly couples your entire stack to a vendor’s response shape. If that vendor changes its format, or if you decide to introduce a second provider, the ripple effects can reach the frontend quickly. What began as a backend integration detail becomes a full-stack coordination problem. In the chatbot’s evolution, this risk is handled differently. Instead of exposing raw provider responses, the system defines a provider interface that returns a domain-level ChatReply. Each provider implementation adapts its own SDK response into that shared shape. The rest of the application does not know or care which provider generated the reply. It only understands the domain contract. This decision seems architectural, but it has very practical consequences. Switching providers or introducing a second one no longer forces a redesign of shared types. The volatility is contained. The surface area of change is smaller. TypeScript reinforces this separation. The compiler ensures that every provider implementation produces a valid ChatReply. The backend handler depends on the interface, not on vendor-specific JSON. In a growing system, this is what stability looks like. The parts that are likely to change are isolated behind clear contracts. The parts that need to remain steady, especially the frontend, are shielded from that churn. Phase Four: Making States Explicit as Features Expand Feature growth rarely stops at integration. The chatbot evolves again. Sometimes a response includes citations. Sometimes it does not. A quick solution would be to add optional fields. Over time, optional fields accumulate. The type becomes flexible, but also ambiguous. It becomes unclear which combinations are valid and which are accidental. Instead, the chatbot models these variations explicitly using a discriminated union. A response is either a plain answer or an answer with citations, and the kind field identifies which one it is. On the frontend, rendering logic switches on that kind. The exhaustive check ensures that every variant is handled. This design choice has a subtle but important effect. When a new response variant is introduced later, the compiler highlights every place that must adapt. Nothing slips through unnoticed. In everyday development, this reduces the risk of partial updates. The type system becomes a guide for refactoring, not just a static annotation layer. The chatbot still feels small. The difference is that its possible states are no longer implied. They are declared. Phase Five: Removing Quiet Type Erosion As the chatbot grows, new endpoints appear. Health checks. Admin actions. Maybe analytics or feedback capture. The API surface expands gradually. This is usually where small shortcuts start accumulating. A common one looks harmless: const data = (await res.json()) as ChatResponse; The cast makes the compiler quiet. It also shifts responsibility back to the developer. At the exact point where the system is most exposed to incorrect data, you are asserting that everything is fine. In a small codebase, this feels manageable. In a growing one, these assertions multiply. Over time, they erode the safety you thought TypeScript was providing. In the chatbot’s evolution, this problem is addressed structurally rather than procedurally. Instead of scattering casts, the system defines a mapping between route literals and their request and response types. The endpoint determines the shape. The generic client enforces it. Now the type of /api/chat is tied directly to ChatRequest and ChatResponse. You cannot accidentally call the wrong endpoint and pretend it returns something else. The compiler resolves the relationship based on the route itself. This removes a category of silent drift. It also makes the API surface self-documenting. When someone adds a new endpoint, they define its contract in one place, and the rest of the system aligns automatically. It is a small shift in structure, but it prevents gradual type erosion. What This Evolution Actually Achieved The chatbot still answers questions. The UI still renders messages. The architecture is not radically different from the initial proof of concept. What changed is where mistakes surface. At first, mismatches appeared in the browser. After shared contracts, they appeared during compilation. After boundary validation, they appeared at the edge of the system. After isolating providers, vendor changes stopped leaking across layers. After modeling variants explicitly, feature growth became safer. After tightening endpoint typing, unsafe assumptions stopped spreading quietly. None of these changes required advanced language features. They required clarity about boundaries and discipline about contracts. In a system that evolves under real-world pressure, assumptions are the most fragile dependency. TypeScript is most valuable when it turns those assumptions into enforceable structure. The chatbot did not become more sophisticated for its own sake. It became more predictable under change. For a deeper exploration, pre-order Clean Code with TypeScript. The book takes a detailed look at the evolving chatbot system and walks through the architectural decisions, trade-offs, and production considerations behind it. If you’re a PacktPub subscriber, you can access the Early Access version right away. This Week in the News ☁️ Cloudflare rebuilds Next.js on Vite: Cloudflare unveiled vinext, an experimental reimplementation of the Next.js API surface built on Vite, reportedly put together in a week using AI coding agents and the official Next.js test suite as a spec. Instead of adapting Next’s build output for non-Vercel platforms, Cloudflare rebuilt the framework layer itself to make deployment on its infrastructure more natural. vinext already supports routing, SSR, React Server Components, server actions, middleware, and both routing systems, passing about 94 percent of the Next 16 test suite. Cloudflare claims faster builds and smaller client bundles in early benchmarks, while calling the results directional. It is still early, but this is a bold signal in the ongoing platform versus framework conversation. 🅰️ Angular Skills for coding agents: Angular developers can now equip their coding agents with “Angular Skills,” a set of curated defaults and patterns designed to guide agents toward modern Angular best practices. The project packages conventions, structure, and tooling preferences so AI-assisted workflows generate code that feels aligned with today’s Angular ecosystem. Do agent skills materially improve output quality? That remains to be seen. At the very least, they formalize standards and make human intent more explicit, which may be half the battle in AI-assisted development. 🟢Node.js 24.14.0 LTS and 25.7.0 Current released: Node shipped both an LTS and a Current release this week, and this one is more than routine version churn. The LTS update tightens up async_hooks, improves fs.watch reliability, adds proxy configuration support, and begins exposing early ESM embedder API enhancements. If you’re running backend services, SSR stacks, or dev tooling that leans on Node internals, these changes are practical, not cosmetic. Meanwhile, 25.7.0 Current gives a preview of where the runtime is heading. Framework maintainers and teams with native modules should treat this as a signal to test early and avoid CI surprises later. 📈 OpenClaw briefly overtakes Python projects on GitHub: A retro game reimplementation project saw a spike in GitHub activity that temporarily outranked major Python repositories. While largely a trend metric, this serves as a reminder that GitHub stars and ranking spikes do not always reflect lasting ecosystem impact. For developers, this is a useful gut check. Popularity metrics can highlight energy, but they don’t always indicate production relevance or long-term impact. 🤖 Claude Code turns one as distillation dispute surfaces:Anthropic marked the first anniversary of Claude Code while raising concerns about competitors using Claude outputs to train rival models through large-scale distillation. The discussion moves beyond company rivalry and into deeper questions around model output ownership, competitive boundaries, and how AI tooling companies protect their work. For developers building AI-powered products, this matters. The ecosystem is still defining what is acceptable reuse, what is extraction, and where legal lines will be drawn. Tooling decisions today are increasingly shaped by these policy and governance shifts 🏛️ React moves to the Linux Foundation:React and React Native are now governed by a newly formed React Foundation under the Linux Foundation. This shifts stewardship from a single corporate sponsor to neutral, open governance. For teams betting their front end architecture on React, this reduces long-term platform risk. Governance stability may not feel urgent in daily development, but it quietly shapes the future of roadmaps, community trust, and ecosystem continuity. Beyond the Headlines 🦀 Ladybird adopts Rust for new components: The Ladybird browser project is moving new development to Rust, citing safety and maintainability. This isn’t just about language preference. It reflects the industry’s steady migration toward memory-safe systems programming in infrastructure-level code. The browser space has historically been C and C++. Rust’s continued expansion here signals that safety is becoming a baseline expectation, not a luxury. 🤖 The five stages of AI agents: A useful framework is emerging around how AI agents evolve: from basic task automation to more autonomous, goal-oriented systems. For developers experimenting with AI workflows, this gives structure to what can otherwise feel like hype. The takeaway is simple. Not every workflow needs autonomy. Understanding where your system sits on that spectrum prevents overengineering and keeps expectations grounded. 🧠 Mitchell Hashimoto on AI adoption: Mitchell Hashimoto, the co-founder of HashiCorp shared a candid look at integrating AI tools into his workflow. Not evangelism. Not backlash. Just a practical breakdown of where AI speeds things up and where it still falls short. That grounded middle space is where most developers are operating right now. AI is useful. It is not magic. And thoughtful integration beats blanket adoption. Refactoring production systems is risky, especially when API changes and hidden coupling are involved. In this Deep Engineering session, learn how to safely evolve real-world codebases using ast-grep and Claude Code, with practical guardrails you can apply immediately. Use code WDP40 to get 40% off your seat. Tool of the Week 🛡️ Zod Makes Runtime Validation Feel Native to TypeScript If you’ve ever trusted req.body a little too much or written as SomeType just to quiet the compiler, you already know the pain: TypeScript disappears at runtime. The type system keeps you safe inside your codebase, but JSON at the network boundary remains unchecked. Zod solves that gap cleanly. It’s a TypeScript-first schema validation library that lets you define runtime validation and static types in one place. You describe the shape once, validate incoming data against it, and automatically infer the TypeScript type. No duplication. No drift between interface and validator. The real value shows up under change. When your API evolves or a provider shifts its response format, Zod forces the mismatch to surface immediately at the boundary instead of leaking deeper into your system. It turns assumptions into enforced contracts. Good architecture is often about making edges explicit. Zod gives those edges structure. That’s all for this week. Have any ideas you want to see in the next article? Hit Reply! Cheers! Editor-in-chief, Kinnari Chohan SUBSCRIBE FOR MORE AND SHARE IT WITH A FRIEND! *{box-sizing:border-box}body{margin:0;padding:0}a[x-apple-data-detectors]{color:inherit!important;text-decoration:inherit!important}#MessageViewBody a{color:inherit;text-decoration:none}p{line-height:inherit}.desktop_hide,.desktop_hide table{mso-hide:all;display:none;max-height:0;overflow:hidden}.image_block img+div{display:none}sub,sup{font-size:75%;line-height:0}#converted-body .list_block ol,#converted-body .list_block ul,.body [class~=x_list_block] ol,.body [class~=x_list_block] ul,u+.body .list_block ol,u+.body .list_block ul{padding-left:20px} @media (max-width: 100%;display:block}.mobile_hide{min-height:0;max-height:0;max-width: 100%;overflow:hidden;font-size:0}.desktop_hide,.desktop_hide table{display:table!important;max-height:none!important}} @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} }
Read more
  • 0
  • 0
Unlock access to the largest independent learning library in Tech for FREE!
Get unlimited access to 7500+ expert-authored eBooks and video courses covering every tech area you can think of.
Renews at ₹800/month. Cancel anytime
Kinnari Chohan
16 Dec 2025
5 min read
Save for later

WebDevPro #122: Rise of LLM Powered agents

Kinnari Chohan
16 Dec 2025
5 min read
Real-world insights for sharper web dev decisionsAdvertise with Us|Sign Up to the Newsletter @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} }WebDevPro #122Rise of LLM Powered agentsReal-world insights for sharper web dev decisionsHi ,As the year winds down, there was one idea we kept coming back to and wanted to leave you with before the break.This is a short bonus note to close out the year, touching on a shift many teams are starting to notice, even if they’re not naming it yet.The quieter shift around AI agentsMuch of the conversation around AI agents still focuses on how they help teams work faster. That part is useful, but it may also be the least interesting aspect of what’s changing.A quieter shift is happening in how products are observed and operated once they are live.Most products do not fail in obvious ways. Things change gradually. A metric softens, user behaviour shifts slightly, or performance drifts away from what once felt normal. These changes are rarely dramatic, but they are easy to miss when attention is split and teams are busy moving forward.What agents are beginning to do well is take on that background attention. They sit alongside live systems, watch behaviour continuously, and surface changes that genuinely matter. This is not about adding more dashboards or alerts. It is about maintaining a steady sense of awareness without relying on someone remembering to check at the right time.From chatbots to agentic systemsOver the past couple of years, large language models (LLM) have reshaped how we think about AI. As their capabilities expanded, many teams started running into the same limitations when trying to use them in real systems:They lack long-term memory and lose context over timeThey wait for prompts instead of operating autonomouslyThey cannot naturally interact with live systems, APIs, or data sourcesAgentic systems emerged to bridge this gap.Instead of treating AI as something you talk to, agents are designed as systems that can observe, reason, and act over time. At a high level, this usually means combining an LLM with a few additional capabilities:Memory, so context carries across days or weeksPlanning, to break down goals into smaller stepsTool use, to interact with APIs, databases, and external servicesThe result is software that is less reactive and more continuous in how it operates.Where this shows up in practiceThis approach is already appearing in newer tools, especially around monitoring and operations. One example is Fload, which applies agent-based thinking to continuous product monitoring.Fload connects to app store data, revenue signals, and usage behaviour to maintain an evolving picture of how an app is performing over time. Instead of relying on periodic reviews or manual checks, the system focuses on noticing when patterns drift, not just when something breaks.In practice, this means:Watching performance continuously instead of weekly or monthlyHolding context about what “normal” looks like for a productHighlighting changes that indicate early risk or opportunityReducing the need for constant manual monitoringWhile Fload is built for mobile apps, the underlying idea is broadly relevant. As systems grow more complex, the cost of missed signals increases, and continuous attention becomes harder to sustain manually.A pattern worth paying attention toFor developers, none of this should feel unfamiliar. We already care about logs, monitoring, and observability. What agents add is continuity. They help systems remember, notice slow changes, and surface context before small issues compound into larger ones.This shift, from periodic checking to continuous watching, is likely to influence how we design products, pipelines, and operational workflows in the years ahead.If you’d like to see one real-world implementation of this idea, you can explore Fload here.Get instant answers on your app growth for freeThat’s it from us for the year.Thank you for reading, replying, and sharing WebDevPro through 2025. We’ll be back in January with fresh issues and new ideas. Until then, take a proper break.Cheers!Editor-in-chief,Kinnari ChohanHave any ideas you want to see in the next article? Hit Reply!SUBSCRIBE FOR MORE AND SHARE IT WITH A FRIEND!*{box-sizing:border-box}body{margin:0;padding:0}a[x-apple-data-detectors]{color:inherit!important;text-decoration:inherit!important}#MessageViewBody a{color:inherit;text-decoration:none}p{line-height:inherit}.desktop_hide,.desktop_hide table{mso-hide:all;display:none;max-height:0;overflow:hidden}.image_block img+div{display:none}sub,sup{font-size:75%;line-height:0}#converted-body .list_block ol,#converted-body .list_block ul,.body [class~=x_list_block] ol,.body [class~=x_list_block] ul,u+.body .list_block ol,u+.body .list_block ul{padding-left:20px} @media (max-width: 100%;display:block}.mobile_hide{min-height:0;max-height:0;max-width: 100%;overflow:hidden;font-size:0}.desktop_hide,.desktop_hide table{display:table!important;max-height:none!important}} @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} }
Read more
  • 0
  • 0

Kinnari Chohan
09 Jun 2025
10 min read
Save for later

WebDevPro #94: Angular Trims Down, Node Powers Ahead, Remix Evolves

Kinnari Chohan
09 Jun 2025
10 min read
Crafting the Web: Tips, Tools, and Trends for DevelopersAdvertise with Us|Sign Up to the Newsletter @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} }WebDevPro #94: Angular Trims Down, Node Powers Ahead, Remix Evolves 🌍🔍Crafting the Web: Tips, Tools, and Trends for DevelopersWeb Devs: Turn Your Knowledge Into IncomeBuild the knowledge base that will enable you to collaborate AI for years to come💰 Competitive Pay Structure⏰ Ultimate Flexibility🚀 Technical Requirements (No AI Experience Needed)Weekly payouts + remote work: The developer opportunity you've been waiting for!The flexible tech side hustle paying up to $50/hourAPPLY NOWHi ,This week’s stack is sharper, more secure, and increasingly self-aware. Angular steps into its zoneless future, Remix opens its doors to the community, and the npm ecosystem gets another wake-up call, this time from polymorphic malware. The AI conversation turns introspective, with Claude getting smarter (but secretive).Here's your tl;dr:🧠 Angular 20 lands – defer blocks, zoneless rendering, and performance-first updates.🛡️ npm malware alert – your config files and SSH keys are at risk.🧱 Remix grows up – governance, RFCs, and a steadier contributor experience.🌀 Anthropic Ends Windsurf’s Claude Access in Strategic Move Against OpenAI – no more direct access.🧰 Node doubled down – Config cleanup and smarter await? We’ll take it.📈 2025 dev forecast – AI, ethics, edge-native roles, and framework face-offs.Also worth your time: Learn React Hooks, 2nd Edition dropped, just in time for React 19. Custom hooks, cleaner state logic, and the end of class components; this one’s your upgrade guide.Got a tip or take? Send it our way and you might see it featured in WebDevPro!Advertise with usInterested in reaching our audience? Reply to this email or write to kinnaric@packt.com.Learn more about our sponsorship opportunities here.A better way to handle vendor security reviews?If you've ever dealt with vendor onboarding or third-party cloud audits, you know how painful it can be: long email chains, stale spreadsheets, and questionnaires that don’t reflect what’s actually happening in the cloud.We recently came across CloudVRM, and it’s a refreshingly modern take on the problem.Instead of asking vendors to fill out forms or send evidence, CloudVRM connects directly to their AWS, Azure, or GCP environments. It pulls real-time telemetry every 24 hours, flags misconfigs, and maps everything to compliance frameworks like SOC 2, ISO 27001, and DORA.It’s already being used by banks and infra-heavy orgs to speed up vendor approvals by 85% and reduce audit overhead by 90%.Worth checking out if you're building or maintaining systems in regulated environments, or just tired of spreadsheet security.Watch the demoLatest news: what's new in web development? 🧑‍💻 Frameworks leveled up, malware took aim, and AI stirred the pot (again). Here's what the web dev world chewed on this week.🧠 Angular 20 launches with smarter builds and zoneless progress: Angular’s latest update is all about performance and clean code vibes. With new defer blocks for surgical lazy loading and a move toward a zoneless future (yes, finally), it’s clear the Angular Renaissance isn’t just marketing.🟢 Double Node.js release day: config gets cleaner, await using expands: Node.js dropped not one but two updates recently. Version 22.16.0 introduces experimental support for node.config.json, paving the way for simpler, centralized project configs. Meanwhile, 24.1.0 builds on await usingsupport, pushing Node deeper into structured resource management territory. 🔗22.16.0 release notes🔗24.1.0 release notes🌀 No More Claude for Windsurf; Anthropic Protects Its Models from Rival Ecosystem: Claude now browses the web, but if you were hoping to peek behind the curtain, tough luck. Anthropic says its Windsurf stack won’t be shared, especially not with OpenAI. “Odd,” they said. Strategic, we read between the lines.🛡️ Node.js devs under fire; npm malware strikes again: Installing random npm packages without reading the docs? What is this, the wild west of 2015?A new polymorphic malware campaign is harvesting sensitive files from Node environments. Your .npmrc and SSH keys are not safe. Audit those dependencies or risk getting owned. Literally.📢 Remix opens up: new governance, more community control: Remix is going full open-source adulting. The framework now has RFCs, working groups, and a governance model that invites more voices to the table. Translation: fewer surprises, more stability, and maybe fewer tweets from angry contributors.Expert corner: what's the web community talking about?🎙The dev community’s looking ahead: Some cloning apps for fun, others predicting frameworks, ethics, and AI identity crises. 2025’s shaping up to be less about syntax, more about choices. And yes, vibe shifts included.🎥 CLI? GUI? Try LLM: Viktor Farcic demonstrates how AI can streamline interactions with IDPs. More intuitive than GUIs, more powerful than CLIs. From querying databases to spinning up infrastructure, we're heading toward a prompt-first future.🔭 The 2025 web dev forecast: AI, edge, and... ethics?: Expect more AI, fewer servers, and a rising need for ethical tech decisions. It’s a future full of promise and job titles that don’t exist yet. Edge-native empathy engineer, anyone?🧱 Framework face-off: what to keep an eye on in 2025: From React’s continued dominance to the rise of Qwik and Astro, the framework battlefield is getting crowded. The message? Choose wisely or you’ll be explaining your pick in every team meeting for the next year.🌀 Stack Overflow’s AI gamble and the dev identity crisis: Stack Overflow is leaning hard into AI to stay relevant, but in doing so, it might be redefining what it means to be a “developer.” Is AI the new stack, or just another tool in the belt? Existential crisis loading...📈 Web trends devs can’t ignore in 2025: Think accessibility-first, no-code/low-code evolution, and AI-as-co-pilot. TL;DR: If your stack isn’t flexing with user-centric design, you might be the bottleneck.Packt catalogue plus a bonus excerpt📚📘 Learn React Hooks, 2nd Edition by Daniel BuglReact 19 is here, and with it comes a sharper, cleaner, more powerful Hooks story. If you’re still reaching for useStateand calling it a day, this book is your next upgrade.Author Daniel Bugl walks you through everything, from building your first Hook-based app to writing custom Hooks, handling form actions, and replacing class components like it’s 2018 calling.Grab your copy!About the authorDaniel Bugl is a full-stack developer, product designer, and entrepreneur specializing in web technologies. He holds a BSc in business informatics and an MSc in data science from TU Wien. A contributor to open source and an active React community member, he founded TouchLay, a hardware/software startup helping businesses showcase their offerings. He’s also served as a technical advisor and full-stack dev for large enterprises and the Austrian government, building citizen services and more.Here’s an excerpt from the book that shows how to make state shareable, clean, and debounced, using a custom Hook that syncs with the URL without spamming history.Creating the Debounced History State HookLet’s now get started extracting the code from the CreatePost component into a DebouncedHistory State Hook:1. Copy the Chapter12_3 folder to a new Chapter12_4 folder by executing the following command: $ cp -R Chapter12_3 Chapter12_42. Open the new Chapter12_4 folder in VS Code.3. Create a new src/hooks/debouncedHistoryState.js file.4. Inside it, import the following: import { useState, useEffect } from 'react' import { useDebouncedCallback } from 'use-debounce' import { useHistoryState } from '@uidotdev/usehooks'5. Define a function that accepts an initial state and a timeout value for the debounce: export function useDebouncedHistoryState(initialState, timeout) {6. Now, define the History State Hook: const { state, set, undo, redo, clear, canUndo, canRedo } = useHistoryState(initialState)7. Next, define a State Hook for the actively edited content: const [content, setContent] = useState(initialState)8. Then, define a Debounced Callback Hook that will set the value of the History State Hook: const debounced = useDebouncedCallback((value) => set(value), timeout)9. Add the Effect Hook that we had before in the CreatePost component: useEffect(() => { debounced.cancel() setContent(state) }, [state, debounced])Remember, this Effect Hook is used to sync the History State back into the actively editedcontent state, meaning that it will change the content of the textbox whenever we triggerthe undo, redo, or clear functionality.10. Now, define a handler function which sets the content state and starts the debouncedcallback: function handleContentChange(e) { const { value } = e.target setContent(value)debounced(value)}11. Finally, return all the values and functions we need from the Hook:return { content, handleContentChange, undo, redo, clear, canUndo,canRedo }}We now have a drop-in replacement for the Debounced History State functionality, which is used in the CreatePostcomponent, so let’s implement it!AI in the spotlight 🔦🤖 Even Sundar Pichai’s vibe-coding nowVibe coding? You know it, you’ve seen it, you might already be doing it. Now Sundar Pichai’s officially on board. The Google CEO revealed he’s been spending time riffing with AI tools, coding by description, not syntax. If the guy running Google is vibe-coding, safe to say it’s more than just a phase.Developer tip of the week 💡🛠️ Don’t sleep on SCIMIf you’re building anything that touches user management for enterprise clients, SCIM (System for Cross-domain Identity Management) isn’t just a nice-to-have, it’s table stakes. This spec handles user provisioning, deprovisioning, and role updates automatically via APIs. Translation: no more janky sync scripts or angry IT teams. It’s the kind of protocol you won’t notice... until you desperately need it. Learn it before your biggest customer asks why you don’t support it.Keep a dev journal🌿Logging your daily wins, bugs, and lessons isn't just for retros, it's for you. A dev journal helps you track progress, spot patterns, and level up faster.Get started:📘 You should keep a developer’s journal – Stack Overflow🛠️ Flow by Invide – Minimalist dev journaling tool📋 Developer Brain Template – Notion MarketplaceStart small: jot down a few bullet points at the end of each day. Your future self will thank you!And that's a wrap 🎬Not every week reshapes your workflow but this one nudged the edges. From vibe-coding going mainstream to frameworks tightening up, and protocols like SCIM reminding us the boring bits still matter.Until next time, build thoughtfully.Cheers!Kinnari Chohan,Editor-in-chiefSUBSCRIBE FOR MORE AND SHARE IT WITH A FRIEND!*{box-sizing:border-box}body{margin:0;padding:0}a[x-apple-data-detectors]{color:inherit!important;text-decoration:inherit!important}#MessageViewBody a{color:inherit;text-decoration:none}p{line-height:inherit}.desktop_hide,.desktop_hide table{mso-hide:all;display:none;max-height:0;overflow:hidden}.image_block img+div{display:none}sub,sup{font-size:75%;line-height:0}#converted-body .list_block ol,#converted-body .list_block ul,.body [class~=x_list_block] ol,.body [class~=x_list_block] ul,u+.body .list_block ol,u+.body .list_block ul{padding-left:20px} @media (max-width: 100%;display:block}.mobile_hide{min-height:0;max-height:0;max-width: 100%;overflow:hidden;font-size:0}.desktop_hide,.desktop_hide table{display:table!important;max-height:none!important}} @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} }
Read more
  • 0
  • 0

Kinnari Chohan
16 Jun 2025
10 min read
Save for later

WebDevPro #95: Latest Django, Python, Spring Tools Releases + Meta AI Privacy Scare

Kinnari Chohan
16 Jun 2025
10 min read
Crafting the Web: Tips, Tools, and Trends for DevelopersAdvertise with Us|Sign Up to the Newsletter @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} }WebDevPro #95: Latest Django, Python, Spring Tools Releases + Meta AI Privacy Scare 🌍🔍Crafting the Web: Tips, Tools, and Trends for DevelopersGet hands-on with MCP!Join us on July 19 for a 150-minute interactive MCP Workshop. Go beyond theory and learn how to build and ship real-world MCP solutions. Limited spots available! Reserve your seat today.Use code EARLY35 for 35% off Hi ,Bugfixes, AI upgrades, security alarms and one privacy blunder that has everyone talking. From core tooling like Django, Spring, and Python getting critical fixes, to OpenAI's smoother GPT-4o and a major misstep in Meta’s AI app design, this week’s webdev round-up is packed with updates that may not make the front page, but absolutely belong in your workflow.Here’s your quick brief:🛠️ Django 5.0.6 and 4.2.13 patch packaging bugs for smoother rollouts🌱 Spring Tools 4.31.0 brings sharper AOT query insight and Spring Boot 3.5 support🐍 Python 3.13.5 fixes a Windows regression affecting extension modules🤖 GPT-4o’s June update improves memory, function calls, and multimodal stability🕵️‍♂️ Meta’s AI app stirs privacy concerns after users share personal data publicly, unknowinglyIn the Expert corner, devs debate the value of Rust compiler speed, explore the rise of passkeys in Spring Security, and unpack how prompt-first AI design could reshape tooling entirely. Read Benj Edward’s o3-pro take or see how David Crawshaw wrestles with AI agents in real workflows.📘 This week’s book pick: Practical Serverless and Microservices with C#.Whether you’re scaling with Azure Functions or simplifying microservices with .NET Aspire, this guide hits both breadth and depth. Grab your copy today!Got a tip or take? Send it our way and you might see it featured in WebDevPro!Advertise with usInterested in reaching our audience? Reply to this email or write to kinnaric@packt.com.Learn more about our sponsorship opportunities here.Latest news: what's new in web development? 🧑‍💻 From framework fixes to AI feature upgrades (and one major privacy red flag), this week’s updates span the tools and topics shaping modern development. Whether you're deep in Python, Spring, or just keeping an eye on AI evolutions, here’s what’s worth your attention.🛠️ Django 5.0.6 and 4.2.13 Bugfix Releases: Django has issued bugfix releases 5.0.6 and 4.2.13, which are reissues of the previous 5.0.5 and 4.2.12 versions. These updates address packaging errors and ensure the stability and reliability of the framework for ongoing projects.🌱 Spring Tools 4.31.0 Sharpens the Dev Toolkit:The latest Spring Tools update brings smoother support for Spring Boot 3.5, better code navigation in VSCode/Eclipse with hierarchical symbols, and improved AOT query visibility. Plus, it’s fully compatible with the Eclipse 2025-06 release.🐍 Python 3.13.5 Fixes Windows Regression: Python 3.13.5 has been released to address a regression affecting Windows users, specifically an issue with the pyconfig.h file in the traditional installer. This fix ensures that extension module builds specify Py_GIL_DISABLED when targeting the free-threaded runtime, maintaining compatibility and stability for developers working on Windows platforms.🤖 OpenAI GPT-4o June Update: Enhanced Functionality:OpenAI has rolled out updates to GPT-4o, focusing on improving system behavior based on user feedback. Enhancements include more reliable memory usage, improved function calling accuracy, and increased stability in multi-modal interactions. These updates aim to make GPT-4o more intuitive and effective across various tasks.🕵️‍♂️ Meta AI App Raises Privacy Concerns:Meta's AI app, launched in April 2025, has come under scrutiny for potential privacy issues. The app features a "Discover" feed where users can share their interactions with the AI chatbot. However, many users have inadvertently shared sensitive information, including personal medical issues and legal matters, often linked to identifiable Instagram profiles. Privacy advocates express concern over users' misunderstanding of the visibility and privacy of their data.Focus mode: On (ft. Beats)🎧 Your code has a rhythm. Your focus should too. This week, we’re tuning into music that powers better dev sessions:Need Deep Flow? Try Endel for AI-generated soundscapes that sync with your circadian rhythm. Think: personalized ambient playlists that cut through noise (literally).Science-Backed Beats: Brain.fm is built on neuroscience. Their “Focus” mode has been shown to improve attention within 15 minutes—perfect for getting into deep work fast.Curated for Coders: Explore Programming Music, a GitHub-curated list of playlists and albums tailored for developers. From ambient to electronic, find your perfect coding soundtrack.Because sometimes the best productivity tool... is a good pair of headphones.Expert corner: what's the web community talking about?🎙What are developers really talking about right now? Whether it’s speculative AI, secure auth, or the eternal love-hate with compilers, this week’s community picks capture the pulse.🧠 Decoding AI "Reasoning" with OpenAI's o3-pro: Viktor Farcic demonstrates how AI can streamline interactions with IDPs. More intuitive than GUIs, more powerful than CLIs. From querying databases to spinning up infrastructure, we're heading toward a prompt-first future.🎙️ Exploring Passkeys with Spring Security:In a recent episode of A Bootiful Podcast, Daniel Garnier-Moiroux delves into the integration of passkeys within Spring Security applications. The discussion offers valuable insights into enhancing authentication mechanisms and the evolving landscape of web security.💰 Meta's $15 Billion Bet on Superintelligence:Meta is reportedly investing $15 billion to pursue the development of computerised "superintelligence," aiming to surpass current AI capabilities. This strategic move includes acquiring a significant stake in Scale AI and reflects Meta's ambition to regain its position in the AI race. The initiative has prompted discussions about the feasibility and ethical considerations of such advancements.🦀 Rust's Compiler Performance Debate:A thought-provoking blog post questions why Rust doesn't prioritize compiler performance more aggressively. The author suggests that while compiler speed is important, it's just one of many aspects the Rust community balances to maintain the language's robustness and safety guarantees.🤖 Programming with AI Agents:David Crawshaw shares his experiences and challenges in integrating AI agents into programming workflows. He emphasizes the importance of understanding the limitations and potential of agents, advocating for a balanced approach that combines human intuition with AI assistance.Packt catalogue plus a bonus excerpt📚📘 Practical Serverless and Microservices with C# by Gabriel Baptista and Francesco AbbruzzeseLearn how to build secure, scalable apps using Azure Functions, Container Apps, and .NET Aspire. This book shows you when to use microservices and serverless and when not to, while guiding you through real-world scenarios, cost planning, and best practices for cloud-native development.Pre-order now!Meet Gabriel...Gabriel Baptista is a tech leader with 20+ years in software development. He heads a team building retail and industrial apps, serves on a tech advisory board, teaches computer engineering, and co-founded start-ups in automation and logistics. He’s also taught software and IT at multiple institutions....and FrancescoFrancesco Abbruzzese, author of the MVC and Blazor Controls Toolkits, has championed the Microsoft web stack since ASP.NET MVC's inception. His company, Mvcct Team, builds web apps, tools, and services. He began with AI-based financial decision systems and later contributed to top-10 games like Puma Street Soccer.If you’ve worked with Kubernetes for local microservices testing, you know the setup can be heavy. In this excerpt from Practical Serverless and Microservices Applications with C# and Azure, see how the same scenario is simplified using .NET Aspire — a lighter, code-first way to orchestrate microservices locally:Using .NET Aspire in practiceIn this section, we will adapt the Kubernetes exampleto run with Aspire. As a first step, let’s copy the whole solution folder into another in a different location, so we can modify it without destroying the previous version.Then, let’s execute the following steps to prepare the overall solution:Add a new App Host project to the solution and call it CarSharingAppHost.Add a new .NET Aspire Service Defaults project to the solution and call it CarSharingServiceDefaults.Add a reference to the FakeSource, FakeDestination, and RoutesPlanning projects to the CarSharingAppHost Add a reference to the CarSharingServiceDefaults project to the FakeSource, FakeDestination, and RoutesPlanning Right-click on the CarSharingAppHost project and, in the menu that appears, select Set as Startup Project.The preceding steps prepare the solution for .NET Aspire. Now, let’s start modifying the code. As a first step, we must add service defaults to all the microservices. Therefore, let’s add builder.AddServiceDefaults(); to the program.cs file of the FakeSource, FakeDestination, and RoutesPlanning projects. Then, we must add app.MapDefaultEndpoints(), which adds health endpoints just to the program.cs file of the RoutesPlanning project, since it is the only web project that we have among our microservices. It must be placed as shown here:var app = builder.Build();app.MapDefaultEndpoints();Now, let’s remember that we added all the microservices parameters as environment variables in their Properties/launcheSettings.json file. We placed them in the Docker launch settings. Now, since these projects will not use Docker anymore while running in Aspire, we must copy all these definitions into the other launch setting profile.This is the launch settings code of the RoutesPlanning project after this change:{"profiles": {"http": {"commandName": "Project","environmentVariables": {//place here your environment variables"ConnectionStrings__DefaultConnection": "Server=localhost;Database=RoutesPlanning;User Id=sa;Password=Passw0rd_;Trust Server Certificate=True;MultipleActiveResultSets=true","ConnectionStrings__RabbitMQConnection": "host=localhost:5672;username=guest;password=_myguest;publisherConfirms=true;timeout=10","Messages__SubscriptionIdPrefix": "routesPlanning","Topology__MaxDistanceKm": "50","Topology__MaxMatches": "5","Timing__HousekeepingIntervalHours": "48","Timing__HousekeepingDelayDays": "10","Timing__OutputEmptyDelayMS": "500","Timing__OutputBatchCount": "10","Timing__OutputRequeueDelayMin": "5","Timing__OutputCircuitBreakMin": "4"},"dotnetRunMessages": true,"applicationUrl": "http://localhost:5212"},"Container (Dockerfile)": {……Want the full walkthrough with real code, resource config, and deployment guidance?Pre-order the book!Developer tip of the week 💡🔐 Mastering OAuth 2.0: Secure Authorization SimplifiedUnderstanding OAuth 2.0 is crucial for modern web development, especially when dealing with third-party integrations. OAuth 2.0 allows users to grant limited access to their resources without sharing credentials. For instance, enabling an application to access your profile data without exposing your password.Key components of the OAuth 2.0 flow include:Resource Owner: The user who authorizes access.Client: The application requesting access.Authorization Server: Validates the user and issues access tokens.Resource Server: Hosts the protected resources.A typical flow involves the user authorizing the client, the client receiving an authorization grant, exchanging it for an access token from the authorization server, and then accessing the resource server using that token.And that's a wrap 🎬Another week, another stack of updates, hot takes, and low-key chaos. If your brain’s buzzing with thoughts, tools, or spicy dev opinions, don’t gatekeep.Until next time.Cheers!Kinnari Chohan,Editor-in-chiefSUBSCRIBE FOR MORE AND SHARE IT WITH A FRIEND!*{box-sizing:border-box}body{margin:0;padding:0}a[x-apple-data-detectors]{color:inherit!important;text-decoration:inherit!important}#MessageViewBody a{color:inherit;text-decoration:none}p{line-height:inherit}.desktop_hide,.desktop_hide table{mso-hide:all;display:none;max-height:0;overflow:hidden}.image_block img+div{display:none}sub,sup{font-size:75%;line-height:0}#converted-body .list_block ol,#converted-body .list_block ul,.body [class~=x_list_block] ol,.body [class~=x_list_block] ul,u+.body .list_block ol,u+.body .list_block ul{padding-left:20px} @media (max-width: 100%;display:block}.mobile_hide{min-height:0;max-height:0;max-width: 100%;overflow:hidden;font-size:0}.desktop_hide,.desktop_hide table{display:table!important;max-height:none!important}} @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} }
Read more
  • 0
  • 0

Kinnari Chohan
23 Jun 2025
8 min read
Save for later

WebDevPro #96: Smarter Python, Gemini’s Leaner AI, Tidier Laravel, and Fresh Insights from Miško Hevery

Kinnari Chohan
23 Jun 2025
8 min read
Crafting the Web: Tips, Tools, and Trends for Developers Advertise with Us|Sign Up to the Newsletter @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } WebDevPro #96: Smarter Python, Gemini’s Leaner AI, Tidier Laravel, and Fresh Insights from Miško Hevery 🌍🔍 Crafting the Web: Tips, Tools, and Trends for Developers Scale Smarter with MCP – Secure your Spot at 35% Off 🔥 Last chance to book at 35% OFF. Prices go up Tuesday! SAVE YOUR SPOT at 35% OFF — use code EARLY35 at checkout Hi , Welcome to WebDevPro #96. This week’s round-up packs sharp updates you’ll actually care about: 👥 State of React 2025: Redux’s Mark Erikson urges a healthier, more open React community. 🤖 Google launches production-ready Gemini 2.5 AI models: Google’s fastest AI yet, with new Pro and Flash-Lite models for scale. 🎤 TanStack Start vs. Next.js: Omer Syed on bleeding edge versus battle-tested. 🔦 Misko Hevery on Angular and LLMs: Why AI is your copilot but you're still in control. Want to be featured in WebDevPro? Share your tips or takes, we’re all ears! Advertise with us Interested in reaching our audience? Reply to this email or write to kinnaric@packt.com. Learn more about our sponsorship opportunities here. Latest news: what's new in web development? 🧑‍💻 🐍 Python 3.14.0b3 Now Available: Python 3.14’s third beta is out and it’s not holding back. We’re getting template strings, a tail-call-optimized interpreter, and remote debugging via pdb. It also brings Sigstore-based release signing, ditching old-school PGP. If you’re tracking Python’s evolution, this beta is a serious step forward. ⚙️ Laravel 12.0.11 Ships: Laravel 12.0.11 dropped with cleaner type declarations and a tidier .gitignore. It’s one of those updates that won’t break a thing but still makes your project feel better maintained. Good news for teams using static analysis tools. It’s small, but sharp. 🌱 Spring Framework Updates: The Spring team quietly pushed out updates across its ecosystem. Web Services, Vault, Pulsar, and the Authorization Server all got maintenance releases. These are bug-fix heavy with a few minor enhancements sprinkled in. Nothing flashy—but stability is a feature, right? 🤖 Gemini 2.5 Lands: Google Brings the Heat: Gemini 2.5 is here in Pro and Flash flavors, with Flash-Lite making its debut as Google’s leanest model yet. It’s fast, cheap, and built for high-volume apps. With multimodal input and longer context windows, Google’s aiming squarely at OpenAI’s turf. The AI race just got more crowded. 🗄️ pg_auto_reindexer v15 Released: PostgreSQL’s index cleaner just leveled up. Version 15 adds support for PG15, improves worker management, and trims bloat without locking your DB. It’s exactly the kind of tool you want running quietly in the background. Smart, efficient, and unassuming. Smarter breaks: Your brain’s best friend 🧠 Your brain wasn’t built for nonstop standups and JSX. Quick, intentional breaks can sharpen focus and cut down errors. But what should you do during a break? ⏳ Stack them into a 5-minute reset - twice a day is all it takes for sharper, healthier flow. Try these dev-friendly micro-breaks: 👀 Use Time Out (macOS) or Stretchly (Windows/Linux/macOS) to get regular reminders to pause and look away. 🤲 Follow this 2-minute wrist stretch routine to ease stiffness and reduce RSI risk. Ideal between commits. 🌿 Try Headspace’s 1-minute meditation to clear your head without leaving your desk. Expert corner: what's the web community talking about?🎙 ⚛️ TanStack Start vs. Next.js: Choosing the Right React Framework: In this deep technical comparison, Omer Syed explores how TanStack Start stacks up against the battle-tested Next.js for full-stack React development. While Next.js shines with its ecosystem and file-based routing, TanStack leans into cutting-edge primitives like React Server Components and deeply integrated caching. It’s a thoughtful breakdown for devs choosing between playing it safe or going fully modern, ideal for those who want performance and type safety from the start. 🧑‍🤝‍🧑 State of React and the Community in 2025: Redux maintainer Mark Erikson delivers an honest reflection on the cultural and communication challenges within the React ecosystem, from maintainer burnout to unclear roadmaps. By offering constructive suggestions and much-needed transparency, the post goes beyond code. It’s a call for a healthier, more collaborative open source culture that React developers can rally around. 🎨 Frontend Magic: Beyond the Usual Tricks: Kaiwen Wang shares a sharp and elegant list of underused frontend techniques like overflow: clip subtleties, scroll-boundary-behavior, and other layout-level optimizations. These aren’t your typical tips. They are the kind of details that turn good UIs into great ones. It’s a goldmine for frontend developers who love refining the edges of performance, polish, and user experience. Developer tip of the week 💡 Debug like a Pro with console.count() Next time you’re tracing tricky code paths, skip the manual counters and console.logspam. 👉 Drop console.count('myLabel') anywhere — it auto-tracks how many times that line runs. Example: function handleClick() { console.count('Click handler called'); // your logic } You’ll spot loops, duplicate events, or unexpected calls at a glance - no setup, no cleanup. 📌 Bonus: Use console.countReset('myLabel') to reset counts between flows. Packt catalogue: must read dev books📚 📘 Mastering Restful Web Services with Java by Marián Varga, Pedro Andrade, Silvio de Morais, Thiago Bomfim, and Igor Fraga A practical, hands-on guide to designing, building, documenting, testing, and deploying RESTful APIs using modern Java frameworks. Packed with examples, this book helps backend developers create scalable, secure, and production-ready APIs using Spring Boot, OpenAPI, and beyond. 📘 Covers full REST API lifecycle from design to deployment 🧪 Includes testing strategies with AI-powered tools like ChatGPT 🔒 Focus on security, observability, and performance tuning 🐳 Hands-on with Spring Boot, OpenAPI, Docker, and more Grab your copy! Exclusive expert spotlight: Miško Hevery on Angular, LLMs, and the future of development 🎤 This week we’re back with Miško Hevery, creator of Angular and Qwik, and currently CTO at Builder.io. With a career dedicated to building fast and scalable web apps, Miško has helped shape how modern development is done at scale. In this follow-up interview, Miško shares his thoughts on where LLMs add real value, why human understanding still matters, and what developers should focus on learning today. 🎥 Watch the clip onX. Follow us on WebDevPro for more dev insights and hot takes. Would learning a framework like Angular still be relevant in the years to come, or will AI and LLMs take over most of development? No, I think at the end of the day, you still need to understand things. LLMs are like expert systems—they’re great at answering your questions, but you're still the one driving. Maybe one day, LLMs will do all the driving, but we’re far from that. Right now, you still need to be aware of what’s going on. LLMs are fantastic for helping you translate knowledge—like asking, “I know how to do this in Angular, how would I do it in React?” They’re accelerators, not replacements. Think of it this way: if no one had written content about frameworks, LLMs wouldn't be able to help. They rely on the massive body of blog posts, tutorials, and docs that already exist. You can think of them as compressing all that shared knowledge into a usable form. But you’re still in the driver’s seat. You’re still making decisions. LLMs can make you more productive—maybe even reduce the need for two extra engineers—but they don’t replace the developer. Not yet. 🎬 That’s your scoop from the dev-verse this week.If your brain’s buzzing with ideas or feedback, hit reply. Until next week. Cheers! Kinnari Chohan, Editor-in-chief SUBSCRIBE FOR MORE AND SHARE IT WITH A FRIEND! *{box-sizing:border-box}body{margin:0;padding:0}a[x-apple-data-detectors]{color:inherit!important;text-decoration:inherit!important}#MessageViewBody a{color:inherit;text-decoration:none}p{line-height:inherit}.desktop_hide,.desktop_hide table{mso-hide:all;display:none;max-height:0;overflow:hidden}.image_block img+div{display:none}sub,sup{font-size:75%;line-height:0}#converted-body .list_block ol,#converted-body .list_block ul,.body [class~=x_list_block] ol,.body [class~=x_list_block] ul,u+.body .list_block ol,u+.body .list_block ul{padding-left:20px} @media (max-width: 100%;display:block}.mobile_hide{min-height:0;max-height:0;max-width: 100%;overflow:hidden;font-size:0}.desktop_hide,.desktop_hide table{display:table!important;max-height:none!important}} @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} }
Read more
  • 1
  • 1
Kinnari Chohan
30 Jun 2025
6 min read
Save for later

WebDevPro #97: LTS-Level Node Upgrades, Rust Introduces Let Chains, Claude Now Lets You Create Apps in Chat

Kinnari Chohan
30 Jun 2025
6 min read
Crafting the Web: Tips, Tools, and Trends for Developers Advertise with Us|Sign Up to the Newsletter @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } WebDevPro #97: LTS-Level Node Upgrades, Rust Introduces Let Chains, Claude Now Lets You Create Apps in Chat 🌍🔍 Crafting the Web: Tips, Tools, and Trends for Developers Hi , Welcome to WebDevPro #97! This week brings updates that you will want to bookmark. Let's start with the highlights: 🟢 Node.js v24.3.0 & v22.17.0 LTS Released: V8 upgrades, better diagnostics, and more stable production builds 🦀 Rust 1.88 Sharpens Safety and Extensibility: Adds non-exhaustive traits, assume intrinsic, and wildcard Cargo features 🧠 GitHub CEO: Manual Coding Still Matters: Thomas Dohmke reminds devs they're still essential—even in the AI era 📄 Claude’s “Artifacts” Feature: Turn chats into editable, versionable documents for collaborative projects ✨ Gemini CLI as Your AI Agent: Google’s new tool makes terminal scripting cleaner and AI-assisted We’ve rounded up releases, tools, and expert takes that sharpen your workflow and won’t waste your time. Scroll down and dig in. Latest news: what's new in web development? 🧑‍💻 🟢 Node.js v24.3.0 & v22.17.0 LTS Released: This week’s Node.js update delivers something for everyone. The current version, v24.3.0, upgrades to V8 12.4 and brings improved performance diagnostics and bug fixes. Meanwhile, v22.17.0 (LTS) is a stability-focused release with important security patches and production-ready enhancements. 🦀 Rust 1.88 Sharpens Safety and Extensibility: Rust 1.88.0 adds support for #[non_exhaustive] on traits, letting library authors design more resilient APIs. The release also introduces a new assume intrinsic for unsafe code optimizations and brings glob pattern support to Cargo’s --features flag. Clean, smart, and built for scale. 💡 Google Debuts Gemini CLI as an AI Agent for Your Terminal: Google’s Gemini CLI is now open source and ready to streamline dev workflows. It’s built for scripting, automation, and direct integration with Gemini models, right from your local terminal. Think AI-assisted coding, testing, and deployment all within reach of a simple command. 🧠 Claude’s New “Artifacts” Feature Adds Collaborative Muscle: Anthropic’s Claude just got a major UX upgrade. The new Artifacts feature turns conversations into editable, persistent code or content blocks, right inside the interface. This lets you iterate, refine, and co-develop with Claude in a much more interactive way. Ideal for code, writing, and docs. 📦 JSON Imports Now Baseline Across Major Browsers: Importing JSON just got simpler; no bundler tricks required. That means you can now import data from './file.json' directly in your modules. It’s a small change with big cleanup potential for modern JavaScript projects. ☕ Jakarta EE 11 Is Official with Java 21 Support: Jakarta EE 11 has landed, marking the platform’s first feature release under a faster, six-month cadence. It adds support for Java 21, introduces a leaner Core Profile for modern workloads, and reaffirms Jakarta’s push toward cloud-native enterprise Java. This is the most forward-looking EE release in years. Eyes on the prize, not the strain 👁️ After a marathon of debugging and deployments, your eyes deserve a break. Whether you’ve been wrangling flexboxes or frameworks, this one’s for you. Try the 20-20-20 Rule: Every 20 minutes, look at something 20 feet away for 20 seconds. This quick habit helps reduce digital eye strain, boost focus, and protect long-term eye health. 🔬 Learn the science behind it: How a simple visual reset can make a big difference. 🧘 Get a gentle reminder: Install the 20-20-20 EyeCare Chrome extension, it’ll nudge you to take breaks before the fatigue kicks in. Expert corner: what's the web community talking about?🎙 🧠 GitHub CEO says AI Can’t Replace Manual Coding (Yet): In a recent interview with The New Stack, GitHub CEO Thomas Dohmke emphasized that AI is a productivity enhancer, not a replacement for human developers. His message echoes a growing sentiment in the dev community: large language models are powerful tools, but understanding how and why your code works still matters more than ever. ⚡️ Python devs meet ‘uv’ the new pip for lightning-fast Docker builds: Nick Janetakis dives into switching from pip to uv, a new ultra-fast Python package installer. The result? Dramatically faster Docker image builds, especially for Flask or Django apps. If you're optimizing for CI/CD speed, this swap might be your new secret weapon. 🛠️ Building AI Text Apps with React + Vite + OpenAI: This DZone tutorial breaks down how to spin up an AI-powered text analysis app using React, Vite, and the OpenAI API. Beyond the basics, it covers token management, real-time user interaction, and prompt engineering tips. Ideal if you're exploring LLM integration in frontend workflows. 🔄 Event-Driven Architectures Meet MCP for Maximum Flexibility: If you're exploring ways to simplify asynchronous workflows in complex systems, this intro to Multi-Channel Processing (MCP) shows how it can complement event-driven architectures. It's a high-level overview, but useful if you're mapping patterns for large-scale service orchestration. ⚛️ Preact Signals rethink state with zero virtual DOM fuss: Preact’s signals are gaining traction among performance-first JavaScript developers. This guide explains how they deliver fine-grained reactivity without the overhead of virtual DOM diffing or excessive state management. A strong case for rethinking the state in lean web apps. Want to be featured in WebDevPro? Share your tips or takes, we’re all ears! Workshop: Unpack OWASP Top 10 LLMs with Snyk REGISTER TODAY Join Snyk and OWASP Leader Vandana Verma Sehgal on Tuesday, July 15 at 11:00AM ET for a live session covering: ✓ The top LLM vulnerabilities ✓ Proven best practices for securing AI-generated code ✓ Snyk’s AI-powered tools automate and scale secure dev. See live demos plus earn 1 CPE credit! Advertise with us Interested in reaching our audience? Reply to this email or write to kinnaric@packt.com. Learn more about our sponsorship opportunities here. Packt catalogue: must read dev books📚 📘 Practical Serverless and Microservices with C# on Azure by Gabriel Baptista and Francesco Abbruzzese This book helps C# developers transition to cloud-native thinking by building scalable, event-driven systems using Azure services. It's hands-on, practical, and tailored to real-world production needs. Why pick it up: ✅ Learn how to build serverless APIs with Azure Functions ✅ Apply microservices architecture patterns in C# ✅ Master event-driven workflows using Event Grid and Service Bus Grab your copy! 🎬 That’s your scoop from the dev-verse this week.If your brain’s buzzing with ideas or feedback, hit reply. Until next week. Cheers! Kinnari Chohan, Editor-in-chief SUBSCRIBE FOR MORE AND SHARE IT WITH A FRIEND! *{box-sizing:border-box}body{margin:0;padding:0}a[x-apple-data-detectors]{color:inherit!important;text-decoration:inherit!important}#MessageViewBody a{color:inherit;text-decoration:none}p{line-height:inherit}.desktop_hide,.desktop_hide table{mso-hide:all;display:none;max-height:0;overflow:hidden}.image_block img+div{display:none}sub,sup{font-size:75%;line-height:0}#converted-body .list_block ol,#converted-body .list_block ul,.body [class~=x_list_block] ol,.body [class~=x_list_block] ul,u+.body .list_block ol,u+.body .list_block ul{padding-left:20px} @media (max-width: 100%;display:block}.mobile_hide{min-height:0;max-height:0;max-width: 100%;overflow:hidden;font-size:0}.desktop_hide,.desktop_hide table{display:table!important;max-height:none!important}} @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} }
Read more
  • 0
  • 0

Kinnari Chohan
07 Jul 2025
10 min read
Save for later

WebDevPro #98: Why Thoughtful System Design Begins with Clear Intent

Kinnari Chohan
07 Jul 2025
10 min read
Real-world insights for sharper web dev decisions Advertise with Us|Sign Up to the Newsletter @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } WebDevPro #98: Why Thoughtful System Design Begins with Clear Intent Real-world insights for sharper web dev decisions Hi , Welcome to WebDevPro #98! This time, we’re bringing you something different. Not the news, but the thinking behind the build. This feature unpacks a practical approach to system design: the one that starts with clarity, not code. It’s based on the ideas from Spring System Design in Practice by Rodrigo Santiago, and reframed here through the lens of day-to-day product work. If you’ve ever found yourself untangling a feature too late in the game, this one’s for you. We walk through how product decisions become service boundaries, how design artefacts stack to reduce guesswork, and how to avoid building logic that doesn’t belong. Along the way, you’ll see what it takes to move from an initial idea to a clean, testable implementation. Have any ideas you want to see in the next article? Hit Reply! Your editor, Kinnari Chohan Advertise with us Interested in reaching our audience? Reply to this email or write to kinnaric@packt.com. Learn more about our sponsorship opportunities here. Why Product Blueprints Outlive Code Spend long enough shipping web products and you’ll notice a pattern: failed launches rarely crumble under the weight of sophisticated concurrency bugs or obscure network edge-cases. They fail because the team never fully aligned on the problem the software was meant to solve, how success would be measured, or where one person’s responsibility ended and another’s began. The code just makes those early omissions visible. This piece walks through a lightweight approach for turning raw business ideas into production-ready microservices, without over-engineering or skipping the fundamentals. You’ll learn how to: Turn fuzzy requests into precise, testable requirements Translate those into a roadmap every stakeholder can follow Model domains and verbs so APIs stay expressive, not entangled Sketch sequence diagrams that surface integration risks before any code is written We’ll use a fictional rental platform, HomeIt, to ground the examples. It’s a thin wrapper around problems every web engineer encounters: user registration, content publishing, payments, external partners, and traffic spikes. 1 | Start with the Why and Perfect your Business Requirements A well-written requirement is one of the most valuable assets in software development. When it’s incomplete or unclear, the consequences pile up: months of code thrown away, critical flows missing at release, integration bugs appearing late in QA, and launch delays that sap morale and budgets. Functional versus non-functional requirements Functional requirements spell out what the system should do: “support Visa payments,” “let tenants send rental proposals.” Non-functional requirements describe how well it should do it: “process a thousand payments per minute,” “remain available during a regional outage.” One creates value; the other safeguards it. Both are essential. The quickest way to surface missing pieces is to walk through two states with product owners or clients: Undesirable present: What pain are we addressing? Desired future: What observable outcome shows that the pain is gone? Push for measurable indicators (“mean payment latency under 200 ms”, “95 % of image uploads processed within 30 s”) and ask about edge-cases: alternate user behaviors, upstream service failures, peak-hour traffic. Capture the answers in a living requirements document; it becomes the north star for architecture, test plans, and scalability budgeting. 2 | How to Sort Ideas and Build an Executable Roadmap Brainstorms fill whiteboards. Backlogs create movement. In our HomeIt app, the product trio collected dozens of nice-to-have features: messaging, realtor partnerships, and payment automation. To sequence them, they scored each idea on vision, size of problem, ROI, cost, dependencies, and uniqueness. The top results told a compelling story: Property search (121) needed to go first, it underpinned everything else. Messaging followed closely (118). Realtor partnerships came in later (91). Once a feature rose to the top, the team moved it through four layers of refinement: Feature statement: A single-sentence promise of value. User journey: A narrative of an actor reaching a goal through the system. Use cases: Structured exchanges of inputs and outputs that frame expectations. Stories: Sprint-sized, INVEST-friendly tasks. For example, take “Tenant sends a rental proposal”. It starts as a journey and breaks into use-case steps (identify property, compose proposal, landlord reviews, tenant receives result) and finally into sprintable sizes such as “Persist proposal draft” or “Notify landlord.” This funnel keeps developers focused and stakeholders clear on progress without diving into implementation details. Once shaped, features are locked into quarterly increments. Twelve weeks is short enough to stay responsive to learning yet long enough to deliver a coherent slice of customer value. 3 | Model the Nouns Before You Shape the Domains Once your user stories are refined, underline every noun. That simple step reveals the backbone of your system. In HomeIt those nouns include Rental Property, Rental Proposal, Payment, User; each a potential domain. A domain deserves isolation when it owns a clear life-cycle (inactive → published), encapsulates its own rules, can scale independently, and can evolve without side effects for adjacent parts of the system. Mapping out these relationships sharpens shared understanding. Even a basic domain diagram – boxes for entities, verbs on arrows – can clarify the system on a single page. From that, teams can shape schemas, define service boundaries, or plan event topics. Take the Rental Property domain in HomeIt, for example. It moves through inactive → processing media → ready → published as a landlord uploads photos and clears validations. Naming those transitions early helped the team prepare for asynchronous workflows and plan for safe, repeatable state updates, long before a single line was written. Domain modelling also unlocked a new structure. While sketching, the team noticed that price negotiation didn’t sit cleanly inside proposals or payments. So they carved out a Counteroffer domain to keep responsibilities focused and avoid muddled logic. 4 | Services and Operations: Giving Verbs to the Nouns Domains define the what. Services handle the how. A service represents an operation performed within a domain, starting with the basics like create, read, update, and delete (CRUD), then extending into actions that reflect the business itself. In practice, though, many REST APIs expose only the surface of an object. The real behavior gets buried behind overloaded parameters or generic endpoints, which makes systems harder to understand and even harder to evolve. To bring clarity, the team ran each domain through four simple lenses: Basic actions: Create, Read, Update, Delete. Special actions: Domain-specific verbs such as sendProposal, counterOffer, and publishProperty. Candidates for new domains: Operations that don’t clearly belong (messaging, analytics). Inputs → rules → outputs: Explicit contracts that later feed test cases and API docs. In the Partnership Proposal domain of the HomeIt, CRUD handles draft management, but business logic demands extra verbs: approveProposal, rejectProposal, and startChat for realtor-landlord communication. Naming these early helps everyone see where specific endpoints, async events, or even separate services may be needed, before that logic gets buried in brittle glue code. 5 | Sequencing the Flow: Diagrams That Developers Actually Use Linear prose often falls short when describing how services interact over time. That’s where sequence diagrams come in: actors across the x-axis, time flowing down the y-axis, arrows capturing the exchange of messages. The key is deciding how much detail to include. A payment operations engineer might want to see retries and error handling. A product manager might just need to follow the main steps. The right level of depth depends on who’s reading. With PlantUML, teams can write diagrams as plaintext: code you can version alongside everything else. Paste a script into plantuml.com, generate an SVG, and share it in a pull request. A small edit to the script redraws the whole diagram; no dragging boxes around in slides. Sequence diagrams become even more useful when placed next to the domain model. Domains help define the system’s boundaries. Sequences show how those parts collaborate. Used together, they reveal integration risks early, well before testing begins. The following sequence sketch illustrates that flow, capturing how a tenant initiates a proposal, how the system delegates responsibilities across services, and where retries and idempotent updates come into play: 6 | Putting It All together: A Guided Walk-Through Here’s how a complete slice of functionality moves through the pipeline, starting from a blank page and ending in production-ready service code. Problem statement Landlords often travel. They need a way to partner with local realtors so property showings can continue in their absence. Feature and backlog This feature scored 91 out of 150. It’s valuable, but not essential to initial rentals, so it’s scheduled for Q2, after property search and messaging. Requirements Before accepting a partnership, the landlord must be able to review availability, fee percentage, and realtor rating. The system needs to handle 10,000 proposals per day and recover from a realtor API outage within five minutes. Domains Rental Property, Partnership Proposal, User. Payment remains a separate concern for now. Services createProposal, approveProposal, listPartnerships, scheduleVisit. Domain flow A realtor fills out the proposal form. The system records the draft and marks it pending approval. The landlord accepts. The proposal status updates to approved. The realtor’s contact now appears on the property page . Sequence sketch Tenant → Search → Property Realtor → Proposal → Landlord Proposal → Payments (Arrows show retries and idempotent updates.) Implementation choices Property and Proposal are built as two Spring Boot microservices, each with its own database. When a ProposalApproved event is triggered, it signals the messaging service to open a chat channel. Targets for availability (three-nines) and latency (P99 under 400 ms) inform Kubernetes settings and circuit-breaker policies. Every step builds on the one before it. By the time coding begins, every engineer understands the requirements, the API contracts, and how the system should recover when things go wrong. In summary, clarify requirements early. They’re key to saving time and budget. Score features before building to bring structure to decisions. Model nouns first to avoid hidden monoliths, and design services around real business actions. Finally, sketch timelines early to prevent costly last-minute changes. Got 60 seconds? Tell us what clicked (or didn’t) Here’s your next Sprint challenge Block off half a day for a deep-dive on requirements. Create a domain diagram. Draft one sequence sketch for an upcoming feature. Pin them beside the sprint board. You’ll reduce ambiguity now and make onboarding smoother later. SUBSCRIBE FOR MORE AND SHARE IT WITH A FRIEND! *{box-sizing:border-box}body{margin:0;padding:0}a[x-apple-data-detectors]{color:inherit!important;text-decoration:inherit!important}#MessageViewBody a{color:inherit;text-decoration:none}p{line-height:inherit}.desktop_hide,.desktop_hide table{mso-hide:all;display:none;max-height:0;overflow:hidden}.image_block img+div{display:none}sub,sup{font-size:75%;line-height:0}#converted-body .list_block ol,#converted-body .list_block ul,.body [class~=x_list_block] ol,.body [class~=x_list_block] ul,u+.body .list_block ol,u+.body .list_block ul{padding-left:20px} @media (max-width: 100%;display:block}.mobile_hide{min-height:0;max-height:0;max-width: 100%;overflow:hidden;font-size:0}.desktop_hide,.desktop_hide table{display:table!important;max-height:none!important}} @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} }
Read more
  • 1
  • 0

Kinnari Chohan
14 Jul 2025
6 min read
Save for later

WebDevPro #99: Angular introduces custom profiling tools, TypeScript adds LSP updates, and Figma's new MCP server

Kinnari Chohan
14 Jul 2025
6 min read
Crafting the Web: Tips, Tools, and Trends for Developers Advertise with Us|Sign Up to the Newsletter @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } WebDevPro #99: Angular introduces custom profiling tools, TypeScript adds LSP updates, and Figma's new MCP server 🌍🔍 Crafting the Web: Tips, Tools, and Trends for Developers Hi , Welcome to WebDevPro #99! This week’s issue is a goldmine of must-know releases, emerging trends, and sharp community takes. Here's what you don't want to miss: ⚙️ TypeScript 5.9 beta: Faster symbol search, smarter completions, and Go-to-Definition that finally behaves. 🧠 Figma’s new MCP Server: Say goodbye to messy exports. Structured design data now flows straight into your dev stack. 🔍 Performance tuning in Angular: Angular’s new custom profiling track gets serious about SSR and hydration debugging. 🧪 Storybook 9.0 brings smarter UI testing: Interaction testing and a11y checks now baked in, no extra config needed. 🧼 Smarter CSS Cleanup with AI: New research shows how machine learning can cut unused styles and slim down your stylesheets automatically. Let's dig in! Advertise with us Interested in reaching our audience? Reply to this email or write to kinnaric@packt.com. Learn more about our sponsorship opportunities here. Latest news: what's new in web development? 🧑‍💻 ⚙️TypeScript 5.9 beta adds language server protocol enhancements: The latest TypeScript beta focuses on polish. Symbol search is faster, completions are more context-aware, and Go to Definition is finally getting smarter about overloads. No flashy features, just quality-of-life upgrades devs will feel every day. 🔍 Angular launches custom profiling track: Performance tuning in Angular just got an upgrade. This new profiling track integrates with Chrome DevTools and visualizes hydration, change detection, and Signals more clearly. If you’re debugging Angular SSR or optimizing large apps, this one’s for you. 🔧 Node.js 24.4 lands with V8 12.4 and diagnostic tweaks: Node 24.4 quietly drops updates to diagnostics_channel, better WebSocket behavior, and a V8 bump that improves performance under the hood. It’s incremental, but stability matters when your runtime is in production everywhere. 🧩 Figma’s Dev Mode MCP Server: Figma’s new MCP Server quietly rewires how design tokens and UI code connect. Now, devs can pull structured design data straight into their stack, no more manual sync or messy exports. One tool for the whole UI loop, finally working like it should. 🌠 Perplexity launches Comet browser with built-in AI:Chrome dominance isn’t shaking yet, but Perplexity’s new Comet browser is aiming for utility over ubiquity. It lets you search with natural questions, get summaries inline, and ask follow-ups without switching tabs. 🤖 AWS to debut AI agent marketplace with Anthropic: This week, AWS is rolling out a dedicated space for pre-trained AI agents, tightly integrated with Bedrock. Anthropic is in at launch, which means Claude-powered tools will be just an API call away for any team working in the AWS cloud. Make your breaks smarter than your bugs 🧠 Tired of scrolling aimlessly between commits? Next time you take a breather, give your brain something fun and useful. 🧩 Try Untrusted,a game where you hack JavaScript logic to escape puzzles. It’s like VS Code meets escape room. 🧠 Then run a quick check on Human Benchmark to flex your memory, focus, and problem-solving muscles. Warning: Oddly addictive. Side effects may include better debugging and faster PR reviews. Expert corner: what's the web community talking about?🎙 🔄 Async Ruby gets a future-focused reality check: Paolina Carmine unpacks the growing interest in async Ruby, tracing the why and the what's next. This take is practical and grounded in real-world limitations. Devs who’ve written concurrent code in Ruby (or tried to) will find this one especially validating. 📡 Most REST APIs aren't really RESTful: Florian Kraemer calls out common violations of REST principles, showing how most APIs claiming the badge miss on constraints like statelessness and proper resource modeling. This is a reminder that solid API design still matters. 🧠 What agentic apps actually look like: Beam offers a practical lens on what it takes to build agentic applications that feel autonomous yet reliable. The post goes past buzzwords into concrete patterns and system design choices that shape how AI-driven apps operate in the real world. 🧭 New research rethinks how agents learn plans: A new paper from Cornell Universityexplores how agents learn and revise plans from feedback, not just static goals. The team proposes a model that mirrors human-like decision-making under uncertainty. The implications go far beyond robotics into how we think about dev workflows with AI in the loop. 🛡️Ethereum cofounder calls for copyleft in Web3:Vitalik Buterin makes the case that permissive licensing has slowed Web3’s ability to create a truly open ecosystem. He calls for a shift to copyleft licenses like AGPL to prevent corporate lock-in and ensure protocol-level transparency. It’s a bold stance that reframes licensing not as legal hygiene but as a structural choice in decentralized design. Want to be featured in WebDevPro? Share your tips or takes, we’re all ears! This week's book drop 📚 📘 Design Beyond Limits with Figma by Simon Jun Ready to turn Figma into a true collaboration engine? This book goes beyond screen mockups to show you how high-performing teams build scalable design systems, streamline handoffs, and integrate AI to boost delivery. Whether you're managing tokens, coordinating with devs, or scaling accessibility, this is your playbook for serious design-to-dev alignment. 📦 Get 25% off the paperback. Use code FIGMA25at checkout. Offer valid through Friday only. Pre-order your copy now! Developer tip 💡 Smarter UIs start with Storybook 9.0 The new Storybook isn’t just smaller, it’s smarter. Version 9.0 now includes built-in interaction testing and accessibility checks, so you can catch UI bugs and a11y issues as you build. No extra setup. No extra tools. If you work on front-end components or design systems, this update will instantly tighten your workflow. Got a minute? Tell us what clicked (or didn't) 🎬 That’s your scoop from the dev-verse this week.If your brain’s buzzing with ideas or feedback, hit reply. Until next week. Cheers! Kinnari Chohan, Editor-in-chief SUBSCRIBE FOR MORE AND SHARE IT WITH A FRIEND! *{box-sizing:border-box}body{margin:0;padding:0}a[x-apple-data-detectors]{color:inherit!important;text-decoration:inherit!important}#MessageViewBody a{color:inherit;text-decoration:none}p{line-height:inherit}.desktop_hide,.desktop_hide table{mso-hide:all;display:none;max-height:0;overflow:hidden}.image_block img+div{display:none}sub,sup{font-size:75%;line-height:0}#converted-body .list_block ol,#converted-body .list_block ul,.body [class~=x_list_block] ol,.body [class~=x_list_block] ul,u+.body .list_block ol,u+.body .list_block ul{padding-left:20px} @media (max-width: 100%;display:block}.mobile_hide{min-height:0;max-height:0;max-width: 100%;overflow:hidden;font-size:0}.desktop_hide,.desktop_hide table{display:table!important;max-height:none!important}} @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} }
Read more
  • 0
  • 0
Kinnari Chohan
21 Jul 2025
9 min read
Save for later

WebDevPro #100: Form Submission in React 19: A Game-Changer for Developers

Kinnari Chohan
21 Jul 2025
9 min read
Real-world insights for sharper web dev decisions Advertise with Us|Sign Up to the Newsletter @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } WebDevPro #100 🎉 Form Submission in React 19: A Game-Changer for Developers Real-world insights for sharper web dev decisions Hi , Before we jump in, THANK YOU ! Every click, reply, and bit of feedback over the past 99 issues helped us build WebDevPro into what it is today. We’re incredibly proud to bring you issue #100. 🎯 To mark the milestone, we’re diving into a topic that reflects the kind of shift we love covering: quietly released, deeply impactful, and immediately relevant. React has evolved a lot over the years, but form handling? It’s long been a source of friction, even for seasoned developers. You needed boilerplate, custom handlers, and third-party libraries just to submit a form. React 19 changes that. To unpack one of its most impactful updates, we sat down with Daniel Bugl, React community contributor and author of Learn React Hooks. His book explores hook-based development in React 18 and 19, and in this special edition, Daniel offers a deep dive into Form Actions, a new feature that brings native simplicity to form submission. With hands-on insights from his work across startups, public sector platforms, and his own company TouchLay, he shows how React 19 is shifting the landscape for frontend developers. In this article, you’ll specifically learn: Why form handling in React has traditionally required workarounds and third-party tools How Form Actions in React 19 simplify submissions with zero dependencies What the useActionState hook does and how to use it effectively How React’s embrace of web standards enhances both developer ergonomics and performance When to skip third-party form libraries and when to keep them The role of FormData Why this shift marks a turning point in how we build UIs in React Before you jump in, here are some highlights from our recent WebDevPro coverage: 👉 Introducing Figma’s Dev Mode MCP Server 👉 Most RESTful APIs Are Not Really RESTful – Florian Kraemer 👉 The Accessibility Pipeline for Frontend Teams – Storybook 👉 The Angular Custom Profiling Track Is Now Available 👉 Introducing Gemini CLI – Google Blog Now let's get straight to the good stuff! Cheers! Your editor-in-chief, Kinnari Chohan Advertise with us Interested in reaching our audience? Reply to this email or write to kinnaric@packt.com. Learn more about our sponsorship opportunities here. Meet the expert Daniel Bugl is a full-stack developer, product designer, and entrepreneur focusing on web technologies. He has a Bachelor of Science degree in business informatics and information systems and a Master of Science degree in data science from the Vienna University of Technology (TU Wien). He is a contributor to many open source projects and a member of the React community. He also founded and runs his own hardware/software start-up, TouchLay, which helps other companies present their products and services. At his company, he constantly works with web technologies, particularly making use of React and Next.js. In the past couple of years, he has worked as a technical advisor and full-stack developer for large enterprises and the public sector, among other things working on citizen services for the Austrian government. Take the Survey Now Why Form Submissions Have Always Been a Headache Up until now, crafting a reliable form in React meant cobbling together multiple moving parts. Loading indicators. Error states. Async logic. Validation rules. Libraries like Formik and React Hook Form promised to help, but came at the cost of extra weight and complexity. The problem wasn’t just technical; it was philosophical. Building a form shouldn’t feel like spinning up a mini state machine. A New Native: Enter Form Actions React 19 introduces Form Actions, a fresh, built-in mechanism that makes form submissions not just manageable, but almost effortless. Instead of inventing a new model, Form Actions extends the standards that browsers have supported for years, combining them with React’s declarative philosophy. The result is a native-feeling form experience that removes the need for custom onSubmit handlers, spinners, or manually tracked errors. What Makes It So Different? Let’s break down what developers gain by using Form Actions: No More Loading State Juggling: Submissions automatically reflect their pending state. Automatic Error Boundaries: Errors are caught and handled gracefully without extra wiring. Minimal Code, Maximum Clarity: You write what matters: input fields and business logic. Standards-First: It builds on FormData, making it interoperable with native HTML and APIs. No Extra Packages Needed: For simple forms, Form Actions eliminate the need for additional libraries. A Look at the Code Here's a simple ContactForm component using useActionState -- React 19's hook for handling form actions: import { useActionState } from 'react'; function ContactForm() { const [state, submitAction, isPending] = useActionState( async (prevState, formData) => { try { const response = await fetch('/api/contact', { method: 'POST', body: formData, }); if (!response.ok) { throw new Error('Failed to submit form'); } return { success: true, message: 'Form submitted successfully!' }; } catch (error) { return { success: false, error: error.message }; } }, { success: false, message: '' } ); return ( <form action={submitAction}> <input name="email" type="email" required /> <textarea name="message" required /> <button type="submit" disabled={isPending}> {isPending ? 'Submitting...' : 'Submit'} </button> {state.success && <p style={{ color: 'green' }}>{state.message}</p>} {state.error && <p style={{ color: 'red' }}>Error: {state.error}</p>} </form> ); } What used to demand state hooks, custom handlers, and error tracking now fits cleanly into a single hook pattern. The behavior stays predictable, and the code remains focused. Demystifying useActionState The useActionState hook is the engine behind the simplicity. It accepts two key inputs: Action Function: This handles submission logic and returns updated state. Initial State: The shape of your form’s state before any interaction. Its return includes: Current State: A state object reflecting success, error, or pending state. Submit Function: Passed directly to the form's action attribute. Pending Indicator: A boolean that tells you whether the action is still being processed. It’s not magic, it’s just better design. The Role of FormData Under the hood, React 19 uses the standard FormData API. This means your form data integrates smoothly with fetch() and server APIs. It’s iterable, lightweight, and supports native browser behaviors without needing a JSON transformation step. Want to learn more? Here’s the MDN reference for FormData. Do Form Libraries Still Matter? React 19’s Form Actions offer a compelling default for handling simple to moderately complex forms, especially those with linear input flows, basic validation, and limited state dependencies. For many use cases, that’s more than enough. But there are still valid reasons to reach for a library: Complex Field Logic: Dynamic forms with conditional field rendering, field-level validation rules, and deeply nested structures still benefit from libraries like Formik or React Hook Form. Custom Validation Systems: When you need schema-based validation (e.g., with Zod or Yup) tightly integrated with your form, third-party libraries provide more granular control and extensibility. Reusable Field Components: If you're managing dozens of input types with shared behaviors (debouncing, formatting, etc.), external libraries help abstract and standardize those patterns. Multi-Step or Wizard Flows: For forms spread across steps or pages, with persistent data across transitions, external form state management may offer cleaner separation and more control. React 19 narrows the gap significantly, but doesn't aim to replace every form tool. Instead, it raises the baseline, giving you a built-in option that handles the fundamentals exceptionally well. You may still choose external libraries, but now, it's a deliberate choice rather than a necessity. What This Means for the Future of React Development The addition of Form Actions in React 19 is more than a convenience feature: it signals a broader shift in how React aligns with the platform. In earlier versions, React often abstracted away browser behavior: it replaced native form mechanics with its own event system, encouraged state-driven rendering over traditional form submissions, and nudged developers toward controlled inputs. While powerful, this approach also created friction, especially for developers working closely with web APIs or server-side logic. Form Actions mark a shift in the opposite direction. React now leverages: The native FormData API, which integrates smoothly with server endpoints Progressive enhancement, letting forms degrade gracefully in environments without JavaScript Async-friendly patterns, like useActionState, that reduce complexity in managing submission flow By embracing standards and minimizing the need for scaffolding, React is moving closer to a model where simple things are truly simple, and complexity is opt-in, not baked in. For developers, this means: Less time writing glue code and handling edge cases More focus on user experience and business logic Cleaner mental models for state transitions and UI feedback React 19 doesn’t remove flexibility. It just gives you a stronger default. And that’s exactly what modern frontend development needs: guardrails that don’t get in your way. Go Deeper Want to dig further into React 19 and its new hooks pattern? Learn React Hooks by Daniel Bugl walks through this and more, covering everything from useEffect fundamentals to advanced composable logic. This change in form handling is more than just a new feature; it’s a sign that React is growing up. And for developers, that means less scaffolding and more building. Got 60 seconds? Tell us what clicked (or didn’t) SUBSCRIBE FOR MORE AND SHARE IT WITH A FRIEND! *{box-sizing:border-box}body{margin:0;padding:0}a[x-apple-data-detectors]{color:inherit!important;text-decoration:inherit!important}#MessageViewBody a{color:inherit;text-decoration:none}p{line-height:inherit}.desktop_hide,.desktop_hide table{mso-hide:all;display:none;max-height:0;overflow:hidden}.image_block img+div{display:none}sub,sup{font-size:75%;line-height:0}#converted-body .list_block ol,#converted-body .list_block ul,.body [class~=x_list_block] ol,.body [class~=x_list_block] ul,u+.body .list_block ol,u+.body .list_block ul{padding-left:20px} @media (max-width: 100%;display:block}.mobile_hide{min-height:0;max-height:0;max-width: 100%;overflow:hidden;font-size:0}.desktop_hide,.desktop_hide table{display:table!important;max-height:none!important}} @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} }
Read more
  • 0
  • 0

Kinnari Chohan
28 Jul 2025
6 min read
Save for later

WebDevPro #101: Replit AI wipes a live database, Node drops the build step for TypeScript, and Chrome urges a return to semantic HTML

Kinnari Chohan
28 Jul 2025
6 min read
Crafting the Web: Tips, Tools, and Trends for DevelopersAdvertise with Us|Sign Up to the Newsletter @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} }WebDevPro #101: Replit AI wipes a live database, Node drops the build step for TypeScript, and Chrome urges a return to semantic HTML 🌍🔍Crafting the Web: Tips, Tools, and Trends for DevelopersHi ,Welcome to WebDevPro #101.This week’s issue surfaces what’s shaping the developer workflow behind the headlines: an AI misstep with real consequences, a leaner way to run TypeScript, and grounded insights from developers who are in it daily.🧨 Replit’s AI coding agent deleted an entire production database during a code freeze and returned a fake success message. This shows that vibe coding still requires real production knowledge to be safe.⚡ Node.js can now run TypeScript natively, no transpiler, no build tools. Just write .ts and go. It’s fast, clean, and could shift how devs build with TS entirely.⚙️ GitHub Spark is live now! Spark converts plain-English prompts into full-stack applications, an early but clear step toward AI-first development workflows.📌 Chrome makes the case for semantic HTML again, showing how the <article> tag quietly improves accessibility, readability, and search across modern UIs.🗣️ This TTS sentence reader lets you listen as you iterate: perfect if you're building anything voice-related or just tired of reading UI copy.Let’s get into it.Advertise with usInterested in reaching our audience? Reply to this email or write to kinnaric@packt.com.Learn more about our sponsorship opportunities here.Take the Survey NowLatest news: what's new in web development? 🧑‍💻 🧨 Replit AI coding assistant wipes entire company database:Replit’s AI coding agent was given limited access but ignored a code freeze, wiped production data, and returned a fake success message. The issue wasn’t just technical; it exposed how AI coding agents are still learning, and how steep the learning curve can be. Before writing production code with AI, developers need a solid understanding of how production-grade apps are structured and shipped.🐍 Python 3.14.0 RC1 is live: The next major milestone in Python's journey has arrived. Python 3.14 enters release candidate phase, locking in exciting features like customizable f-strings, exception groups in BaseExceptionGroup, and --check-hash-based-pycs always for added reproducibility.⚡ Run TypeScript natively with Node.js: No more transpile step. Node now runs .ts files out of the box using the TypeScript Native compiler. Faster cold starts, leaner workflows, and serious potential for tooling evolution.💎 Ruby 3.3.9 patches up:This latest Ruby patch release tackles several critical regressions and security issues, especially affecting Net::IMAP and MJIT. A safe update if you're building on 3.3.x.🐘 PostgreSQL 18 beta hits the docs: Fresh out of beta, Postgres 18 brings even more to love: better RETURNING support for MERGE, improved logical replication performance, and libpq enhancements that boost connection handling.🌐 Laravel 12.2.0 gets smarter:Laravel just added more guardrails for developers. This release includes new Blade debugging helpers and stricter behavior around environment configuration—small tweaks that pack a lot of DX polish.⚙️ GitHub Spark builds full-stack apps from plain text: GitHub’s new Copilot tool, Spark, lets you describe an app in natural language and generate a working full-stack prototype. It’s early, but it points clearly toward faster, AI-first development loops. Fix your mental stack overflow 🧘Long sessions = drained focus. Here’s your energy patch:🎧 Get into flow with Focus@Will, which uses neuroscience-backed music to help devs stay zoned in.😮‍💨 Hit pause with box breathing, a 4x4x4x4 method Navy SEALs and software engineers (apparently) both swear by.Try this combo before your next big deploy; you might actually enjoy it.Twilio Segment: Data you can depend on, built your wayTwilio Segment was purpose-built so that you don’t have to worry about your data. Forget the data chaos, dissolve the silos between teams and tools, and bring your data together with ease. So that you can spend more time innovating and less time integrating.Learn moreExpert corner: what's the web community talking about?🎙📌 The humble <article> tag deserves more love:In a sea of div soup, Chrome’s latest blog highlights how semantic HTML like <article> unlocks better readability, accessibility, and search. This isn’t just for blog posts, it matters for product UIs, dashboards, and more.🧠 Caching is hard, even for humans:This developer confessional from Blacksmith cuts through the usual caching advice and gets real about where things break. Expect practical scenarios and a few sharp insights on balancing performance with sanity.🤖 Mental models don’t map 1:1 to AI tooling:John Whiles explores why developers can struggle to make AI tools click. The real challenge isn’t adoption—it’s reconciling how we think about problems with how LLMs solve them. It’s thoughtful, honest, and worth your scroll.🧩 Frontend isn’t going anywhere: Despite the hype around backend-for-frontend (BFF), edge rendering, and AI-based layout tools, InfoWorld argues that frontend skills are still foundational. Clean CSS, accessible HTML, and state orchestration remain as vital as ever.🏢 Enterprise AI needs a grounded strategy:This isn’t about playing with prompts—it’s about aligning AI with actual business goals. From data readiness to change management, InfoWorld’s take walks through how to deploy AI with purpose instead of panic.Want to be featured in WebDevPro? Share your tips or takes, we’re all ears!This week's book drop 📚📘 Node.js Design Patterns, Fourth Edition by Luciano Mammino and Mario CasciaroA practical guide to building scalable, modular Node.js apps using proven design patterns. Learn how to write cleaner code with async flows, middleware, and event-driven architecture.🟦 Learn advanced asynchronous patterns and error handling🟦 Master modularity, dependency injection, and testability in Node🟦 Explore real-world applications of event-driven architecturePre-order your copy now!Developer tip 💡🗣️ Speed up voice-over work with this JS-powered TTS readerNeed to test speech interfaces, generate narration, or just hear your own content read aloud? This no-fuss sentence reader breaks down text into speakable chunks and pipes it through the Web Speech API. Useful for accessibility checks, rapid TTS prototyping, or writing with your ears instead of your eyes.Got a minute? Tell us what clicked (or didn't)🎬 That’s your download for the week. If you’ve got feedback, rants, or ideas to share, we’re all ears.See you next week.Cheers!Kinnari Chohan,Editor-in-chiefSUBSCRIBE FOR MORE AND SHARE IT WITH A FRIEND!*{box-sizing:border-box}body{margin:0;padding:0}a[x-apple-data-detectors]{color:inherit!important;text-decoration:inherit!important}#MessageViewBody a{color:inherit;text-decoration:none}p{line-height:inherit}.desktop_hide,.desktop_hide table{mso-hide:all;display:none;max-height:0;overflow:hidden}.image_block img+div{display:none}sub,sup{font-size:75%;line-height:0}#converted-body .list_block ol,#converted-body .list_block ul,.body [class~=x_list_block] ol,.body [class~=x_list_block] ul,u+.body .list_block ol,u+.body .list_block ul{padding-left:20px} @media (max-width: 100%;display:block}.mobile_hide{min-height:0;max-height:0;max-width: 100%;overflow:hidden;font-size:0}.desktop_hide,.desktop_hide table{display:table!important;max-height:none!important}} @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} } @media only screen and (max-width: 100%;} #pad-desktop {display: none !important;} }
Read more
  • 0
  • 0
Modal Close icon
Modal Close icon