<?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: Aswin S</title>
    <description>The latest articles on DEV Community by Aswin S (@aswin_s_26090b9fa349f055c).</description>
    <link>https://dev.to/aswin_s_26090b9fa349f055c</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1821700%2F7ef8d2e0-a23c-47fd-b429-7227d50ba4d9.png</url>
      <title>DEV Community: Aswin S</title>
      <link>https://dev.to/aswin_s_26090b9fa349f055c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aswin_s_26090b9fa349f055c"/>
    <language>en</language>
    <item>
      <title>I Built a CAPTCHA Killer Using Behavioral Micro-Signals — Here's the Math Behind It</title>
      <dc:creator>Aswin S</dc:creator>
      <pubDate>Tue, 24 Feb 2026 14:01:35 +0000</pubDate>
      <link>https://dev.to/aswin_s_26090b9fa349f055c/i-built-a-captcha-killer-using-behavioral-micro-signals-heres-the-math-behind-it-557p</link>
      <guid>https://dev.to/aswin_s_26090b9fa349f055c/i-built-a-captcha-killer-using-behavioral-micro-signals-heres-the-math-behind-it-557p</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2Fp6hp1oizk6khykp78l7f.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.amazonaws.com%2Fuploads%2Farticles%2Fp6hp1oizk6khykp78l7f.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;The Problem&lt;br&gt;
CAPTCHAs are the worst UX on the internet. And now they don't even work.&lt;br&gt;
GPT-4V solves image CAPTCHAs with &amp;gt;99% accuracy. Google's reCAPTCHA is essentially a surveillance tool that tracks users across the web in exchange for "free" bot detection. And the $4.1B CAPTCHA industry has no answer.&lt;br&gt;
I decided to build something fundamentally different.&lt;br&gt;
The Insight&lt;br&gt;
When you interact with a device, your body produces involuntary micro-signals. Your hand trembles slightly (3-12Hz physiological tremor). Your scroll speed varies with attention. Your typing rhythm reflects cognitive load. And critically — these signals are correlated because they share physiological drivers.&lt;br&gt;
Your heartbeat creates micro-vibrations in your hand. Your breathing modulates your grip. Your neural oscillations affect your motor planning. This interconnection creates a coherence signature unique to living biological systems.&lt;br&gt;
The 5 Signal Channels&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pointer Dynamics
typescriptfunction pointerJitter(samples: {x: number, y: number, t: number}[]): number {
const displacements = samples.map((s, i) =&amp;gt; 
i &amp;gt; 0 ? Math.sqrt((s.x - samples[i-1].x)&lt;strong&gt;2 + (s.y - samples[i-1].y)&lt;/strong&gt;2) : 0
).filter(d =&amp;gt; d &amp;gt; 0);
const mean = displacements.reduce((a, b) =&amp;gt; a + b, 0) / displacements.length;
const variance = displacements.reduce((a, d) =&amp;gt; a + (d - mean)**2, 0) / displacements.length;
return Math.min(Math.sqrt(variance) / 5, 1);
}&lt;/li&gt;
&lt;li&gt;Scroll Entropy — Shannon entropy of scroll velocity distribution&lt;/li&gt;
&lt;li&gt;Keystroke Rhythm — Coefficient of variation of inter-key intervals&lt;/li&gt;
&lt;li&gt;Micro-Tremor — Power spectral density in the 3-12Hz band&lt;/li&gt;
&lt;li&gt;Cross-Channel Coherence — Pearson correlation across all channel pairs
Why Bots Can't Beat It
A bot can fake one channel. For 5 channels, an attacker must satisfy:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;10 pairwise coherence constraints&lt;br&gt;
5 marginal distributions&lt;br&gt;
All evolving naturally over time&lt;/p&gt;

&lt;p&gt;This is equivalent to real-time neuromuscular simulation.&lt;br&gt;
Try It&lt;br&gt;
bashnpm install @areyouhuman/sdk&lt;br&gt;
jsximport { AreYouHuman } from '@areyouhuman/sdk/react';&lt;/p&gt;

