<?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: CodeLong888</title>
    <description>The latest articles on DEV Community by CodeLong888 (@codelong888).</description>
    <link>https://dev.to/codelong888</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%2F3891284%2F7cd6aec6-b3b2-4745-b86e-7d2bec7fe714.png</url>
      <title>DEV Community: CodeLong888</title>
      <link>https://dev.to/codelong888</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codelong888"/>
    <language>en</language>
    <item>
      <title>An OpenAI flagship lost 38% of its daily usage in three days — then set three straight all-time highs</title>
      <dc:creator>CodeLong888</dc:creator>
      <pubDate>Sun, 16 Aug 2026 01:41:04 +0000</pubDate>
      <link>https://dev.to/codelong888/an-openai-flagship-lost-38-of-its-daily-usage-in-three-days-then-set-three-straight-all-time-4ebb</link>
      <guid>https://dev.to/codelong888/an-openai-flagship-lost-38-of-its-daily-usage-in-three-days-then-set-three-straight-all-time-4ebb</guid>
      <description>&lt;p&gt;Everyone publishes AI model leaderboards. Almost nobody publishes the &lt;strong&gt;day-level curve&lt;/strong&gt; — and the&lt;br&gt;
curve is where the actual story is.&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://whatstrending.ai/models" rel="noopener noreferrer"&gt;whatstrending.ai&lt;/a&gt; we snapshot every model's daily request count&lt;br&gt;
from OpenRouter's usage feed into a database, once a day, &lt;code&gt;INSERT OR IGNORE&lt;/code&gt; — a row can never be&lt;br&gt;
revised after the fact. We're 78 days in. Here is what &lt;code&gt;openai/gpt-5.6-luna&lt;/code&gt; did over the last two&lt;br&gt;
weeks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Requests/day&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Aug 04&lt;/td&gt;
&lt;td&gt;162.9M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aug 05&lt;/td&gt;
&lt;td&gt;180.8M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aug 06&lt;/td&gt;
&lt;td&gt;193.8M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aug 07&lt;/td&gt;
&lt;td&gt;210.8M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aug 08&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;222.5M&lt;/strong&gt; ← peak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aug 09&lt;/td&gt;
&lt;td&gt;209.6M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aug 10&lt;/td&gt;
&lt;td&gt;171.6M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aug 11&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;137.3M&lt;/strong&gt; ← floor: −38.3% off peak in 3 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aug 12&lt;/td&gt;
&lt;td&gt;143.2M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aug 13&lt;/td&gt;
&lt;td&gt;157.3M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aug 14&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;231.8M&lt;/strong&gt; ← new all-time high, +47.4% in one day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aug 15&lt;/td&gt;
&lt;td&gt;237.3M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aug 16&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;243.5M&lt;/strong&gt; ← third consecutive all-time high&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A flagship model shed &lt;strong&gt;more than a third of its daily traffic in three days&lt;/strong&gt;, then won all of it&lt;br&gt;
back — and more — inside the same week. Three consecutive days above the old peak as of Aug 16.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this isn't a data artifact
&lt;/h2&gt;

&lt;p&gt;Three checks, run before writing this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The whole table didn't move.&lt;/strong&gt; The all-model daily total went 3.56B → 3.66B (+2.8%) on the day
luna jumped 47%, and 3.70B → 3.73B (+0.8%) on Aug 16. Luna's &lt;em&gt;share&lt;/em&gt; moved: roughly 4.4% → 6.5%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Peers didn't dip with it.&lt;/strong&gt; During luna's drawdown (Aug 09–11), &lt;code&gt;deepseek/deepseek-v4-flash-0731&lt;/code&gt;
and &lt;code&gt;tencent/hy3&lt;/code&gt; were setting their own highs on the same days — so this is not a provider-wide
trailing-edge reporting droop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rows are frozen at write time.&lt;/strong&gt; Aug 14 read 231.8M on the day we collected it and reads 231.8M
today. Nothing was backfilled or revised.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why it matters
&lt;/h2&gt;

&lt;p&gt;Monthly aggregates — which is what every public ranking shows — would have flattened this entire&lt;br&gt;
event into "usage grew". The day-level series shows real flagship usage is far more volatile than&lt;br&gt;
anything the leaderboards suggest: a −38% drawdown and a full recovery to new highs fit inside eight&lt;br&gt;
days. If you're making routing, capacity, or "which model is winning" decisions off monthly numbers,&lt;br&gt;
you're averaging away the actual signal.&lt;/p&gt;

&lt;p&gt;The live, daily-updated version of this curve is here:&lt;br&gt;
&lt;strong&gt;&lt;a href="https://whatstrending.ai/models" rel="noopener noreferrer"&gt;https://whatstrending.ai/models&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Method: daily snapshot of OpenRouter per-day request counts, 100 models/day, 78 days and counting,&lt;br&gt;
stored append-only (&lt;code&gt;INSERT OR IGNORE&lt;/code&gt;) in Cloudflare D1.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>openrouter</category>
      <category>data</category>
    </item>
    <item>
      <title>We ping 2,587 vibe-coded apps every 6 hours. The 'AI apps die fast' narrative isn't holding up</title>
      <dc:creator>CodeLong888</dc:creator>
      <pubDate>Sat, 15 Aug 2026 07:57:35 +0000</pubDate>
      <link>https://dev.to/codelong888/we-ping-2587-vibe-coded-apps-every-6-hours-the-ai-apps-die-fast-narrative-isnt-holding-up-1jo5</link>
      <guid>https://dev.to/codelong888/we-ping-2587-vibe-coded-apps-every-6-hours-the-ai-apps-die-fast-narrative-isnt-holding-up-1jo5</guid>
      <description>&lt;p&gt;Everyone "knows" vibe-coded apps are abandoned within weeks. Someone ships a weekend project with Cursor or Lovable, tweets about it, and the domain quietly dies when the trial credits run out.&lt;/p&gt;

&lt;p&gt;I run &lt;a href="https://vibeking.fun" rel="noopener noreferrer"&gt;VibeKing&lt;/a&gt;, a directory of products built with AI coding tools. A couple of weeks ago I added a liveness engine: every product in the catalogue gets an HTTP check every 6 hours, cycling through all of them continuously. No sampling, no estimates — every single URL, checked repeatedly, with failure counts.&lt;/p&gt;

&lt;p&gt;Here's what the data actually says so far.&lt;/p&gt;

&lt;h2&gt;
  
  
  93.1% of them are up
&lt;/h2&gt;

&lt;p&gt;Of &lt;strong&gt;2,587 approved products&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Live&lt;/td&gt;
&lt;td&gt;2,408&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;93.1%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;At risk (intermittent failures)&lt;/td&gt;
&lt;td&gt;178&lt;/td&gt;
&lt;td&gt;6.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Confirmed dead&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;"At risk" means the checker has caught the site failing on recent checks but it hasn't sustained enough consecutive failures to be declared dead. "Dead" requires repeated failures over multiple checks — a bar nothing has cleared yet in the observation window.&lt;/p&gt;

