<?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: Om Yaduvanshi</title>
    <description>The latest articles on DEV Community by Om Yaduvanshi (@omyvnss).</description>
    <link>https://dev.to/omyvnss</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%2F3837725%2F67e483d8-4951-4765-8b99-e909d93aca89.jpg</url>
      <title>DEV Community: Om Yaduvanshi</title>
      <link>https://dev.to/omyvnss</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/omyvnss"/>
    <language>en</language>
    <item>
      <title>what i refused to build (and why the subtraction is the product)</title>
      <dc:creator>Om Yaduvanshi</dc:creator>
      <pubDate>Tue, 06 Oct 2026 04:12:45 +0000</pubDate>
      <link>https://dev.to/omyvnss/what-i-refused-to-build-and-why-the-subtraction-is-the-product-3ngp</link>
      <guid>https://dev.to/omyvnss/what-i-refused-to-build-and-why-the-subtraction-is-the-product-3ngp</guid>
      <description>&lt;p&gt;the easiest way to kill a small analytics tool is to add everything.&lt;/p&gt;

&lt;p&gt;someone asks for countries, you add countries. someone wants email reports, you add email reports. six months later you have a dashboard with forty tabs and a cookie banner, which is exactly what you started out hating.&lt;/p&gt;

&lt;p&gt;i'm om yaduvanshi, 18, an applied ai developer. &lt;strong&gt;cloudline&lt;/strong&gt; is my cookieless &lt;strong&gt;google analytics alternative&lt;/strong&gt;, and this is day 11 of 90 building in public. the series so far was about what i track without cookies. today it's about what i refused to build.&lt;/p&gt;

&lt;h2&gt;
  
  
  the refusals that made the product
&lt;/h2&gt;

&lt;p&gt;cookies first. the whole premise. &lt;strong&gt;cloudline&lt;/strong&gt; sets none, stores no ips, and keeps nothing on your visitors' devices.&lt;/p&gt;

&lt;p&gt;then user agents. every browser sends a string naming your os and device, and analytics tools read it for free device stats. it's also a fingerprint ingredient, so i banned it. the dashboard works out mobile, tablet, and desktop from screen width instead. i wrote about that yesterday.&lt;/p&gt;

&lt;h2&gt;
  
  
  the refusals still on the list
&lt;/h2&gt;

&lt;p&gt;revenue attribution is coming soon. it sits on the homepage with a "coming soon" tag and on the roadmap page with the honest note that those numbers don't exist yet. i could ship a version that guesses revenue from pageviews. people ask for it. a guessed revenue number is worse than no revenue number, because someone will make a pricing decision on it.&lt;/p&gt;

&lt;p&gt;countries, operating systems, browsers: also on the roadmap. the dashboard groups traffic today without knowing where anyone lives or what they run, because knowing that was never required for the question it answers. when those arrive, they arrive without changing the four things a pageview stores: page, referrer, screen size, time.&lt;/p&gt;

&lt;p&gt;core web vitals and weekly email reports are on the same list. all useful, and all still sitting on it, because each one is a promise about data collection that i want to make once and keep.&lt;/p&gt;

&lt;h2&gt;
  
  
  why no is the product
&lt;/h2&gt;

&lt;p&gt;here's the mechanism people miss. every feature you refuse is consent logic your users never need. a tool that stores four things needs no cookie banner. a tool that stores forty things needs a legal department.&lt;/p&gt;

&lt;p&gt;the product isn't the dashboard. the dashboard is what the refusals leave behind.&lt;/p&gt;

&lt;h2&gt;
  
  
  the honest limit
&lt;/h2&gt;

&lt;p&gt;saying no is easy to write about and hard to keep doing. users will ask for all of this, reasonably, and every one of them is a real need. the line i'm drawing: nothing ships until i can collect it without asking the visitor to agree to being collected.&lt;/p&gt;

&lt;p&gt;if that ever stops being true, the whole premise breaks. so it stays the rule.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0a6fcd9x6yf588id33ip.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0a6fcd9x6yf588id33ip.webp" alt="Cloudline dashboard overview" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  one line, under a minute
&lt;/h2&gt;

&lt;p&gt;if you haven't installed yet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://trycloudline.space/tracker.js"&lt;/span&gt; &lt;span class="na"&gt;data-site-id=&lt;/span&gt;&lt;span class="s"&gt;"YOUR-SITE-ID"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1l0bx4wu9tsdfuxo6lnk.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1l0bx4wu9tsdfuxo6lnk.webp" alt="Cloudline visitors-over-time chart" width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;takes under a minute. removing it is deleting the line.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;cloudline&lt;/strong&gt; is &lt;strong&gt;free for early users&lt;/strong&gt; while i keep building it. cookieless analytics in one line of code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://trycloudline.space" rel="noopener noreferrer"&gt;https://trycloudline.space&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— om yaduvanshi&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>privacy</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>how i detect mobile vs desktop without cookies or user agents</title>
      <dc:creator>Om Yaduvanshi</dc:creator>
      <pubDate>Mon, 05 Oct 2026 04:11:18 +0000</pubDate>
      <link>https://dev.to/omyvnss/how-i-detect-mobile-vs-desktop-without-cookies-or-user-agents-58bn</link>
      <guid>https://dev.to/omyvnss/how-i-detect-mobile-vs-desktop-without-cookies-or-user-agents-58bn</guid>
      <description>&lt;p&gt;most analytics tools know your visitors' phones better than you do.&lt;/p&gt;

&lt;p&gt;their model numbers. their os versions. their browser builds. all from a string the browser sends on every request.&lt;/p&gt;

&lt;p&gt;i didn't want that string. so cloudline doesn't store it.&lt;/p&gt;

