<?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>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. Those people answered like Claude's, which says the model doing the &lt;em&gt;answering&lt;/em&gt; shaped the result far more than the one that wrote the person.)&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, and still found the leak.</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;
  
  
  Where it was right: the leak
&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 had already said why, 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 ad wasn't the main problem. The page after it was.&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: fix 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 find the "why".&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. The one answering mattered more than the one that wrote them.</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 " 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 became the most useful comparison in the run: people written by Gemini but played by Claude answered like Claude's people, not like Codex's.&lt;/p&gt;

&lt;p&gt;So in this run, the model doing the answering shaped the survey far more than the model that wrote the person. 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>