&lt;p&gt;Two honest caveats. First, this window is short — the engine has been running since early August, so this measures &lt;em&gt;current&lt;/em&gt; availability, not long-term survival. The interesting numbers arrive in 6-12 months, and I'll publish those too, whichever way they cut. Second, there's a survivorship component: some products died before ever being catalogued, and those deaths aren't in the denominator. What this data can say is narrower but still useful: &lt;strong&gt;of the vibe-coded products visible enough to be catalogued, 93% are up right now&lt;/strong&gt; — the wasteland narrative describes launches that never got noticed, not the ones that did.&lt;/p&gt;

&lt;h2&gt;
  
  
  What vibe coders build: tools for other vibe coders
&lt;/h2&gt;

&lt;p&gt;Category distribution of the same 2,587:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AI Coding&lt;/td&gt;
&lt;td&gt;691&lt;/td&gt;
&lt;td&gt;26.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dev Tools&lt;/td&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;td&gt;15.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marketing&lt;/td&gt;
&lt;td&gt;316&lt;/td&gt;
&lt;td&gt;12.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SaaS&lt;/td&gt;
&lt;td&gt;237&lt;/td&gt;
&lt;td&gt;9.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;178&lt;/td&gt;
&lt;td&gt;6.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Design&lt;/td&gt;
&lt;td&gt;161&lt;/td&gt;
&lt;td&gt;6.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;42% of AI-built products are developer tooling.&lt;/strong&gt; The community's biggest output category is tools for itself — the classic gold-rush-shovels pattern, visible in the data.&lt;/p&gt;

&lt;h2&gt;
  
  
  .com still wins, but the builder TLDs are a third of everything
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;TLD&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;.com&lt;/td&gt;
&lt;td&gt;46.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.ai&lt;/td&gt;
&lt;td&gt;11.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.app&lt;/td&gt;
&lt;td&gt;10.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.io&lt;/td&gt;
&lt;td&gt;6.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.dev&lt;/td&gt;
&lt;td&gt;3.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;.ai + .app + .io + .dev together are &lt;strong&gt;30.5%&lt;/strong&gt; — nearly a third of vibe-coded products launch on a "builder" TLD. And still, when makers want to be taken seriously, they buy the .com.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method, briefly
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Catalogue: 2,587 approved products on &lt;a href="https://vibeking.fun" rel="noopener noreferrer"&gt;vibeking.fun&lt;/a&gt;, collected from launch platforms and direct submissions&lt;/li&gt;
&lt;li&gt;Liveness: HTTP checks in rotating batches every 6 hours via Cloudflare Workers cron; a product is "at risk" after repeated recent failures and "dead" only after sustained consecutive failures&lt;/li&gt;
&lt;li&gt;Anti-bot handling: sites that block automated checks (401/403/405/429) count as &lt;em&gt;alive&lt;/em&gt; — refusing bots is not being down&lt;/li&gt;
&lt;li&gt;Nothing here is estimated. Counts are from the production database, queried today.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'll re-run this in a few months when the longitudinal picture exists. If you want your product in the tracked set: &lt;a href="https://vibeking.fun/submit" rel="noopener noreferrer"&gt;vibeking.fun/submit&lt;/a&gt; — free, no signup wall for browsing, and the checker will keep an eye on your uptime for you.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>indiehackers</category>
      <category>data</category>
    </item>
    <item>
      <title>Your hreflang says English-only. Does your language switcher agree?</title>
      <dc:creator>CodeLong888</dc:creator>
      <pubDate>Thu, 13 Aug 2026 19:51:06 +0000</pubDate>
      <link>https://dev.to/codelong888/your-hreflang-says-english-only-does-your-language-switcher-agree-146</link>
      <guid>https://dev.to/codelong888/your-hreflang-says-english-only-does-your-language-switcher-agree-146</guid>
      <description>&lt;p&gt;I run a maintenance sweep over my own site every day. Yesterday it found 1,474 dead internal links that had been sitting there in plain sight, on 737 pages, and every automated check I had was green.&lt;/p&gt;

&lt;p&gt;The cause is a bug class I have not seen written up, so here it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two places encode "which languages does this page have"
&lt;/h2&gt;

&lt;p&gt;A partially translated site has, whether you planned it or not, &lt;strong&gt;two independent answers&lt;/strong&gt; to the question &lt;em&gt;does this page exist in Chinese?&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;code&gt;&amp;lt;link rel="alternate" hreflang="..."&amp;gt;&lt;/code&gt; tags in &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; — what you tell crawlers.&lt;/li&gt;
&lt;li&gt;The EN / 简 / 繁 buttons in your nav — what you tell humans.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mine disagreed. The &lt;code&gt;hreflang&lt;/code&gt; side was correct: a few page families on my site are English-only, so those pages emit an English self-reference and nothing else. There is even a comment in the source explaining why, because declaring an alternate that 404s poisons the whole hreflang cluster.&lt;/p&gt;