&lt;p&gt;i'm om yaduvanshi, 18, an applied ai developer building &lt;strong&gt;cloudline&lt;/strong&gt;, a cookieless &lt;strong&gt;google analytics alternative&lt;/strong&gt;. one script tag, under &lt;strong&gt;2 KB&lt;/strong&gt;, no cookies, no stored ips. this is day 10 of my 90-day build in public, and part of my series on tracking the web without tracking people. so far: referrers, scroll depth, funnels, button clicks, engaged time, live visitors, traffic sources.&lt;/p&gt;

&lt;h2&gt;
  
  
  what the user agent gives you for free
&lt;/h2&gt;

&lt;p&gt;every request your browser makes carries a user-agent string. it names the browser, the os, sometimes the exact device. every analytics tool that reads it gets device breakdowns for zero effort.&lt;/p&gt;

&lt;p&gt;the catch is that it's a fingerprint ingredient. combine it with a few other signals and you can single out one visitor out of thousands. that's exactly the machinery cookieless analytics is trying to avoid. so i banned it. cloudline stores no user-agent strings. not even a trimmed version.&lt;/p&gt;

&lt;h2&gt;
  
  
  what i kept instead
&lt;/h2&gt;

&lt;p&gt;a pageview in cloudline stores four things: page, referrer, screen size, time. screen size is the one that does double duty here.&lt;/p&gt;

&lt;p&gt;the dashboard turns screen width into a device bucket. narrow width reads as mobile, medium as tablet, wide as desktop. the cutoffs are boring on purpose. they match what most responsive sites already use as breakpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  what you lose
&lt;/h2&gt;

&lt;p&gt;honesty first: this is approximate. a phone in landscape can read as a tablet. a tiny laptop can read as one too. a desktop with a half-width browser window looks like a phone.&lt;/p&gt;

&lt;p&gt;here's what i tell myself about it: the question "mobile or desktop" is almost never about the exact device. it's about how your site looks. a phone in landscape still shows your site in a narrow window, which is what you were designing for anyway.&lt;/p&gt;

&lt;p&gt;so the bucket answers the useful question even when it misses the literal one.&lt;/p&gt;

&lt;h2&gt;
  
  
  the honest limit
&lt;/h2&gt;

&lt;p&gt;if you need to know that 34% of visitors are on iphone 15s running ios 18, this isn't your tool. and if that's a real requirement, i'd genuinely ask what decision changes on that answer. most of the time the answer is "redesign the mobile checkout" and the bucket already told you that.&lt;/p&gt;

&lt;p&gt;there's a pattern across this whole series. every time i remove a signal, the remaining ones have to earn their place. screen size earns it. it was already in the pageview for layout purposes, and it carries the device question for free.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0a6fcd9x6yf588id33ip.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0a6fcd9x6yf588id33ip.webp" alt="Cloudline dashboard overview" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  one line, under a minute
&lt;/h2&gt;

&lt;p&gt;if you haven't installed yet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://trycloudline.space/tracker.js"&lt;/span&gt; &lt;span class="na"&gt;data-site-id=&lt;/span&gt;&lt;span class="s"&gt;"YOUR-SITE-ID"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1l0bx4wu9tsdfuxo6lnk.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1l0bx4wu9tsdfuxo6lnk.webp" alt="Cloudline visitors-over-time chart" width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;takes under a minute. removing it is deleting the line.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;cloudline&lt;/strong&gt; is &lt;strong&gt;free for early users&lt;/strong&gt; while i keep building it. cookieless analytics in one line of code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://trycloudline.space" rel="noopener noreferrer"&gt;https://trycloudline.space&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— om yaduvanshi&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>privacy</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>how i group traffic sources without cookies</title>
      <dc:creator>Om Yaduvanshi</dc:creator>
      <pubDate>Sun, 04 Oct 2026 04:11:43 +0000</pubDate>
      <link>https://dev.to/omyvnss/how-i-group-traffic-sources-without-cookies-dmb</link>
      <guid>https://dev.to/omyvnss/how-i-group-traffic-sources-without-cookies-dmb</guid>
      <description>&lt;p&gt;every dashboard has a "top traffic sources" chart. almost none of them will tell you how it got made.&lt;/p&gt;

&lt;p&gt;i'm om yaduvanshi. i'm 18, an applied ai developer building &lt;strong&gt;cloudline&lt;/strong&gt;, a cookieless &lt;strong&gt;google analytics alternative&lt;/strong&gt;. one script tag, under &lt;strong&gt;2 KB&lt;/strong&gt;, no cookies, no stored ips. day 9 of my 90-day build in public, and part of my series on tracking the web without tracking people. so far: referrers, scroll depth, funnels, button clicks, engaged time, live visitors.&lt;/p&gt;

&lt;h2&gt;
  
  
  a referrer is a url, not an answer
&lt;/h2&gt;

&lt;p&gt;a pageview in cloudline stores four things: page, referrer, screen size, time. the referrer is the interesting one for this piece. it's a raw string. &lt;code&gt;https://www.google.com/search?q=cookieless+analytics&lt;/code&gt;. &lt;code&gt;https://t.co/abc123&lt;/code&gt;. or nothing at all, when someone typed the url directly or the browser stripped it.&lt;/p&gt;

&lt;p&gt;a raw string is not a traffic source. so the dashboard groups them.&lt;/p&gt;

&lt;h2&gt;
  
  
  the four buckets
&lt;/h2&gt;

&lt;p&gt;cloudline sorts referrers into four buckets: search, social, newsletters, ai assistants. everything else is websites. no referrer at all reads as direct.&lt;/p&gt;

