<?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: Oleksii Antoniuk</title>
    <description>The latest articles on DEV Community by Oleksii Antoniuk (@alantalex).</description>
    <link>https://dev.to/alantalex</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%2F3865097%2Fe7eea4ef-83e8-438a-9701-865091bf4ec7.jpeg</url>
      <title>DEV Community: Oleksii Antoniuk</title>
      <link>https://dev.to/alantalex</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alantalex"/>
    <language>en</language>
    <item>
      <title>A Lie Detector for HTTP Requests: Analytics Through Time</title>
      <dc:creator>Oleksii Antoniuk</dc:creator>
      <pubDate>Wed, 03 Jun 2026 03:00:00 +0000</pubDate>
      <link>https://dev.to/alantalex/a-lie-detector-for-http-requests-analytics-through-time-2b43</link>
      <guid>https://dev.to/alantalex/a-lie-detector-for-http-requests-analytics-through-time-2b43</guid>
      <description>&lt;p&gt;Remember that guy from the last article who visited my site using Firefox 140.0 while the rest of the world was still stuck in the 130s? Back then, it felt like an exotic anomaly, a visit from a "guest from the future." But when these "time travelers" start showing up in formation, you realize: it's time to stop being surprised and start classifying them.&lt;/p&gt;

&lt;p&gt;(Read the details in the article on my Blog &lt;a href="https://oleant.dev/en/blog/through-the-looking-glass-of-logs-karachi-police-duckduckgo-and-ipv6-magic" rel="noopener noreferrer"&gt;"Through the Looking Glass of Logs: Karachi Police, DuckDuckGo, and IPv6 Magic"&lt;/a&gt; )&lt;/p&gt;

&lt;p&gt;If the first version of my Laravel analytics package was just a "peep-hole" in the door, version 1.3.0 has evolved into a full-scale digital customs checkpoint—complete with X-rays, biometrics, and an elephant's memory. Let’s look under the hood and break down how to distinguish a real human from a script that desperately wants to be your friend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chapter 1: The Evolution of Paranoia (Scoring System)
&lt;/h2&gt;

&lt;p&gt;In the beginning, I was naive. I believed the internet was a world of black and white: if the User-Agent said "Googlebot," it was a robot—we’d shake its hand and show it to the indexing section. If it said "Mozilla/5.0," it was a human—we’d pour them a coffee and log them into the "Visitors" table.&lt;/p&gt;

&lt;p&gt;But the reality of 2026 quickly shattered those rose-colored glasses. Today, even the laziest spam-bot, whipped up by a high schooler on a weekend, can mimic the latest Chrome build so skillfully that standard verification methods just give up. The bot no longer screams "I am a robot!". It enters quietly, subtly, rubbing its virtual palms together.&lt;/p&gt;

&lt;p&gt;Realizing this, I turned my package into a digital investigator that no longer makes snap judgments. Now, it uses a weighting system (Scoring). The package doesn't issue a verdict immediately—it observes, cross-references facts, and builds a "suspicion file."&lt;/p&gt;

&lt;h3&gt;
  
  
  Here is what this real-time interrogation protocol looks like:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;"Appeared out of nowhere" (+35 points):&lt;/strong&gt; Imagine someone materializing right in the middle of your kitchen, bypassing the front door. If a request knocks on an internal page (e.g., straight to /checkout or deep into the blog) without a Referer header, my inner detective narrows his eyes. Regular people rarely teleport—they follow links.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Digital Paleozoic" (+60 points):&lt;/strong&gt; Suddenly, a guest on Windows XP pops up in the logs. In 2026! It’s like a gentleman in rusty knight’s armor showing up at a high-tech gala. Most likely, we’re looking at an old botnet using ancient libraries for requests. This is a major red flag, almost a conviction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Cloud Residency" (+100 points):&lt;/strong&gt; If an IP check shows the guest lives in an Amazon, Hetzner, or DigitalOcean data center—game over. Normal people don't browse the web while physically sitting in a server rack in Frankfurt. This is an instant bot status, with no right to appeal.&lt;/p&gt;

&lt;p&gt;When the total score in this "suspect card" breaks the 70-point threshold, the visit is officially flagged as "non-human."&lt;/p&gt;

&lt;p&gt;This approach allows us to stay polite to real people who might just have a weird browser config or a paranoid antivirus stripping referers, while ruthlessly filtering out the "stealth bots" trying to leak into your clean analytics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chapter 2: Snitch Ports and the Referer Loop
&lt;/h2&gt;

&lt;p&gt;Sometimes bots mess up on things so absurd that it feels like the script developer decided to wink at me from the shadows. In version 1.3.0, I implemented two traps that have become my favorites in the hunt for automated "guests."&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Port Leak: The Spy Who Came from the Control Panel
&lt;/h3&gt;

&lt;p&gt;Imagine a customer walking into your store, but their badge says "Junior Hacking Intern at cPanel." You’d be on guard, right? That’s exactly how it looks in the logs.&lt;/p&gt;