&lt;p&gt;The nav switcher never got that memo. It was doing the naive thing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// every page, unconditionally&lt;/span&gt;
&lt;span class="s2"&gt;`&amp;lt;a href="&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;basePath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;EN&amp;lt;/a&amp;gt;
 &amp;lt;a href="/zh-cn&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;basePath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;简&amp;lt;/a&amp;gt;
 &amp;lt;a href="/zh-tw&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;basePath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;繁&amp;lt;/a&amp;gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So on every English-only page, the two Chinese buttons pointed at URLs that do not exist. Click 简 on the API docs, get a 404.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why nothing caught it
&lt;/h2&gt;

&lt;p&gt;This is the part worth internalising. The bug survived because it fails every test you would think to write:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The pages are all 200.&lt;/strong&gt; Uptime checks, sitemap validation, status sweeps — all green. The broken thing is a link &lt;em&gt;on&lt;/em&gt; a healthy page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The &lt;code&gt;hreflang&lt;/code&gt; is correct.&lt;/strong&gt; Any SEO audit that checks hreflang reciprocity passes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The 404s are correct too.&lt;/strong&gt; Those Chinese URLs &lt;em&gt;should&lt;/em&gt; 404; the page genuinely does not exist in Chinese.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is invisible on the pages you look at most.&lt;/strong&gt; My homepage, tools, and guides &lt;em&gt;are&lt;/em&gt; translated, so the switcher works perfectly everywhere I click during normal use. It only breaks in the families I never browse by hand.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every component was individually correct. The defect only existed in the relationship between two of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The check that found it
&lt;/h2&gt;

&lt;p&gt;Nothing clever. Take a page, extract every on-site &lt;code&gt;href&lt;/code&gt;, and curl all of them — recording the status &lt;strong&gt;and&lt;/strong&gt; the redirect count:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://example.com/some-page &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'href="/[^"]*"'&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/href="//;s/"//'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; p&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
      &lt;/span&gt;&lt;span class="nv"&gt;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s1"&gt;'%{http_code}:%{num_redirects}'&lt;/span&gt; &lt;span class="s2"&gt;"https://example.com&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$code&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"200:0"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="s2"&gt; -&amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;$code&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;num_redirects&lt;/code&gt; half matters as much as the status. &lt;code&gt;200:1&lt;/code&gt; is a link that works but burns a hop, and a page full of those is a page slowly leaking crawl budget. I run this against one rotating page per sweep rather than crawling the whole site — cheap, and over a couple of weeks it covers everything that matters.&lt;/p&gt;

&lt;p&gt;On the page I happened to rotate to yesterday, &lt;a href="https://hackmyip.com/api-docs" rel="noopener noreferrer"&gt;the API docs&lt;/a&gt;, it printed exactly two lines. Both were the language switcher.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix is not "add the missing pages"
&lt;/h2&gt;

&lt;p&gt;The tempting fix is to generate the Chinese versions so the links resolve. That is how you end up maintaining machine-translated pages nobody reads, and — if they serve near-identical content — competing with yourself in search.&lt;/p&gt;

&lt;p&gt;The real fix is to make the two sources of truth &lt;strong&gt;one&lt;/strong&gt; source of truth. I already had a set listing the English-only paths, used by the &lt;code&gt;hreflang&lt;/code&gt; generator. The switcher just needed to consult it:&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;zhLinks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;EN_ONLY_PAGES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;basePath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`
  &amp;lt;a href="/zh-cn&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;basePath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;简&amp;lt;/a&amp;gt;
  &amp;lt;a href="/zh-tw&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;basePath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;繁&amp;lt;/a&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On English-only pages the switcher now renders the EN button alone. 1,474 dead links gone; the rest of the site keeps its full switcher. Whenever a page family gets translated for real, adding it to that one set fixes the crawler signal and the human UI in the same commit — which is the actual win here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things to take away
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;If two subsystems answer the same question, one of them is going to be wrong.&lt;/strong&gt; Language availability, feature flags, pricing tiers — anywhere you have a "which of these exist" list, count how many places encode it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Green status checks do not mean green links.&lt;/strong&gt; A 200 page can be full of 404s. Check the edges of your graph, not just the nodes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit the family, not a sample.&lt;/strong&gt; Spot-checking would have found nothing, because the switcher works on most pages. Enumerating every link on one page found it in seconds.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The crawler-facing side of this is what I care about most, since AI assistants read my &lt;a href="https://hackmyip.com/llms.txt" rel="noopener noreferrer"&gt;machine-readable site directory&lt;/a&gt; and follow whatever URLs it hands them. A dead link is not just a bad click — it is a citation you never get.&lt;/p&gt;

&lt;p&gt;Go curl your own language switcher.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>i18n</category>
    </item>
    <item>
      <title>How to check if an IP is blacklisted (DNSBL), from raw DNS to one curl</title>
      <dc:creator>CodeLong888</dc:creator>
      <pubDate>Wed, 29 Jul 2026 13:35:06 +0000</pubDate>
      <link>https://dev.to/codelong888/how-to-check-if-an-ip-is-blacklisted-dnsbl-from-raw-dns-to-one-curl-4jl5</link>
      <guid>https://dev.to/codelong888/how-to-check-if-an-ip-is-blacklisted-dnsbl-from-raw-dns-to-one-curl-4jl5</guid>
      <description>&lt;p&gt;Your emails start bouncing, or a website suddenly challenges every request from your server. Very often the reason is boring: your IP landed on a DNSBL and you did not know.&lt;/p&gt;

&lt;p&gt;A DNSBL (DNS-based blackhole list) is a reputation database you query over plain DNS. Mail servers do this on every incoming connection. Spamhaus, SpamCop, Barracuda and a dozen others each run their own list, their own criteria, and their own delisting process.&lt;/p&gt;

&lt;h2&gt;
  
  
  The raw mechanic (it is just DNS)
&lt;/h2&gt;

&lt;p&gt;To check an IP against a list, you reverse its octets and query them as a subdomain of the list's zone. Checking &lt;code&gt;127.0.0.2&lt;/code&gt; against SpamCop looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;nslookup &lt;span class="nt"&gt;-type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;A 2.0.0.127.bl.spamcop.net
&lt;span class="go"&gt;
Name:    2.0.0.127.bl.spamcop.net
Address:  127.0.0.2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the name resolves (typically to something in &lt;code&gt;127.0.0.0/8&lt;/code&gt;), the IP is listed. If you get &lt;code&gt;NXDOMAIN&lt;/code&gt;, it is clean on that list. &lt;code&gt;127.0.0.2&lt;/code&gt; is the standard test address that every DNSBL keeps permanently listed, which is why the query above always "hits" and is a handy way to confirm your resolver can reach a list at all.&lt;/p&gt;

&lt;p&gt;That last part matters more than people expect. Some lists, Spamhaus in particular, refuse queries coming from big public resolvers like 8.8.8.8 or 1.1.1.1. You can query them and get nothing back, conclude "clean", and be wrong. If you script your own checker, query through your own resolver and treat "no answer" as unknown, not clean.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking a dozen lists with one request
&lt;/h2&gt;

&lt;p&gt;Checking one list tells you little. An IP that is clean on SpamCop can be listed on UCEPROTECT or PSBL. To do it properly you loop over 10 to 15 zones, handle each list's return-code semantics, and handle the resolver problem above.&lt;/p&gt;

&lt;p&gt;Or you let one endpoint do it. I run a free, keyless API that fans out the DNS queries server-side:&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;$ &lt;/span&gt;curl &lt;span class="s2"&gt;"https://hackmyip.com/api/blacklist?ip=1.1.1.1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&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;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.1.1.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;"total_lists"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total_checked"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"unavailable_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"listed_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"clean"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CLEAN"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"results"&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="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;"Barracuda"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"zone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b.barracudacentral.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"listed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_listed"&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="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;"SpamCop"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"zone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bl.spamcop.net"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"listed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_listed"&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="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;"Spamhaus ZEN"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"zone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"zen.spamhaus.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"listed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unavailable"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Response trimmed; the real one returns all 12 lists: Spamhaus ZEN, Barracuda, SpamCop, Spam Eating Monkey, UCEPROTECT L1, Composite Blocking List, Invaluement, PSBL, Mailspike, Truncate, WPBL, and Suomispam.)&lt;/p&gt;

&lt;p&gt;One honest detail I want to point out because most checkers get it wrong: notice &lt;code&gt;total_checked: 10&lt;/code&gt; versus &lt;code&gt;total_lists: 12&lt;/code&gt;, and &lt;code&gt;"status": "unavailable"&lt;/code&gt; on Spamhaus in that run. When a zone cannot be reached from the edge location serving your request, the API says so instead of silently reporting "clean". If you build on top of this, treat &lt;code&gt;unavailable&lt;/code&gt; as "check this one another way", not as a pass.&lt;/p&gt;

&lt;p&gt;There is also a browser version of the same check at &lt;a href="https://hackmyip.com/blacklist" rel="noopener noreferrer"&gt;hackmyip.com/blacklist&lt;/a&gt; if you just want to paste an IP and look, and the full endpoint list lives in the &lt;a href="https://hackmyip.com/api" rel="noopener noreferrer"&gt;API docs&lt;/a&gt;. No key, no signup, CORS enabled, so you can call it from a frontend too.&lt;/p&gt;

