<?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: Ayush Niroula</title>
    <description>The latest articles on DEV Community by Ayush Niroula (@ayushniroula).</description>
    <link>https://dev.to/ayushniroula</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F634848%2F84e12105-389a-4a3f-829f-479a1a6fe5a6.jpeg</url>
      <title>DEV Community: Ayush Niroula</title>
      <link>https://dev.to/ayushniroula</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ayushniroula"/>
    <language>en</language>
    <item>
      <title>Introducing Tributary: your coding agents, one workbench</title>
      <dc:creator>Ayush Niroula</dc:creator>
      <pubDate>Mon, 09 Nov 2026 16:27:09 +0000</pubDate>
      <link>https://dev.to/ayushniroula/introducing-tributary-your-coding-agents-one-workbench-da3</link>
      <guid>https://dev.to/ayushniroula/introducing-tributary-your-coding-agents-one-workbench-da3</guid>
      <description>&lt;p&gt;Tributary is an open-source AI workbench for working with the coding agents and local models you already use. It includes a desktop app, a VS Code companion and a CLI.&lt;/p&gt;

&lt;p&gt;The idea is straightforward: keep the conversation, real project files and review tools together, even when you change assistants.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fympf6rk4efgt4z7gx4aa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fympf6rk4efgt4z7gx4aa.png" alt="Tributary’s original beaver and helper-bot illustration" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Original project artwork. The workbench screenshot below shows the actual app.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bring your own agent
&lt;/h2&gt;

&lt;p&gt;Tributary connects to native coding agents such as Claude Code, Codex and Gemini CLI, and supports compatible Agent Client Protocol tools such as OpenCode. You can also connect model services including Ollama, LM Studio, Unsloth and llama.cpp.&lt;/p&gt;

&lt;p&gt;Your assistant still needs its own account, installation or local service. Model access and available tools depend on that connection. Tributary gives them a shared place to work with your project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow the work in real files
&lt;/h2&gt;

&lt;p&gt;Open a project folder, ask for a change and review the result in the editor. You can inspect Git diffs and red/green line counts, use split editors, run commands in terminals and check the project’s formatting rules.&lt;/p&gt;

&lt;p&gt;The workbench also has a preview browser, project checks and Node.js/TypeScript debugging support. It can help with QA workflows such as inspecting imported Playwright results, screenshots and traces.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F51ad1q9q78225sbj1azq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F51ad1q9q78225sbj1azq.png" alt="Actual Tributary workbench: files, editor and agent chat" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Start a team from chat
&lt;/h2&gt;

&lt;p&gt;For a task with independent pieces, start with &lt;code&gt;/team&lt;/code&gt;, choose workers and follow their progress in Live activity. You can keep more than one background chat moving and review the resulting changes.&lt;/p&gt;

&lt;p&gt;Background runs require the app to remain open. Shared project rooms coordinate people and tasks; they do not automatically synchronize everyone’s source files or execute agents on another person’s computer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep project context useful
&lt;/h2&gt;

&lt;p&gt;Project notes can hold decisions, run instructions and gotchas. Bounded excerpts help carry useful context to an assistant without sending every previous conversation. File mentions and agent handoffs help keep the work connected when you switch tools.&lt;/p&gt;

&lt;p&gt;Local coding connections support file tools and approved commands. Deep research needs an assistant with web tools; local coding mode does not include a bundled web-search service.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small Rust bridge, with published measurements
&lt;/h2&gt;

&lt;p&gt;Tributary uses an optional Rust helper for bounded file discovery and ownership of a local model process. The intention is to give specific expensive work an explicit lifetime and keep its buffers bounded.&lt;/p&gt;

&lt;p&gt;The recorded Linux results are deliberately scoped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discovery allocation requests fell about 33–66% in the recorded cases.&lt;/li&gt;
&lt;li&gt;Fifteen of 18 CLI scan medians improved; three became slower.&lt;/li&gt;
&lt;li&gt;A six-app CPU-model comparison measured idle app/model PSS of 456.803 → 439.785 MiB.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are different source-build workloads, not evidence of a universal editor speed ranking. The benchmark guide publishes raw observations, source snapshots, methods and unfavorable cases. Its verifier recalculates the numbers without running another benchmark.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/DarkWorldCoder/tributary/blob/main/BENCHMARKS.md" rel="noopener noreferrer"&gt;Read the benchmark evidence&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the preview
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/DarkWorldCoder/tributary/releases" rel="noopener noreferrer"&gt;Get Tributary&lt;/a&gt;, open a project and use Settings → Connections to connect an assistant. Preview installers are unsigned; release checksums are included.&lt;/p&gt;

&lt;p&gt;If you prefer building from source, the README covers Node.js, npm, Git and the optional Rust helper.&lt;/p&gt;

&lt;p&gt;I’m looking for concrete feedback: which agent do you use, what work do you want to do, and where does the workflow get in your way?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/DarkWorldCoder/tributary" rel="noopener noreferrer"&gt;Source and setup&lt;/a&gt; · &lt;a href="https://github.com/DarkWorldCoder/tributary/issues" rel="noopener noreferrer"&gt;Report an issue&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Preview a Django template without starting its application server</title>
      <dc:creator>Ayush Niroula</dc:creator>
      <pubDate>Tue, 03 Nov 2026 08:04:03 +0000</pubDate>
      <link>https://dev.to/ayushniroula/preview-a-django-template-without-starting-its-application-server-5bd8</link>
      <guid>https://dev.to/ayushniroula/preview-a-django-template-without-starting-its-application-server-5bd8</guid>
      <description>&lt;p&gt;A template review is easier to reproduce when the template, engine and input data are all explicit. Here is the native Django workflow being added to Arguseye, including a baseline you can compare after an edit.&lt;/p&gt;

&lt;p&gt;I’m the maker of Arguseye. This draft was prepared with AI from the project’s implementation and test records; it is not a report of production adoption.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Release status:&lt;/strong&gt; use the &lt;code&gt;feat/template-previews&lt;/code&gt; source branch for this walkthrough. The published 0.0.15 npm and VS Code packages do not contain this work yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Use a real Python environment
&lt;/h2&gt;