&lt;p&gt;A real user comes to you from Google, social media, or types the address manually. But vulnerability scanners often work "in tandem" with hijacked hostings or control panels. As a result, a header hits my analytics: Referer:  &lt;code&gt;https://some-shadow-site.com:2083&lt;/code&gt;  ...&lt;/p&gt;

&lt;p&gt;Port  &lt;code&gt;:2083&lt;/code&gt;  is the classic entry point for cPanel. A real person cannot "accidentally" follow a link from another server's admin panel to your site. It’s a dead giveaway that someone just finished dissecting a neighboring hosting and is now targeting your project. In my config, these "snitch ports" (including Plesk  &lt;code&gt;:8443&lt;/code&gt;  and Webmin  &lt;code&gt;:10000&lt;/code&gt;  ) have a weight of 100.&lt;/p&gt;

&lt;p&gt;One hit like that, and the bot is instantly sent to the digital ban list before it can even say "Hello World."&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Referer Loop:** Failing the Turing Test at the Starting Line
&lt;/h3&gt;

&lt;p&gt;Bots try their hardest to look like "one of us." They know that a missing referer is suspicious (&lt;em&gt;we already assigned +35 points for that in Chapter 1&lt;/em&gt;), so they try to simulate it. But sometimes they do it with the grace of a bull in a china shop.&lt;/p&gt;

&lt;p&gt;I call this the &lt;strong&gt;Referer Loop&lt;/strong&gt;. A bot lands on your page and sets the Referer header to... that exact same page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bot Logic:&lt;/strong&gt; "If I say I came from here, the server will think I just clicked an internal link."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Analytics Logic:&lt;/strong&gt; "Buddy, this is your first visit. You haven't been inside yet to navigate from anywhere to anywhere."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bot Logic:&lt;/strong&gt; "If I say I came from here, the server will think I just clicked an internal link."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Analytics Logic:&lt;/strong&gt; "Buddy, this is your first visit. You haven't been inside yet to navigate from anywhere to anywhere."&lt;br&gt;
If the system sees a page referencing itself during the very first appearance of that IP in a session—the masks are off. Turing test failed, and the bot score gets another 50 points. A living human must first arrive at the site before they can start moving between its pages.&lt;/p&gt;
&lt;h3&gt;
  
  
  How it looks in code
&lt;/h3&gt;

&lt;p&gt;For those who like to "get their hands on" the implementation, here is the config snippet responsible for this "interrogation" stage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cd"&gt;/** 
* 4. SUSPICIOUS REFERER PORTS 
* Technical ports in the Referer header (cPanel, Plesk, etc.) 
* Real users almost never arrive from these ports. 
*/&lt;/span&gt;
&lt;span class="s1"&gt;'port_leak'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="mi"&gt;2082&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2083&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// cPanel&lt;/span&gt;
    &lt;span class="mi"&gt;2086&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2087&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// WHM&lt;/span&gt;
    &lt;span class="mi"&gt;8443&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8880&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Plesk&lt;/span&gt;
    &lt;span class="mi"&gt;2222&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// DirectAdmin&lt;/span&gt;
    &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// Webmin&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="s1"&gt;'weights'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;// Traffic arriving from technical control panels&lt;/span&gt;
    &lt;span class="s1"&gt;'port_leak'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// Referer loop detection (URL == Referer on first hit)&lt;/span&gt;
    &lt;span class="s1"&gt;'referer_loop'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Chapter 3: Snowball Effect — The Magic of Retroactive Retribution
&lt;/h2&gt;

&lt;p&gt;If the previous methods were the "border patrol" at the gates, then the Snowball Effect is the work of internal security with access to the archives. This is the most powerful and, I admit, my favorite feature of the 1.3.0 release.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Imagine this:&lt;/strong&gt; a bot visits you. Not a clunky Python script, but an elite "stealth operative." For the first three pages, it behaves perfectly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It maintains pauses, mimicking human reading patterns.&lt;/li&gt;
&lt;li&gt;It provides flawless headers.&lt;/li&gt;
&lt;li&gt;It even "scrolls" (simulates activity).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My system looks at it and says: "Okay, buddy, you look human. Go ahead." We log it as a "clean" visitor, and it ends up in your beautiful statistics. But on the fourth page, the bot slips up. &lt;/p&gt;

&lt;p&gt;Professional curiosity takes over, and it wanders into a "honeypot"—trying to read the /.env file or peek into /wp-admin.&lt;/p&gt;

&lt;p&gt;In older versions of analytics, we would have simply flagged that fourth visit as "bot activity." But this is absurd! If it tried to steal your access keys at 2:05 PM, it means that at 2:00 PM it wasn't a fan reading your Laravel articles either. It was an enemy lying in wait.&lt;/p&gt;