&lt;h2&gt;
  
  
  If your IP is actually listed
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Fix the cause first. A listing almost always has a reason: a compromised machine on your network, a web form being abused to send mail, an open relay, or a neighbor on the same shared IP range. Delisting without fixing the cause gets you relisted fast.&lt;/li&gt;
&lt;li&gt;Then go to each list's own delisting page. There is no central authority; every list has its own form and its own rules.&lt;/li&gt;
&lt;li&gt;Some lists age entries out automatically after the abuse stops, others keep you until you ask. Recheck after a day or two.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you are on a cloud provider or CGNAT, you may simply have inherited a previous tenant's reputation. Same playbook applies, and it is a good argument for checking an IP before you build anything mail-related on it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>networking</category>
      <category>security</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>how i run a 2,500-page directory from a single cloudflare worker</title>
      <dc:creator>CodeLong888</dc:creator>
      <pubDate>Tue, 21 Jul 2026 03:01:26 +0000</pubDate>
      <link>https://dev.to/codelong888/how-i-run-a-2500-page-directory-from-a-single-cloudflare-worker-lf1</link>
      <guid>https://dev.to/codelong888/how-i-run-a-2500-page-directory-from-a-single-cloudflare-worker-lf1</guid>
      <description>&lt;p&gt;quick build writeup, because i haven't seen many people run a directory this way and it's been surprisingly nice to live with.&lt;/p&gt;

&lt;p&gt;the site is vibeking, a directory of vibe-coded products (stuff people built mostly by prompting AI). around 2,500 entries right now, each with its own page, and the whole thing runs as ONE cloudflare worker with a d1 database behind it. no framework, no build step, no origin server. here's how it works and the two things that bit me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;one entry, not one page.&lt;/strong&gt; the trick that makes a big directory maintainable is you never build pages, you build data. every product is a row in d1 (name, tagline, url, category, tags). one render function turns any row into a full page: title, meta, og tags, json-ld, internal links to related products, all of it. so the 2,000th product costs the same effort as the 5th. the worker matches /product/:slug, pulls the row, renders. that's basically the whole architecture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;d1 at the edge is great until you think about it wrong.&lt;/strong&gt; it's sqlite, and for a read-heavy directory that's perfect. the mistake i made early was doing too much per request. put indexes on whatever you sort/filter by (category, votes, created_at) on day one, not after it's slow.&lt;/p&gt;

&lt;p&gt;now the two things that actually bit me, because this is the useful part:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. the soft-404 that quietly poisons your seo.&lt;/strong&gt; my worker had a catch-all that, for any path it didn't recognize, just served the homepage with a 200. felt harmless. it is not. google crawls a bunch of guessed/junk urls, every one returns 200-homepage, and google decides "this site returns the same page for everything" and starts distrusting your urls. for a directory whose entire seo bet is thousands of unique pages, that's poison. the fix is boring but critical: any unmatched path must return a real 404. probe your own site with a fake url and confirm you get a 404. i'd fixed this on a couple of my other sites and STILL had to catch it here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. the cold-start problem is real and your page count doesn't save you.&lt;/strong&gt; here's the humbling bit. i thought 2,500 pages was a moat. it isn't, on its own. a brand-new domain with 2,500 thin pages is 2,500 pages google mostly ignores, because you haven't earned trust yet. page count is potential energy, not traffic. what turns it on is the slow stuff: real internal linking, genuinely useful individual pages, being something an AI assistant would recommend, and earning a few real links from outside. i'm in the middle of that part now and it's the opposite of fun, which is probably why it's the part most of us skip.&lt;/p&gt;

&lt;p&gt;if you're building anything directory-shaped on workers, those are the two i'd save you: return real 404s, and don't mistake a big sitemap for traction.&lt;/p&gt;

&lt;p&gt;the site if you want to see the pattern in the wild: &lt;a href="https://vibeking.fun/?utm_source=devto&amp;amp;utm_medium=blog&amp;amp;utm_campaign=distro" rel="noopener noreferrer"&gt;vibeking.fun&lt;/a&gt;. happy to answer anything about the worker/d1 setup in the comments.&lt;/p&gt;

&lt;p&gt;thanks for reading.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>cloudflare</category>
      <category>serverless</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I built 1,081 free tools. Today a stranger finally asked to join.</title>
      <dc:creator>CodeLong888</dc:creator>
      <pubDate>Sun, 19 Jul 2026 16:59:01 +0000</pubDate>
      <link>https://dev.to/codelong888/i-built-1081-free-tools-today-a-stranger-finally-asked-to-join-1f8l</link>
      <guid>https://dev.to/codelong888/i-built-1081-free-tools-today-a-stranger-finally-asked-to-join-1f8l</guid>
      <description>&lt;p&gt;Seventeen days ago I launched &lt;a href="https://yourhack.ai" rel="noopener noreferrer"&gt;yourhack.ai&lt;/a&gt;, a directory of free, client-side web tools. Calculators, converters, formatters, PDF stuff. Everything runs in the browser, nothing gets uploaded, no signups.&lt;/p&gt;

&lt;p&gt;I kept adding tools almost every day. The counter says 1,081 now, which sounds impressive until you realize a counter is just me talking to myself. A directory you fill yourself is a monologue.&lt;/p&gt;

&lt;p&gt;Today that changed. A stranger submitted their own product through the submit form and asked to be listed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this tiny event matters
&lt;/h2&gt;

&lt;p&gt;Nobody submits their product to a site they think is dead. A submission is someone spending their own effort betting that being on YOUR page is worth something. You cannot fake that signal, and you cannot buy it, which makes it the first piece of real product-market evidence a directory can get.&lt;/p&gt;

&lt;p&gt;One submission is a small number. But the difference between zero and one is the difference between "my project" and "a place". Everything after this is just more.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually did with it
&lt;/h2&gt;

&lt;p&gt;I did not auto-approve it, and honestly that surprised me too.&lt;/p&gt;

&lt;p&gt;The submission described itself as a free calculator. I opened the site: the calculator was behind a $4.99/mo plan, and the free part was a reference library. Decent product, but the listing copy oversold it. So I rewrote the listing to match reality (free library, paid tools, affiliate links disclosed) before approving it.&lt;/p&gt;

&lt;p&gt;That felt like the actual job of a directory. Anyone can aggregate links. The only thing that makes a directory worth listing on is that someone checks what's behind the link.&lt;/p&gt;

&lt;h2&gt;
  
  
  The boring lessons
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Review flows get used before you're ready.&lt;/strong&gt; I wrote the submission form in week one and assumed it would sit idle for months. Real usage always arrives before the polish does.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The first outside user finds your real bugs.&lt;/strong&gt; Mine surfaced a policy question I had never written down: can makers edit a listing after approval? (Answer now: no. Approved listings are frozen; edits go back through review.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ship the door before you expect visitors.&lt;/strong&gt; If the submit form had not existed, this person would have bounced and I would never have known anyone cared.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you run a directory, a gallery, a showcase, anything with a "submit" button: the day that button gets pressed by someone you don't know is the day the site becomes real. Build the door early.&lt;/p&gt;