&lt;p&gt;Your project needs its own Django installation. Arguseye uses &lt;code&gt;.venv/bin/python&lt;/code&gt; on Linux/macOS or &lt;code&gt;.venv/Scripts/python.exe&lt;/code&gt; on Windows when that environment exists. Another interpreter can be selected in project configuration.&lt;/p&gt;

&lt;p&gt;The template project does not need React or a &lt;code&gt;package.json&lt;/code&gt;. The Arguseye CLI itself still requires Node.js 22+ and Chromium or Chrome.&lt;/p&gt;

&lt;p&gt;Build the development branch in a separate directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="nt"&gt;--branch&lt;/span&gt; feat/template-previews https://github.com/DarkWorldCoder/arguseye.git
&lt;span class="nb"&gt;cd &lt;/span&gt;arguseye
npm ci
npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the following commands, replace &lt;code&gt;/path/to/arguseye&lt;/code&gt; and &lt;code&gt;/path/to/python-app&lt;/code&gt; with your actual directories. No app server is started.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Make a small template with an include
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;templates/card.html&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jinja"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;article&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Hello &lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
  &lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;include&lt;/span&gt; &lt;span class="s2"&gt;"items.html"&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;templates/items.html&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jinja"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
  &lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nv"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;items&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;item&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;endfor&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the Python project root, create &lt;code&gt;arguseye.templates.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;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mappings"&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="nl"&gt;"pattern"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"templates/**/*.html"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"engine"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"django"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"roots"&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;"templates"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"profiles"&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="nl"&gt;"example"&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="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ada"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"items"&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;"Tea"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Coffee"&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;A path mapping matters because &lt;code&gt;.html&lt;/code&gt; can also be ordinary HTML. Template delimiters alone are not proof that Django is the correct engine.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Save a baseline
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node /path/to/arguseye/dist/cli.mjs shot templates/card.html &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--root&lt;/span&gt; /path/to/python-app &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--engine&lt;/span&gt; django &lt;span class="nt"&gt;--profile&lt;/span&gt; example &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--capture-dir&lt;/span&gt; /tmp/card-baseline &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; summary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result includes accessibility text, errors, warnings, resolved inputs and native-engine metadata. The baseline directory preserves the screenshot and comparison inputs even though this command only prints a summary.&lt;/p&gt;

&lt;p&gt;Check &lt;code&gt;errors&lt;/code&gt; and &lt;code&gt;warnings&lt;/code&gt; before treating the result as complete. Missing context is useful evidence for the next edit.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Edit the partial and compare
&lt;/h2&gt;

&lt;p&gt;Change the list text or styling in &lt;code&gt;items.html&lt;/code&gt;, then run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node /path/to/arguseye/dist/cli.mjs diff &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--root&lt;/span&gt; /path/to/python-app &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--baseline&lt;/span&gt; /tmp/card-baseline &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--out&lt;/span&gt; /tmp/card-comparison &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The comparison uses the baseline’s resolved data and viewport. It returns before/after evidence, highlighted changed pixels, accessibility changes, and new or resolved errors. Its status is &lt;code&gt;unchanged&lt;/code&gt;, &lt;code&gt;changed&lt;/code&gt; or &lt;code&gt;incomplete&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A changed screenshot still needs a review. It does not establish that the edit is correct.&lt;/p&gt;

&lt;h2&gt;
  
  
  In VS Code
&lt;/h2&gt;

&lt;p&gt;The matching extension build adds &lt;strong&gt;Preview Component&lt;/strong&gt; to the editor, tab and Explorer context menus. Choose the engine and a data profile, then open &lt;strong&gt;Props&lt;/strong&gt; to edit JSON. Unsaved template and partial edits use the same engine as CLI and MCP verification. Template updates replace the document and reset interactive state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where a full application test is still needed
&lt;/h2&gt;

&lt;p&gt;This workflow renders Django’s native templates with supplied context. It does not automatically run views, middleware, context processors or database queries. Project tags and filters need explicit setup. Rendering trusted template code is not an OS security sandbox.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/DarkWorldCoder/arguseye/blob/feat/template-previews/docs/templates.md" rel="noopener noreferrer"&gt;native-template guide&lt;/a&gt; lists the installed engine fixtures, configuration and exact adapter boundaries. Reproducible examples that expose a wrong include, escaping difference or missing context are especially useful feedback.&lt;/p&gt;

</description>
      <category>django</category>
      <category>python</category>
      <category>devtools</category>
      <category>opensource</category>
    </item>
    <item>
      <title>5 prompts to give your coding agent before you ship a launch</title>
      <dc:creator>Ayush Niroula</dc:creator>
      <pubDate>Fri, 30 Oct 2026 02:42:14 +0000</pubDate>
      <link>https://dev.to/ayushniroula/5-prompts-to-give-your-coding-agent-before-you-ship-a-launch-4kek</link>
      <guid>https://dev.to/ayushniroula/5-prompts-to-give-your-coding-agent-before-you-ship-a-launch-4kek</guid>
      <description>&lt;p&gt;Your agent writes the landing page, the pricing table and the launch email. Then you ship, and find out from real customers what was wrong.&lt;/p&gt;