&lt;p&gt;a google search lands in search. a link from x or reddit lands in social. a substack link lands in newsletters. a chatgpt or claude referrer lands in ai assistants, in its own bucket instead of hiding inside websites.&lt;/p&gt;

&lt;p&gt;that last bucket is the one i'd have laughed at three years ago. people find websites through chatbots now. it's a traffic source worth naming.&lt;/p&gt;

&lt;h2&gt;
  
  
  the honest limit
&lt;/h2&gt;

&lt;p&gt;referrers lie. day 2 of this series was about exactly that. in-app browsers strip them. some apps never send them. a chunk of real traffic will always read as direct when it isn't.&lt;/p&gt;

&lt;p&gt;the only way to fix the gaps is identity tracking: stitching visits together across sessions. that's the thing i refuse to store. no cookies, no ip storage, no fingerprints. so the buckets stay approximate, and the dashboard doesn't pretend otherwise.&lt;/p&gt;

&lt;p&gt;if you need exact attribution per visitor, this isn't your tool. if you want to know roughly where your readers come from without a consent banner, four buckets get you there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0a6fcd9x6yf588id33ip.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0a6fcd9x6yf588id33ip.webp" alt="Cloudline dashboard overview" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  one line, under a minute
&lt;/h2&gt;

&lt;p&gt;if you haven't installed yet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://trycloudline.space/tracker.js"&lt;/span&gt; &lt;span class="na"&gt;data-site-id=&lt;/span&gt;&lt;span class="s"&gt;"YOUR-SITE-ID"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1l0bx4wu9tsdfuxo6lnk.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1l0bx4wu9tsdfuxo6lnk.webp" alt="Cloudline visitors-over-time chart" width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;takes under a minute. removing it is deleting the line.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;cloudline&lt;/strong&gt; is &lt;strong&gt;free for early users&lt;/strong&gt; while i keep building it. cookieless analytics in one line of code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://trycloudline.space" rel="noopener noreferrer"&gt;https://trycloudline.space&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— om yaduvanshi&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>privacy</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>how i count live visitors without cookies</title>
      <dc:creator>Om Yaduvanshi</dc:creator>
      <pubDate>Sat, 03 Oct 2026 04:10:33 +0000</pubDate>
      <link>https://dev.to/omyvnss/how-i-count-live-visitors-without-cookies-4fjn</link>
      <guid>https://dev.to/omyvnss/how-i-count-live-visitors-without-cookies-4fjn</guid>
      <description>&lt;p&gt;someone is on your site right now. your analytics can't tell you that without a consent banner.&lt;/p&gt;

&lt;p&gt;i'm om yaduvanshi. i'm 18, an applied ai developer building &lt;strong&gt;cloudline&lt;/strong&gt;, a cookieless &lt;strong&gt;google analytics alternative&lt;/strong&gt;. one script tag, under &lt;strong&gt;2 KB&lt;/strong&gt;, no cookies, no stored ips. this continues my series on tracking the web without tracking people. so far i've covered referrers, scroll depth, funnels, button clicks, and engaged time.&lt;/p&gt;

&lt;h2&gt;
  
  
  live visitors usually means sessions
&lt;/h2&gt;

&lt;p&gt;most analytics tools show "real-time" visitors. what they really show is open sessions. a session is a bundle of pageviews stitched together with a cookie or a fingerprint. the tool watches its bundles and counts the ones that moved recently.&lt;/p&gt;

&lt;p&gt;that's fine when it works. it needs an identity layer underneath. every "user online now" number is paid for with stored identifiers.&lt;/p&gt;

&lt;h2&gt;
  
  
  what cloudline counts instead
&lt;/h2&gt;

&lt;p&gt;cloudline's live view is dumber, and i mean that as a compliment.&lt;/p&gt;

&lt;p&gt;the dashboard has a section called "visitors, live." it shows today's visits arriving in real time. a visit is a pageview that happened. nothing gets stitched to anything else, because there's nothing to stitch with. the pageview stores the page, the referrer, the screen size, and the time. no cookies, no ip storage, nothing on the visitor's device.&lt;/p&gt;

&lt;p&gt;so the number on screen is a count of active visits, not of identified people. someone opened your post. it's counted. they closed the tab. it stops being counted. nobody was identified at any point.&lt;/p&gt;

&lt;h2&gt;
  
  
  why launch days made me build it
&lt;/h2&gt;

&lt;p&gt;i built this for the moments when the number actually matters. a post hits the front page of some feed and you want to watch the wave arrive. total visits tomorrow morning tells you it happened. live visits tells you it's happening.&lt;/p&gt;

&lt;p&gt;the cookieless version does this job fine, because the job was never "know exactly who is here." the job was "is anyone here right now."&lt;/p&gt;

&lt;h2&gt;
  
  
  the honest limit
&lt;/h2&gt;

&lt;p&gt;aggregation has a cost, and i keep saying this because it keeps being true. cloudline can't tell you that the live visitor on your pricing page is the same person who read your docs this morning. there are no profiles, no "this visitor also viewed" trails. the dashboard counts visits and doesn't pretend to connect them.&lt;/p&gt;

&lt;p&gt;if you want to know who your visitors are, this tool is not for you. if you want to know what your pages are doing, it's enough.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faizf7f223331s02q0ifa.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faizf7f223331s02q0ifa.webp" alt="Cloudline dashboard overview" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  one line, under a minute
&lt;/h2&gt;