&lt;p&gt;The directory is at &lt;a href="https://yourhack.ai" rel="noopener noreferrer"&gt;yourhack.ai&lt;/a&gt;, and if you've built a free web tool, the door is at &lt;a href="https://yourhack.ai/submit" rel="noopener noreferrer"&gt;yourhack.ai/submit&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>webdev</category>
      <category>sideprojects</category>
      <category>indiehacking</category>
    </item>
    <item>
      <title>i built 1000+ free web tools in a couple weeks and turns out building it was the easy part</title>
      <dc:creator>CodeLong888</dc:creator>
      <pubDate>Fri, 17 Jul 2026 11:20:35 +0000</pubDate>
      <link>https://dev.to/codelong888/i-built-1000-free-web-tools-in-a-couple-weeks-and-turns-out-building-it-was-the-easy-part-50ei</link>
      <guid>https://dev.to/codelong888/i-built-1000-free-web-tools-in-a-couple-weeks-and-turns-out-building-it-was-the-easy-part-50ei</guid>
      <description>&lt;p&gt;so i've been building this thing called yourhack.ai for the last couple weeks and i wanted to write down the honest version of how it's going, mostly because everything i read about side projects is either a flex or a "how i hit $10k MRR" thing and this is very much neither lol.&lt;/p&gt;

&lt;p&gt;it started dumb. i kept needing quick little tools online, convert this file, format this json, compress this image, count these words. and every single time i'd land on some site absolutely drowning in ads and popups, half of them making you create an account just to download the result of a 10 second task. it genuinely irritated me every time.&lt;/p&gt;

&lt;p&gt;so i built one. a clean little tool that does the thing and gets out of the way. then i built another. and uh, i didn't really stop. it's over 1000 now.&lt;/p&gt;

&lt;p&gt;the thing that let it get out of hand this fast is honestly the only clever bit: i don't build pages, i build entries. every tool is basically one object in a file (name, description, a little render function), and a template turns that into a full page with its own url, seo tags, structured data, search entry, all of it. so adding the 500th tool costs about the same as the 5th. the whole site is a single cloudflare worker at the edge, and most of the tools run entirely in your browser so your files just stay on your machine (the newer ai-powered ones do hit a server, being upfront about that).&lt;/p&gt;

&lt;p&gt;anyway, that's the part i'm proud of. here's the part that's been humbling me.&lt;/p&gt;

&lt;p&gt;i genuinely, kind of embarrassingly, believed that if i just made enough actually-useful stuff, people would find it. that was the whole plan. make it good and they'll come.&lt;/p&gt;

&lt;p&gt;they did not come lol.&lt;/p&gt;

&lt;p&gt;turns out a brand new domain is basically invisible. you can ship a thousand genuinely useful pages and google will just not care, because your site hasn't earned any trust yet and trust is the whole game. i had it backwards. i thought building was 90% of it and getting the word out was some small thing at the end. it's the opposite. building was the easy part, the fun part, the part fully in my control. distribution is slow and awkward and mostly out of my hands, and i'm just not naturally good at it.&lt;/p&gt;

&lt;p&gt;and the embarrassing tell is what i keep doing about it: instead of doing the scary distribution work, i just build more tools. because building is comfortable and putting myself out there is not. i'm aware it's a cope. i've been doing it anyway. writing this is me trying to break the pattern a little.&lt;/p&gt;

&lt;p&gt;where i've landed for now is to stop trying to "launch" and just be genuinely useful over a long stretch of time. answer real questions clearly, make the site something an AI assistant would actually recommend when someone asks it for a tool, and let that compound slowly instead of chasing a spike that dies in two days.&lt;/p&gt;

&lt;p&gt;so that's the honest state of it. i can build fast, i'm bad at getting seen, and i'm working on the second one.&lt;/p&gt;

&lt;p&gt;if you've been through this, i'd genuinely love to hear what worked for you. not "post everywhere", i mean the specific one or two things that actually moved the needle. if you want to see the thing itself it's &lt;a href="https://yourhack.ai" rel="noopener noreferrer"&gt;yourhack.ai&lt;/a&gt;, though honestly i'd take the distribution advice over the traffic.&lt;/p&gt;

&lt;p&gt;thanks for reading this far.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>showdev</category>
      <category>indiehackers</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I tracked every trending AI repo's stars daily for 3 weeks. The growth is not where I expected</title>
      <dc:creator>CodeLong888</dc:creator>
      <pubDate>Fri, 10 Jul 2026 00:38:14 +0000</pubDate>
      <link>https://dev.to/codelong888/i-tracked-every-trending-ai-repos-stars-daily-for-3-weeks-the-growth-is-not-where-i-expected-4j8a</link>
      <guid>https://dev.to/codelong888/i-tracked-every-trending-ai-repos-stars-daily-for-3-weeks-the-growth-is-not-where-i-expected-4j8a</guid>
      <description>&lt;p&gt;I run a small AI trends site, and three weeks ago I started doing something simple: every day, snapshot the star count of every repo that crosses my GitHub trending scan for AI. No judgment, no curation, just append-only rows in a database.&lt;/p&gt;

&lt;p&gt;611 repos and 2,671 data points later (June 19 to July 10), the picture of what's actually growing looks pretty different from what my feeds told me was hot. Here's what the data says.&lt;/p&gt;

&lt;p&gt;Before publishing this I re-checked every number below against GitHub's live API. Star counts drift by the hour, so treat them as of July 10.&lt;/p&gt;

&lt;h2&gt;
  
  
  The top 10 risers, by raw stars gained
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Repo&lt;/th&gt;
&lt;th&gt;Gained&lt;/th&gt;
&lt;th&gt;Window&lt;/th&gt;
&lt;th&gt;From → To&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;calesthio/OpenMontage&lt;/td&gt;
&lt;td&gt;+30,253&lt;/td&gt;
&lt;td&gt;21 days&lt;/td&gt;
&lt;td&gt;5,899 → 36,152&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeusData/codebase-memory-mcp&lt;/td&gt;
&lt;td&gt;+20,483&lt;/td&gt;
&lt;td&gt;19 days&lt;/td&gt;
&lt;td&gt;7,516 → 27,999&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mattpocock/skills&lt;/td&gt;
&lt;td&gt;+19,053&lt;/td&gt;
&lt;td&gt;15 days&lt;/td&gt;
&lt;td&gt;137,485 → 156,538&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;obra/superpowers&lt;/td&gt;
&lt;td&gt;+16,887&lt;/td&gt;
&lt;td&gt;20 days&lt;/td&gt;
&lt;td&gt;232,908 → 249,795&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NousResearch/hermes-agent&lt;/td&gt;
&lt;td&gt;+14,896&lt;/td&gt;
&lt;td&gt;21 days&lt;/td&gt;
&lt;td&gt;197,297 → 212,193&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Panniantong/Agent-Reach&lt;/td&gt;
&lt;td&gt;+14,334&lt;/td&gt;
&lt;td&gt;14 days&lt;/td&gt;
&lt;td&gt;34,780 → 49,114&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;usestrix/strix&lt;/td&gt;
&lt;td&gt;+13,243&lt;/td&gt;
&lt;td&gt;12 days&lt;/td&gt;
&lt;td&gt;26,363 → 39,606&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;addyosmani/agent-skills&lt;/td&gt;
&lt;td&gt;+12,685&lt;/td&gt;
&lt;td&gt;21 days&lt;/td&gt;
&lt;td&gt;63,156 → 75,841&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;asgeirtj/system_prompts_leaks&lt;/td&gt;
&lt;td&gt;+11,720&lt;/td&gt;
&lt;td&gt;21 days&lt;/td&gt;
&lt;td&gt;43,415 → 55,135&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;msitarzewski/agency-agents&lt;/td&gt;
&lt;td&gt;+11,055&lt;/td&gt;
&lt;td&gt;10 days&lt;/td&gt;
&lt;td&gt;118,241 → 129,296&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Windows differ because I only hold snapshots for the days a repo appeared in my scan; each row states its own real window.&lt;/p&gt;