&lt;p&gt;You can make the same agent rehearse the launch first. Install the MarketMirror plugin or MCP server once, then give it prompts like these.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. "Which of these three ads should I run?"
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Use MarketMirror to test these three ads on young parents and students in India. Put them in Instagram and Facebook feeds and tell me which one people stop at, which one confuses them, and why.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You get thumb-stop, click and hide rates per ad and per audience, with the comments people left.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. "Is this price going to feel wrong?"
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Survey 150 simulated buyers on USD 4.99 a month versus USD 2.99, with and without a card for the free trial. Run it three times and show me the range.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In one simulated Fitloop study, the card requirement dropped trial starts from 4.1% to 0.2%.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. "Will my sales pitch backfire?"
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Rehearse this pitch and these rebuttals with the simulated buyers. Tell me which objections my rebuttals fix and which they make worse.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the 2,999-person Fitloop run, the rebuttals pushed "no" from 34.8% to 54.2% (simulated). Better to learn that here.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. "Where does my site lose people?"
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Send simulated visitors through &lt;a href="https://my-site.example" rel="noopener noreferrer"&gt;https://my-site.example&lt;/a&gt; and record where they hesitate, leave or finish signing up.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  5. "Do the models agree?"
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Run the same survey with Claude and Codex writing and playing different thirds of the market, and show me where they disagree.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When they disagree, you've found the part of your plan that's least certain.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9hrjdijonvsdz4iznfja.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9hrjdijonvsdz4iznfja.png" alt="The live control room while a run plays" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;The quickest way, with &lt;a href="https://docs.astral.sh/uv/" rel="noopener noreferrer"&gt;uv&lt;/a&gt; installed, is one entry in your agent's MCP config (the package is &lt;code&gt;marketmirror&lt;/code&gt; on PyPI and in the official MCP Registry):&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;"mcpServers"&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;"market-mirror"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"uvx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"marketmirror"&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;p&gt;Then ask the agent to run &lt;code&gt;doctor&lt;/code&gt; and &lt;code&gt;setup&lt;/code&gt;. Or install from a clone:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/DarkWorldCoder/market-mirror.git
&lt;span class="nb"&gt;cd &lt;/span&gt;market-mirror
bash install.sh
./mm configure
./mm agent-config &lt;span class="nt"&gt;--client&lt;/span&gt; claude   &lt;span class="c"&gt;# also: codex, cursor, gemini, generic&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every result is simulated and labelled so: use it to choose what to test for real.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/DarkWorldCoder/market-mirror" rel="noopener noreferrer"&gt;https://github.com/DarkWorldCoder/market-mirror&lt;/a&gt;&lt;/strong&gt; (a ⭐ helps other people find it)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written with help from an AI assistant; numbers are from the saved simulated runs in the README.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Give your coding agent visual feedback on React, Next.js, and Vue edits</title>
      <dc:creator>Ayush Niroula</dc:creator>
      <pubDate>Thu, 29 Oct 2026 14:58:03 +0000</pubDate>
      <link>https://dev.to/ayushniroula/give-your-coding-agent-visual-feedback-on-react-nextjs-and-vue-edits-4oaa</link>
      <guid>https://dev.to/ayushniroula/give-your-coding-agent-visual-feedback-on-react-nextjs-and-vue-edits-4oaa</guid>
      <description>&lt;p&gt;An agent can change a heading and pass the type checker while leaving it cramped on mobile. I built Arguseye so the agent can inspect the rendered component before calling the edit done.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: This article was written with AI assistance using Arguseye’s source, product documentation, and recorded component captures. I’m the maker of Arguseye.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Arguseye brings that inspection into the editing loop. It renders an existing React, browser-renderable Next.js, or Vue 3 component using the project’s own source and installed packages. You can use it through MCP, the CLI, or a VS Code preview panel without starting the application or authoring a story.&lt;/p&gt;

&lt;p&gt;Here is the workflow for one edit, including what to do when application context is missing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a coding agent needs to see
&lt;/h2&gt;

&lt;p&gt;A screenshot helps with spacing, clipping, and typography. An agent also needs to know which inputs produced it and whether the render is trustworthy enough to compare.&lt;/p&gt;

&lt;p&gt;Arguseye returns a cropped PNG and accessibility text together with the target, viewport, resolved props, unresolved inputs, source fingerprint, timings, warnings, and &lt;code&gt;errors: string[]&lt;/code&gt;. A render can succeed while remaining incomplete. For example, the component may depend on a runtime value or provider that the isolated preview cannot reconstruct.&lt;/p&gt;

&lt;p&gt;That distinction should affect the agent’s next action. It might supply an explicit prop, choose another usage, or explain why the full application still needs checking.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwumnn66xakn48ey67cm2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwumnn66xakn48ey67cm2.png" alt="Existing CSCA.ai HeroSection source and its rendered component in the real VS Code extension" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The screenshot shows CSCA.ai’s existing &lt;code&gt;HeroSection.tsx&lt;/code&gt;. Its preview uses the project’s assets and matching cached Next font faces. The public gallery also includes the project’s feature cards and exam-information grid.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Install in the project you want to inspect
&lt;/h2&gt;

&lt;p&gt;You need Node.js 22 or later, the project’s dependencies installed, and Chromium or Google Chrome.&lt;/p&gt;

&lt;p&gt;For Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @ayushniroula/arguseye &lt;span class="nb"&gt;install &lt;/span&gt;claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Codex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @ayushniroula/arguseye &lt;span class="nb"&gt;install &lt;/span&gt;codex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart the client after installation. The installer adds the MCP configuration and bundled agent skill. Other supported installation targets include Cursor, Gemini CLI, Windsurf, VS Code Copilot, and Antigravity. The &lt;a href="https://darkworldcoder.github.io/arguseye/guide.html#install" rel="noopener noreferrer"&gt;installation guide&lt;/a&gt; lists their configuration paths.&lt;/p&gt;

&lt;p&gt;To use the visual editor panel, install &lt;a href="https://marketplace.visualstudio.com/items?itemName=ayushniroula.arguseye" rel="noopener noreferrer"&gt;Arguseye from the VS Code Marketplace&lt;/a&gt;, open a &lt;code&gt;.tsx&lt;/code&gt;, &lt;code&gt;.jsx&lt;/code&gt;, or &lt;code&gt;.vue&lt;/code&gt; file, and run &lt;strong&gt;Arguseye: Preview Component&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Choose a component and its inputs
&lt;/h2&gt;

&lt;p&gt;Ask the agent to discover how the component is used before inventing props:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Find the usages of this component. Choose one with resolved literal props, render it at a mobile width, and report any unresolved inputs or provider warnings.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;list_usages&lt;/code&gt; discovers literal props from JSX and Vue templates, including supported aliases and local barrel re-exports. Runtime expressions remain unresolved. &lt;code&gt;render_component&lt;/code&gt; can then use a discovered usage, while &lt;code&gt;render_usages&lt;/code&gt; provides paginated isolated previews with up to 12 renders per batch.&lt;/p&gt;

&lt;p&gt;These previews answer how a component renders with discovered inputs. They do not prove a whole page, authenticated session, or backend workflow works.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Capture a baseline before the edit
&lt;/h2&gt;

&lt;p&gt;A successful render returns a &lt;code&gt;captureId&lt;/code&gt;. Keep that ID and ask the agent to compare against it after editing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Save this capture ID. After changing the heading, compare against this baseline using the same export, resolved props, and viewport. Show the images, accessibility changes, new errors, and completeness status.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The MCP comparison uses &lt;code&gt;render_diff({ baselineId })&lt;/code&gt;. A session retains the latest 64 captures. If the baseline has expired, make a new capture before continuing.&lt;/p&gt;

