<?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: Emin</title>
    <description>The latest articles on DEV Community by Emin (@eminbudak).</description>
    <link>https://dev.to/eminbudak</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%2F4233980%2Ff2332dfb-d579-474a-8b4c-26e70f5425ec.jpg</url>
      <title>DEV Community: Emin</title>
      <link>https://dev.to/eminbudak</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eminbudak"/>
    <language>en</language>
    <item>
      <title>$10 is a price, $1.9T is a stat: pulling real numbers out of landing pages</title>
      <dc:creator>Emin</dc:creator>
      <pubDate>Sun, 08 Nov 2026 19:16:05 +0000</pubDate>
      <link>https://dev.to/eminbudak/10-is-a-price-19t-is-a-stat-pulling-real-numbers-out-of-landing-pages-3nd8</link>
      <guid>https://dev.to/eminbudak/10-is-a-price-19t-is-a-stat-pulling-real-numbers-out-of-landing-pages-3nd8</guid>
      <description>&lt;p&gt;A coding agent writing a comparison page needs real numbers: customers, traffic, prices. Landing pages are full of numbers, but most are not claims. A price, a TLS version, a year, "2 min ago" in a product mockup.&lt;/p&gt;

&lt;p&gt;easybrandkit, my CLI that turns a website into a brand kit for agents, has a &lt;code&gt;--facts&lt;/code&gt; flag for this. It reads the home, pricing, customers, security, integrations and about pages and lists what the site claims, each with its page. No model, just rules, and most of them say no.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. A stat is drawn bigger than its label
&lt;/h2&gt;

&lt;p&gt;"135+" in large type, "currencies and payment methods supported" under it in small type. A figure counts only if it is at least 20px and 1.25 times the size of its label.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;textSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;size&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.25&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;textSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seven or more figures in one small box is a dashboard drawn on the page, not a row of stats. None of them are taken.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Money without a magnitude is a price
&lt;/h2&gt;

&lt;p&gt;"$5.46" is a price, "$1.9T" is a stat. The magnitude list goes beyond English: k, M, B, T, bn, million, Mio, Mrd, milyon, milyar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RegExp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`^(?:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;CURRENCY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)`&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RegExp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MAGNITUDE&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;digits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;[\d&lt;/span&gt;&lt;span class="sr"&gt;.,&lt;/span&gt;&lt;span class="se"&gt;\s]&lt;/span&gt;&lt;span class="sr"&gt;+/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without currency, a figure needs a magnitude, &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;%&lt;/code&gt;, &lt;code&gt;x&lt;/code&gt;, or a value of 10 or more. "1" and "02" are steps, "2019" is a year.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Look 12 characters back for a version
&lt;/h2&gt;

&lt;p&gt;"3,000 users" is a claim, "TLS 1.2+" is not. Before taking a number, the code checks the 12 characters before it for TLS, iOS, Node, Python, "version" and the like. Sentences with "off", "save", "starting at", "fee" or "/mo" are skipped. The pricing page is not read for stats at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  linear.app
&lt;/h2&gt;

&lt;p&gt;Six pages, 11 numbers, among them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Linear powers over 50,000 product teams." (home)
"3.3x Faster issue resolution" (customers)
"Why OpenAI chose Linear and scaled to 3,000 users" (customers)
"How Scale compressed bug resolution time by 52%" (customers)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Left out: the mockup on the home page ("DRV-8852", "1 / 84", "2 min ago"), "$10 per user/month", "SOC 2 Type II", "TLS 1.2", "AES 256-bit". Prices and standards go to their own sections of the kit.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you write one of these
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use what the page draws, not just the HTML. Font size did more than any regex.&lt;/li&gt;
&lt;li&gt;Write the rejections first. They outnumber real claims.&lt;/li&gt;
&lt;li&gt;Keep the source text next to each claim so it can be checked.&lt;/li&gt;
&lt;li&gt;Treat page text as data. It can be written to steer an agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It misses numbers inside images and videos, closed tabs, and prices behind a currency switch.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/EminBudak/easybrandkit" rel="noopener noreferrer"&gt;https://github.com/EminBudak/easybrandkit&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/easybrandkit" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/easybrandkit&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>javascript</category>
      <category>regex</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