&lt;p&gt;Three things in this data genuinely surprised me.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. "Skills" are eating agent frameworks
&lt;/h2&gt;

&lt;p&gt;Four of the top ten are not agent frameworks. They are collections of packaged expertise that plug into an existing agent: obra/superpowers (still compounding at roughly 840 stars a day on a 250k base), mattpocock/skills, addyosmani/agent-skills, msitarzewski/agency-agents.&lt;/p&gt;

&lt;p&gt;A year ago this table would have been full of new frameworks. Now the framework layer looks settled and the growth is in what you load INTO the agent. The moat moved from orchestration code to encoded judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The sharpest climbs are applications, not infrastructure
&lt;/h2&gt;

&lt;p&gt;The steepest sustained climb from a newcomer in my dataset is MadsLorentzen/ai-job-search: +10,591 stars in 3 days, roughly 3,500 a day. It is an AI job application framework. Not a model, not a devtool.&lt;/p&gt;

&lt;p&gt;Same pattern elsewhere: OpenMontage (agentic video production) went 6x in three weeks and topped the whole table. xbtlin/ai-berkshire, a Chinese-language value-investing research agent, went from 1,518 to 12,339 in 15 days, an 8x. People are starring things that do a job for them, not things that help them build things.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. A 14-year-old repo gained 10k stars in two days
&lt;/h2&gt;

&lt;p&gt;smicallef/spiderfoot was created in April 2012. It is a classic OSINT automation tool. Between my June 21 and June 23 snapshots it gained 10,413 stars, the fastest burst I recorded from any repo.&lt;/p&gt;

&lt;p&gt;Old tools that happen to be perfect agent tools are getting second lives. If your decade-old project has a clean CLI and does one thing well, it is suddenly relevant again, because agents can drive it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Methodology, honestly
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Snapshots are daily and only cover repos while they appear in my trending scan, so tracking windows differ per repo. Every delta above states its own window, measured between my first and last snapshot for that repo.&lt;/li&gt;
&lt;li&gt;"Gained" is the difference between those two snapshots, no extrapolation.&lt;/li&gt;
&lt;li&gt;I cross-checked the endpoints against GitHub's API on publish day; stored values matched within normal hourly drift.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The live version of this table updates daily on &lt;a href="https://whatstrending.ai/repos" rel="noopener noreferrer"&gt;the rising repos page&lt;/a&gt;, and there's a &lt;a href="https://whatstrending.ai/pulse" rel="noopener noreferrer"&gt;daily AI briefing&lt;/a&gt; built from the same tracked data (model usage movers, funding, and rising repos), archived per day.&lt;/p&gt;

&lt;p&gt;I'll keep the snapshots running. If this is useful I can post the four-week edition with week-over-week velocity, which the raw data already supports.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>github</category>
      <category>opensource</category>
      <category>datascience</category>
    </item>
    <item>
      <title>I put 300+ free web tools in one place, with no ads and no signup</title>
      <dc:creator>CodeLong888</dc:creator>
      <pubDate>Fri, 03 Jul 2026 01:51:49 +0000</pubDate>
      <link>https://dev.to/codelong888/i-put-300-free-web-tools-in-one-place-with-no-ads-and-no-signup-1cf6</link>
      <guid>https://dev.to/codelong888/i-put-300-free-web-tools-in-one-place-with-no-ads-and-no-signup-1cf6</guid>
      <description>&lt;p&gt;I use a lot of little web tools. A JSON formatter here, a cron parser there, a "cm to inches" when I am reading a spec written by someone on the other side of the planet. And every single time, the same friction: the first result is buried in ads, a cookie wall pops up, and half of them want me to sign in just to format some text.&lt;/p&gt;

&lt;p&gt;So I built the thing I actually wanted: &lt;a href="https://yourhack.ai" rel="noopener noreferrer"&gt;yourhack.ai&lt;/a&gt;, a directory of 300+ free web tools. No ads. No signup. Nothing you paste ever leaves your browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is in it
&lt;/h2&gt;

&lt;p&gt;A bit of everything, all client side:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Developer&lt;/strong&gt;: JSON formatter, Base64, JWT decoder, regex tester, cron parser, hash generators, diff checker, timestamp converter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Converters&lt;/strong&gt;: length, weight, temperature, and dedicated pages for the pairs people actually search, like &lt;a href="https://yourhack.ai/cm-to-inches" rel="noopener noreferrer"&gt;cm to inches&lt;/a&gt; and &lt;a href="https://yourhack.ai/kg-to-lbs" rel="noopener noreferrer"&gt;kg to lbs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calculators&lt;/strong&gt;: &lt;a href="https://yourhack.ai/mortgage-calculator" rel="noopener noreferrer"&gt;mortgage&lt;/a&gt;, loan, percentage, &lt;a href="https://yourhack.ai/bmi-calculator" rel="noopener noreferrer"&gt;BMI&lt;/a&gt;, GPA, and a pile more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generators&lt;/strong&gt;: passwords, QR codes, UUIDs, fake data, usernames&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PDF and image&lt;/strong&gt;: merge, split, compress, resize, crop, all in the browser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Random and fun&lt;/strong&gt;: dice, wheel of names, and the rest&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every tool is its own page, works offline once loaded, and runs entirely on your machine. A privacy-friendly toolbox by default, because there is no server to send your data to.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I actually enjoyed building
&lt;/h2&gt;