&lt;p&gt;if you haven't installed yet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://trycloudline.space/tracker.js"&lt;/span&gt; &lt;span class="na"&gt;data-site-id=&lt;/span&gt;&lt;span class="s"&gt;"YOUR-SITE-ID"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnsmi7h8v7bgip38lvw24.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnsmi7h8v7bgip38lvw24.webp" alt="Cloudline visitors-over-time chart" width="800" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;takes under a minute. removing it is deleting the line.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;cloudline&lt;/strong&gt; is &lt;strong&gt;free for early users&lt;/strong&gt; while i keep building it. cookieless analytics in one line of code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://trycloudline.space" rel="noopener noreferrer"&gt;https://trycloudline.space&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— om yaduvanshi&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>privacy</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>how i measure engaged time without cookies</title>
      <dc:creator>Om Yaduvanshi</dc:creator>
      <pubDate>Fri, 02 Oct 2026 04:10:22 +0000</pubDate>
      <link>https://dev.to/omyvnss/how-i-measure-engaged-time-without-cookies-24i5</link>
      <guid>https://dev.to/omyvnss/how-i-measure-engaged-time-without-cookies-24i5</guid>
      <description>&lt;p&gt;your dashboard says visitors spend four minutes on your pricing page. the tab was open in the background the whole time.&lt;/p&gt;

&lt;p&gt;i'm om yaduvanshi. i'm 18, an applied ai developer building &lt;strong&gt;cloudline&lt;/strong&gt;, a cookieless &lt;strong&gt;google analytics alternative&lt;/strong&gt;. one script tag, under &lt;strong&gt;2 KB&lt;/strong&gt;, no cookies, no stored ips. this continues my series on tracking the web without tracking people. so far i've covered referrers, scroll depth, funnels, and button clicks.&lt;/p&gt;

&lt;h2&gt;
  
  
  time on page is a number that lies
&lt;/h2&gt;

&lt;p&gt;most analytics tools compute time on page by subtracting the first event timestamp from the last. one pageview and no second event, and they guess. a tab left open while you made lunch counts as a deeply engaged reader.&lt;/p&gt;

&lt;p&gt;it gets worse. that number pretends to describe a person. cookie tools stitch your pageviews into a session, then average. the average is of people who may not exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  what engaged time actually measures
&lt;/h2&gt;

&lt;p&gt;cloudline measures something smaller and more honest. how long a page holds attention while it is visible.&lt;/p&gt;

&lt;p&gt;that phrasing is deliberate. the script counts the page only while it is being looked at. not who is looking. when the tab is hidden or the window is minimized, the clock stops. when you come back, it resumes. nothing about the visitor gets stored to make that work.&lt;/p&gt;

&lt;p&gt;the dashboard pairs engaged time with scroll depth, because time alone still lies. a page with two minutes of engaged time and 100% scroll depth got read. two minutes and 25% scroll depth is a page someone left open while they did something else.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs9ioiq19um7gthd8lynn.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs9ioiq19um7gthd8lynn.webp" alt="Cloudline scroll depth and engaged time view" width="799" height="620"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  attention doesn't need an identity
&lt;/h2&gt;

&lt;p&gt;this is the part that surprised me when i built it. measuring attention does not require identifying anyone.&lt;/p&gt;

&lt;p&gt;in cookie tools, time on page is a property of a session. it belongs to a person. in cloudline, engaged time is a property of the page. the page held attention for this long, across all the visits. nobody's visits get connected to each other.&lt;/p&gt;

&lt;p&gt;that's the whole privacy story, really. you can know how your content performs without knowing who performed it.&lt;/p&gt;

&lt;h2&gt;
  
  
  the honest limit
&lt;/h2&gt;

&lt;p&gt;aggregation has a cost. cloudline can't tell you that the visitor who spent four minutes on pricing also read the docs. 40 visits of three minutes each might be one loyal reader or 40 drive-bys. the dashboard counts visits and engaged time separately and doesn't pretend to connect them.&lt;/p&gt;

&lt;p&gt;for the question most site owners actually ask, which pages hold attention and which don't, the aggregate is enough. a page with attention and no clicks has a call-to-action problem. i wrote about that part yesterday: &lt;a href="https://dev.to/omyvnss/how-i-track-button-clicks-without-cookies-33ko"&gt;https://dev.to/omyvnss/how-i-track-button-clicks-without-cookies-33ko&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc2369os16aas5afo878w.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc2369os16aas5afo878w.webp" alt="Cloudline one-line install" width="799" height="620"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;if you haven't installed yet, it's one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://trycloudline.space/tracker.js"&lt;/span&gt; &lt;span class="na"&gt;data-site-id=&lt;/span&gt;&lt;span class="s"&gt;"YOUR-SITE-ID"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;takes under a minute. removing it is deleting the line.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;cloudline&lt;/strong&gt; is &lt;strong&gt;free for early users&lt;/strong&gt; while i keep building it. cookieless analytics in one line of code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://trycloudline.space" rel="noopener noreferrer"&gt;https://trycloudline.space&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— om yaduvanshi&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>privacy</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>how i track button clicks without cookies</title>
      <dc:creator>Om Yaduvanshi</dc:creator>
      <pubDate>Thu, 01 Oct 2026 04:12:29 +0000</pubDate>
      <link>https://dev.to/omyvnss/how-i-track-button-clicks-without-cookies-33ko</link>
      <guid>https://dev.to/omyvnss/how-i-track-button-clicks-without-cookies-33ko</guid>
      <description>&lt;p&gt;pageviews tell you someone saw your pricing page. they don't tell you if anyone clicked the button.&lt;/p&gt;

&lt;p&gt;i'm om yaduvanshi. i'm 18, an applied ai developer building &lt;strong&gt;cloudline&lt;/strong&gt;, a cookieless &lt;strong&gt;google analytics alternative&lt;/strong&gt;. one script tag, under &lt;strong&gt;2 KB&lt;/strong&gt;, no cookies, no stored ips. this continues my series on tracking the web without tracking people. so far i've done referrers, scroll depth, and funnels.&lt;/p&gt;