&lt;p&gt;For a CLI workflow across separate commands, save the capture in a directory. The following paths and export name are examples; substitute your own component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @ayushniroula/arguseye shot src/Card.tsx &lt;span class="nt"&gt;--export&lt;/span&gt; Card &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--capture-dir&lt;/span&gt; .arguseye/baseline &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--out&lt;/span&gt; .arguseye/before.png &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Edit the source, then compare:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @ayushniroula/arguseye diff &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--baseline&lt;/span&gt; .arguseye/baseline &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--out&lt;/span&gt; .arguseye/comparison &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output directory contains before, after, and highlighted diff images plus JSON evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Review the comparison
&lt;/h2&gt;

&lt;p&gt;Comparisons report &lt;code&gt;unchanged&lt;/code&gt;, &lt;code&gt;changed&lt;/code&gt;, or &lt;code&gt;incomplete&lt;/code&gt;. Review the images alongside dimension changes, accessibility snapshot changes, and new or resolved errors.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkad019sfylfsc2dd628w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkad019sfylfsc2dd628w.png" alt="Actual WiseAdmit unsaved heading edit with before, after, highlighted differences, and an incomplete-context warning" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this recorded WiseAdmit comparison, the heading changes from “AI ecosystem” to “An AI ecosystem.” The capture records 2,904 changed pixels and an &lt;code&gt;incomplete&lt;/code&gt; status because Next.js server/font behavior in &lt;code&gt;CurrencyProvider&lt;/code&gt; requires the application runtime. The warning remains visible even though the component rendered.&lt;/p&gt;

&lt;p&gt;You still have to judge the heading and check the intended layout. The pixel count points to a difference; it cannot establish that the page’s interactions work.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Keep the human preview close to the source
&lt;/h2&gt;

&lt;p&gt;In VS Code, choose an export or discovered usage and inspect the component at mobile, tablet, or desktop widths. Ordinary live edits can preserve interactive state; verification renders start from fresh component state. Vue template and style updates can preserve state, while script changes remount and report the reset.&lt;/p&gt;

&lt;p&gt;The panel and agent tools share the rendering engine. That helps the developer inspect the same kind of evidence the agent receives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Boundaries worth keeping in the workflow
&lt;/h2&gt;

&lt;p&gt;Browser rendering does not reproduce every framework feature. Next.js server execution, Nuxt application context, and arbitrary backend or authentication state still need the application runtime. Statically reconstructable styles and layout context are supported; missing context remains explicit.&lt;/p&gt;

&lt;p&gt;For Next Google fonts, matching assets from an existing &lt;code&gt;.next/static&lt;/code&gt; build can be reused. If those assets are absent, the preview reports unresolved font context. It does not silently turn a fallback font into a complete result.&lt;/p&gt;

&lt;p&gt;Rendering runs locally, but the component executes real project code and may make its own network requests. Use projects you trust and inspect their behavior as you would when running them normally.&lt;/p&gt;

&lt;p&gt;Use the comparison to review the component edit. Run the application tests when the change affects a complete page or user journey.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://darkworldcoder.github.io/arguseye/" rel="noopener noreferrer"&gt;Get started with Arguseye&lt;/a&gt; · &lt;a href="https://darkworldcoder.github.io/arguseye/gallery.html" rel="noopener noreferrer"&gt;Real screenshot gallery&lt;/a&gt; · &lt;a href="https://github.com/DarkWorldCoder/arguseye" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>react</category>
      <category>webdev</category>
      <category>vscode</category>
    </item>
    <item>
      <title>Asking ChatGPT 'would people buy this?' is the worst market research you can do</title>
      <dc:creator>Ayush Niroula</dc:creator>
      <pubDate>Sun, 25 Oct 2026 08:45:03 +0000</pubDate>
      <link>https://dev.to/ayushniroula/asking-chatgpt-would-people-buy-this-is-the-worst-market-research-you-can-do-53de</link>
      <guid>https://dev.to/ayushniroula/asking-chatgpt-would-people-buy-this-is-the-worst-market-research-you-can-do-53de</guid>
      <description>&lt;p&gt;Everyone does it. You paste your landing page into a chatbot and ask: "Would people buy this?"&lt;/p&gt;

&lt;p&gt;It says something encouraging, suggests a few tweaks, and you feel validated. That's the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three reasons one chatbot answer misleads you
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. It's one voice.&lt;/strong&gt; Your market is students on prepaid data, parents who ask their partner first, and someone who lost money to an online course last year. One assistant answering "as a typical customer" averages all of them away.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. It tends to agree with you.&lt;/strong&gt; Chat assistants are tuned to be helpful and agreeable. "Would people buy this?" is a question that invites a yes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Its numbers are too neat.&lt;/strong&gt; Ask a model to rate purchase intent from 1 to 5 and you get narrow, unrealistic distributions. A 2025 paper on semantic similarity rating (arXiv 2510.08338) found that letting the model answer in its own words, then scoring those words against anchor statements, comes much closer to real survey panels.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do instead
&lt;/h2&gt;

&lt;p&gt;Build a &lt;strong&gt;population&lt;/strong&gt;, not a persona, and let more than one model speak.&lt;/p&gt;

&lt;p&gt;That's what MarketMirror does. In one Fitloop run (an invented fitness app), 2,999 simulated people were written and interviewed: a third by Claude, a third by Codex, a third by Gemini. Each was asked about money this month, their phone and data plan, who they ask before buying and a time they got scammed. Then they saw the offer.&lt;/p&gt;

&lt;p&gt;Here's what happened when the &lt;em&gt;same offer&lt;/em&gt; was answered by different models (all simulated):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;People written by&lt;/th&gt;
&lt;th&gt;Answered by&lt;/th&gt;
&lt;th&gt;Yes / maybe / no&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude (1,000)&lt;/td&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;td&gt;1.3% / 75.6% / 23.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini (1,000)&lt;/td&gt;
&lt;td&gt;Claude (stand-in)&lt;/td&gt;
&lt;td&gt;0.9% / 69.7% / 29.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codex (999)&lt;/td&gt;
&lt;td&gt;Codex&lt;/td&gt;
&lt;td&gt;0.0% / 5.7% / 94.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjlmatishtfakt09x9nbs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjlmatishtfakt09x9nbs.png" alt="Do the models agree?" width="799" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One model said "maybe". The other said "no" almost every time. If you'd asked just one of them, you'd have walked away with very different confidence about the same launch.&lt;/p&gt;