&lt;p&gt;
  siteKey="your_key" &lt;br&gt;
  onVerify={(token) =&amp;gt; console.log('Human!', token)} &lt;br&gt;
/&amp;gt;&lt;br&gt;
Demo: areyouhuman-io.vercel.app&lt;br&gt;
Full SDK docs: areyouhuman-io.vercel.app/sdk&lt;br&gt;
Technical whitepaper available on request.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>react</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Your app makes 47 API calls on page load. You just don't know it yet.</title>
      <dc:creator>Aswin S</dc:creator>
      <pubDate>Sat, 21 Feb 2026 10:32:53 +0000</pubDate>
      <link>https://dev.to/aswin_s_26090b9fa349f055c/your-app-makes-47-api-calls-on-page-load-you-just-dont-know-it-yet-4g4f</link>
      <guid>https://dev.to/aswin_s_26090b9fa349f055c/your-app-makes-47-api-calls-on-page-load-you-just-dont-know-it-yet-4g4f</guid>
      <description>&lt;p&gt;Open DevTools on your app. Go to Network tab. Filter by XHR. Refresh.&lt;/p&gt;

&lt;p&gt;Count the requests.&lt;/p&gt;

&lt;p&gt;Now look closer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;That &lt;code&gt;/api/user&lt;/code&gt; endpoint? Called &lt;strong&gt;4 times&lt;/strong&gt; — once by Header, once by Sidebar, once by ProfileCard, once by NotificationBell. Same data. Four round-trips.&lt;/li&gt;
&lt;li&gt;Those 25 product cards? Each one fires its own &lt;code&gt;GET /api/products/:id&lt;/code&gt;. That's &lt;strong&gt;25 requests&lt;/strong&gt; instead of 1 batch call.&lt;/li&gt;
&lt;li&gt;That status indicator? Polling every &lt;strong&gt;2 seconds&lt;/strong&gt;. The data changes once a minute. 95% of those polls are wasted.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lighthouse doesn't see any of this. It scores your HTML, your images, your CSS. Your API layer? Invisible.&lt;/p&gt;

&lt;p&gt;So I built a tool that sees it.&lt;/p&gt;

&lt;h2&gt;
  
  
  One command
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx flux-scan https://your-app.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Opens headless Chrome. Watches every API call for 30 seconds. Runs 13 rules. Gives you a score.&lt;/p&gt;

&lt;p&gt;Here's what the output looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;╔════════════════════════════════════════════════════╗
║  FluxAPI Report — Score: 38/100 (poor)            ║
╚════════════════════════════════════════════════════╝

⚡ Efficiency   ██████░░░░░░░░░░░░░░ 30%
💾 Caching      ████████████░░░░░░░░ 55%
🔄 Patterns     ██████████████░░░░░░ 70%

Issues Found:
  🔴 5 critical  🟡 5 warnings  ℹ️  3 info

Top Fixes:
  E2: GET /api/user called 4x from 4 components
     ⚡ 600ms faster  📉 3 fewer requests
  E3: N+1: 25 individual GET /products/:id
     ⚡ 2.1s faster  📉 24 fewer requests