&lt;h2&gt;
  
  
  the gap between seeing and clicking
&lt;/h2&gt;

&lt;p&gt;a pageview is a weak signal. it says a browser loaded a page. it says nothing about intent.&lt;/p&gt;

&lt;p&gt;the button is where intent lives. someone pressing "get early access" is a different event from someone loading the page that holds it. most analytics tools record both and tie them to a person. cloudline can't tie anything to anyone, so clicks had to work another way.&lt;/p&gt;

&lt;h2&gt;
  
  
  mark the button, store the label
&lt;/h2&gt;

&lt;p&gt;tracking a button in cloudline takes one attribute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;data-cloudline-track=&lt;/span&gt;&lt;span class="s"&gt;"get-early-access"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;get early access&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;that's it. when the button is clicked, cloudline records the label and nothing else. not the cursor position, not a session id. the label is the whole record.&lt;/p&gt;

&lt;p&gt;for clicks fired from javascript, there's a tiny api:&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="nx"&gt;Cloudline&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;track&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;get-early-access&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;same deal. the label goes in, nothing about the visitor comes with it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm82noa4v5hx77nt3mv92.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm82noa4v5hx77nt3mv92.webp" alt="Cloudline button click tracking, clicks grouped by label" width="800" height="628"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  why i don't capture every click automatically
&lt;/h2&gt;

&lt;p&gt;most tools listen to every click on the page and sort it out later. i went the other way on purpose.&lt;/p&gt;

&lt;p&gt;auto-capture means deciding later what's personal and what isn't. explicit labels move that decision to the button, made once by the person who built the page. you pick what to measure. the tool can't surprise you with data you never asked for.&lt;/p&gt;

&lt;p&gt;it also keeps the script small. auto-capture needs more listeners and more code to maintain. one attribute needs a single event listener.&lt;/p&gt;

&lt;h2&gt;
  
  
  where the clicks show up
&lt;/h2&gt;

&lt;p&gt;clicks land in the dashboard grouped by label, per page. which buttons get pressed on which pages, that's the view. they also slot into funnels: a pageview, then a button click, then another pageview. i wrote about that part here: &lt;a href="https://dev.to/omyvnss/how-i-track-funnels-without-cookies-5fd1"&gt;https://dev.to/omyvnss/how-i-track-funnels-without-cookies-5fd1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ciy3lrd69huhlfhsfyh.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ciy3lrd69huhlfhsfyh.webp" alt="Cloudline one-line install" width="800" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;if you haven't installed yet, it's one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://trycloudline.space/tracker.js"&lt;/span&gt; &lt;span class="na"&gt;data-site-id=&lt;/span&gt;&lt;span class="s"&gt;"YOUR-SITE-ID"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;takes under a minute. removing it is deleting the line.&lt;/p&gt;

&lt;h2&gt;
  
  
  the honest limit
&lt;/h2&gt;

&lt;p&gt;a click with no identity can't tell you whether the person who clicked did anything else. 40 clicks on "get early access" and 12 signups might be the same people. might not be. cloudline counts the clicks and the signups separately and doesn't pretend to connect them.&lt;/p&gt;

&lt;p&gt;the separate counts are usually enough. a button with views and no clicks has a button problem, and the numbers say that much on their own.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;cloudline&lt;/strong&gt; is &lt;strong&gt;free for early users&lt;/strong&gt; while i keep building it. cookieless analytics in one line of code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://trycloudline.space" rel="noopener noreferrer"&gt;https://trycloudline.space&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— om yaduvanshi&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>privacy</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>how much traffic do cookie banners cost you</title>
      <dc:creator>Om Yaduvanshi</dc:creator>
      <pubDate>Wed, 30 Sep 2026 04:11:09 +0000</pubDate>
      <link>https://dev.to/omyvnss/how-much-traffic-do-cookie-banners-cost-you-2710</link>
      <guid>https://dev.to/omyvnss/how-much-traffic-do-cookie-banners-cost-you-2710</guid>
      <description>&lt;p&gt;i'm om yaduvanshi. i'm 18, an applied ai developer, and i build &lt;strong&gt;cloudline&lt;/strong&gt;, a &lt;strong&gt;google analytics alternative&lt;/strong&gt; without cookies. one script tag, under &lt;strong&gt;2 KB&lt;/strong&gt;, no banner needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  the visitors you never see
&lt;/h2&gt;

&lt;p&gt;cookie-based analytics usually need a consent banner. every visitor who clicks decline goes missing from your numbers. not tracked badly. gone.&lt;/p&gt;

&lt;p&gt;here's the uncomfortable part. you know the banner costs you visitors. you just don't know how many.&lt;/p&gt;

&lt;h2&gt;
  
  
  do the math on your own site
&lt;/h2&gt;

&lt;p&gt;if your consent tool reports a decline rate, run this. say 10,000 people hit your site last month and 35% declined. that's 3,500 visits your analytics threw away. you made decisions around 6,500 people who don't represent your traffic.&lt;/p&gt;

&lt;p&gt;the numbers are made up. yours aren't. that's the point. open your consent dashboard and look.&lt;/p&gt;

&lt;h2&gt;
  
  
  the banner is optional
&lt;/h2&gt;

&lt;p&gt;a pageview in cloudline stores four things: page, referrer, screen size, time. nothing else. no cookies, no stored ips, nothing on the visitor's device. so there's no banner, and no decline-rate hole.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ciy3lrd69huhlfhsfyh.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ciy3lrd69huhlfhsfyh.webp" alt="Cloudline one-line install" width="800" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;the point is simpler than privacy. it's counting everyone who showed up.&lt;/p&gt;