&lt;p&gt;In version 1.3.0, the system switches to Retroactive Retribution mode: "You sneaky piece of hardware!" says the package. "If you're a bot now, you've been a bot all along."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works technically:&lt;/strong&gt; As soon as an IP address hits a critical weight (threshold) or lands in a Honeypot, the package triggers a background task (via Laravel Queue or Command). It pulls up the history of that IP for the last 60 days and "re-colors" all its past, seemingly "clean" visits with bot status.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cd"&gt;/** 
* Snowball Effect (Retroactive Cleanup) 
* Automatically flags historical sessions of a newly identified bot. 
*/&lt;/span&gt;
&lt;span class="s1"&gt;'cumulative'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'enabled'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'history_window_days'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// How far back we are willing to "take revenge"&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your statistics are cleaned up retroactively. You open the dashboard and see that the "garbage" hits that managed to slip through disguised as real people have simply vanished. This isn't just analytics; it's a self-cleaning ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chapter 4: UA Detector or "Your Mustache is Falling Off"
&lt;/h2&gt;

&lt;p&gt;To understand how my config works, you need to look at what bots are actually sending in their headers. Here are two classic examples from my logs that are guaranteed to fail the check:&lt;/p&gt;

&lt;h3&gt;
  
  
  "The Humble Automator"
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;python-requests/2.31.0&lt;/code&gt; or &lt;code&gt;GuzzleHttp/7&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's a bot:&lt;/strong&gt; No guesswork needed here. These request libraries honestly admit what they are. In the config, they live in the  suspicious_ua  section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cd"&gt;/**
* 2. SUSPICIOUS USER-AGENTS (Common fragments)
* Common library or tool strings used by scrapers and automated tools.
*/&lt;/span&gt;
&lt;span class="s1"&gt;'suspicious_ua'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="s1"&gt;'python-requests'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'guzzlehttp'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'go-http-client'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'curl'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="mf"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  "The Forgetful Mimic"
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's a bot:&lt;/strong&gt; Windows NT 6.1 (Windows 7) and IE 9 in 2026? This is either a very sad computer in a rural library or (more likely in 99% of cases) an old botnet using decade-old presets. This gets penalized via  obsolete_os  :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cd"&gt;/**
* Obsolete OS versions (Windows XP, 2000, etc.) 
*/&lt;/span&gt;
&lt;span class="s1"&gt;'obsolete_os'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="s1"&gt;'Windows NT 5'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'Windows NT 6'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'Mac OS X 10'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Code Implementation:&lt;/strong&gt; Setting the Weights&lt;br&gt;
And here is the heart of the system—the weight matrix in  &lt;code&gt;config/visit-analytics.php&lt;/code&gt;  . This is where we define how strict our "border control" will be.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Scoring Weights (Suspicion Matrix) */&lt;/span&gt;
&lt;span class="s1"&gt;'weights'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;// Direct entry to internal page without Referer (bot behavior)&lt;/span&gt;
    &lt;span class="s1"&gt;'no_referer'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// Attempting to trick the system by setting Referer to current URL&lt;/span&gt;
    &lt;span class="s1"&gt;'referer_loop'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// If IP belongs to a data center (AWS, Hetzner, etc.) — instant 100% bot&lt;/span&gt;
    &lt;span class="s1"&gt;'datacenter'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// Click speed exceeding human capabilities (&amp;lt; 2 seconds between pages)&lt;/span&gt;
    &lt;span class="s1"&gt;'speed_anomaly'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// Visiting a "honeypot" (e.g., /.env or /wp-admin)&lt;/span&gt;
    &lt;span class="s1"&gt;'honeypot'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// Those weird ports in the referer (cPanel, Plesk)&lt;/span&gt;
    &lt;span class="s1"&gt;'port_leak'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How the Honeypot Works
&lt;/h3&gt;

&lt;p&gt;This is the most effective and fastest way to purge your logs. We add a list of paths to the config that a normal user of your Laravel app would never visit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="s1"&gt;'honeypot_paths'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'/.env'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'/wp-admin'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'/.git'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'/bitrix'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'/config.php'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'/phpinfo.php'&lt;/span&gt;&lt;span class="p"&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 moment a script knocks on  &lt;code&gt;/.env&lt;/code&gt;  , it gets  &lt;code&gt;is_bot = true&lt;/code&gt;  and a maximum  &lt;code&gt;bot_score&lt;/code&gt;  . And thanks to the Snowball Effect, all its previous attempts to "act human" on the home page are instantly nullified.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chapter 5: What’s Next? (Filament Announcement)
&lt;/h2&gt;

&lt;p&gt;Collecting data and filtering it with virtuosity is only half the battle. The real "dopamine hit" comes when you see the results of your work not in raw database tables, but in beautiful, intuitive graphics. There is nothing more satisfying than watching the gray "bot curve" decline while the green graph of real, live humans grows steadily.&lt;/p&gt;