📛 Add to your README:
  ![FluxAPI Score](https://img.shields.io/badge/FluxAPI_Score-38%2F100-red)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No config. No API key. No signup.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 13 things it catches
&lt;/h2&gt;

&lt;p&gt;I didn't invent these patterns. Every senior dev has debugged them at 2am. I just automated the detection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ones that hurt:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Request Waterfalls&lt;/strong&gt; — A → B → C → D running sequentially when they have no data dependency. On WiFi, costs 200ms. On Jio 4G? 600ms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicate Fetches&lt;/strong&gt; — Same endpoint called from multiple components because nobody made a shared hook. The most common bug I've seen in React/Vue apps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;N+1 Pattern&lt;/strong&gt; — The backend dev's nightmare, happening in the frontend. List page doing individual fetches instead of one batch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Cache Strategy&lt;/strong&gt; — Zero Cache-Control, zero staleTime. Every single component mount hits the network. Every. Single. One.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The ones that waste:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Over-fetching&lt;/strong&gt; — API returns 50 fields. Component reads 6. That's 88% wasted bytes on every request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polling Waste&lt;/strong&gt; — Polling every 2s when data changes every 60s. 95% of polls return identical data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing Compression&lt;/strong&gt; — JSON responses without gzip. On a 87KB product list, that's 52KB wasted per load.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The ones you forget:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Missing Revalidation&lt;/strong&gt; — Has ETag but never sends If-None-Match&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Over-Caching&lt;/strong&gt; — Cache TTL of 1 hour but data changes every 5 minutes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Error Recovery&lt;/strong&gt; — 500s with no retry strategy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each violation comes with &lt;strong&gt;copy-paste fix code&lt;/strong&gt; that matches your stack. Using TanStack Query? It generates &lt;code&gt;useQuery&lt;/code&gt; with the right &lt;code&gt;staleTime&lt;/code&gt;. Using SWR? &lt;code&gt;useSWR&lt;/code&gt; with &lt;code&gt;dedupingInterval&lt;/code&gt;. Not using a data library? Plain &lt;code&gt;Promise.all&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Here's what made me build this
&lt;/h2&gt;

&lt;p&gt;I work at a company in Kerala building tax software. Our app is Laravel + Vue. Users are accountants across India — many on Jio 4G, some on BSNL connections that would make your WiFi cry.&lt;/p&gt;

&lt;p&gt;One day I opened Network tab and counted. 43 API calls on the dashboard. Twelve were duplicates. Eight were sequential waterfalls. The app scored 85 on Lighthouse.&lt;/p&gt;

&lt;p&gt;Lighthouse said we were fine. Our users in Patna said the app took 8 seconds to load.&lt;/p&gt;

&lt;p&gt;That's when I realized: &lt;strong&gt;the same API patterns cost 3x more on a mobile network.&lt;/strong&gt; A waterfall that's 200ms on WiFi is 600ms on Jio 4G. An N+1 that's 1 second on broadband is 4 seconds on Airtel 3G.&lt;/p&gt;

&lt;p&gt;So FluxAPI has network-adjusted scoring:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx flux-scan https://myapp.com &lt;span class="nt"&gt;--network&lt;/span&gt; jio-4g
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same code. Same API calls. Different score. Because your Tier 2 users aren't on WiFi.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Network&lt;/th&gt;
&lt;th&gt;Score Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WiFi&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jio 4G&lt;/td&gt;
&lt;td&gt;~20% harder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Airtel 3G&lt;/td&gt;
&lt;td&gt;~40% harder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BSNL 2G&lt;/td&gt;
&lt;td&gt;~70% harder&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Live monitoring during dev
&lt;/h2&gt;

&lt;p&gt;The CLI gives you a snapshot. But what about catching issues as you write code?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @fluxiapi/vue   &lt;span class="c"&gt;# or @fluxiapi/react&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;RouterView&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;FluxDevTools&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One component. A floating badge in the corner with your live score. Click it and a panel expands showing every violation, every request, real-time. Change code, refresh, score updates.&lt;/p&gt;

&lt;p&gt;It integrates with TanStack Query, SWR, and Vue Query — so it knows your cache configuration and can suggest better values.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I want you to do right now
&lt;/h2&gt;

&lt;p&gt;Open your terminal. Run this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx flux-scan https://your-app.com &lt;span class="nt"&gt;-o&lt;/span&gt; report.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open the report. Look at the score. Look at the top issues. I bet you'll find at least one duplicate fetch you didn't know about.&lt;/p&gt;

&lt;p&gt;Then open the report and try the "Copy Badge" button. Add it to your README. Show your team what your API health looks like.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/aswinsasi/fluxapi" rel="noopener noreferrer"&gt;github.com/aswinsasi/fluxapi&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/@fluxiapi/scan" rel="noopener noreferrer"&gt;@fluxiapi/scan&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://fluxapi-phi.vercel.app" rel="noopener noreferrer"&gt;fluxapi-phi.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MIT licensed. I'd love a ⭐ if this saved you time.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's the worst API pattern you've found in your codebase? Drop it in the comments — I'm genuinely curious what patterns I should add next.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>vue</category>
    </item>
  </channel>
</rss>
