<?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: vinesh eg</title>
    <description>The latest articles on DEV Community by vinesh eg (@vinesh_eg_e429ec230997bf0).</description>
    <link>https://dev.to/vinesh_eg_e429ec230997bf0</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%2F3713799%2Facb2cc43-5c29-4128-a6e5-6e29c233cd91.jpg</url>
      <title>DEV Community: vinesh eg</title>
      <link>https://dev.to/vinesh_eg_e429ec230997bf0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vinesh_eg_e429ec230997bf0"/>
    <language>en</language>
    <item>
      <title>I Built a Browser-Native AI App With No Backend — Here’s What I Learned</title>
      <dc:creator>vinesh eg</dc:creator>
      <pubDate>Wed, 25 Feb 2026 15:36:28 +0000</pubDate>
      <link>https://dev.to/vinesh_eg_e429ec230997bf0/i-built-a-browser-native-ai-app-with-no-backend-heres-what-i-learned-8dl</link>
      <guid>https://dev.to/vinesh_eg_e429ec230997bf0/i-built-a-browser-native-ai-app-with-no-backend-heres-what-i-learned-8dl</guid>
      <description>&lt;h3&gt;
  
  
  Combining Chrome's new WebMCP API with Transformers.js taught me that AI development isn't just a backend problem anymore
&lt;/h3&gt;




&lt;p&gt;When most people think about adding AI to a web app, they picture the same architecture: a frontend that sends requests to a backend that calls OpenAI or Anthropic, and a response that travels back the same way. It works. But it also means API bills, latency, data leaving the device, and infrastructure to maintain.&lt;/p&gt;

&lt;p&gt;I wanted to challenge that assumption. So I built a document analysis app where everything — the AI model, the tool execution, the agent reasoning — runs entirely in the browser. No backend. No API keys. No cloud inference.&lt;/p&gt;

&lt;p&gt;Two tools made it possible: &lt;strong&gt;Transformers.js&lt;/strong&gt; and &lt;strong&gt;Chrome's WebMCP API&lt;/strong&gt;. They solve different problems, and combining them produced something more interesting than either could alone.&lt;/p&gt;




&lt;h2&gt;
  
  
  Transformers.js: The Model Comes to the Browser
&lt;/h2&gt;

&lt;p&gt;Transformers.js is Hugging Face's JavaScript library for running AI models locally in the browser. It uses ONNX format models, accelerated by WebAssembly, with optional WebGPU support for faster inference where available.&lt;/p&gt;

&lt;p&gt;The model I used was &lt;strong&gt;Qwen2.5-0.5B-Instruct&lt;/strong&gt; — a 0.5 billion parameter instruction-tuned model, quantised to 4-bit (~300MB download). It downloads once, caches in the browser, and runs completely offline from that point on.&lt;/p&gt;

&lt;p&gt;The critical engineering decision is where the model runs: a &lt;strong&gt;Web Worker&lt;/strong&gt;. This keeps inference off the main thread entirely, so the UI stays responsive while the model is generating. Without this, the page would freeze for every token generated.&lt;/p&gt;

&lt;p&gt;What surprised me was how capable the model is for focused tasks. Summarisation, keyword extraction, document Q&amp;amp;A, deciding which tool to call — Qwen2.5-0.5B handles all of these well. It's not GPT-4. But for scoped, well-defined tasks it's genuinely useful, and it's free to run after the initial download.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Transformers.js is good for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Privacy-sensitive workflows where data can't leave the device&lt;/li&gt;
&lt;li&gt;Offline-capable applications&lt;/li&gt;
&lt;li&gt;High-volume internal tools where per-token API costs add up fast&lt;/li&gt;
&lt;li&gt;Any task where you want instant responses without a network round trip&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Chrome WebMCP: Making Your Web App Agent-Ready
&lt;/h2&gt;