&lt;p&gt;Right now, I’m working on bringing all this "looking-glass magic" into the visual plane. In the next major release, I’m planning full integration with Filament. Why dig through configs via the terminal when you can manage your digital security through a stylish UI?&lt;/p&gt;

&lt;h3&gt;
  
  
  Here’s what’s on the horizon:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Real-time Dashboard:&lt;/strong&gt; A set of widgets showing your site’s "pulse" in real time. You’ll literally see who the system has "neutralized" just now and for what reason.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interactive Bot Map:&lt;/strong&gt; Visualization of attacks and visits. &lt;br&gt;
You’ll be able to see clearly where the Palo Alto scanners are coming from and where the "honest" search engines are lurking. It will look like a cyber-command headquarters.&lt;/p&gt;

&lt;p&gt;Admin Panel Weight Management: No more editing &lt;code&gt;.php&lt;/code&gt; files just to change a single sensitivity threshold. You’ll be able to fine-tune scoring weights, add new suspicious ports, or update your honeypot list with a few clicks without leaving the comfort of the Filament panel.&lt;/p&gt;

&lt;p&gt;But first things first. The path to perfect analytics is a marathon, not a sprint. So stay tuned: I promise the updates will be "tasty," technically elegant, and incredibly useful for those who value the purity of their data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Epilogue: Purity as a Religion
&lt;/h2&gt;

&lt;p&gt;Ultimately, after implementing behavioral analysis and port checks, my traffic charts have "slimmed down" significantly. Но это та самая диета, которая идет на пользу. Now I know for sure: if I see a visit from Linux via &lt;code&gt;IPv6&lt;/code&gt;, it's either my old friend, the "digital detective," or a genuinely interested pro—not just another Palo Alto Networks script that decided to read my Terms of Service.&lt;/p&gt;

&lt;p&gt;Logs are not just text. They are a signature. And now, my Laravel package can distinguish the calligraphy of a living person from the mechanical stamps of a typewriter.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>webdev</category>
      <category>analytics</category>
      <category>security</category>
    </item>
    <item>
      <title>Through the Looking Glass of Logs: Karachi Police, DuckDuckGo, and IPv6 Magic</title>
      <dc:creator>Oleksii Antoniuk</dc:creator>
      <pubDate>Fri, 29 May 2026 19:33:34 +0000</pubDate>
      <link>https://dev.to/alantalex/through-the-looking-glass-of-logs-karachi-police-duckduckgo-and-ipv6-magic-7e2</link>
      <guid>https://dev.to/alantalex/through-the-looking-glass-of-logs-karachi-police-duckduckgo-and-ipv6-magic-7e2</guid>
      <description>&lt;p&gt;Remember when I said reality turned out to be harsher? When you open the logs of a custom-built analytics package after a couple of days, you expect to see hits from a few friends and, in the best-case scenario, your mom. Well, maybe a lost translator bot.&lt;/p&gt;

