<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Royshell</title>
    <description>The latest articles on DEV Community by Royshell (@royshell).</description>
    <link>https://dev.to/royshell</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3597225%2F4439f5f7-9385-4afa-9202-1daf9679db7d.jpg</url>
      <title>DEV Community: Royshell</title>
      <link>https://dev.to/royshell</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/royshell"/>
    <language>en</language>
    <item>
      <title>I got tired of ugly websites. So I built a tool to fix them (and yes it has AI)</title>
      <dc:creator>Royshell</dc:creator>
      <pubDate>Thu, 12 Mar 2026 23:15:34 +0000</pubDate>
      <link>https://dev.to/royshell/i-got-tired-of-ugly-websites-so-i-built-a-tool-to-fix-them-and-yes-it-has-ai-476h</link>
      <guid>https://dev.to/royshell/i-got-tired-of-ugly-websites-so-i-built-a-tool-to-fix-them-and-yes-it-has-ai-476h</guid>
      <description>&lt;p&gt;We've all been there.&lt;/p&gt;

&lt;p&gt;It's 11pm. You're reading an article. The background is blinding white. The font is tiny. There are three cookie banners, a chat bubble, a newsletter popup, and somehow also an ad shaped like a button that says "CONGRATULATIONS."&lt;/p&gt;

&lt;p&gt;I got fed up. So I built &lt;strong&gt;Polish&lt;/strong&gt; ✦ 🇵🇱 - a Chrome side panel that lets you restyle any website, instantly, without touching the code.&lt;/p&gt;

&lt;p&gt;For the record: I am Polish (well at least, I hold a Polish citzenship). The name was inevitable. I had no choice.&lt;/p&gt;

&lt;p&gt;I also have some accessibility background, which means I've spent a lot of time thinking about how people actually read and interact with the web — and how badly most websites fail at it. Polish is partly a product of that frustration. Readable fonts, better contrast, focus mode that strips the noise — these aren't just nice-to-haves. For a lot of people, they make the difference between being able to use a site or not.&lt;/p&gt;




&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;You open the panel, you click a few things, and the page transforms in front of you. No settings menus. No extensions with 47 permissions you don't understand. Just: make this look better.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One-Click Polish&lt;/strong&gt; gives you five toggles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dark Mode&lt;/li&gt;
&lt;li&gt;More Contrast&lt;/li&gt;
&lt;li&gt;Focus Mode ← this one removes ads, cookie banners, sidebars, popups, and chat widgets. It's kind of life-changing.&lt;/li&gt;
&lt;li&gt;Extra Spacing&lt;/li&gt;
&lt;li&gt;Readable fonts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Theme Presets&lt;/strong&gt; are full-page visual vibes — Miami Vice, Cyber Mode, Night Owl, Newspaper, Clean Reader. Yes, Miami Vice is a legitimate reading mode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fine-Tune&lt;/strong&gt; lets you adjust font size, heading scale, colors, and font family if you're the kind of person who has opinions about typography. (You're a developer. You do.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI Style&lt;/strong&gt; is the fun one. You type something like &lt;em&gt;"make this look like a retro terminal"&lt;/em&gt; or &lt;em&gt;"luxury magazine, serif fonts, warm tones"&lt;/em&gt; and it generates a full CSS style for the page. Powered by Llama via Groq, running server-side so you don't need an API key.&lt;/p&gt;