&lt;p&gt;The whole site is one Cloudflare Worker with a tiny registry. Adding a tool is one object:&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="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;json-formatter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;JSON Formatter &amp;amp; Validator&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;developer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Format, validate and minify JSON in your browser.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;keywords&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;json formatter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;json validator&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nx"&gt;intro&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A short SEO paragraph for the page.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;the self-contained tool HTML + inline script&amp;gt;`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The router, the shared template, the SEO tags, the JSON-LD, the sitemap, and the search index all read from that array. So the marginal cost of tool number 301 is one entry: no new routing, no new template. That is what made it possible to grow past 300 without the codebase turning into spaghetti.&lt;/p&gt;

&lt;p&gt;No backend, no database, no build step. Static render on the edge plus inline JavaScript per tool. It costs almost nothing to run, which is the whole reason it can stay free with no ads.&lt;/p&gt;

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

&lt;p&gt;It is live at &lt;a href="https://yourhack.ai" rel="noopener noreferrer"&gt;yourhack.ai&lt;/a&gt;. Light and dark mode, mobile friendly, and it grows every day.&lt;/p&gt;

&lt;p&gt;If there is a tool you keep googling and hate the ad-choked result for, tell me and I will add it. That is genuinely the roadmap right now: whatever people keep needing.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>showdev</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Check your IP, ASN, and VPN/proxy leaks from the terminal with curl (no signup, no key)</title>
      <dc:creator>CodeLong888</dc:creator>
      <pubDate>Tue, 30 Jun 2026 10:23:47 +0000</pubDate>
      <link>https://dev.to/codelong888/check-your-ip-asn-and-vpnproxy-leaks-from-the-terminal-with-curl-no-signup-no-key-53lb</link>
      <guid>https://dev.to/codelong888/check-your-ip-asn-and-vpnproxy-leaks-from-the-terminal-with-curl-no-signup-no-key-53lb</guid>
      <description>&lt;p&gt;Every "what's my IP" site is a bloated page covered in ads, cookie banners, and "sign up for a VPN" popups. Half the time I just want the number, and often I want it inside a shell script or over SSH, where a browser is not even an option.&lt;/p&gt;

&lt;p&gt;So here is the no-nonsense version: &lt;code&gt;hackmyip.com&lt;/code&gt; serves clean text and JSON when you hit it with curl. No signup, no API key, no HTML.&lt;/p&gt;

&lt;h2&gt;
  
  
  The basics
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# IP + location + network, human-readable&lt;/span&gt;
curl hackmyip.com

&lt;span class="c"&gt;# just the raw IP (pipe-friendly)&lt;/span&gt;
curl hackmyip.com/ip
&lt;span class="c"&gt;# 203.0.113.45&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because &lt;code&gt;/ip&lt;/code&gt; returns nothing but the address, it drops straight into scripts:&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;IP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; hackmyip.com/ip&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"running from &lt;/span&gt;&lt;span class="nv"&gt;$IP&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  JSON when you need to parse it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl hackmyip.com/json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"203.0.113.45"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Amsterdam"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"asn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AS64500"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"org"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Example Telecom B.V."&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;Pipe it into &lt;code&gt;jq&lt;/code&gt; like anything else:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; hackmyip.com/json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; .asn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The useful one: is my VPN actually working?
&lt;/h2&gt;

&lt;p&gt;This is the endpoint I reach for most. It tells you whether your current IP looks like a normal residential connection or a datacenter / VPN / proxy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl hackmyip.com/proxy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;proxy: yes
type:  datacenter/hosting
network: AS212238  Datacamp Limited
signal: IP is on a known datacenter/hosting ASN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why this is handy: turn your VPN on, then run &lt;code&gt;curl hackmyip.com/proxy&lt;/code&gt;. If it still shows your real residential ISP and ASN, your VPN is not actually routing that traffic (a leak). If it shows a datacenter ASN like above, the VPN is doing its job. It is a one-second sanity check you can even drop into a script before doing anything sensitive.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rest of the toolkit
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl hackmyip.com/asn       &lt;span class="c"&gt;# your ASN + ISP&lt;/span&gt;
curl hackmyip.com/headers   &lt;span class="c"&gt;# the request headers the server sees&lt;/span&gt;
curl hackmyip.com/ua        &lt;span class="c"&gt;# your User-Agent&lt;/span&gt;
curl hackmyip.com/rdns      &lt;span class="c"&gt;# reverse DNS (PTR) of your IP&lt;/span&gt;
curl hackmyip.com/help      &lt;span class="c"&gt;# the full menu&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All of it is free, keyless, and runs on Cloudflare's edge, so it is fast from anywhere. If you would rather hit a full JSON API (DNS, WHOIS, blacklist, breach checks, and more), the no-key API is documented at &lt;a href="https://hackmyip.com/api-docs" rel="noopener noreferrer"&gt;https://hackmyip.com/api-docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What do you use for this in your scripts? Curious whether people are still hardcoding &lt;code&gt;ifconfig.me&lt;/code&gt; or have a sharper trick.&lt;/p&gt;

</description>
      <category>bash</category>
      <category>linux</category>
      <category>devops</category>
      <category>privacy</category>
    </item>
    <item>
      <title>I tracked which AI models people actually use for a month. The top 5 are all Chinese or open-weight.</title>
      <dc:creator>CodeLong888</dc:creator>
      <pubDate>Tue, 30 Jun 2026 05:24:22 +0000</pubDate>
      <link>https://dev.to/codelong888/i-tracked-which-ai-models-people-actually-use-for-a-month-the-top-5-are-all-chinese-or-open-weight-4ckf</link>
      <guid>https://dev.to/codelong888/i-tracked-which-ai-models-people-actually-use-for-a-month-the-top-5-are-all-chinese-or-open-weight-4ckf</guid>
      <description>&lt;p&gt;Everyone argues about which AI model is "best" using benchmarks. I wanted to know something simpler: which models do people actually &lt;em&gt;run&lt;/em&gt; in production, when they pay per token and can pick anything?&lt;/p&gt;

&lt;p&gt;So I started tracking OpenRouter's published usage rankings every day. OpenRouter is a neutral marketplace: developers route requests to whatever model they want and pay by the token, so the rankings are a real, money-on-the-line signal of demand. Here is what the last 7 days look like, by token volume routed per model.&lt;/p&gt;

&lt;h2&gt;
  
  
  The current top 10 by real usage
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rank&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Tokens/wk&lt;/th&gt;
&lt;th&gt;Price (in/out per MTok)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;DeepSeek V4 Flash&lt;/td&gt;
&lt;td&gt;DeepSeek&lt;/td&gt;
&lt;td&gt;4.72T&lt;/td&gt;
&lt;td&gt;$0.09 / $0.18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;MiMo-V2.5&lt;/td&gt;
&lt;td&gt;Xiaomi&lt;/td&gt;
&lt;td&gt;4.38T&lt;/td&gt;
&lt;td&gt;$0.11 / $0.28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;MiniMax M3&lt;/td&gt;
&lt;td&gt;MiniMax&lt;/td&gt;
&lt;td&gt;3.68T&lt;/td&gt;
&lt;td&gt;$0.30 / $1.20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Owl Alpha&lt;/td&gt;
&lt;td&gt;OpenRouter (free)&lt;/td&gt;
&lt;td&gt;3.55T&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Hy3 preview&lt;/td&gt;
&lt;td&gt;Tencent&lt;/td&gt;
&lt;td&gt;3.46T&lt;/td&gt;
&lt;td&gt;$0.06 / $0.21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Claude Opus 4.7&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;2.23T&lt;/td&gt;
&lt;td&gt;$5 / $25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;GLM 5.2&lt;/td&gt;
&lt;td&gt;Z.ai&lt;/td&gt;
&lt;td&gt;2.20T&lt;/td&gt;
&lt;td&gt;$0.94 / $3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;DeepSeek V4 Pro&lt;/td&gt;
&lt;td&gt;DeepSeek&lt;/td&gt;
&lt;td&gt;2.08T&lt;/td&gt;
&lt;td&gt;$0.44 / $0.87&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Claude Opus 4.8&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;1.92T&lt;/td&gt;
&lt;td&gt;$5 / $25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Claude Sonnet 4.6&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;1.54T&lt;/td&gt;
&lt;td&gt;$3 / $15&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The entire top 5 is a Chinese lab or open-weight. The first OpenAI model, GPT-5.5, does not show up until #12. The first Gemini is #13.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest caveat
&lt;/h2&gt;

&lt;p&gt;Before anyone (rightly) objects: this is OpenRouter only. It measures the open API and router market, where developers pick a model per call. It does NOT include first-party traffic like ChatGPT, the Gemini app, or claude.ai, so the big consumer flagships are heavily undercounted in this view.&lt;/p&gt;

&lt;p&gt;So this is not "OpenAI is losing." It is something more specific, and to me more interesting: when developers route through a neutral marketplace and pay their own token bill, they overwhelmingly reach for cheap open and Chinese models.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why: the price gap is brutal
&lt;/h2&gt;

&lt;p&gt;Look at the two ends of the table. DeepSeek V4 Flash is $0.09 / $0.18 per million tokens. Claude Opus is $5 / $25. That is roughly a 50x difference on output.&lt;/p&gt;

&lt;p&gt;For a chatbot you babysit, quality wins and you happily pay for Opus. But for agent loops, batch pipelines, RAG over big corpora, and anything that burns tokens at scale, a 50x price gap is the whole decision. The open and Chinese models are now good enough for those workloads and an order of magnitude cheaper. That combination is what the usage chart is showing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this actually means
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;If you are building anything token-heavy, you are probably leaving real money on the table by defaulting to a US flagship.&lt;/li&gt;
&lt;li&gt;The "open models are toys" era is over, at least for production API workloads.&lt;/li&gt;
&lt;li&gt;The gap between benchmark leaderboards and real usage is large. The model that tops your favorite eval can have near-zero real adoption, and the reverse is also true.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I update this leaderboard daily here if you want to watch it move: &lt;a href="https://whatstrending.ai/models" rel="noopener noreferrer"&gt;https://whatstrending.ai/models&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What are you actually routing for bulk or agent work right now? DeepSeek, GLM, MiniMax, or something you self-host? Curious how this matches what people see in production.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>llm</category>
      <category>opensource</category>
    </item>
    <item>
      <title>My deploy agent could have dropped my database and I didn't realize</title>
      <dc:creator>CodeLong888</dc:creator>
      <pubDate>Mon, 22 Jun 2026 15:28:56 +0000</pubDate>
      <link>https://dev.to/codelong888/my-deploy-agent-could-have-dropped-my-database-and-i-didnt-realize-2aba</link>
      <guid>https://dev.to/codelong888/my-deploy-agent-could-have-dropped-my-database-and-i-didnt-realize-2aba</guid>
      <description>&lt;p&gt;I run a small free privacy-tools site as a side project. The product was fine. The maintenance was the part that wore me down: SEO upkeep, structured data, keeping every page linked. So I built a scheduled agent to handle it.&lt;/p&gt;

&lt;p&gt;It's a Claude agent that runs a few times a day. It reads the current state of the site, picks one small improvement, ships it to production, and sends me a digest of what it changed. Most runs are boring: a meta description here, a schema fix there.&lt;/p&gt;

&lt;p&gt;One run, it caught something I didn't know about. I'd shipped a handful of tools that were never actually listed in my own directory. They worked if you had the direct link, but nothing pointed to them, so neither Google nor any AI assistant could find them. The agent surfaced them, rebuilt the catalog into machine-readable structured data, and fixed it on its own.&lt;/p&gt;

&lt;p&gt;I was pleased with that, so I posted about it. The pushback was immediate, and most of it was fair.&lt;/p&gt;

&lt;p&gt;The objections that actually landed:&lt;/p&gt;

&lt;p&gt;The digest is the agent describing what it thinks it did. It is not a receipt. If something ships three times a day, you want the real diff and deploy log, captured outside the agent, not the agent's own summary of its own work. An LLM grading its own homework is exactly what you shouldn't trust.&lt;/p&gt;

&lt;p&gt;A scheduled, autonomous agent turns time into an attack surface. Nobody has to attack you live. They leave something in whatever the agent reads next, and the schedule does the rest while you sleep.&lt;/p&gt;

&lt;p&gt;Nothing stops an LLM from deciding that DROP TABLE is a reasonable improvement. It has no instinct that deleting data is bad. It can talk itself into a destructive change as easily as a helpful one.&lt;/p&gt;

&lt;p&gt;Blast radius. This is survivable if you run small isolated services where one bad change is contained. It is a different story on a single app where one deploy touches everything.&lt;/p&gt;

&lt;p&gt;So I stopped feeling clever and went to look at what my agent could actually do. Not what I had told it to do in its instructions, what its permissions physically allowed. The answer was bad. It could run arbitrary commands, deploy and delete the whole service, run destructive database operations, and force-push over my git history. My entire safety story was one line in a prompt that said "additive changes only." That is not a guardrail. If the agent had ever decided dropping a table was an improvement, nothing in the system would have stopped it.&lt;/p&gt;

&lt;p&gt;That is the lesson I actually paid for: convention is not a guardrail. "I told it not to" is not the same as "it cannot."&lt;/p&gt;

&lt;p&gt;What I changed:&lt;/p&gt;

&lt;p&gt;I scoped the permissions so it cannot, instead of trusting it not to. A tight allow-list (deploy only) plus a hard deny-list: no destructive database commands, no delete, no force-push, no rm, no arbitrary execution. Even if the agent convinces itself, the command fails.&lt;/p&gt;

&lt;p&gt;I stopped treating the digest as the source of truth. The real record is the diff and the deploy log, captured independently of the agent.&lt;/p&gt;

&lt;p&gt;I put a literal blocklist on the load-bearing paths: auth, billing, anything that is not additive content.&lt;/p&gt;

&lt;p&gt;I now treat anything the agent fetches from an external site as data, never as instructions. That closes the leave-something-it-reads-and-wait angle.&lt;/p&gt;

&lt;p&gt;The last piece, still open: the token it deploys with is a full-access login. Scoping it to the minimum is the final wall, so a slipped command hits a permission error instead of my infrastructure.&lt;/p&gt;

&lt;p&gt;I still think letting an agent ship to production is worth it. But the safety has to live in what it physically cannot do, not in what you politely asked it to avoid. The most useful part of the whole thing was not my agent catching a bug. It was a pile of strangers catching my agent.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>automation</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