&lt;p&gt;Instead, I discovered that the server had become a point of interest for folks who don't just "scroll the feed," but dissect the internet down to its molecules. My little project suddenly transformed into a testing ground for those who prefer silence and &lt;code&gt;IPV6&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Read the first part of the story about how it all began in the article: &lt;br&gt;
&lt;a href="https://oleant.dev/en/blog/how-i-built-my-own-laravel-analytics-package-and-almost-didnt-crash-production" rel="noopener noreferrer"&gt;How I Built My Own Laravel Analytics Package (and Almost Didn't Crash Production)&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this series, we’ll step "through the looking glass": we’ll find out who &lt;strong&gt;Palo Alto Networks&lt;/strong&gt; are, why bots read my Terms of Service in 7 seconds, and why &lt;em&gt;Linux + DuckDuckGo&lt;/em&gt; is now the official mark of quality for a visitor.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Chapter 1: Ghost in the Shell (Linux) and the Guest from the Future
&lt;/h2&gt;

&lt;p&gt;The first one to make my freshly-baked analytics package "rustle" like a pro was a guest whose profile looked like a canonical portrait of a cyber-detective. Imagine: Sunday, late evening. Most people are scrolling social media feeds on iPhones. But in my logs, a character pops up entering via &lt;code&gt;IPv6&lt;/code&gt;, using &lt;strong&gt;Linux&lt;/strong&gt;, and introducing themselves as &lt;strong&gt;Firefox 140.0&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For a second, I froze. It’s April 2026; stable browser versions have barely crawled into the 130s. Who is this? A time traveler? A Mozilla nightly build tester? Or simply someone who knows a little more than "everything" about anonymity and header spoofing? In the world of info-sec, this is a clear signal: we are looking at a "power user" who consciously uses a non-standard stack to avoid blending into the crowd.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;He came from the "Looking Glass" — via &lt;strong&gt;DuckDuckGo&lt;/strong&gt;. Its users hate being tracked and know how to look where others are forbidden to enter. And this guest didn't come to my audit just to "click buttons." He behaved like a professional inspector:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;First — Politeness.&lt;/strong&gt; Checked &lt;code&gt;robots.txt&lt;/code&gt;. Knocked before entering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jurisdictional Study.&lt;/strong&gt; In a matter of seconds, he "swallowed" the Terms of Service page. Pros always check whose territory they are on before pulling the trigger.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target Action.&lt;/strong&gt; He wasn't interested in articles about choosing a framework. He came for a specific tool — a &lt;em&gt;deep DNS audit&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This visit is the highest form of recognition. When a person using software from the future (Firefox 140!) and hiding behind IPv6 tunnels chooses your tool for work — it means you’ve made something truly worthwhile. But it also means your server must be ready to receive such "ghosts." If your security is leaky, such a pro will see it before the first pixel of the interface even renders.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Chapter 2: DNS Detective. The "Karachi Police" Case
&lt;/h2&gt;

&lt;p&gt;While my analytics package imperturbably digested traffic, the "Linux user" from the Netherlands decided that enough was enough with the studying of terms — it was time to move on to "field tests." And as his target, he chose not some local spare parts shop, but the domain &lt;code&gt;karachipolice.gov.pk&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When the official website of the police of Pakistan’s largest city pops up in the Sunday audit logs, you involuntarily adjust your imaginary detective hat. What was it? Subtle trolling, a real investigation, or did someone on the other side of the ocean just decide to test their professional aptitude via an independent tool?&lt;/p&gt;

&lt;p&gt;Either way, the "Run Audit" button was pressed. And &lt;strong&gt;Oleant&lt;/strong&gt; laid out evidence on the table that would make any sysadmin in Karachi's eye twitch:&lt;/p&gt;

&lt;h3&gt;
  
  
  DMARC: null
&lt;/h3&gt;

&lt;p&gt;This was the first and biggest "red flag." DMARC is, essentially, passport control for your mail. If it equals &lt;code&gt;null&lt;/code&gt;, it means the domain has no policy protecting against email spoofing. Any freshman hacker could send an email with the subject "Urgent Fine" on behalf of the Chief of Police.&lt;/p&gt;

&lt;h3&gt;
  
  
  SPF with a "soft" character
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;~all&lt;/code&gt; policy in an SPF record is like a lock that is closed, but if you pull hard enough, it opens. We’re telling the world which servers have the right to send mail, but then immediately adding: "But if it comes from someone else, accept it anyway, just mark it as suspicious."&lt;/p&gt;

&lt;h3&gt;
  
  
  IPv6 Facade and Hosted Email
&lt;/h3&gt;

&lt;p&gt;The Karachi Police website honestly resolves via modern &lt;strong&gt;AAAA records&lt;/strong&gt; (hello, IPv6 future!), but their entire email infrastructure hangs on standard servers of a popular low-cost host. It’s like putting an old carburetors from a vintage Lada into a modern supercar.&lt;/p&gt;

&lt;p&gt;Observing this audit through the prism of my analytics package, I realized one important thing: there are no borders on the web. A person sitting under the protection of a European provider via an IPv6 tunnel exposes critical security gaps in an Asian government agency in seconds, using a tool written in free time by a web developer for web developers somewhere in Europe.&lt;/p&gt;

&lt;p&gt;This is the "Looking Glass," where security isn't the thickness of the walls, but the correctness of a single line in a DNS record. If your domain hasn't been audited in a while, don't hesitate to visit Oleant and run a &lt;a href="https://oleant.net/security-tools/dns-records-check" rel="noopener noreferrer"&gt;free DNS audit&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Chapter 3: Dancing with Shadows
&lt;/h2&gt;

&lt;p&gt;If in the first chapter we met a live pro, in the third, the "corporate ghosts" enter the game. When you launch a project, you feel like it's just you and a blank sheet of code. But as soon as you record the first hits from &lt;strong&gt;Palo Alto Networks&lt;/strong&gt; bots, you realize: the project is already being watched.&lt;/p&gt;

&lt;p&gt;Don't be scared; they haven't hacked my logs. In the world of "heavy duty" security, everything works more elegantly. Palo Alto and their peers build global threat maps by analyzing traffic worldwide. How do they "see" this?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Step 01 | Network Footprint:&lt;/strong&gt; When my server queries DNS records or ports of a domain, for external monitoring systems, my domain suddenly starts behaving like an active scanner.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 02 | Reputation Scoring:&lt;/strong&gt; If your domain regularly "communicates" with government or corporate nodes in audit mode, Palo Alto's algorithms flag it as a technical analysis node.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 03 | Verdict:&lt;/strong&gt; The domain is assigned a category. Being in "InfoSec" is much more prestigious and safer for reach than hanging in "Uncategorized" or "Suspicious."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why is this important for us? Because in 2026, domain reputation is your passport to the "clean internet." If your project behaves professionally, uses a fresh stack (&lt;em&gt;Laravel 12!&lt;/em&gt;), and is correctly configured, even giants like Palo Alto begin to treat your traffic as a legitimate research tool.&lt;/p&gt;




&lt;h3&gt;
  
  
  Epilogue
&lt;/h3&gt;

&lt;p&gt;Security isn't scary. It's hygiene. It's the ability to understand who is knocking on your door and why. My analytics package showed me this clearly: from live Linux enthusiasts to the soulless but damn smart machines of Palo Alto.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Logs don't lie. They tell stories cooler than any spy novel. The main thing is knowing how to read them.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And in the next episode...&lt;/strong&gt;&lt;br&gt;
We’ll break down how one forgotten comma in a Content Security Policy (CSP) can turn your modern project into a pumpkin for Googlebot and why "Mixed Content" is a death sentence for your SEO.&lt;/p&gt;

&lt;p&gt;You can read the article about auditing security headers here: &lt;a href="https://oleant.dev/en/blog/your-digital-fortress-why-a-security-headers-audit-is-essential" rel="noopener noreferrer"&gt;Your Digital Fortress: Why a Security Headers Audit is Essential&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TAKE CARE OF YOUR HTTP HEADERS.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;SEE YOU THROUGH THE LOOKING GLASS.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>privacy</category>
      <category>networking</category>
    </item>
    <item>
      <title>How I Built My Own Laravel Analytics Package (and Almost Didn't Crash Production)</title>
      <dc:creator>Oleksii Antoniuk</dc:creator>
      <pubDate>Thu, 21 May 2026 21:56:48 +0000</pubDate>
      <link>https://dev.to/alantalex/how-i-built-my-own-laravel-analytics-package-and-almost-didnt-crash-production-l75</link>
      <guid>https://dev.to/alantalex/how-i-built-my-own-laravel-analytics-package-and-almost-didnt-crash-production-l75</guid>
      <description>&lt;h2&gt;
  
  
  Why Not Google Analytics? (Or why I love reinventing the wheel)
&lt;/h2&gt;

&lt;p&gt;To be honest, this wasn't an easy call. I’ve been in development for quite a while and had grown accustomed to GA. What could be simpler: you slap a script with your ID onto the site, and data starts flowing into the analytics console. All that's left is to wait for the traffic to roll in and then analyze it by country, gender, age groups, and so on.&lt;/p&gt;

&lt;p&gt;Yes, that’s how it used to be, but in today’s reality, there are objective reasons to rethink this concept. Let’s be real: hooking up Google Analytics in 2026 is like putting a massive deadbolt on your front door but leaving the keys with your neighbor. Everything seems under control, but the neighbor knows exactly when you came home, what you bought, and why you have a long face. And when someone visits you and wants to stay incognito, the neighbor won't give them the keys, and they won't even tell you they stopped by. Their response would be something like: “Nobody came, I never sleep, everything is under control…”. What am I getting at?&lt;/p&gt;

&lt;h3&gt;
  
  
  Remember the General Data Protection Regulation (GDPR)?
&lt;/h3&gt;

&lt;p&gt;Now, for your analytics to work, you must display a cookie consent banner and get the user's permission. And that’s where the problem lies. 90% of users don’t accept all cookies—only the strictly necessary ones. And what does that mean? Google Analytics ends up dead in the water. Besides, everyone is sick and tired of these banners. So, if there’s a legal way to ditch them, why not take it?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;(To learn how to avoid legal trouble with data protection laws, check out the article &lt;a href="https://oleant.dev/en/blog/gdpr-without-the-headache-a-guide-for-web-developers-in-germany" rel="noopener noreferrer"&gt;GDPR Without the Headache: A Guide for Web Developers in Germany &lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The decision to drop GA was made. When I decided to hit the "Eject" button and catapult myself out of the Google ecosystem, I faced a logical question: what would fill the void? Because I still needed the numbers. I started looking at the heavy artillery.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The first candidate was Matomo (formerly Piwik):&lt;/em&gt; Probably the most powerful all-in-one machine. It’s like keeping a pet elephant in your backyard. It does everything, the database grows like crazy, but it requires a separate PHP server, MySQL, and constant babysitting. For my small pet projects, it felt like trying to drive nails with a microscope.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The second tool I looked at was Plausible / Fathom:&lt;/em&gt; Sleek, modern, and privacy-respecting. But there’s a catch: you either pay a subscription (a questionable investment for a free tool) or you mess around with self-hosted Docker versions, which also eat up a good chunk of your VPS RAM.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I looked at all of this and thought: “Do I really need to spin up an entire infrastructure just to know that 50 people read my article on German taxes yesterday?”. That’s when it hit me: I don’t need a "combine harvester." I need a tiny, precision scalpel that lives right inside my Laravel application.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I wanted something of my own: lightweight, like a morning espresso, and not asking annoying questions about GDPR. Plus, I was simply curious about who all these people (and bots) were "knocking" on my security tools at &lt;a href="https://oleant.net" rel="noopener noreferrer"&gt;oleant.net&lt;/a&gt;. Since this blog also needed the same tool, I decided to develop a standalone package that could be easily installed via composer and published openly on Packagist.&lt;/p&gt;

&lt;p&gt;For those interested in diving into the code, the package is called &lt;strong&gt;&lt;code&gt;oleant/laravel-visit-analytics&lt;/code&gt;&lt;/strong&gt;, compatible with Laravel versions 10/11/12. GitHub link: &lt;a href="https://github.com/Oleant-NET/laravel-visit-analytics" rel="noopener noreferrer"&gt;https://github.com/Oleant-NET/laravel-visit-analytics&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Heart of the System: Middleware and the Magic of the Aftertaste
&lt;/h3&gt;

&lt;p&gt;Which architecture to use? There are various ways to implement this. Fortunately, Laravel has a great Middleware mechanism. I decided to stick with that, but would it slow down the user? They shouldn't have to care about my overhead. And what if the database goes down or something goes wrong? A 500 error page as the face of the site is definitely not what I was aiming for.&lt;/p&gt;

&lt;p&gt;That’s why a crucial decision was made — to use the &lt;strong&gt;&lt;code&gt;terminate()&lt;/code&gt;&lt;/strong&gt; method. In a Laravel Middleware, it’s like a polite waiter: he brings you the check and smiles (the &lt;strong&gt;&lt;code&gt;handle()&lt;/code&gt;&lt;/strong&gt; method), and only after you’ve already left the restaurant does he go back to wipe the table and log the tip (the &lt;strong&gt;&lt;code&gt;terminate()&lt;/code&gt;&lt;/strong&gt; method).&lt;/p&gt;

&lt;p&gt;The user has already received their page and is happy, while our server quietly and without rush writes the logs to the database in that moment. Even if something goes wrong, the client still leaves satisfied, and the waiter... just doesn't get a tip this time. Just kidding, but here’s how it works in practice:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PHP&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;terminate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Response&lt;/span&gt; &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Logic to exclude non-target clients, like Admin etc.&lt;/span&gt;
        &lt;span class="c1"&gt;// …&lt;/span&gt;
        &lt;span class="c1"&gt;// Next, write our visitors to the database&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;logVisit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;\Throwable&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// If the DB takes a nap, we won't wake the user with a 500 error&lt;/span&gt;
        &lt;span class="nc"&gt;\Log&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Analytics failed, but we're keeping our cool: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;Lifehack&lt;/strong&gt;: All analytics code must be wrapped in a try-catch. Believe me, there's nothing sillier than "crashing" an entire project just because the logger didn't have enough room for a long User-Agent or some other non-obvious case.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GDPR on the Fly&lt;/strong&gt;: How Not to Become Public Enemy No. 1&lt;br&gt;
To avoid slapping a banner the size of half the screen saying “We are watching you, bro,” I implemented IP anonymization. We simply trim the last part of the address before it ever touches the database. This anonymizes the user and fully complies with the law. Yet, we can still tell which country, data center, etc., the visit came from. We’ll talk more about data center bots once there's more data to show.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Back to IP anonymization:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PHP&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Before: 192.168.1.154 -&amp;gt; After: 192.168.1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It’s like seeing a crowd in masks: you understand that 5 people showed up, but who among them is your neighbor — you have no clue. The law is satisfied, and so is my conscience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Payload:&lt;/strong&gt; Gathering Only the Goodies&lt;br&gt;
Initially, I wanted to write everything that comes in the URL to the database. But then I looked at the Livewire logs, where half the state of the planet is passed in the parameters, and realized — the database would explode. So, I decided to implement filtering based on allowed parameters in the config using &lt;strong&gt;&lt;code&gt;array_intersect_key&lt;/code&gt;&lt;/strong&gt;. Now, only what I’ve personally authorized in the config ends up in the logs. Clean, orderly, and zero fluff.&lt;/p&gt;

&lt;p&gt;The default set in the package config looks like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PHP&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="s1"&gt;'whitelist'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'utm_source'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'utm_medium'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'utm_campaign'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'utm_term'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'utm_content'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'ref'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But you can, of course, change it by publishing the config in your project first:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bash&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan vendor:publish &lt;span class="nt"&gt;--tag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"visit-analytics-config"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, a visit-analytics.php file will appear in your config folder. There, you can not only expand the list of tracked parameters (for example, adding something like page or search) but also specify excluded paths so you don't turn your database into a dump for admin panel or technical endpoint logs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;The package started humming, and the data began to flow. I closed my laptop and went to bed, thinking I’d wake up to some visitor charts from a couple of friends. But reality turned out to be much tougher (and more interesting).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;In the next episode, we’ll step through the "looking glass": who are Palo Alto Networks, why do bots read my Terms of Service in 7 seconds, and why Linux + DuckDuckGo is a badge of quality for a visitor?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>privacy</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Why I don’t trust my own deployments (and why you should audit your Security Headers)</title>
      <dc:creator>Oleksii Antoniuk</dc:creator>
      <pubDate>Sat, 11 Apr 2026 07:15:18 +0000</pubDate>
      <link>https://dev.to/alantalex/why-i-dont-trust-my-own-deployments-and-why-you-should-audit-your-security-headers-19cm</link>
      <guid>https://dev.to/alantalex/why-i-dont-trust-my-own-deployments-and-why-you-should-audit-your-security-headers-19cm</guid>
      <description>&lt;p&gt;As a Laravel developer, I’ve always felt pretty safe. Modern frameworks do a lot of heavy lifting, but here’s the cold truth: even the most secure backend can be undermined by a "leaky" frontend or a misconfigured Nginx.&lt;/p&gt;

&lt;p&gt;I caught myself constantly jumping between third-party tools every time I deployed a new feature just to make sure I hadn't messed up my Strict-Transport-Security or broken my Content-Security-Policy. Eventually, I got tired of the routine and built my own module within Oleant.&lt;/p&gt;

&lt;p&gt;What’s the deal?&lt;br&gt;
I’m talking about the Security Headers Audit. It’s not just another tool that says "everything is bad"; it breaks down exactly what's happening under the hood of your URL.&lt;/p&gt;

&lt;p&gt;Why it matters (The Tech Side):&lt;br&gt;
A lot of devs think SSL/TLS is the finish line. But without the right headers, you're still vulnerable to:&lt;/p&gt;

&lt;p&gt;Clickjacking (lack of X-Frame-Options).&lt;/p&gt;

&lt;p&gt;MIME-sniffing (no X-Content-Type-Options).&lt;/p&gt;

&lt;p&gt;XSS attacks that a solid CSP could have neutralized instantly.&lt;/p&gt;

&lt;p&gt;My Implementation:&lt;br&gt;
I built this using Laravel 11 + Inertia.js + Vue 3. This stack allowed me to make the audit process incredibly snappy. You drop the URL, and the Vue component reactively renders the status of every critical header.&lt;/p&gt;

&lt;p&gt;Give it a spin:&lt;br&gt;
I’ve exposed this tool as a dedicated route here:&lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://oleant.net/security-tools/headers-audit" rel="noopener noreferrer"&gt;https://oleant.net/security-tools/headers-audit&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s not a bloated "all-in-one" suite — it’s a precision scalpel. If you’re deploying something today, just throw your link in there and see how much "red" pops up. I actually found a few embarrassing gaps in my own older projects this way.&lt;/p&gt;

&lt;p&gt;Follow my journey: &lt;a href="https://oleant.dev/en/blog" rel="noopener noreferrer"&gt;https://oleant.dev/en/blog&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>laravel</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Stop guessing, start auditing: Why I built a custom Web Performance tool for Laravel devs</title>
      <dc:creator>Oleksii Antoniuk</dc:creator>
      <pubDate>Tue, 07 Apr 2026 06:57:31 +0000</pubDate>
      <link>https://dev.to/alantalex/stop-guessing-start-auditing-why-i-built-a-custom-web-performance-tool-for-laravel-devs-5h6o</link>
      <guid>https://dev.to/alantalex/stop-guessing-start-auditing-why-i-built-a-custom-web-performance-tool-for-laravel-devs-5h6o</guid>
      <description>&lt;p&gt;Hi DEV community! 👋 &lt;/p&gt;

&lt;p&gt;As a Senior Laravel Developer, I've always been obsessed with one thing: &lt;strong&gt;Performance.&lt;/strong&gt; We all use Lighthouse and PageSpeed Insights, but I felt something was missing—a tool that speaks the language of developers and gives actionable SEO insights without the fluff.&lt;/p&gt;

&lt;p&gt;That's why I started building &lt;a href="https://oleant.net" rel="noopener noreferrer"&gt;oleant.net&lt;/a&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  What’s the goal?
&lt;/h3&gt;

&lt;p&gt;My mission is to simplify &lt;strong&gt;Core Web Vitals&lt;/strong&gt; optimization. It's not just about the score; it's about the user experience and how search engines perceive your architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I'm sharing here:
&lt;/h3&gt;

&lt;p&gt;On this profile and my technical blog at &lt;a href="https://oleant.dev" rel="noopener noreferrer"&gt;oleant.dev&lt;/a&gt;, I’ll be deep-diving into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Advanced Laravel optimization techniques.&lt;/li&gt;
&lt;li&gt;Real-world Core Web Vitals case studies.&lt;/li&gt;
&lt;li&gt;Building high-performance SEO tools from scratch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd love to hear your thoughts! What's your biggest struggle when it comes to web performance?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check out the auditor here:&lt;/strong&gt; &lt;a href="https://oleant.net" rel="noopener noreferrer"&gt;oleant.net&lt;/a&gt; 🚀&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>performance</category>
      <category>webdev</category>
      <category>seo</category>
    </item>
  </channel>
</rss>