&lt;h2&gt;
  
  
  the honest part
&lt;/h2&gt;

&lt;p&gt;dropping the banner doesn't fix everything. bots still visit. some traffic is junk no matter what tool you use. and without cookies you can't stitch one person's journey across visits. i wrote about that tradeoff when i built funnels: &lt;a href="https://dev.to/omyvnss/how-i-track-funnels-without-cookies-5fd1"&gt;https://dev.to/omyvnss/how-i-track-funnels-without-cookies-5fd1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;but the decline hole is the biggest and dumbest one. visitors choosing to disappear, because of a banner you never wanted in the first place.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1l0bx4wu9tsdfuxo6lnk.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1l0bx4wu9tsdfuxo6lnk.webp" alt="Cloudline live visitor counts" width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;the live demo shows today's visits in real time, everyone counted: &lt;a href="https://trycloudline.space" rel="noopener noreferrer"&gt;https://trycloudline.space&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;cloudline&lt;/strong&gt; is &lt;strong&gt;free for early users&lt;/strong&gt; while i keep building it. cookieless analytics in one line of code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://trycloudline.space" rel="noopener noreferrer"&gt;https://trycloudline.space&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— om yaduvanshi&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>privacy</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>how i track funnels without cookies</title>
      <dc:creator>Om Yaduvanshi</dc:creator>
      <pubDate>Tue, 29 Sep 2026 04:11:20 +0000</pubDate>
      <link>https://dev.to/omyvnss/how-i-track-funnels-without-cookies-5fd1</link>
      <guid>https://dev.to/omyvnss/how-i-track-funnels-without-cookies-5fd1</guid>
      <description>&lt;p&gt;i'm om yaduvanshi. i'm 18, an applied ai developer building &lt;strong&gt;cloudline&lt;/strong&gt;, a cookieless &lt;strong&gt;google analytics alternative&lt;/strong&gt;. one script tag, under &lt;strong&gt;2 KB&lt;/strong&gt;, no cookies, no stored ips.&lt;/p&gt;

&lt;p&gt;funnels are the one analytics feature that seems to need identity. a funnel says: 100 people saw the pricing page, 40 clicked start free, 12 signed up. to connect those steps you usually follow one person through the whole journey.&lt;/p&gt;

&lt;p&gt;here's the problem. cloudline can't follow anyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  a funnel with no person in it
&lt;/h2&gt;

&lt;p&gt;strip identity out and a funnel stops describing individual visitors. it just describes the counts.&lt;/p&gt;

&lt;p&gt;cloudline counts pageviews and button clicks per page. a pageview stores four things: page, referrer, screen size, time. that's it. no cookies, no stored ips.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1l0bx4wu9tsdfuxo6lnk.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1l0bx4wu9tsdfuxo6lnk.webp" alt="Cloudline visitors-over-time chart" width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;a funnel is those counts stacked in the order you care about. pricing page got 100 views. the start free button got 40 clicks. the signup page got 12 views. the drop between steps is the same drop. it was never attached to a name.&lt;/p&gt;

&lt;h2&gt;
  
  
  why the steps have to be explicit
&lt;/h2&gt;

&lt;p&gt;without identity, the funnel can't guess your steps. a cookie-based tool watches a person move from page to page and draws the path for you. cloudline can't do that, so you pick the steps: this pageview, then this button click, then that pageview.&lt;/p&gt;

&lt;p&gt;i decided that was fine. the automatic version mostly invents paths you never designed anyway.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm82noa4v5hx77nt3mv92.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm82noa4v5hx77nt3mv92.webp" alt="Cloudline button click tracking, clicks grouped by label" width="800" height="628"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;button clicks fill in the middle of the funnel. add data-cloudline-track to the button and only the label is stored. clicks on "start free" sit between the pricing pageview and the signup pageview, which pageviews alone would never show.&lt;/p&gt;

&lt;h2&gt;
  
  
  where it lies to you
&lt;/h2&gt;

&lt;p&gt;a funnel with no identity has one honest caveat. it assumes the 40 people who clicked are inside the 100 who viewed. they probably are. sometimes they aren't. a visitor can click start free, leave, and come back tomorrow. cloudline counts that as one click and two visits. no way around it.&lt;/p&gt;

&lt;p&gt;i show the counts anyway because the direction of the drop matters more than the exact math. if 100 become 40 become 12, the shape of the problem is obvious. you don't need a person-level trail to know the pricing page leaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  how i actually use it
&lt;/h2&gt;

&lt;p&gt;i look at one funnel per important path. not ten. one.&lt;/p&gt;

&lt;p&gt;if the drop is between step one and two, the page doesn't sell the click. if it's between two and three, the button works and the next page doesn't. the funnel points at the problem. it doesn't diagnose it.&lt;/p&gt;

&lt;p&gt;live visitors help here. when i change a page i watch today's visits in real time and see whether the counts start moving. same anonymous counts, just faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  the honest tradeoff
&lt;/h2&gt;

&lt;p&gt;you lose the per-visitor journey. no "user 482 bounced at step 2". what you get is the shape of the funnel with zero tracking baggage: no cookies, no stored ips.&lt;/p&gt;

&lt;p&gt;for an indie tool, that trade was easy. i'd rather explain one honest caveat than maintain an identity graph.&lt;/p&gt;