&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Vue 3 + TypeScript + Vite&lt;/li&gt;
&lt;li&gt;Tailwind CSS v4&lt;/li&gt;
&lt;li&gt;Pinia&lt;/li&gt;
&lt;li&gt;Chrome Extension Manifest v3&lt;/li&gt;
&lt;li&gt;Groq / Llama proxy (&lt;a href="https://github.com/Royshell/polish-api" rel="noopener noreferrer"&gt;separate repo&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was a genuinely fun project to build. Chrome extensions have their own weird rules — no cross-origin fetch from the side panel, service workers instead of background pages, scripting permissions that require jumping through hoops. Worth the pain.&lt;/p&gt;




&lt;h2&gt;
  
  
  It's open source. Come break things with me.
&lt;/h2&gt;

&lt;p&gt;The project is early. It works, it's useful, but there's a lot of room to grow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More theme presets&lt;/li&gt;
&lt;li&gt;Shareable styles&lt;/li&gt;
&lt;li&gt;Better per-site memory&lt;/li&gt;
&lt;li&gt;Whatever you think would be cool&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any of that sounds interesting, the repo is here:&lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://github.com/Royshell/polish" rel="noopener noreferrer"&gt;github.com/Royshell/polish&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stars are appreciated. PRs are more appreciated. Opinions in the comments are fine too.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Now if you'll excuse me, I have some websites to fix.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>ui</category>
      <category>extensions</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Built a Production-Ready AI Agent with NestJS and React (and You Can Steal It)</title>
      <dc:creator>Royshell</dc:creator>
      <pubDate>Sun, 01 Feb 2026 16:18:48 +0000</pubDate>
      <link>https://dev.to/royshell/i-built-a-production-ready-ai-agent-with-nestjs-and-react-and-you-can-steal-it-3lgb</link>
      <guid>https://dev.to/royshell/i-built-a-production-ready-ai-agent-with-nestjs-and-react-and-you-can-steal-it-3lgb</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Building an AI agent in 2026 is way less scary than it sounds.&lt;br&gt;&lt;br&gt;
Most of the time, it’s just &lt;strong&gt;clean backend architecture + smart API calls to LLMs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I built a &lt;strong&gt;production-ready boilerplate&lt;/strong&gt; using &lt;strong&gt;NestJS + React&lt;/strong&gt; that gives you a working AI agent (with streaming chat UI) in under a minute.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Steal the code here:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/Royshell/ai-agent-nest-react-boilerplate" rel="noopener noreferrer"&gt;https://github.com/Royshell/ai-agent-nest-react-boilerplate&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fork it. Copy it. Rip it apart. That’s what it’s for.&lt;/p&gt;


&lt;h2&gt;
  
  
  “AI Agents” Sound Big. The Reality Is Smaller (and Better)
&lt;/h2&gt;

&lt;p&gt;If you hang around developer Twitter or LinkedIn long enough, “AI agents” start to feel like this massive, abstract thing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;autonomous reasoning
&lt;/li&gt;
&lt;li&gt;tool orchestration
&lt;/li&gt;
&lt;li&gt;memory systems
&lt;/li&gt;
&lt;li&gt;workflows and planners
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And sure — those things exist.&lt;/p&gt;

&lt;p&gt;But here’s the reality for &lt;strong&gt;most real-world AI apps&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An AI agent is just an application that calls an LLM API in a structured way.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You don’t need to understand transformers.&lt;br&gt;&lt;br&gt;
You don’t need to train models.&lt;br&gt;&lt;br&gt;
You don’t need a PhD.&lt;/p&gt;

&lt;p&gt;You need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an API key
&lt;/li&gt;
&lt;li&gt;a backend endpoint
&lt;/li&gt;
&lt;li&gt;a clean way to stream responses
&lt;/li&gt;
&lt;li&gt;a UI to display them
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s it.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Basic AI Agent Flow (No Magic)
&lt;/h2&gt;

&lt;p&gt;Almost every modern AI app follows the same steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sign up to an LLM provider (Gemini, OpenAI, Claude, etc.)&lt;/li&gt;
&lt;li&gt;Generate an &lt;strong&gt;API key&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Store it in your backend &lt;code&gt;.env&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create an endpoint that sends prompts to the LLM&lt;/li&gt;
&lt;li&gt;Stream tokens back to the client&lt;/li&gt;
&lt;li&gt;Render them in the UI&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Different providers, same idea.&lt;br&gt;&lt;br&gt;
HTTP + JSON + streaming.&lt;/p&gt;

&lt;p&gt;This boilerplate focuses on getting that flow &lt;strong&gt;right&lt;/strong&gt;, cleanly and predictably.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why NestJS for the Backend?
&lt;/h2&gt;

&lt;p&gt;I wanted a backend that feels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;production-ready
&lt;/li&gt;
&lt;li&gt;readable
&lt;/li&gt;
&lt;li&gt;easy to extend later
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;NestJS gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clear module boundaries
&lt;/li&gt;
&lt;li&gt;dependency injection
&lt;/li&gt;
&lt;li&gt;controllers vs services separation
&lt;/li&gt;
&lt;li&gt;structure without over-engineering
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this project, the backend is built in a &lt;strong&gt;module-driven design&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There’s a dedicated module responsible for AI / LLM interaction — not scattered logic inside random controllers.&lt;/p&gt;


&lt;h2&gt;
  
  
  Example: Chat Endpoint (Complete &amp;amp; Simplified)
&lt;/h2&gt;

&lt;p&gt;Below is a &lt;strong&gt;fully copyable&lt;/strong&gt;, simplified version of the chat endpoint.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Body, Controller, Post, Res } from '@nestjs/common';
import { Response } from 'express';
import { AgentService } from './agent.service';
import { ChatDto } from './dto/chat.dto';