&lt;p&gt;WebMCP is newer and less understood. It's a W3C browser standard, currently in Chrome 146 Canary behind a feature flag, co-developed by engineers at Google and Microsoft.&lt;/p&gt;

&lt;p&gt;The core idea: websites can register &lt;strong&gt;structured, callable tools&lt;/strong&gt; directly in the browser using a new API called &lt;code&gt;navigator.modelContext&lt;/code&gt;. Any AI agent that has access to the browser session — via Chrome's DevTools protocol or a connected MCP client — can discover those tools and call them as typed function calls.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Register a tool that any AI agent can call
navigator.modelContext.registerTool({
  name: "count_words",
  description: "Count words and estimate reading time for the loaded document",
  inputSchema: {},
  execute: async () =&amp;gt; ({ wordCount: 423, readingTime: "2 min" })
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a significant shift from how browser-based AI agents work today. Current approaches require agents to visually interpret pages — taking screenshots, reading the DOM, simulating clicks. It's brittle. Every redesign breaks the agent's understanding of the page.&lt;/p&gt;

&lt;p&gt;WebMCP replaces visual guessing with a semantic contract. Your page declares what it can do, in terms AI agents already understand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What WebMCP is not&lt;/strong&gt; — it's not for your app talking to an AI. It's for an AI agent talking to your app. The direction of the call is reversed from what most developers expect.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Happens When You Combine Them
&lt;/h2&gt;

&lt;p&gt;Here's where it gets interesting. These two tools solve genuinely different problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transformers.js&lt;/strong&gt; provides local AI intelligence — the ability to reason, summarise, and decide&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebMCP&lt;/strong&gt; provides agent interoperability — the ability for external agents to interact with your app through a typed interface&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the POC I built, they work together as a complete agent loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User: "What are the main topics in this document?"
         ↓
Qwen2.5 (local, Transformers.js) — Pass 1
  Reads tool descriptions, decides: call extract_keywords({ topN: 8 })
         ↓
toolRegistry.execute("extract_keywords")  ← WebMCP handler
  Returns: [{ word: "transformer", count: 8 }, ...]
         ↓
Qwen2.5 (local, Transformers.js) — Pass 2
  Reads the JSON result, writes natural language answer
         ↓
"The main topics are transformers, attention mechanisms, and neural networks..."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model runs twice per agent turn — once to decide which tool to call, once to turn the tool result into a human answer. WebMCP provides the structured bridge in between. Neither step touches a server.&lt;/p&gt;

&lt;p&gt;The UI makes the whole loop visible: a three-panel layout with the document on the left, AI summary in the middle, and an agent chat console on the right where you can see the &lt;code&gt;navigator.modelContext&lt;/code&gt; tool call cards — showing the exact JSON request and response — alongside the natural language answer.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Practical Difference Between the Two APIs
&lt;/h2&gt;

&lt;p&gt;One thing worth being precise about: &lt;strong&gt;WebMCP's &lt;code&gt;navigator.modelContext&lt;/code&gt; is a write-only registration API from your own page's perspective.&lt;/strong&gt; You register tools. External agents call them. There's no &lt;code&gt;getTools()&lt;/code&gt; method — you can't call your own registered tools back through the navigator API.&lt;/p&gt;

&lt;p&gt;In the POC, I solved this by maintaining a parallel &lt;code&gt;toolRegistry&lt;/code&gt; — a simple JavaScript object that stores each tool's execute function. The WebMCP registration exposes tools to external agents, while the registry ref lets the local agent console call the same functions directly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Each tool registers in two places:
  1. navigator.modelContext.registerTool()  → for external AI agents
  2. toolRegistry["tool_name"] = fn        → for local agent loop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same logic, same output. One is the external interface, one is the internal wiring.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Use Cases This Unlocks
&lt;/h2&gt;

&lt;p&gt;Working through this POC made the practical applications obvious:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Legal and medical document review&lt;/strong&gt; — documents never leave the device, no compliance questions about data egress, AI assistance is still fully functional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Internal enterprise tools&lt;/strong&gt; — no per-token API costs, no rate limits, works on restricted networks. A tool used by a hundred people all day costs the same as one person using it for five minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent-ready web apps&lt;/strong&gt; — with WebMCP, your web app becomes part of the broader AI agent ecosystem automatically. When Claude in Chrome, Cursor, or any MCP-compatible agent visits your page, it gets a clean typed API instead of having to scrape your UI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Offline-first applications&lt;/strong&gt; — once the model is cached, everything works without connectivity. Field tools, healthcare applications, anything that needs to work in low-connectivity environments.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Honest Trade-offs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Model capability:&lt;/strong&gt; A 0.5B parameter model is good at focused tasks but not at complex multi-step reasoning. If you need GPT-4 level capability, you still need a cloud model. Browser-native AI is excellent for scoped, well-defined tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First load:&lt;/strong&gt; ~300MB is a real UX consideration. Users need to see clear progress and understand what's happening. After the first download it's instant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WebMCP maturity:&lt;/strong&gt; Chrome 146 Canary only, behind a flag. No Firefox or Safari signals yet. The &lt;code&gt;@mcp-b/global&lt;/code&gt; polyfill bridges the gap for demos and development, but native agent discovery requires Chrome Canary for now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WebGPU on Windows:&lt;/strong&gt; GPU driver crashes with WebGPU are common on Windows right now. WASM is the stable fallback — slower but reliable everywhere.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;What this combination demonstrates is that AI development has a new axis to reason about: not just which model, but where the model runs and how your app exposes itself to agents. For a long time, "frontend developer" and "AI developer" were different job descriptions. Transformers.js and WebMCP are collapsing that gap. A frontend developer who understands these two APIs can now ship a complete AI-powered workflow — with local inference, structured tool use, and agent interoperability — without touching a backend. The web page is becoming an AI-native surface. Not just a UI for humans, but a typed interface for agents. WebMCP is the standard that makes that possible without giving up the browser's security model or the user's privacy.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>WebMCP: Your AI, Every Website — The Web’s New Power Shift</title>
      <dc:creator>vinesh eg</dc:creator>
      <pubDate>Mon, 16 Feb 2026 16:02:30 +0000</pubDate>
      <link>https://dev.to/vinesh_eg_e429ec230997bf0/webmcp-your-ai-every-website-the-webs-new-power-shift-9d3</link>
      <guid>https://dev.to/vinesh_eg_e429ec230997bf0/webmcp-your-ai-every-website-the-webs-new-power-shift-9d3</guid>
      <description>&lt;h2&gt;
  
  
  The Paradigm Shift: Users Control AI, Not Developers
&lt;/h2&gt;

&lt;p&gt;Chrome 146 has officially introduced &lt;strong&gt;WebMCP&lt;/strong&gt;, fundamentally changing who holds the keys to AI on the web.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Old Way:&lt;/strong&gt; Developers choose the AI. You visit a site, you use &lt;em&gt;their&lt;/em&gt; model, &lt;em&gt;their&lt;/em&gt; API, and follow &lt;em&gt;their&lt;/em&gt; privacy rules.&lt;br&gt;
&lt;strong&gt;The WebMCP Way:&lt;/strong&gt; You choose the AI. You bring your preferred assistant—whether it's a local Llama model or a cloud-based Claude—to every website you visit.&lt;/p&gt;

&lt;p&gt;Think of it like the early web: Websites used to dictate which browser you needed. Now, browsers are universal. WebMCP does the same for AI—&lt;strong&gt;your AI now works everywhere.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  What exactly is WebMCP?
&lt;/h2&gt;

&lt;p&gt;WebMCP is a browser API that allows websites to expose their internal functions (tools) to a user's chosen AI assistant.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Developer's Implementation:
&lt;/h3&gt;

&lt;p&gt;Instead of complex SDKs, you simply register tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Websites register what they can do&lt;/span&gt;
&lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerTool&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;search_products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;'Search our product catalog',&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/api/search?q=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The website says, "I can search products." Your AI (configured in your browser) sees that capability and uses it to fulfill your requests.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Wins (For Everyone)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stakeholder&lt;/th&gt;
&lt;th&gt;Benefit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Privacy &amp;amp; Choice.&lt;/strong&gt; Process medical or financial data using a local model (like Gemini Nano) so data never leaves your machine.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Developers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Zero Cost.&lt;/strong&gt; Stop paying $500/month in OpenAI API fees. Users bring their own "compute" and "intelligence."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Architects&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Separation of Concerns.&lt;/strong&gt; Your app provides the &lt;em&gt;capabilities&lt;/em&gt;; the browser handles the &lt;em&gt;orchestration&lt;/em&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Real-World Scenario: The "One-Command" Shopping
&lt;/h3&gt;

&lt;p&gt;Imagine visiting a retail site and telling your browser AI:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Find me wireless headphones under $100 and add the best-reviewed pair to my cart."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;The site exposes &lt;code&gt;search_products&lt;/code&gt; and &lt;code&gt;add_to_cart&lt;/code&gt; via WebMCP.&lt;/li&gt;
&lt;li&gt;Your AI discovers these tools.&lt;/li&gt;
&lt;li&gt;Your AI executes the search, parses the reviews, and hits the "add to cart" function.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The developer didn't have to build a chatbot; they just had to expose their API.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Testing WebMCP: Building a Task Manager POC
&lt;/h2&gt;

&lt;p&gt;To validate WebMCP's real-world viability, I built a proof-of-concept task management application. Here's what I learned:&lt;/p&gt;

&lt;h3&gt;
  
  
  The Setup (Chrome Canary 146+)
&lt;/h3&gt;

&lt;p&gt;WebMCP is currently experimental:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download Chrome Canary&lt;/li&gt;
&lt;li&gt;Enable &lt;code&gt;chrome://flags/#enable-experimental-web-platform-features&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Restart browser&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Implementation
&lt;/h3&gt;

&lt;p&gt;Instead of integrating an AI SDK, I registered six tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerTool&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;add_task&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Add a new task to the list&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;inputSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;taskText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Task description&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;taskText&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; 
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; 
      &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;taskText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
      &lt;span class="na"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; 
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nf"&gt;updateUI&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Task added: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;taskText&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Users could say "Add a task to buy groceries" and their AI (whichever they configured) would execute the function—no prompt engineering, no model selection, no API costs on my end.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Learnings from the POC
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. The Mental Shift is Real&lt;/strong&gt;&lt;br&gt;
As a developer, you stop thinking "How do I integrate AI?" and start thinking "What capabilities should I expose?" It's liberating.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Fallback Strategy Required&lt;/strong&gt;&lt;br&gt;
Only Chrome Canary 146+ supports WebMCP currently. Feature detection is essential:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;modelContext&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Use WebMCP&lt;/span&gt;
  &lt;span class="nf"&gt;initWebMCPTools&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Fallback to traditional AI integration&lt;/span&gt;
  &lt;span class="nf"&gt;initGeminiAPI&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Performance Varies by User's Choice&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;User with local AI:&lt;/strong&gt; 10-50ms response time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User with cloud AI:&lt;/strong&gt; 500-1500ms response time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer's API cost:&lt;/strong&gt; $0 in both cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Privacy is Verifiable&lt;/strong&gt;&lt;br&gt;
When testing with local AI models, network monitoring confirmed zero external API calls. Data truly stayed on the device—perfect for sensitive applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Tool Documentation Becomes Your API&lt;/strong&gt;&lt;br&gt;
Your tool descriptions are critical. They're the only "interface" the AI has. Clear, precise descriptions determine whether the AI can use your tools effectively:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ Bad: Vague description&lt;/span&gt;
&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Does task stuff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="c1"&gt;// ✅ Good: Clear, actionable description&lt;/span&gt;
&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Add a new task to the user&lt;/span&gt;&lt;span class="se"&gt;\'&lt;/span&gt;&lt;span class="s1"&gt;s task list with the provided text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Reality Check: Security &amp;amp; Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Input Validation is Critical
&lt;/h3&gt;

&lt;p&gt;Just because an AI called your tool doesn't mean the input is safe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ✅ Always validate&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;taskText&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;taskText&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid task text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// ✅ Sanitize for XSS&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sanitized&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sanitizeHTML&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;taskText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// ✅ Check business rules&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sanitized&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Task text too long&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;performAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sanitized&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Rate Limiting Still Matters
&lt;/h3&gt;

&lt;p&gt;Even though you're not paying for AI inference, prevent abuse:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rateLimiter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;checkRateLimit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;requests&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;rateLimiter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;recentRequests&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;60000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;recentRequests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Rate limit exceeded&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;recentRequests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="nx"&gt;rateLimiter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;recentRequests&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Performance Considerations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Variable latency:&lt;/strong&gt; A local model might respond in 10ms, a cloud model in 2 seconds. Build UIs with loading states and optimistic updates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The BYOM risk:&lt;/strong&gt; Users' AI quality varies. Their model might misinterpret your tools. Robust error handling and clear tool descriptions are essential.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bottom Line
&lt;/h2&gt;

&lt;p&gt;WebMCP isn't just an API; it's a decentralization of intelligence. It moves AI from a &lt;strong&gt;B2B&lt;/strong&gt; product (sold to devs) to a &lt;strong&gt;B2C&lt;/strong&gt; utility (owned by users).&lt;/p&gt;

&lt;h3&gt;
  
  
  My POC Proved Three Things:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Developer experience is simpler&lt;/strong&gt; — No SDK bloat, no API key management, just expose your capabilities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost savings are real&lt;/strong&gt; — $1,800/year eliminated for a modest-traffic app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User control is genuine&lt;/strong&gt; — Privacy, model choice, and performance tradeoffs shift to where they belong: the user&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Within two years, saying "Our site is AI-enabled" will sound as redundant as "Our site has buttons." The web is becoming AI-native, and for the first time, &lt;strong&gt;the user is in control.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Ready to build?&lt;/strong&gt; Start by auditing your app's core functions. What could an AI do for your users if it had the right "tools"?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it yourself:&lt;/strong&gt; My task manager POC is open source. Clone it, enable WebMCP in Chrome Canary, and experience the future of web development firsthand. See README for setup instructions.&lt;/p&gt;

&lt;p&gt;Note: content created with the help of AI!&lt;/p&gt;

</description>
      <category>webmcp</category>
      <category>mcp</category>
      <category>frontend</category>
      <category>web</category>
    </item>
    <item>
      <title>Stop Wasting Time on Dev Tooling Setup: Meet dev-forge</title>
      <dc:creator>vinesh eg</dc:creator>
      <pubDate>Tue, 10 Feb 2026 14:35:30 +0000</pubDate>
      <link>https://dev.to/vinesh_eg_e429ec230997bf0/stop-wasting-time-on-dev-tooling-setup-meet-dev-forge-2jkj</link>
      <guid>https://dev.to/vinesh_eg_e429ec230997bf0/stop-wasting-time-on-dev-tooling-setup-meet-dev-forge-2jkj</guid>
      <description>&lt;h2&gt;
  
  
  The Problem Every Developer Faces
&lt;/h2&gt;

&lt;p&gt;Picture this: You're excited to start a new project. You create a new repository, run &lt;code&gt;npm init&lt;/code&gt;, and then... the dreaded tooling setup begins.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; eslint prettier husky lint-staged
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; @typescript-eslint/parser @typescript-eslint/eslint-plugin
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; stylelint stylelint-config-standard
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; commitlint @commitlint/config-conventional
&lt;span class="c"&gt;# ... 20 more packages and counting&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then comes the configuration files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.eslintrc.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.prettierrc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.huskyrc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.lintstagedrc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.stylelintrc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;commitlint.config.js&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each with dozens of configuration options. Each needing to work together. Each requiring maintenance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two hours later&lt;/strong&gt;, you still haven't written a single line of actual code.&lt;/p&gt;

&lt;p&gt;Sound familiar?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Cost of Developer Tooling
&lt;/h2&gt;

&lt;p&gt;Let's be honest about what this costs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Time Lost&lt;/strong&gt;: 2-4 hours per project setup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inconsistency&lt;/strong&gt;: Every project configured slightly differently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintenance Burden&lt;/strong&gt;: Updating 10+ dependencies regularly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding Friction&lt;/strong&gt;: New team members confused by configuration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cognitive Load&lt;/strong&gt;: Remembering what all these tools do&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a team of 5 developers starting 10 projects a year:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;100-200 hours&lt;/strong&gt; spent just on tooling setup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;That's 2.5-5 weeks&lt;/strong&gt; of productive development time lost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that's just setup. Add maintenance, debugging configuration conflicts, and keeping up with best practices? The real cost is even higher.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing @vinesheg/dev-forge
&lt;/h2&gt;

&lt;p&gt;What if you could get enterprise-grade developer tooling with a single command?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; @vinesheg/dev-forge
npx forge init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. &lt;strong&gt;30 seconds and you're done.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;dev-forge is a zero-configuration developer toolkit that bundles and pre-configures six essential development tools into one package:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Biome&lt;/strong&gt; - Lightning-fast linting and formatting (10-100x faster than ESLint)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knip&lt;/strong&gt; - Find unused files, dependencies, and exports&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lefthook&lt;/strong&gt; - High-performance Git hooks (faster than Husky)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commitlint&lt;/strong&gt; - Enforce conventional commit messages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stylelint&lt;/strong&gt; - Professional CSS/SCSS linting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm-package-json-lint&lt;/strong&gt; - Validate your package.json structure&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Zero Configuration
&lt;/h3&gt;

&lt;p&gt;No configuration files to create. No options to remember. No decisions to make. It just works.&lt;/p&gt;

&lt;p&gt;The package includes battle-tested defaults that follow industry best practices. You can override anything if needed, but 95% of projects won't need to.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Single Dependency
&lt;/h3&gt;

&lt;p&gt;Instead of installing and managing 10+ packages:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"devDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"eslint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^8.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"prettier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^3.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"husky"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^8.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lint-staged"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^13.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@typescript-eslint/parser"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^6.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@typescript-eslint/eslint-plugin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^6.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"eslint-config-prettier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^9.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"stylelint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^15.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"stylelint-config-standard"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^34.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@commitlint/cli"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^17.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@commitlint/config-conventional"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^17.0.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"devDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@vinesheg/dev-forge"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.0.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Built on Speed
&lt;/h3&gt;

&lt;p&gt;dev-forge uses the fastest tools available:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Biome&lt;/strong&gt; (written in Rust) is 10-100x faster than ESLint&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lefthook&lt;/strong&gt; (written in Go) outperforms Husky significantly&lt;/li&gt;
&lt;li&gt;Parallel execution by default for even faster checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On a medium-sized project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ESLint + Prettier: &lt;strong&gt;~8 seconds&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Biome: &lt;strong&gt;~0.5 seconds&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's a &lt;strong&gt;16x speedup&lt;/strong&gt; on every commit, every save, every check.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Automatic Git Hooks
&lt;/h3&gt;

&lt;p&gt;Git hooks are installed automatically and run on every commit:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pre-commit hook:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Lints and formats staged files&lt;/li&gt;
&lt;li&gt;✅ Checks CSS/SCSS&lt;/li&gt;
&lt;li&gt;✅ Validates package.json if changed&lt;/li&gt;
&lt;li&gt;✅ Auto-fixes issues when possible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Commit-msg hook:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Enforces &lt;a href="https://www.conventionalcommits.org/" rel="noopener noreferrer"&gt;Conventional Commits&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;✅ Ensures clean commit history&lt;/li&gt;
&lt;li&gt;✅ Enables automatic changelog generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No bad code reaches your repository. Ever.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Team Consistency
&lt;/h3&gt;

&lt;p&gt;Every developer on your team gets the same setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# New team member joins&lt;/span&gt;
git clone your-repo
npm &lt;span class="nb"&gt;install&lt;/span&gt;  &lt;span class="c"&gt;# Automatically runs 'forge init'&lt;/span&gt;
&lt;span class="c"&gt;# ✅ Fully configured, ready to code&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No more "works on my machine" issues. No more style debates. No more inconsistent code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Impact
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before dev-forge:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Monday 9:00 AM: Start new microservice
Monday 9:05 AM: npm init
Monday 9:10 AM: Install ESLint, Prettier, Husky...
Monday 9:30 AM: Configure ESLint
Monday 10:00 AM: Configure Prettier
Monday 10:30 AM: Set up Husky + lint-staged
Monday 11:00 AM: Configure commitlint
Monday 11:30 AM: Fight with ESLint/Prettier conflicts
Monday 12:00 PM: Finally start coding
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  After dev-forge:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Monday 9:00 AM: Start new microservice
Monday 9:05 AM: npm install --save-dev @vinesheg/dev-forge
Monday 9:06 AM: npx forge init
Monday 9:07 AM: Start coding
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Time saved: 2 hours 53 minutes&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;dev-forge uses a smart "extends" pattern for maximum flexibility:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Installation&lt;/strong&gt; creates minimal local configs that extend the toolkit's defaults&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;All tools&lt;/strong&gt; run from the toolkit's own dependencies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero maintenance&lt;/strong&gt; - update one package, update everything&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customization&lt;/strong&gt; - override any setting by editing the generated configs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example generated &lt;code&gt;biome.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://biomejs.dev/schemas/1.9.4/schema.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"./node_modules/@vinesheg/dev-forge/configs/biome.json"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Want to disable a rule? Just add it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"./node_modules/@vinesheg/dev-forge/configs/biome.json"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"linter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rules"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"suspicious"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"noExplicitAny"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"off"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Initialize in a New Project
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; @vinesheg/dev-forge
npx forge init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Add to package.json Scripts
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"forge check"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lint:fix"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"forge fix"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Run Checks
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run lint      &lt;span class="c"&gt;# Check all files&lt;/span&gt;
npm run lint:fix  &lt;span class="c"&gt;# Auto-fix issues&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Git Hooks Run Automatically
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat: add user authentication"&lt;/span&gt;
&lt;span class="c"&gt;# ✅ Pre-commit hook checks your code&lt;/span&gt;
&lt;span class="c"&gt;# ✅ Commit message validated&lt;/span&gt;
&lt;span class="c"&gt;# ✅ Commit succeeds if all pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  CI/CD Integration
&lt;/h2&gt;

&lt;p&gt;Add to GitHub Actions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Quality Checks&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx forge check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. All your quality checks in one command.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Should Use This?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Individual Developers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Side projects&lt;/li&gt;
&lt;li&gt;✅ Portfolio work&lt;/li&gt;
&lt;li&gt;✅ Learning projects&lt;/li&gt;
&lt;li&gt;✅ Open source contributions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Benefit:&lt;/strong&gt; Spend time coding, not configuring&lt;/p&gt;

&lt;h3&gt;
  
  
  Startups
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Move fast without sacrificing quality&lt;/li&gt;
&lt;li&gt;✅ Consistent standards from day one&lt;/li&gt;
&lt;li&gt;✅ Easy onboarding for new hires&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Benefit:&lt;/strong&gt; Scale from 2 to 20 developers seamlessly&lt;/p&gt;

&lt;h3&gt;
  
  
  Established Teams
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Standardize across all projects&lt;/li&gt;
&lt;li&gt;✅ Reduce maintenance burden&lt;/li&gt;
&lt;li&gt;✅ Modernize legacy tooling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Benefit:&lt;/strong&gt; Reduce tool setup time by 80%+&lt;/p&gt;

&lt;h3&gt;
  
  
  Open Source Projects
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Lower barrier for contributors&lt;/li&gt;
&lt;li&gt;✅ Enforce quality automatically&lt;/li&gt;
&lt;li&gt;✅ Modern, fast tooling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Benefit:&lt;/strong&gt; More contributions, higher quality&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Details
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Built With
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Biome&lt;/strong&gt; - Rust-based linter/formatter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lefthook&lt;/strong&gt; - Go-based Git hooks&lt;/li&gt;
&lt;li&gt;Modern, maintained packages only&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node.js ≥ 18.0.0&lt;/li&gt;
&lt;li&gt;Git (for hooks)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  File Size
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Package: ~2 MB&lt;/li&gt;
&lt;li&gt;With dependencies: ~50 MB&lt;/li&gt;
&lt;li&gt;Negligible impact on project size&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Performance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Initialization: &amp;lt; 1 second&lt;/li&gt;
&lt;li&gt;Check command: 2-5 seconds (medium project)&lt;/li&gt;
&lt;li&gt;Git hooks: &amp;lt; 1 second&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comparison with Alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Manual Setup&lt;/th&gt;
&lt;th&gt;ESLint+Prettier+Husky&lt;/th&gt;
&lt;th&gt;dev-forge&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Setup time&lt;/td&gt;
&lt;td&gt;2-4 hours&lt;/td&gt;
&lt;td&gt;1-2 hours&lt;/td&gt;
&lt;td&gt;30 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Packages to install&lt;/td&gt;
&lt;td&gt;10+&lt;/td&gt;
&lt;td&gt;6-8&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Config files&lt;/td&gt;
&lt;td&gt;5-7&lt;/td&gt;
&lt;td&gt;4-5&lt;/td&gt;
&lt;td&gt;5 (auto-generated)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linting speed&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;Slow&lt;/td&gt;
&lt;td&gt;Very fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintenance&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best practices&lt;/td&gt;
&lt;td&gt;Maybe&lt;/td&gt;
&lt;td&gt;Depends&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git hooks&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Automatic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dead code detection&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Package.json validation&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Getting Started Today
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; @vinesheg/dev-forge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Initialize:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   npx forge init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start coding:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Git hooks are installed&lt;/li&gt;
&lt;li&gt;All tools configured&lt;/li&gt;
&lt;li&gt;Quality checks automatic&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Philosophy
&lt;/h2&gt;

&lt;p&gt;dev-forge follows three core principles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Convention over Configuration&lt;/strong&gt; - Sensible defaults that just work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed Matters&lt;/strong&gt; - Use the fastest tools available&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer Experience First&lt;/strong&gt; - Make the right thing the easy thing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We believe developers should spend time solving problems, not configuring tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;We're working on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔌 &lt;strong&gt;Plugin System&lt;/strong&gt; - Add custom tools easily&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;More Tools&lt;/strong&gt; - Additional quality checks and automation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Now
&lt;/h2&gt;

&lt;p&gt;Don't let tooling setup slow you down. Try dev-forge in your next project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; @vinesheg/dev-forge
npx forge init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It takes 30 seconds. Your future self will thank you.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Published under MIT License. Free to use, modify, and share.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>productivity</category>
      <category>showdev</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