&lt;p&gt;i wrote about the other cookieless stitching problem last time: &lt;a href="https://dev.to/omyvnss/how-i-track-scroll-depth-without-cookies-jb9"&gt;https://dev.to/omyvnss/how-i-track-scroll-depth-without-cookies-jb9&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;cloudline&lt;/strong&gt; is &lt;strong&gt;free for early users&lt;/strong&gt; while i keep building it. cookieless analytics in one line of code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://trycloudline.space" rel="noopener noreferrer"&gt;https://trycloudline.space&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— om yaduvanshi&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>privacy</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>how i track scroll depth without cookies</title>
      <dc:creator>Om Yaduvanshi</dc:creator>
      <pubDate>Mon, 28 Sep 2026 04:13:08 +0000</pubDate>
      <link>https://dev.to/omyvnss/how-i-track-scroll-depth-without-cookies-jb9</link>
      <guid>https://dev.to/omyvnss/how-i-track-scroll-depth-without-cookies-jb9</guid>
      <description>&lt;p&gt;i'm om yaduvanshi. i'm 18, an applied ai developer building &lt;strong&gt;cloudline&lt;/strong&gt;, a cookieless &lt;strong&gt;google analytics alternative&lt;/strong&gt;. one script tag, under &lt;strong&gt;2 KB&lt;/strong&gt;, no cookies, no stored ips.&lt;/p&gt;

&lt;p&gt;to report "this visitor scrolled 75% of the page", you have to know it's the same visitor across scroll events. the usual answer is a cookie. here's how i got around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  why scroll depth is a stitching problem
&lt;/h2&gt;

&lt;p&gt;scroll events are cheap. the browser fires them for free. the hard part is connecting a dozen scroll events to one visit. most tools do that with a session id in a cookie.&lt;/p&gt;

&lt;p&gt;take the cookie away and the events don't connect. that's the whole problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  what the number actually is
&lt;/h2&gt;

&lt;p&gt;forget the visitor for a second. scroll depth is simpler than it sounds: for each pageview, what's the deepest point reached? cloudline reports it in four buckets: 25, 50, 75, 100%.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm2js4q7xzrrqpd2khlku.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm2js4q7xzrrqpd2khlku.webp" alt="Cloudline scroll depth card showing the 25/50/75/100% buckets" width="800" height="632"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;scroll depth is a property of the pageview. it says nothing about the reader. a speed-scroller and a careful reader both show 100%. the number tells you where attention drops, not how deep it goes.&lt;/p&gt;

&lt;h2&gt;
  
  
  the cookieless version
&lt;/h2&gt;

&lt;p&gt;if every pageview is already anonymous, there's nothing to stitch.&lt;/p&gt;

&lt;p&gt;cloudline's script logs a pageview with four things: page, referrer, screen size, time. the deepest scroll mark rides along with that same pageview. the browser already knows how far it scrolled, so only the bucket number leaves the page. no cookie to read and nothing to fingerprint.&lt;/p&gt;

&lt;p&gt;nothing about the visitor is stored, because nothing about the visitor is needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  how i read the numbers
&lt;/h2&gt;

&lt;p&gt;the buckets only mean something against the page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1l0bx4wu9tsdfuxo6lnk.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1l0bx4wu9tsdfuxo6lnk.webp" alt="Cloudline visitors-over-time chart" width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;a cliff between 50 and 75% on a long post means the middle drags. 100% on a pricing page with no clicks means people saw the price and left. low numbers on a short page mean nothing, the page just ends.&lt;/p&gt;

&lt;p&gt;i check one thing per page: where's the biggest drop between buckets. that's the paragraph to rewrite.&lt;/p&gt;

&lt;h2&gt;
  
  
  the honest limits
&lt;/h2&gt;

&lt;p&gt;scroll depth can't tell reading from skimming, and it can't tell you why someone stopped. on short pages the buckets are noise.&lt;/p&gt;

&lt;p&gt;it's one number per pageview. treat it like that and it's useful.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;cloudline&lt;/strong&gt; is &lt;strong&gt;free for early users&lt;/strong&gt; while i keep building it. cookieless analytics in one line of code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://trycloudline.space" rel="noopener noreferrer"&gt;https://trycloudline.space&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— om yaduvanshi&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>privacy</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>what i learned about referrers building a cookieless analytics tool</title>
      <dc:creator>Om Yaduvanshi</dc:creator>
      <pubDate>Sat, 26 Sep 2026 21:47:45 +0000</pubDate>
      <link>https://dev.to/omyvnss/what-i-learned-about-referrers-building-a-cookieless-analytics-tool-51fi</link>
      <guid>https://dev.to/omyvnss/what-i-learned-about-referrers-building-a-cookieless-analytics-tool-51fi</guid>
      <description>&lt;p&gt;i'm om yaduvanshi. i'm 18, an applied ai developer, and i built cloudline, a cookieless google analytics alternative. one script tag, under 2 KB, no cookies, no stored ips.&lt;/p&gt;

&lt;h2&gt;
  
  
  what a pageview stores
&lt;/h2&gt;

&lt;p&gt;four things: page, referrer, screen size, time. that's it. device type comes from screen width. no fingerprinting.&lt;/p&gt;

&lt;h2&gt;
  
  
  what i got wrong
&lt;/h2&gt;

&lt;p&gt;i treated referrer as solid data. yesterday someone corrected me. referrer is best-effort. browsers strip or reduce it based on referrer-policy. https to http drops it completely.&lt;/p&gt;

&lt;p&gt;he was right, and it changed how i think about the data. three fields are measured by my own script, so i trust them. referrer is a hint. when it shows up, it's the only free read on where a visit came from.&lt;/p&gt;

&lt;h2&gt;
  
  
  why this matters
&lt;/h2&gt;