&lt;p&gt;(The Gemini row is Gemini-written people answered by Claude: Gemini's quota ran out mid-run. The groups held different people and weren't fully crossed, so this doesn't show which model matters more.)&lt;/p&gt;

&lt;h2&gt;
  
  
  What this buys you
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A range, not a verdict.&lt;/strong&gt; When models disagree, the honest answer is "between these two", and you see it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The objection that survived every model.&lt;/strong&gt; All three groups named the same top objection: trust (59.6% overall). That's the one to fix first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free-text reasons per person,&lt;/strong&gt; grouped by audience, so you know &lt;em&gt;who&lt;/em&gt; says no and &lt;em&gt;why&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The limits (read these)
&lt;/h2&gt;

&lt;p&gt;The people are synthetic. Agreement between models is a robustness check on the simulation, not evidence about real buyers. Use it to choose what to test for real, then run that real test small.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Open source (AGPL-3.0). Works from Claude Code, Codex, Cursor, Gemini or any MCP agent. Ask it in plain words.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/DarkWorldCoder/market-mirror" rel="noopener noreferrer"&gt;https://github.com/DarkWorldCoder/market-mirror&lt;/a&gt;&lt;/strong&gt; (a ⭐ helps other people find it)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written with help from an AI assistant; every number was checked against the saved run results.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>We showed 8 real Facebook ads to 120 simulated buyers. It ranked them backwards. Here's what was still useful.</title>
      <dc:creator>Ayush Niroula</dc:creator>
      <pubDate>Sun, 25 Oct 2026 04:34:50 +0000</pubDate>
      <link>https://dev.to/ayushniroula/we-showed-8-real-facebook-ads-to-120-simulated-buyers-it-ranked-them-backwards-and-still-found-245d</link>
      <guid>https://dev.to/ayushniroula/we-showed-8-real-facebook-ads-to-120-simulated-buyers-it-ranked-them-backwards-and-still-found-245d</guid>
      <description>&lt;p&gt;Simulation tools love to show the run where they were right. This is a run where one was wrong, and why it was still worth doing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;csca.ai sells prep for the CSCA exam (the test for studying in China) to students and parents in South and Southeast Asia. They ran 11 Facebook ads for a free mock test across Nepal, Indonesia, Bangladesh, Vietnam and Sri Lanka, and let us use the real results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real results (Meta Ads Manager):&lt;/strong&gt; $56.05 spent, 274,557 impressions, 4,466 clicks, 1,500 landing page views, 16 sign-ups.&lt;/p&gt;

&lt;p&gt;Then we gave MarketMirror the 8 that got most of the budget, plus a brief, &lt;strong&gt;without the results&lt;/strong&gt;. It built 120 simulated students and parents (8 audiences × 15 people, each with a short life interview), put the ads in realistic Facebook feeds three times over with different random seeds, and ran a survey on the sign-up offer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it was wrong: clicks
&lt;/h2&gt;

&lt;p&gt;We compared the simulated click ranking with the real one. Rank correlation: &lt;strong&gt;-0.84&lt;/strong&gt;. That's not "a bit off", that's almost backwards. The simulation's favourite ad was the Nepal broad audience; the real winner was the Indonesia parents ad at 2.32% CTR.&lt;/p&gt;

&lt;p&gt;If you'd used it to pick which ad gets the budget, it would have pointed you the wrong way. We'd rather say that out loud than hide the run.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was still useful: the objections
&lt;/h2&gt;

&lt;p&gt;Look at the real funnel again: 1,500 people reached the page and 16 signed up. About &lt;strong&gt;1 in 100&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The simulated buyers' objections pointed at the sign-up form, in their own words and their own languages:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Gratis tapi minta password lagi? Jangan." (Free, but asking for a password again? No way.) &lt;em&gt;(Indonesia)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;"Phone number dhele spam asbhe." (Give them my number and the spam starts.) &lt;em&gt;(Bangladesh)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;"Free sign-up? They want my phone and email. Harvesting data for sure." &lt;em&gt;(Nepal)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the survey, trust ("looks like a scam") was the top blocker for 56% of the simulated people, and privacy for 28%. The real sign-up form asks for full name, email, phone number, country and a password, for a &lt;em&gt;free&lt;/em&gt; test.&lt;/p&gt;

&lt;p&gt;The funnel alone doesn't show why real visitors left. The objections say what to test first: the form.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it suggested next
&lt;/h2&gt;

&lt;p&gt;From the real ad data plus the run, MarketMirror's &lt;code&gt;ideas&lt;/code&gt; step wrote five next tests. Two of them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero-friction entry:&lt;/strong&gt; a 3-question quiz first, no email, no personal data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy-first page:&lt;/strong&gt; say plainly how the data is used, cut the form to 3 fields.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are proposals, not results. The point is the order: test the page before buying more clicks.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we take from it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Don't use a simulation to rank ads by CTR.&lt;/strong&gt; At least not until a backtest on your own past ads says it can. (MarketMirror has &lt;code&gt;backtest&lt;/code&gt; and &lt;code&gt;calibrate&lt;/code&gt; for exactly this.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do use it to choose what to test.&lt;/strong&gt; Objections, in buyers' own words, by audience, before you spend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real data in, next test out.&lt;/strong&gt; The useful loop is: export real results → compare → test the fix on simulated buyers → run the small real test.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;MarketMirror is open source (AGPL-3.0) and runs from Claude Code, Codex, Cursor, Gemini or any MCP agent.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/DarkWorldCoder/market-mirror" rel="noopener noreferrer"&gt;https://github.com/DarkWorldCoder/market-mirror&lt;/a&gt;&lt;/strong&gt;: if it saves you one bad launch, a ⭐ helps other people find it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Real ad results shared with csca.ai's permission. Simulated buyers are synthetic; their quotes are labelled. Written with help from an AI assistant; every number was checked against the saved data.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>ai</category>
      <category>startup</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I simulated 2,999 buyers with three AI models, and they didn't agree</title>
      <dc:creator>Ayush Niroula</dc:creator>
      <pubDate>Sat, 24 Oct 2026 03:20:50 +0000</pubDate>
      <link>https://dev.to/ayushniroula/i-simulated-2999-buyers-with-three-ai-models-the-one-answering-mattered-more-than-the-one-that-2dh9</link>
      <guid>https://dev.to/ayushniroula/i-simulated-2999-buyers-with-three-ai-models-the-one-answering-mattered-more-than-the-one-that-2dh9</guid>
      <description>&lt;p&gt;&lt;a href="https://cdn.jsdelivr.net/gh/DarkWorldCoder/market-mirror@main/docs/video/marketmirror-launch.mp4" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frr0d5gx84qzebgkzdq1j.png" alt="Watch the 60-second launch film" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm building MarketMirror, an open-source tool that tests ads, prices, messages and sales pitches on simulated buyers before any money goes into a real campaign. It ends with a plain-language report that says go, iterate or no-go.&lt;/p&gt;

&lt;p&gt;The obvious objection to any "synthetic customers" tool is: aren't you just measuring the language model's mood? I wanted to see that effect directly, so I ran one market with three model providers at once. Every number below is simulated. Fitloop, the product, is an invented fitness app.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;The advertised offer was a 7-day free trial with no card, then USD 4.99 a month. The brief and the landing page still asked for a card at sign-up, on purpose: the test is meant to catch that.&lt;/p&gt;

&lt;p&gt;I requested 3,000 people in six audiences across India, the Philippines and Kenya. They belonged to five communities: two WhatsApp groups, two Facebook groups and r/budgetfitness. A third each were written and interviewed by Claude Sonnet, Codex (gpt-6-luna) and Gemini 3.8 Flash. In the backend's settings:&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="nv"&gt;LLM_POOL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;claude_code:sonnet,codex:gpt-6-luna,antigravity:gemini-3.8-flash-low
&lt;span class="nv"&gt;LLM_POOL_STRICT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;          &lt;span class="c"&gt;# keeps rounds and tests on each person's own provider (until a provider runs out; see below)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each provider writes an equal share of every audience and interviews its own people. It then answers for them in the feeds, social rounds, survey and pitch, so one model speaks for a person from start to finish, unless a provider runs out mid-run (which happened here; see below). In total, 2,999 people were written and 2,987 were interviewed. The one person whose calls failed is counted, not filled in.&lt;/p&gt;

&lt;h2&gt;
  
  
  How one simulated person is built
&lt;/h2&gt;

&lt;p&gt;Each audience is spread over slots (age, gender, city, income, life stage), so you don't get 500 copies of the same 24-year-old. Then, for each person:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;a 150-250 word persona;&lt;/li&gt;
&lt;li&gt;a stereotype guard, in code with no model call, so that no two people in an audience share both a job and a city (in this run it changed 20 people);&lt;/li&gt;
&lt;li&gt;a 12-question life interview: how money is this month, what phone and data plan they have, a time they got scammed, who they ask before spending, what annoys them in ads;&lt;/li&gt;
&lt;li&gt;follow-ups and a decision card: triggers, stoppers, dealbreakers, trust cues, and where what they &lt;em&gt;say&lt;/em&gt; differs from what they &lt;em&gt;do&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's one person as the model wrote him. Yash is 42 and lives in Pune. He drives an app cab and runs a mobile-accessories stall at weekends. He once lost ₹6,000 to a crypto course, so now he reads reviews and asks his wife and mother before buying. His says-vs-does line: he says he'd do 15 minutes of exercise while waiting for rides, but his shifts run long, so he probably won't.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftlftx1nz5tkr1lue9evt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftlftx1nz5tkr1lue9evt.png" alt="Three of the simulated buyers, with their interview answers and objections" width="800" height="820"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What they went through
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./mm cli feedtest &lt;span class="nt"&gt;--simulation&lt;/span&gt; &lt;span class="nv"&gt;$SIM&lt;/span&gt; &lt;span class="nt"&gt;--creatives&lt;/span&gt; @creatives.json   &lt;span class="c"&gt;# add --seeds 3 for a range; this run used one seed&lt;/span&gt;
./mm cli survey &lt;span class="nt"&gt;--simulation&lt;/span&gt; &lt;span class="nv"&gt;$SIM&lt;/span&gt; &lt;span class="nt"&gt;--offer&lt;/span&gt; &lt;span class="s2"&gt;"7-day trial, no card"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--messages&lt;/span&gt; @messages.txt &lt;span class="nt"&gt;--split&lt;/span&gt; &lt;span class="nt"&gt;--pricing&lt;/span&gt; USD
./mm cli pitch &lt;span class="nt"&gt;--simulation&lt;/span&gt; &lt;span class="nv"&gt;$SIM&lt;/span&gt; &lt;span class="nt"&gt;--script&lt;/span&gt; @pitch.md &lt;span class="nt"&gt;--rebuttals&lt;/span&gt; @rebuttals.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In practice, a single &lt;code&gt;market-test&lt;/code&gt; config runs all of this.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Feed test:&lt;/strong&gt; five ads placed among organic posts in Facebook, Instagram, TikTok and Reddit feeds. Each person sees one ad, assigned at random. In total there were 5,140 person-platform sessions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Social rounds:&lt;/strong&gt; four Reddit-like rounds on OASIS produced 3,565 actions, and 1,259 of those were "do nothing".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Survey:&lt;/strong&gt; answers come back as free text. Semantic similarity rating (SSR, arXiv 2510.08338) then compares each answer against five anchor statements using local embeddings, which gives a 1-5 distribution without another model call. When you ask a model for a number directly, you get narrow, unrealistic rating distributions. The SSR paper reports that rating the model's own words comes much closer to real survey panels.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pitch:&lt;/strong&gt; every person hears the pitch, raises an objection, gets my rebuttal, and decides again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyst panel:&lt;/strong&gt; five simulated analysts read the run independently.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The headline (simulated)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Decision&lt;/td&gt;
&lt;td&gt;iterate (medium confidence)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Would start the trial&lt;/td&gt;
&lt;td&gt;0.7% yes, 50.4% maybe, 48.9% no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Purchase intent (1-5)&lt;/td&gt;
&lt;td&gt;2.88 ± 1.14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Top objection&lt;/td&gt;
&lt;td&gt;trust / "looks like a scam", 59.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best ad&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;fb_parents&lt;/code&gt;, expected CTR 1.02%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analysts&lt;/td&gt;
&lt;td&gt;5 of 5: iterate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3etdmv7exvnqzuv7ubfl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3etdmv7exvnqzuv7ubfl.png" alt="The MarketMirror dashboard for this run" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The signals disagree, and the report says so. The survey alone points to no-go, while the feed test and the analysts point to iterate.&lt;/p&gt;

&lt;h2&gt;
  
  
  The models disagreed
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;People written by&lt;/th&gt;
&lt;th&gt;Played by&lt;/th&gt;
&lt;th&gt;Yes / maybe / no (%)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude (1,000)&lt;/td&gt;
&lt;td&gt;Claude Sonnet 5.5&lt;/td&gt;
&lt;td&gt;1.3 / 75.6 / 23.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini (1,000)&lt;/td&gt;
&lt;td&gt;Claude Sonnet 5.5 (stand-in)&lt;/td&gt;
&lt;td&gt;0.9 / 69.7 / 29.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codex (999)&lt;/td&gt;
&lt;td&gt;Codex&lt;/td&gt;
&lt;td&gt;0.0 / 5.7 / 94.3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjlmatishtfakt09x9nbs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjlmatishtfakt09x9nbs.png" alt="The dashboard's &amp;quot;Do the models agree?&amp;quot; check" width="799" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The stand-in row wasn't planned. Gemini's login ran out of quota for about four days mid-run, so Claude played the Gemini-written people (&lt;code&gt;MM_PROVIDER_STANDIN=antigravity=claude&lt;/code&gt;). The results label those people "antigravity (played by claude)". That accident gave a rough extra comparison: the Gemini-written cohort, played by Claude, answered more like the Claude-written cohort than the Codex-written one.&lt;/p&gt;

&lt;p&gt;That's a reason to check how sensitive results are to the answering model, but the cohorts held different people and writer and answerer weren't fully crossed, so this run can't show which one matters more. All three groups still named trust as the top objection. I read every rate above as a range between two temperaments, not as one market's answer. The dashboard's "Do the models agree?" section is built for this. It splits results by provider with 95% ranges and checks whether the would-convert ranges overlap and whether the top objection and best message match. Agreement is a robustness check on the simulation, not evidence about real buyers. This run can't tell me whether Codex's people are more realistic or just more negative. Only real data can settle that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pitch made it worse
&lt;/h2&gt;

&lt;p&gt;Before the rebuttals: 1.1% yes, 64.0% maybe, 34.8% no. After them: 1.1% yes, 44.6% maybe, 54.2% no. The pitch scored 23 out of 100. The trust rebuttal moved 44.9% of the people who raised trust, and the price rebuttal moved 8.9%. The report's fix was to stop arguing and instead show the exact charge after day 7, the cancel steps and the local price. That matched the analysts' themes: no local payment option (UPI), a USD price competing with free YouTube, and a card wall that kills the trial.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7c9jnr204kkxx880pfw9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7c9jnr204kkxx880pfw9.png" alt="Sales rehearsal: before and after the rebuttals" width="800" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Writing 2,999 full-depth people took 2 h 40 min through three login gateways. That includes a restart midway to apply a fix; a cache meant finished people weren't rewritten. The social rounds then kept hitting usage limits, so I moved the rest of the run to an Anthropic API key. From there it took 40 minutes for four rounds, 23 for the survey of 2,999 plus its retest, and 37 for the pitch. MarketMirror didn't meter the tokens used inside the rounds, survey and pitch, so I can't give you a cost for this run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits you should know
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The people are synthetic. Detailed biographies don't make them representative.&lt;/li&gt;
&lt;li&gt;Attention, fatigue, social proof and landing friction include hand-set priors.&lt;/li&gt;
&lt;li&gt;The spread across seeds measures simulation variation, not predictive confidence. Test-retest (76.7% gave the same verdict here) measures consistency, not agreement with humans.&lt;/li&gt;
&lt;li&gt;Fitloop is invented, so none of this has been checked against real outcomes. &lt;code&gt;backtest&lt;/code&gt; and &lt;code&gt;calibrate&lt;/code&gt; exist for that, but they need your paired real data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/DarkWorldCoder/market-mirror.git
&lt;span class="nb"&gt;cd &lt;/span&gt;market-mirror
bash install.sh
./mm configure
./mm provider check
./mm start
./mm cli quickstart &lt;span class="nt"&gt;--out&lt;/span&gt; scenarios/acme
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quickstart asks about your product, buyers and channels. It prepares the people, then stops before the remaining tests so you can review them. Preparation itself uses model calls, so start with a small cohort. From Claude Code, Codex, Cursor or Gemini, you can install the plugin or MCP server and ask in plain words.&lt;/p&gt;

&lt;p&gt;The repo is at &lt;a href="https://github.com/DarkWorldCoder/market-mirror" rel="noopener noreferrer"&gt;https://github.com/DarkWorldCoder/market-mirror&lt;/a&gt; (AGPL-3.0). If you've run real surveys or ad tests and have opinions on how to validate something like this, I'd like to hear them.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I wrote this with help from an AI assistant and checked every number against the run's saved results.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>ai</category>
      <category>opensource</category>
      <category>llm</category>
    </item>
    <item>
      <title>10,000 Times Cleaner Code Just By Using This Tool.</title>
      <dc:creator>Ayush Niroula</dc:creator>
      <pubDate>Wed, 25 Sep 2024 03:45:58 +0000</pubDate>
      <link>https://dev.to/ayushniroula/10000-times-cleaner-code-just-by-using-this-tool-19po</link>
      <guid>https://dev.to/ayushniroula/10000-times-cleaner-code-just-by-using-this-tool-19po</guid>
      <description>&lt;p&gt;Ever stared at your codebase thinking, “Wow, that’s a lot of console.log clutter!"? Or maybe you’ve spent way too much time hunting down those rogue print statements you used while debugging. Well, good news—Eradicate (era) is here to rescue you from that mess! 🦸‍♀️&lt;/p&gt;

&lt;p&gt;Era is a slick open-source tool that automatically cleans your codebase, wiping out unwanted logs, prints, and debugging statements across multiple languages. No more manual code cleanup or dealing with bloated files filled with leftover logs. It’s like Marie Kondo for your code! ✨&lt;/p&gt;

&lt;p&gt;In this story, I’m going to show you how era works, why it’s a game-changer, and how you can get started ASAP.&lt;/p&gt;

&lt;p&gt;🎯 Why Era? Because Nobody Has Time to Manually Clean Code! ⏳&lt;br&gt;
Picture this: You’re deep in the middle of a project, dropping console.log and print() statements left and right to debug your code. By the time you finish, you’ve got a sea of logs floating around your files, making it hard to see the real logic.&lt;/p&gt;

&lt;p&gt;Enter Eradicate (era). It’s like having a digital cleaning assistant that sweeps through your codebase, finds those pesky outputs, and wipes them out faster than you can say “refactor.” Whether you’re working on a personal project or contributing to a large team, era automates the boring cleanup part, so you can focus on the fun stuff — like, you know, actually coding. 😎&lt;/p&gt;

&lt;p&gt;⚡️ Key Features You’ll Love&lt;br&gt;
Multi-language support: Clean up logs in JavaScript, Python, PHP, Go, Ruby, and more. No matter the language, era has your back. 💻&lt;br&gt;
Customizable Config: You decide what gets cleaned and what stays — because not all logs deserve the boot.&lt;br&gt;
Target Specific Files/Folders: Just finished working on a feature? Run era on a single file or folder. Easy peasy.&lt;br&gt;
Ignore What Matters: Don’t want to clean certain files or directories (like node_modules)? Era makes it simple to exclude what you don’t want to touch.&lt;br&gt;
🚀 How to Get Started with Era&lt;br&gt;
Ready to clean up your code like a boss? Here’s your step-by-step guide.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Initialize Era in Your Project
First things first — you need to let era know where to get started. Run the following command to initialize era in your project:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;era init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This creates a shiny new erd.yaml config file in your root directory. It’s your personalized cleanup map where you define exactly what needs scrubbing.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clean Up Logs and Prints Like a Pro
Time to make your code spotless! Run the clean command, and era will scan your project and clean out all those pesky logs:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;era clean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;By default, era will check your erd.yaml file for cleaning rules. If it doesn’t find one, no worries—it’s got default settings ready to go. 🧼✨&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Target a Specific File or Folder
Don’t need to clean the whole project? No problem. You can target individual files or folders:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To clean a specific file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;era remove -f path/to/yourfile.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or to clean a whole folder:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;era remove -d path/to/yourfolder&lt;br&gt;
&lt;/code&gt;Era will carefully check the file or folder, hunt down the unwanted logs, and leave the rest untouched. 🕵️‍♀️&lt;/p&gt;

&lt;p&gt;🔧 The Magic Behind Era’s Config File&lt;br&gt;
Let’s talk about the secret sauce: the erd.yaml configuration file. Here’s a breakdown of what it does and how you can tweak it to fit your project like a glove:yml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Root: "."
ReportPath: "era-reports"
IgnoreKeyword:
  - "erd:ignore"
  - "erd:ignoreAll"
IgnoreFileExtensions:
  - ".exe"
  - ".dll"
  - ".zip"
  - ".tar"
IgnoreDirs:
  - "node_modules"
  - ".git"
  - "vendor"
IgnoreFiles: []
ListenType: "command"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Root: This is where era starts its search — usually your project’s root directory.&lt;br&gt;
ReportPath: After each run, era will generate a report in this directory, so you can see exactly what was cleaned. 📊&lt;br&gt;
IgnoreKeyword: Add custom tags to your code like erd:ignore to stop era from cleaning certain sections.&lt;br&gt;
IgnoreFileExtensions: These are the file types era won’t touch — think binaries or compressed files.&lt;br&gt;
IgnoreDirs: Directories like node_modules or .git are automatically excluded to save you time. No one needs to clean those, right? 😅&lt;br&gt;
ListenType: Currently, this is set to “command,” meaning era listens for cleanup commands from you. More listen types may come in the future — stay tuned!&lt;br&gt;
🎉 The Best Part: It’s Free and Open-Source!&lt;br&gt;
Yup, you heard that right. Eradicate (era) is open-source, meaning you can use it, modify it, and even contribute back to it! It’s all about helping fellow developers keep their codebases clean without the hassle.&lt;/p&gt;

&lt;p&gt;💡 Final Thoughts&lt;br&gt;
Eradicate isn’t just a tool — it’s a timesaver, a productivity booster, and a clutter-buster. Whether you’re working solo or part of a larger team, using era helps you maintain a tidy codebase with minimal effort.&lt;/p&gt;

&lt;p&gt;If you’re tired of manually cleaning up your files, give era a spin. It’s free, easy to set up, and — trust me — it’ll save you hours of time.&lt;/p&gt;

&lt;p&gt;Join the revolution! 🚀 You can find the code on Github and contribute to making this tool even better.&lt;/p&gt;

&lt;p&gt;Happy Coding! 💻✨&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>javascript</category>
      <category>go</category>
    </item>
    <item>
      <title>Eradicate (era): A Powerful Open-Source Tool for Code Cleanup</title>
      <dc:creator>Ayush Niroula</dc:creator>
      <pubDate>Tue, 24 Sep 2024 01:12:56 +0000</pubDate>
      <link>https://dev.to/ayushniroula/eradicate-era-a-powerful-open-source-tool-for-code-cleanup-1b5i</link>
      <guid>https://dev.to/ayushniroula/eradicate-era-a-powerful-open-source-tool-for-code-cleanup-1b5i</guid>
      <description>&lt;p&gt;Thrilled to announce my open-source project Eradicate (era) 🎉 era is a versatile tool that simplifies cleaning and transforming codebases across multiple languages. From removing unwanted logs to customizing file cleanup, era helps developers maintain cleaner and more efficient projects.&lt;/p&gt;

&lt;p&gt;Check it out, give it a try, and contribute to making development a little bit easier for everyone! 🌟&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/wadmit/era" rel="noopener noreferrer"&gt;https://github.com/wadmit/era&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>go</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