@Controller('chat')
export class ChatController {
  constructor(private readonly agentService: AgentService) {}

  @Post()
  async chat(@Body() dto: ChatDto, @Res() res: Response) {
    // The controller stays thin and boring on purpose
    return this.agentService.streamChat(dto, res);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The controller does almost nothing — by design.&lt;/p&gt;

&lt;p&gt;All the interesting logic lives inside the agent service, which:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;talks to the LLM provider
&lt;/li&gt;
&lt;li&gt;handles streaming
&lt;/li&gt;
&lt;li&gt;stays isolated from HTTP concerns
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That separation is intentional and makes the system easy to extend later.&lt;/p&gt;




&lt;h2&gt;
  
  
  “But This Is Just a Chatbot…”
&lt;/h2&gt;

&lt;p&gt;Yes.&lt;br&gt;&lt;br&gt;
And that’s the point.&lt;/p&gt;

&lt;p&gt;A chatbot is the &lt;strong&gt;simplest possible AI agent&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;input → reasoning → output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you have that working:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the controller can accept any input (not just chat messages)&lt;/li&gt;
&lt;li&gt;the agent can call tools&lt;/li&gt;
&lt;li&gt;the agent can fetch data&lt;/li&gt;
&lt;li&gt;the agent can write to databases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The UI might stay a chat, but the backend can evolve into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;internal assistants&lt;/li&gt;
&lt;li&gt;workflow agents&lt;/li&gt;
&lt;li&gt;data-aware tools&lt;/li&gt;
&lt;li&gt;system controllers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The chat is just the &lt;strong&gt;interface&lt;/strong&gt;, not the limitation.&lt;/p&gt;




&lt;h2&gt;
  
  
  LLM Providers Are Swappable by Design
&lt;/h2&gt;

&lt;p&gt;The main branch uses &lt;strong&gt;Google Gemini&lt;/strong&gt; because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the free tier is usable&lt;/li&gt;
&lt;li&gt;the API is simple&lt;/li&gt;
&lt;li&gt;no credit card required to start&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the architecture doesn’t care.&lt;/p&gt;

&lt;p&gt;Each provider lives in its &lt;strong&gt;own branch&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;openai&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;anthropic&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ollama&lt;/code&gt; (local models)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same agent interface.&lt;br&gt;&lt;br&gt;
Different implementations.&lt;/p&gt;

&lt;p&gt;No vendor lock-in.&lt;/p&gt;




&lt;h2&gt;
  
  
  MCP, Tools, and Databases (What’s Next)
&lt;/h2&gt;

&lt;p&gt;Once you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a clean agent layer&lt;/li&gt;
&lt;li&gt;a predictable API boundary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can start connecting &lt;strong&gt;real capabilities&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The next step in this project is adding &lt;strong&gt;MCP (Model Context Protocol) placeholders&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That opens the door to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;external tools&lt;/li&gt;
&lt;li&gt;databases&lt;/li&gt;
&lt;li&gt;internal APIs&lt;/li&gt;
&lt;li&gt;contextual data sources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;querying a database&lt;/li&gt;
&lt;li&gt;calling internal services&lt;/li&gt;
&lt;li&gt;reading documents&lt;/li&gt;
&lt;li&gt;executing structured actions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The current version doesn’t implement MCP yet — but the architecture is ready for it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Frontend: Simple, Modern, and Boring (In a Good Way)
&lt;/h2&gt;

&lt;p&gt;The frontend is built with &lt;strong&gt;React + Vite&lt;/strong&gt;, following modern best practices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;small, focused components&lt;/li&gt;
&lt;li&gt;custom hooks for logic&lt;/li&gt;
&lt;li&gt;streaming message rendering&lt;/li&gt;
&lt;li&gt;clean separation between UI and data fetching&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a chat component&lt;/li&gt;
&lt;li&gt;hooks that manage streaming state&lt;/li&gt;
&lt;li&gt;minimal styling (on purpose)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s not a design system.&lt;br&gt;&lt;br&gt;
It’s a &lt;strong&gt;starting point&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Replace it. Restyle it. Or keep it.&lt;/p&gt;




&lt;h2&gt;
  
  
  This Is a Boilerplate, Not a Framework
&lt;/h2&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;You’re encouraged to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;copy files&lt;/li&gt;
&lt;li&gt;delete parts&lt;/li&gt;
&lt;li&gt;rewrite logic&lt;/li&gt;
&lt;li&gt;break conventions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This repo is opinionated enough to be useful — but loose enough to disappear once you’ve taken what you need.&lt;/p&gt;




&lt;h2&gt;
  
  
  Community First
&lt;/h2&gt;

&lt;p&gt;Seriously:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;steal the code&lt;/li&gt;
&lt;li&gt;fork it&lt;/li&gt;
&lt;li&gt;open PRs&lt;/li&gt;
&lt;li&gt;suggest changes&lt;/li&gt;
&lt;li&gt;build weird stuff with it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it saves you a few hours of setup — it did its job.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;AI agents aren’t magic.&lt;br&gt;&lt;br&gt;
They’re software systems that talk to APIs.&lt;/p&gt;

&lt;p&gt;If you can build a backend endpoint and a frontend UI, you can build an AI agent.&lt;/p&gt;

&lt;p&gt;Hopefully, this boilerplate helps you skip the boring parts and get straight to building something interesting.&lt;/p&gt;

&lt;p&gt;Happy hacking 🚀&lt;br&gt;&lt;br&gt;
And yes — please steal it.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>nestjs</category>
      <category>react</category>
      <category>ai</category>
    </item>
    <item>
      <title>Why I Chose Vue Over React in 2025 (Or: How I Survived 15+ Years of Frontend Without Losing My Mind)</title>
      <dc:creator>Royshell</dc:creator>
      <pubDate>Sun, 30 Nov 2025 13:26:46 +0000</pubDate>
      <link>https://dev.to/royshell/why-i-chose-vue-over-react-in-2025-or-how-i-survived-15-years-of-frontend-without-losing-my-3mbd</link>
      <guid>https://dev.to/royshell/why-i-chose-vue-over-react-in-2025-or-how-i-survived-15-years-of-frontend-without-losing-my-3mbd</guid>
      <description>&lt;p&gt;I’ve been writing frontend for more than 15 years.&lt;br&gt;
Yes, I was there before it was cool.&lt;br&gt;
Before the hype.&lt;br&gt;
Before performance budgets.&lt;br&gt;
Before every job interview opened with the terrifying question:&lt;/p&gt;

&lt;p&gt;"So… what do you know about the rules of hooks?"&lt;/p&gt;

&lt;p&gt;Let’s just say this:&lt;br&gt;
If I had one dollar for every time an interviewer asked me about useEffect dependencies, I’d be writing this article from a vineyard in Burgundy.&lt;/p&gt;

&lt;p&gt;I Started Back When jQuery, Backbone and Angular.js Ruled the Earth&lt;/p&gt;

&lt;p&gt;I’ve worked with the first versions of Angular, early React builds, and even Backbone&lt;br&gt;
(yes, I was there from the beginning, when dinosaurs still roamed the DOM).&lt;/p&gt;

&lt;p&gt;I watched these frameworks grow, evolve, mutate and sometimes…&lt;br&gt;
get tangled in their own abstractions.&lt;/p&gt;

&lt;p&gt;For many years, React was my favorite.&lt;br&gt;
It was clean. It was minimal. It made sense.&lt;br&gt;
You had render, you had props, you had state — and life was good.&lt;/p&gt;

&lt;p&gt;And then… Hooks arrived.&lt;/p&gt;

&lt;p&gt;Hooks: The Moment React Started Feeling Less Like React&lt;/p&gt;

&lt;p&gt;Look, I’m not saying hooks are bad.&lt;br&gt;
They’re powerful, flexible and elegant when used correctly.&lt;/p&gt;

&lt;p&gt;But let’s be honest:&lt;/p&gt;

&lt;p&gt;With hooks, React stopped being the small, friendly library I loved&lt;br&gt;
and turned into something more like a university course in lifecycle philosophy.&lt;/p&gt;

&lt;p&gt;Suddenly you need to understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why you can’t call hooks inside an if&lt;/li&gt;
&lt;li&gt;Why the dependency array includes things you don’t even use&lt;/li&gt;
&lt;li&gt;Why missing one dependency triggers a warning longer than your CV&lt;/li&gt;
&lt;li&gt;Why your component renders 3 times before saying hello&lt;/li&gt;
&lt;li&gt;Why writing a simple effect feels like disarming a bomb&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;React stayed great - but it definitely stopped being simple.&lt;/p&gt;

&lt;p&gt;Still, I’ll give React the credit it deserves:&lt;br&gt;
If your project includes mobile, React Native is a monster of an ecosystem.&lt;br&gt;
In that scenario, React still wins.&lt;/p&gt;

&lt;p&gt;But then something happened.&lt;/p&gt;

&lt;p&gt;A New Project: No Mobile, No SSR Drama, Just Lots of UI and Fast Iterations&lt;/p&gt;

&lt;p&gt;I got a project with no mobile requirements.&lt;br&gt;
Just a lot of UI work, many interactions, rapid iteration, and a client who loves changing requirements every two days.&lt;/p&gt;

&lt;p&gt;The priorities were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Velocity&lt;/li&gt;
&lt;li&gt;Simplicity&lt;/li&gt;
&lt;li&gt;Flexibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and also - &lt;strong&gt;a codebase that wouldn't fight back&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So I decided to revisit something I hadn’t touched for a while.&lt;/p&gt;

&lt;p&gt;And that’s how I rediscovered Vue.&lt;/p&gt;

&lt;p&gt;People say Vue has a low learning curve.&lt;/p&gt;

&lt;p&gt;Honestly?&lt;br&gt;
If you’ve used Angular and React for years, the learning curve of Vue is not low.&lt;/p&gt;

&lt;p&gt;It’s &lt;strong&gt;nonexistent&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You open a file, write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  &amp;lt;button @click="increment"&amp;gt;Clicked: {{ counter }}&amp;lt;/button&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script setup&amp;gt;
import { ref } from 'vue';

const counter = ref(0);
const increment = () =&amp;gt; counter.value++;
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And everything works.&lt;br&gt;
No rules of hooks.&lt;br&gt;
No dependency arrays.&lt;br&gt;
No guessing games.&lt;br&gt;
Just… reactivity.&lt;/p&gt;

&lt;p&gt;And that’s the funny part:&lt;/p&gt;

&lt;p&gt;Vue is truly reactive.&lt;/p&gt;

&lt;p&gt;React, despite its name, is basically a smart re-rendering engine&lt;br&gt;
that we wrapped with conventions and patterns over the years.&lt;/p&gt;

&lt;p&gt;Vue’s approach is simpler:&lt;/p&gt;

&lt;p&gt;you update a ref =&amp;gt;&lt;/p&gt;

&lt;p&gt;Vue updates the DOM =&amp;gt;&lt;/p&gt;

&lt;p&gt;you move on with your life.&lt;/p&gt;

&lt;p&gt;Try explaining this to someone who spent years debugging useEffect loops.&lt;/p&gt;

&lt;p&gt;Vue in a Client Project: This Is Where the Magic Happened&lt;/p&gt;

&lt;p&gt;My project required a lot:&lt;/p&gt;

&lt;p&gt;dashboards, AI agent interactions, real time-ish UI updates, changing specs from the founders, demo after demo after demo.&lt;/p&gt;

&lt;p&gt;Vue made it ridiculously easy to: ship features fast, react to last-minute changes, keep code readable, avoid pointless abstractions, and maintain a clean mental model.&lt;/p&gt;

&lt;p&gt;One example: working with the  element.&lt;/p&gt;

&lt;p&gt;In React, you often need: useRef, useEffect, cleanup functions, conditional renders,and then you must pray that the timing is right.&lt;/p&gt;

&lt;p&gt;In Vue:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  &amp;lt;canvas ref="canvas"&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;/template&amp;gt;
&amp;lt;script setup&amp;gt;
import { onMounted, ref } from 'vue';

const canvas = ref(null);

onMounted(() =&amp;gt; {
  const ctx = canvas.value.getContext('2d');
  ctx.fillStyle = 'purple';
  ctx.fillRect(20, 20, 100, 100);
})
&amp;lt;/script&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Done.&lt;br&gt;
No lifecycle puzzles.&lt;br&gt;
No cryptic hook behavior.&lt;br&gt;
Just drawing.&lt;/p&gt;

&lt;p&gt;My clients loved the speed.&lt;br&gt;
I loved the sanity.&lt;br&gt;
Everyone won.&lt;/p&gt;

&lt;p&gt;So Why Did Vue Win for Me in 2025?&lt;br&gt;
1) &lt;strong&gt;Because I want to write real code, not fight the framework&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vue gives me that.&lt;/p&gt;

&lt;p&gt;2) &lt;strong&gt;Because true reactivity beats hook gymnastics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No dependency arrays.&lt;br&gt;
No "why did this effect run again?" moments.&lt;/p&gt;

&lt;p&gt;3) &lt;strong&gt;Because working with clients demands velocity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vue is insanely fast for development.&lt;/p&gt;

&lt;p&gt;4) &lt;strong&gt;Because when mobile isn't involved, React loses its main strategic advantage&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No React Native?&lt;br&gt;
Then Vue shines.&lt;/p&gt;

&lt;p&gt;5) &lt;strong&gt;Because Vue feels like a modern framework built for humans&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It has strong opinions, but not too many.&lt;br&gt;
It has magic, but not too much.&lt;br&gt;
It feels natural.&lt;/p&gt;

&lt;p&gt;After 15+ years of frontend across Backbone, Angular, React and everything in between,&lt;br&gt;
Vue in 2025 feels like the tool I always wanted but only recently discovered.&lt;/p&gt;

&lt;p&gt;React will always have a place in my toolbox.&lt;br&gt;
But in projects focused on UI interactions, speed and clarity,&lt;br&gt;
Vue is my choice moving forward&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>vue</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