&lt;p&gt;if you're building analytics, know which fields you measure and which ones you receive. measured fields you can trust. received fields get an asterisk.&lt;/p&gt;

&lt;p&gt;cloudline is free for early users while i keep building it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://trycloudline.space" rel="noopener noreferrer"&gt;https://trycloudline.space&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— om yaduvanshi&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>privacy</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>i built a cookieless analytics tool (and deleted my cookie banner)</title>
      <dc:creator>Om Yaduvanshi</dc:creator>
      <pubDate>Fri, 25 Sep 2026 23:19:55 +0000</pubDate>
      <link>https://dev.to/omyvnss/i-built-a-cookieless-analytics-tool-and-deleted-my-cookie-banner-13ih</link>
      <guid>https://dev.to/omyvnss/i-built-a-cookieless-analytics-tool-and-deleted-my-cookie-banner-13ih</guid>
      <description>&lt;p&gt;i'm om yaduvanshi, 18. i build ai agents, and my second project is cloudline — website analytics without cookies.&lt;/p&gt;

&lt;p&gt;the problem: i put GA4 on a side project, added the cookie banner the lawyers want, and watched a chunk of my visitors click “decline” and disappear from my stats forever. you're not measuring traffic. you're measuring consent.&lt;/p&gt;

&lt;p&gt;so i built the alternative: one script tag under 2kb, pasted from your dashboard. no cookies, no ip storage, no banner needed for the analytics itself.&lt;/p&gt;

&lt;p&gt;a pageview stores exactly four things: page, referrer, screen size, time. that's the whole list.&lt;/p&gt;

&lt;p&gt;what you get: top pages, traffic sources (search, social, newsletters, even ai assistants), scroll depth, button clicks, funnels, live visitor count. up to 50 sites in one dashboard.&lt;/p&gt;

&lt;p&gt;why this matters for you: if you've ever stared at a GA4 dashboard that felt built for a fortune 500 company, or delayed launching because the cookie banner copy wasn't ready — this is the tool that skips all of that.&lt;/p&gt;

&lt;p&gt;it's free while in early access, no card: trycloudline.space&lt;/p&gt;

&lt;p&gt;i'm posting about building this in public for the next 90 days. next up: how scroll depth tracking works without storing anything personal.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>analytics</category>
      <category>privacy</category>
    </item>
    <item>
      <title>I Built a Cookie-Free Google Analytics Alternative</title>
      <dc:creator>Om Yaduvanshi</dc:creator>
      <pubDate>Sun, 20 Sep 2026 11:28:18 +0000</pubDate>
      <link>https://dev.to/omyvnss/i-built-a-cookie-free-google-analytics-alternative-41p7</link>
      <guid>https://dev.to/omyvnss/i-built-a-cookie-free-google-analytics-alternative-41p7</guid>
      <description>&lt;p&gt;I built &lt;strong&gt;Cloudline&lt;/strong&gt;, a Google Analytics alternative without cookies.&lt;/p&gt;

&lt;p&gt;I'm Om Yaduvanshi, and I built Cloudline because I wanted website analytics without turning a simple website into a complicated tracking system.&lt;/p&gt;

&lt;p&gt;If you've ever searched for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a Google Analytics alternative&lt;/li&gt;
&lt;li&gt;cookie-free website analytics&lt;/li&gt;
&lt;li&gt;privacy-friendly analytics&lt;/li&gt;
&lt;li&gt;analytics without storing IP addresses&lt;/li&gt;
&lt;li&gt;lightweight website analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;this is exactly the problem Cloudline is trying to solve.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Cloudline?
&lt;/h2&gt;

&lt;p&gt;Cloudline is a lightweight website analytics platform that doesn't use cookies or store IP addresses.&lt;/p&gt;

&lt;p&gt;You can track:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time visitors&lt;/li&gt;
&lt;li&gt;Pageviews&lt;/li&gt;
&lt;li&gt;Traffic sources&lt;/li&gt;
&lt;li&gt;Popular pages&lt;/li&gt;
&lt;li&gt;Devices&lt;/li&gt;
&lt;li&gt;Engagement&lt;/li&gt;
&lt;li&gt;Clicks&lt;/li&gt;
&lt;li&gt;Scroll depth&lt;/li&gt;
&lt;li&gt;Funnels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tracking script is under 2 KB.&lt;/p&gt;

&lt;p&gt;The goal isn't to recreate every feature of GA4. It's to make the common analytics questions easy to answer:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How many people visited my site?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where did they come from?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which pages are getting attention?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are visitors engaging with?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where are they dropping off?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why build another Google Analytics alternative?
&lt;/h2&gt;

&lt;p&gt;There are already privacy-focused analytics products like Plausible, Fathom, Matomo and Umami.&lt;/p&gt;

&lt;p&gt;Cloudline isn't trying to pretend those products don't exist.&lt;/p&gt;

&lt;p&gt;I'm building another option with a different priority: keep the analytics experience focused, lightweight and easy to understand while avoiding cookies and IP storage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is it for?
&lt;/h2&gt;

&lt;p&gt;Cloudline is mainly aimed at developers, indie hackers, founders, SaaS builders and anyone who wants useful website analytics without a huge analytics stack.&lt;/p&gt;

&lt;p&gt;It's currently &lt;strong&gt;free for early users&lt;/strong&gt; while I continue building it.&lt;/p&gt;

&lt;p&gt;If you're looking for a &lt;strong&gt;Google Analytics alternative without cookies&lt;/strong&gt;, I'd love to have you try Cloudline and tell me what you'd change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://trycloudline.space" rel="noopener noreferrer"&gt;https://trycloudline.space&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;— Om Yaduvanshi&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>privacy</category>
      <category>saas</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
