<?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: v. Splicer</title>
    <description>The latest articles on DEV Community by v. Splicer (@numbpill3d).</description>
    <link>https://dev.to/numbpill3d</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1890803%2Fcad0d65c-d245-49cd-a357-f94d50b89379.gif</url>
      <title>DEV Community: v. Splicer</title>
      <link>https://dev.to/numbpill3d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/numbpill3d"/>
    <language>en</language>
    <item>
      <title>I Open-Sourced a Free YouTube Shorts Factory. The Money Isn't in the Shorts.</title>
      <dc:creator>v. Splicer</dc:creator>
      <pubDate>Mon, 02 Nov 2026 17:48:13 +0000</pubDate>
      <link>https://dev.to/numbpill3d/i-open-sourced-a-free-youtube-shorts-factory-the-money-isnt-in-the-shorts-4abp</link>
      <guid>https://dev.to/numbpill3d/i-open-sourced-a-free-youtube-shorts-factory-the-money-isnt-in-the-shorts-4abp</guid>
      <description>&lt;p&gt;&lt;em&gt;The pipeline costs nothing. The audience costs everything. Here's the math the faceless-channel gurus skip.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;There's a particular genre of video that haunts the recommended feed after midnight. A guy in a rented penthouse, or more often no guy at all, just a synthetic voice over stock footage, explaining that he makes $14,000 a month from a channel he hasn't touched in weeks. Faceless. Automated. Passive. Link in bio for the course.&lt;/p&gt;

&lt;p&gt;The course is the business. The channel is the ad for the course. That's been true for years, and nobody running the funnel has any reason to tell you.&lt;/p&gt;

&lt;p&gt;I built the machine those courses describe and put it on GitHub for free. It's called &lt;code&gt;ffmpeg-ai&lt;/code&gt;, it lives at &lt;a href="https://github.com/numbpill3d/ffmpeg-ai" rel="noopener noreferrer"&gt;https://github.com/numbpill3d/ffmpeg-ai&lt;/a&gt;, and it turns a single line of text into a finished, captioned, voiced vertical video using almost entirely free services. Giving it away makes it easy to tell the truth about what it can and can't do for your bank account, because there's nothing to upsell on the far side of the repo.&lt;/p&gt;

&lt;p&gt;The short version: the factory works. The economics of what it produces are nothing like the thumbnails.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Machine Actually Does
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;ffmpeg-ai&lt;/code&gt; is a Python CLI. You give it a topic and it runs an eight-stage pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. script     OpenRouter, with fallback across 6 free LLMs
2. voice      edge-tts, hook + segments + CTA synthesized in parallel
3. pacing     expands the visual timeline so no image overstays
4. images     AI images synced per segment, cascading across 7 providers
5. render     Ken Burns motion or fast storyboard cuts
6. captions   local faster-whisper transcription, burned in
7. music      optional bed with sidechain ducking under narration
8. encode     H.264 + AAC, 9:16 for Shorts or 16:9 for landscape
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setup is the usual ritual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://github.com/numbpill3d/ffmpeg-ai.git
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;ffmpeg-ai
&lt;span class="nv"&gt;$ &lt;/span&gt;uv pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;".[dev]"&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env    &lt;span class="c"&gt;# add your OpenRouter key, free tier works&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ffmpeg-ai generate &lt;span class="s2"&gt;"why your router's admin page is still on port 80"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What comes out is a 9:16 video up to 58 seconds long, with a voiceover, karaoke-style captions, paced visuals, a thumbnail and a run report. The free image path uses Pollinations (no key), Stable Horde (guest key built in), and the free tiers on Hugging Face and Together. Paid providers like BFL, fal.ai and Prodia are optional slots, never requirements.&lt;/p&gt;

&lt;p&gt;Batch mode is where the "passive" fantasy starts to feel real:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ffmpeg-ai batch topics.txt &lt;span class="nt"&gt;-o&lt;/span&gt; out/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fifty topics in a text file, fifty videos in a folder by morning. Your marginal cost per video rounds to zero. That sentence is the hook every faceless-channel course is built on, and it's completely true.&lt;/p&gt;

&lt;p&gt;It also stops mattering the moment you look at the other side of the ledger.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Math They Leave Out
&lt;/h2&gt;

&lt;p&gt;Start with what YouTube pays for Shorts. Public RPM estimates (what a creator actually takes home per thousand views) cluster around &lt;strong&gt;$0.02 to $0.10&lt;/strong&gt; across most niches. Finance and tech sit near the top of that band. Memes and text-message stories sit at the floor. Long-form in the same niches typically lands between $2 and $15 per thousand. That's up to two orders of magnitude more per view for the format the guru videos never mention.&lt;/p&gt;

&lt;p&gt;Now run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10,000,000 Shorts views x $0.02 per 1k  =  $200
10,000,000 Shorts views x $0.10 per 1k  =  $1,000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ten million views is a lot of human attention. It's roughly the number of people who live in Sweden. Monetized as Shorts, it buys you somewhere between a nice dinner and a month of rent in a cheap town.&lt;/p&gt;

&lt;p&gt;And you have to earn the right to collect even that. The current Partner Program bar for full revenue sharing is 1,000 subscribers plus either 4,000 public watch hours in a year or 10 million Shorts views in 90 days. In August 2026 YouTube announced that from &lt;strong&gt;February 1, 2027&lt;/strong&gt;, new applicants need double that: 8,000 qualified watch hours or 20 million qualified Shorts views in 90 days. Existing partners keep their status but need to accept the new terms by January 31, and they need to hold 10 million qualified Shorts views on a rolling 90-day window to keep earning from Shorts at all. Drop under the line and Shorts revenue stops until you climb back over it.&lt;/p&gt;

&lt;p&gt;So the bar for getting paid just doubled for anyone who isn't already in. The pay rate didn't move.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Policy That Eats Slop Farms
&lt;/h2&gt;

&lt;p&gt;The bigger threat to the automated channel is the review.&lt;/p&gt;

&lt;p&gt;YouTube's old "repetitious content" policy now goes by &lt;strong&gt;inauthentic content&lt;/strong&gt;, and the clarified guidance from July 2026 is blunt about what it targets: generic, template-built videos, content that's unsatisfying or off-putting, and AI personas posing as experts on health, legal, finance or political topics. The detail that matters most is that reviewers judge the channel's overall pattern, not individual videos. One templated upload doesn't sink you. Three hundred that share a skeleton will.&lt;/p&gt;

&lt;p&gt;Picture a channel built by running &lt;code&gt;batch&lt;/code&gt; on a scraped list of trending topics with the default style, default voice and default captions, every single day. That channel is a pattern, and patterns are exactly what this policy was written to catch.&lt;/p&gt;

&lt;p&gt;Disclosure is a separate rule. Realistic synthetic content that could be mistaken for something real needs the "altered or synthetic content" toggle in Studio, and realistic AI voices fall inside that line. Disclosing doesn't throttle reach or monetization on its own. Skipping it when it's required can get you demonetized. Flip the toggle and move on.&lt;/p&gt;

&lt;p&gt;What this policy kills is the lazy way of using the tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the Money Actually Lives
&lt;/h2&gt;

&lt;p&gt;The faceless-channel gurus are right about one thing: the business model works. They just put it in the wrong place on the diagram. The course sellers make their money from the course. The channel is top-of-funnel, a machine for turning strangers into people who recognize your name.&lt;/p&gt;

&lt;p&gt;You can run the same play honestly. Treat Shorts as distribution and treat a product you own as the business. A digital guide, a template pack, a config bundle, anything with margins you control and a price that isn't set by an ad auction. One $35 sale is worth the Shorts payout on somewhere between 350,000 and 1.75 million views at the RPM band above. Ten sales a month and the ad revenue is a rounding error.&lt;/p&gt;

&lt;p&gt;There's one plumbing problem. Since August 2023, links in Shorts descriptions and comments aren't clickable. YouTube killed them to fight spam. What you have left:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The channel page.&lt;/strong&gt; Links in your channel header still work, and that's where curious viewers go after a Short lands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Related video links.&lt;/strong&gt; A Short can point to a long-form video or livestream on your channel. Long-form descriptions &lt;em&gt;do&lt;/em&gt; have clickable links.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everything off-platform.&lt;/strong&gt; Your Medium posts, your newsletter, your own site. Shorts are the billboard. The shop needs a front door somewhere else.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the structure that makes sense looks like this. Shorts pull attention. A handful of longer videos (&lt;code&gt;ffmpeg-ai&lt;/code&gt; has a landscape mode up to ten minutes with &lt;code&gt;--mode landscape -d 300&lt;/code&gt;) catch the people who want more. Those videos and your channel page point at something you sell.&lt;/p&gt;

&lt;p&gt;If you want a worked map of this pattern applied to automation projects that actually invoice somebody, &lt;a href="https://numbpilled.gumroad.com/l/ai-automation-playbook" rel="noopener noreferrer"&gt;AI Automation Playbook&lt;/a&gt; covers seven monetizable builds and a 30-day plan. It's the long version of "stop selling attention by the thousand and start selling outcomes."&lt;/p&gt;

&lt;h2&gt;
  
  
  Running the Factory Without Building a Slop Farm
&lt;/h2&gt;

&lt;p&gt;The tool has the flags you need to stay on the right side of "inauthentic." Use them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Edit the script before it renders.&lt;/strong&gt; The &lt;code&gt;--edit-script&lt;/code&gt; flag stops the pipeline after the LLM writes and before anything gets voiced. Rewrite the hook. Kill the filler. Add the one detail only you know. A video that contains your judgment isn't template content, whatever generated the first draft.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ffmpeg-ai generate &lt;span class="s2"&gt;"how cheap ESP32 boards became aircraft trackers"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--edit-script&lt;/span&gt; &lt;span class="nt"&gt;--style&lt;/span&gt; dramatic &lt;span class="nt"&gt;--caption-style&lt;/span&gt; bold-center
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Use your own visuals.&lt;/strong&gt; &lt;code&gt;--images-dir path/&lt;/code&gt; swaps the AI image providers for a folder you supply. Screenshots of your terminal, photos of your bench, diagrams you drew. This one change does more for the "is a human here" question than anything else in the pipeline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Script-only dry runs.&lt;/strong&gt; &lt;code&gt;--dry-run&lt;/code&gt; generates the script without rendering. Run fifty dry runs, keep the five worth making, and render those. Curation is the human layer, and it's cheap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vary the skeleton.&lt;/strong&gt; Rotate &lt;code&gt;--render-mode&lt;/code&gt; between &lt;code&gt;kenburns&lt;/code&gt; and &lt;code&gt;storyboard&lt;/code&gt;, rotate caption styles, and change the music bed. A channel where every video has the same bones reads as a farm because it is one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pick a niche you can actually talk about.&lt;/strong&gt; This matters more than every flag combined. An AI pipeline amplifies whatever you feed it. Feed it a topic you understand and it saves you hours of editing. Feed it a topic you scraped from a "most profitable niches" listicle and it produces a confident wrong video at industrial scale.&lt;/p&gt;

&lt;p&gt;Once the workflow is curated, the scheduling becomes the boring part, which is exactly what you want. A cron entry or a scheduled job that runs &lt;code&gt;ffmpeg-ai batch&lt;/code&gt; against a reviewed topic file, writes into a dated folder and pings you when renders finish turns the factory into a morning ritual instead of a project. The 25 production configs in &lt;a href="https://numbpilled.gumroad.com/l/openauto" rel="noopener noreferrer"&gt;OpenClaw Automation Bible&lt;/a&gt; handle exactly this kind of plumbing: scheduled jobs, multi-step swarms, and Telegram or Discord notifications when a batch lands. Wire the render queue to it and you can review a folder of drafts over coffee instead of babysitting a terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Honest Unit Economics
&lt;/h2&gt;

&lt;p&gt;Here's the ledger with nothing hidden:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cost per Short          ~$0 on free tiers (your electricity, your time)
human time per Short    10-20 min if you edit the script and swap visuals
Shorts ad revenue       $0.02-$0.10 per 1k views, after you qualify
qualification           1,000 subs + 10M Shorts views / 90 days
                        (20M for new applicants from Feb 1, 2027)
links in Shorts         not clickable; route via channel page + long-form
real revenue            whatever you sell at the end of the funnel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The machine removes the production cost. It doesn't remove the attention problem, the policy problem or the product problem. Three problems out of four are still yours.&lt;/p&gt;

&lt;p&gt;That's still a good deal. Production cost was the wall that kept most people from running a channel at all. With that wall gone, you get to spend your hours on the parts that pay: having something to say and having something to sell.&lt;/p&gt;

&lt;p&gt;Clone it, run a dry batch on ten topics you actually know, and render the best two. If both of them embarrass you, the problem was never the pipeline.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Sources: github.com/numbpill3d/ffmpeg-ai (README); UpTube, "YouTube's New 2026 Policies"; Social Day, "YouTube raises Partner Program entry bar to 8,000 watch hours from February 2027"; Korpi, faceless channel RPM estimates; Tubefilter, "YouTube's banning clickable links from Shorts descriptions and comments" (Aug 10, 2023).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; passive-income, make-money-online, youtube, automation, artificial-intelligence&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>ai</category>
      <category>tutorial</category>
      <category>automation</category>
    </item>
    <item>
      <title>Your LoRa Board Can Track Airliners at 150 Nautical Miles</title>
      <dc:creator>v. Splicer</dc:creator>
      <pubDate>Mon, 02 Nov 2026 13:00:04 +0000</pubDate>
      <link>https://dev.to/numbpill3d/your-lora-board-can-track-airliners-at-150-nautical-miles-aed</link>
      <guid>https://dev.to/numbpill3d/your-lora-board-can-track-airliners-at-150-nautical-miles-aed</guid>
      <description>&lt;p&gt;&lt;em&gt;The datasheet stops at 960 MHz. The airplanes are at 1090. Somebody did the math anyway.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Somewhere over your house right now, a few dozen aircraft are shouting their names into the dark. Altitude, heading, a 24-bit hex identity, all of it on 1090 MHz, all of it plaintext, roughly twice a second, to anyone holding the right piece of copper. For about a decade the right piece of copper was an RTL-SDR dongle hanging off a Raspberry Pi. That arrangement still works. It's also no longer the cheapest way in.&lt;/p&gt;

&lt;p&gt;On November 1, Hackaday covered a build by a developer who goes by thefatmoop: an ADS-B receiver made from a Meshnology W12 board, which pairs an ESP32-S3 with Semtech's new LR2021 LoRa transceiver. No SDR. No Linux. No Pi. The board demodulates the aircraft signal itself, checks the CRC, and serves live tracks on a web page from a chip the size of a postage stamp. The builder reports aircraft at around 150 nautical miles with an indoor antenna that was cut for the wrong band. Parts come in under $50.&lt;/p&gt;

&lt;p&gt;That last detail is the interesting one. The radio was never sold to do this.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Box Says 960 MHz
&lt;/h2&gt;

&lt;p&gt;Pull up the LR2021 spec and you get two published frequency ranges: 150 to 960 MHz for the sub-GHz path, and 1600 to 2500 MHz for the 2.4 GHz and S-band side. ADS-B lives at 1090 MHz, which falls neatly in the gap between them, a dead zone on the marketing sheet.&lt;/p&gt;

&lt;p&gt;The build tunes the sub-GHz path to 1090 anyway, and it hears airplanes.&lt;/p&gt;

&lt;p&gt;There's a whole philosophy of hardware hiding in that sentence. A frequency range on a datasheet is a promise about performance across temperature, voltage and production lots. A warranty, basically. The synthesizer inside a modern transceiver usually has more headroom than the vendor wants to characterize, guarantee and support, so the published number lands where the lawyers and the test engineers are comfortable. Past that number you are on your own, which in practice means the thing usually works a little worse and nobody will help you when it doesn't.&lt;/p&gt;

&lt;p&gt;Every interesting capability in computing started as a misuse. Wi-Fi chips became spectrum analyzers. TV tuner dongles became the RTL-SDR. Now a LoRa transceiver built for battery-powered sensor meshes is pulling Mode S out of the sky. The pins don't care what the box says. They care about tolerances.&lt;/p&gt;

&lt;p&gt;The second reason this works is the modulation list. The LR2021 supports FSK, LoRa, LR-FHSS, FLRC, O-QPSK and OOK. That last one, on-off keying, is the whole trick, because ADS-B is pulses of carrier switched on and off. Strip away the aviation acronyms and an aircraft transponder is a very fast, very loud flashlight.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a Plane Actually Says
&lt;/h2&gt;

&lt;p&gt;ADS-B on 1090 MHz is called Extended Squitter. Each message opens with an 8 microsecond preamble: four short pulses at fixed offsets (0, 1.0, 3.5 and 4.5 microseconds) that work as a fingerprint for "a Mode S frame starts here." After the preamble comes the data block, 112 bits at one megabit per second.&lt;/p&gt;

&lt;p&gt;The encoding is pulse position modulation. Each bit gets a 1 microsecond slot split into two halves. A pulse in the first half is a 1, a pulse in the second half is a 0. If that sounds like Manchester encoding riding on OOK, you've understood it, and that's exactly how the build's write-up describes it.&lt;/p&gt;

&lt;p&gt;Inside those 112 bits:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DF   (5 bits)   downlink format, 17 for ADS-B from a transponder
CA   (3 bits)   capability
AA   (24 bits)  ICAO address, the aircraft's permanent hex identity
ME   (56 bits)  the payload: position, velocity, callsign, depending on type
PI   (24 bits)  CRC-24 parity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CRC is your entire quality gate. At 1090 MHz you're listening to a crowded band full of overlapping replies, reflections and garbage, so the receiver lives or dies on rejecting frames that don't check out. The ESP32-S3 handles that in firmware: frames that fail the CRC go in the bin, frames that pass get decoded into tracks.&lt;/p&gt;

&lt;p&gt;Note what's missing from that bit layout. There's no signature, no key and no nonce. The 2013 academic paper "On the Security of the Automatic Dependent Surveillance-Broadcast Protocol" said it plainly: the data link layer has no authentication. Anyone can listen, and nobody can tell you're listening. Keep that in mind, because it comes back at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Flashing It
&lt;/h2&gt;

&lt;p&gt;The project ships as a GPL-3.0 repository, &lt;code&gt;esp32s3-lr2021-adsb-receiver&lt;/code&gt;, with a factory image in its releases. The flow is short enough to fit on a napkin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. flash the factory image (follow the repo's install guide)
2. join the W12-ADSB-SETUP wifi network the board broadcasts
3. browse to 192.168.4.1/setup and enter your own 2.4 GHz wifi creds
4. read the board's new IP off the 0.96" OLED
5. open that IP from any machine on the same network
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once it's on your LAN, check the receiver diagnostics page before you trust anything. The defaults use the LF (sub-GHz) input. Frequency correction starts in &lt;strong&gt;Observe&lt;/strong&gt; mode, where it measures drift without acting on it. Let it watch real traffic for a while, then flip it to &lt;strong&gt;Apply&lt;/strong&gt;. Cheap crystals drift, and a receiver that's slightly off-frequency looks exactly like a receiver with a bad antenna. People burn hours swapping antennas to fix a calibration problem.&lt;/p&gt;

&lt;p&gt;Use a real USB-C data cable. The charge-only cable in your drawer will flash nothing and tell you nothing about why.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Filter You Have to Kill
&lt;/h2&gt;

&lt;p&gt;Here's where the build stops being a firmware install and turns into a hardware mod.&lt;/p&gt;

&lt;p&gt;The W12's sub-GHz path has a SAW filter, U12, marked &lt;code&gt;2J1&lt;/code&gt;, sitting between the antenna port and the radio. Its job is to pass the LoRa band and reject everything else. It does that job well, which is the problem, because "everything else" includes 1090 MHz.&lt;/p&gt;

&lt;p&gt;The README's fix is surgical. Remove U12, then bridge pads 1 and 4 with an insulated jumper so the antenna feeds the radio directly, and keep the jumper clear of pads 2, 3 and 5. Then connect your antenna to the LF/sub-GHz port.&lt;/p&gt;

&lt;p&gt;A few notes from the bench side of this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a fine tip or hot air. SAW filter packages are small and the pads lift if you get impatient. A tweezer-tip iron or a hot air station on low airflow is the civilized route.&lt;/li&gt;
&lt;li&gt;Thin wire, short run. A short length of 30 AWG Kynar wire is ideal. At a gigahertz, a long loop of jumper is a tiny antenna of its own.&lt;/li&gt;
&lt;li&gt;This is a one-way trip. Once U12 is gone, the LF path is unfiltered. LoRa use on that port gets noisier, and you're exposed to strong out-of-band signals that the filter used to eat. Treat the board as an ADS-B receiver from here on.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can skip the mod. The HF/2.4 GHz input works without it. In the builder's testing, though, range was noticeably shorter on the unmodified path. The difference between 40 miles and 150 miles is one tiny filter and five minutes with a soldering iron.&lt;/p&gt;

&lt;h2&gt;
  
  
  Antennas, and the Wrong One That Works
&lt;/h2&gt;

&lt;p&gt;The headline range came from an indoor 915 MHz antenna, the one cut for LoRa. That works because a 915 MHz whip is close enough to 1090 to resonate badly but usefully, and because airplanes are loud and high with nothing in the way.&lt;/p&gt;

&lt;p&gt;You can do better for the price of a coffee. Wavelength at 1090 MHz is about 275 mm, so a quarter-wave element is about 69 mm. A quarter-wave ground plane (one 69 mm vertical element, four radials drooping at 45 degrees, all soldered to an SMA bulkhead connector) is a classic first antenna build for ADS-B, and it routinely beats store-bought whips. If you'd rather buy one, get something actually labeled for 1090 MHz with a 50 ohm feed.&lt;/p&gt;

&lt;p&gt;Placement beats gain. Line of sight decides everything at this frequency. A cheap antenna in a top-floor window will outperform an expensive one on a desk surrounded by drywall, wiring and a monitor that leaks RF from every seam.&lt;/p&gt;

&lt;p&gt;The optional GNSS module earns its slot here too. When the board knows where it is, range and bearing calculations make sense, and your track list stops being a list of numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Give Up
&lt;/h2&gt;

&lt;p&gt;This is a beautiful hack and an incomplete tool. Know the trade before you sell off your dongle.&lt;/p&gt;

&lt;p&gt;A conventional RTL-SDR station, something like an RTL-SDR Blog V4 [AFFILIATE: RTL-SDR Blog V4] feeding &lt;code&gt;readsb&lt;/code&gt; on a Pi, gives you a few things the W12 doesn't:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MLAT.&lt;/strong&gt; Multilateration locates aircraft that broadcast Mode S without position data by comparing arrival times across many receivers. That needs precise timestamps and a feeder network. The W12 is on its own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feeding aggregators.&lt;/strong&gt; The big community tracking networks expect standard decoder output. A custom ESP32 web page doesn't plug in without extra work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everything else on the spectrum.&lt;/strong&gt; An SDR is a general-purpose radio. Tomorrow it can be an AIS receiver, a weather satellite station or a pager decoder. The W12 does one thing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What you get in exchange is a receiver that boots in seconds, sips power from a USB brick, has no SD card to corrupt and no OS to patch, and costs less than a decent dinner. As a permanent window-sill sensor, a field unit in a go-bag, or a second station somewhere you'd never park a Pi, that trade is easy to justify.&lt;/p&gt;

&lt;p&gt;The project also has honest edges. It's experimental. It's not an official Meshnology or Semtech product. A commenter on the Hackaday piece reported the W12 is hard to find in the US and EU outside Amazon India. Check availability before you plan a weekend around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plaintext Sky
&lt;/h2&gt;

&lt;p&gt;Back to that missing signature.&lt;/p&gt;

&lt;p&gt;ADS-B is a protocol that announces everything and authenticates nothing. That makes it great for hobbyists and quietly uncomfortable for everyone else. Every aircraft with a working transponder broadcasts a permanent 24-bit address. The address maps to a registration. The registration maps to an owner. Log it for a month from one window and you have a pattern of life: who flies, when, where they go and how often they come back.&lt;/p&gt;

&lt;p&gt;That's the OSINT angle, and it's why aircraft tracking keeps turning up in investigative work. Corporate jets telegraph acquisitions. Government flights telegraph visits. Private planes telegraph exactly what their owners would prefer they didn't. A $50 receiver that logs every ICAO address it hears is a surprisingly sharp instrument once you start keeping notes. If you go that route, a structured intel log matters more than the radio does. The template set in &lt;strong&gt;Obsidian + Claude Daily Ops&lt;/strong&gt; (numbpilled.gumroad.com/l/obsidian-claude) was built for exactly this kind of recon-notebook habit, where raw captures become something you can actually search six weeks later.&lt;/p&gt;

&lt;p&gt;The same plaintext design that makes listening easy makes injection theoretically easy, and that's been a research topic for over a decade: ghost aircraft, spoofed positions, the lot. Leave it on the page. Receiving 1090 MHz is legal in most places. Transmitting on it is the kind of mistake that ends with very serious people at your door, because you'd be interfering with live air traffic safety systems. The W12's radio can transmit. Don't let it near 1090 on the way out.&lt;/p&gt;

&lt;p&gt;Defenders have the mirror-image problem: a receiver network that trusts plaintext can be fooled. Plausibility checks, multilateration and cross-referencing against primary radar are how serious systems cope. A single-board receiver like this one makes a nice teaching tool for that conversation, because it shows you exactly how little stands between the sky and your screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to Take It
&lt;/h2&gt;

&lt;p&gt;Build one, mod the filter, cut a 69 mm ground plane, stick it in the highest window you have, and let it run for a week. Then point something at the data. Log every ICAO address to a file, count unique aircraft per hour, and flag any address you've seen more than ten times. Within a few days you'll know which tail numbers own your sky.&lt;/p&gt;

&lt;p&gt;If this build hit the part of your brain that likes turning cheap ESP32 boards into field sensors, the rest of that playbook lives in &lt;strong&gt;Hardware Hacking for OSINT: Raspberry Pi War-Driving Box&lt;/strong&gt; (numbpilled.gumroad.com/l/pidriver). It's the long-form version of this post's instincts: RF capture, firmware, and turning passive collection into intelligence without paying anyone a subscription.&lt;/p&gt;

&lt;p&gt;The datasheet said 960. The airplanes said 1090. The airplanes were right.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Sources: Hackaday, "Building An ADS-B Receiver For Less Than You Think" (Nov 1, 2026); github.com/thefatmoop/esp32s3-lr2021-adsb-receiver; CNX Software on the Semtech LR2021; Strohmeier, Lenders and Martinovic, "On the Security of the Automatic Dependent Surveillance-Broadcast Protocol" (arXiv:1307.3664).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tutorial</category>
      <category>security</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Python Scripts That Pay Rent</title>
      <dc:creator>v. Splicer</dc:creator>
      <pubDate>Sat, 31 Oct 2026 22:58:39 +0000</pubDate>
      <link>https://dev.to/numbpill3d/python-scripts-that-pay-rent-5dg9</link>
      <guid>https://dev.to/numbpill3d/python-scripts-that-pay-rent-5dg9</guid>
      <description>&lt;p&gt;If you do it twice, you script it. If you script it well, you sell it.&lt;/p&gt;

&lt;p&gt;I didn't learn Python to get a job. I learned it to stop doing jobs I hated.&lt;/p&gt;

&lt;p&gt;For 6 months, I watched myself do the same dumb, manual tasks every single day. Digging through 50,000 lines of logs to find why a site crashed. Checking HaveIBeenPwned every time I used the same password twice. Copy-pasting client names into an invoice template like it was 1998.&lt;/p&gt;

&lt;p&gt;Then I stopped learning and started automating.&lt;/p&gt;

&lt;p&gt;The shift is simple: Stop asking "what can Python do?" and start asking "what am I already doing that's annoying as hell?"&lt;/p&gt;

&lt;p&gt;Those annoying things are rent-paying scripts. Because if it annoys you, it annoys 10,000 other people. And they will pay $19 to never do it again.&lt;/p&gt;

&lt;p&gt;Here are 3 scripts from my actual pack that now pay my internet bill, my coffee habit, and then some. Steal them, use them, and I'll show you how to turn them into a Gumroad product in 2 hours.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Framework: From Chore to Cash
&lt;/h3&gt;

&lt;p&gt;Most Python tutorials are backwards. They teach you &lt;code&gt;for loops&lt;/code&gt; and then give you a fake problem.&lt;/p&gt;

&lt;p&gt;Real automation works like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Identify The Repeat:&lt;/strong&gt; Anything you do 2x per week manually.&lt;br&gt;
&lt;strong&gt;2. Script The Ugly Version:&lt;/strong&gt; It doesn't need to be pretty. It needs to work for YOU.&lt;br&gt;
&lt;strong&gt;3. Productize The Clean Version:&lt;/strong&gt; Add arguments, error handling, a README. That's a tool.&lt;br&gt;
&lt;strong&gt;4. Sell The Result, Not The Code:&lt;/strong&gt; Nobody wants "a Python script." They want "never manually parse logs again."&lt;/p&gt;

&lt;p&gt;Let's build it.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Log Parser That Saves Your Sanity (and Your Saturday)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Annoying Shit:&lt;/strong&gt; Your client says "the site was down at 3 AM." You open &lt;code&gt;access.log&lt;/code&gt;. It's 300MB. It's just IP - - [timestamp] "GET /..." 200.&lt;/p&gt;

&lt;p&gt;You &lt;code&gt;Ctrl+F&lt;/code&gt; for "500" like an animal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Script:&lt;/strong&gt; &lt;code&gt;log_hunter.py&lt;/code&gt; — Finds the real problems in seconds.&lt;/p&gt;

&lt;p&gt;This is the script I use for every freelance server I touch. It finds 5xx errors, counts top failing endpoints, and flags suspicious IPs that are hammering you.&lt;br&gt;
&lt;strong&gt;Use it:&lt;/strong&gt; &lt;code&gt;python log_hunter.py /var/log/nginx/access.log&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it sells:&lt;/strong&gt; Every indie hacker,  freelancer, and junior DevOps guy has this exact problem. They don't want to learn regex. They want to run one command and send a screenshot to their client. I sell this as part of a "Server Rescue Kit" for $19. It took me 45 minutes to write.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Credential Leak Checker That Stops You From Getting Pwned
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Annoying Shit:&lt;/strong&gt; You have a &lt;code&gt;.env&lt;/code&gt; file with 30 API keys. You have old projects on . You have that one &lt;code&gt;config_old_backup.json&lt;/code&gt; you forgot about. Did you leak a Stripe key 8 months ago? You have no idea until Stripe emails you saying "we rotated your key."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Script:&lt;/strong&gt; &lt;code&gt;leakpatrol.py&lt;/code&gt; — Scans your own machine like an attacker would.&lt;/p&gt;

&lt;p&gt;This one is paranoid and valuable. It scans a directory for high-entropy strings, known key patterns (, Stripe, GitHub PATs), and .env files left in git.&lt;br&gt;
&lt;strong&gt;Use it:&lt;/strong&gt; Drop it in any project folder and run &lt;code&gt;python leakpatrol.py&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it sells:&lt;/strong&gt; Fear is a great motivator. This script sells to freelancers and founders who are terrified of getting that email from AWS about a $4,000 bill because they leaked a key. I package it as "Pre-Commit Security Guard" and upsell a GitHub Action version. People pay for peace of mind.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The Invoice Auto-Gen That Actually Gets You Paid
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Annoying Shit:&lt;/strong&gt; It's the 30th. You have to make 5 invoices. You open . You open last month's invoice. You change the dates. You change the numbers. You miscalculate. You hate your life for 45 minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Script:&lt;/strong&gt; &lt;code&gt;invoice_machine.py&lt;/code&gt; — From a CSV to a PDF invoice in 2 seconds.&lt;/p&gt;

&lt;p&gt;This one literally pays rent. I bill hourly. I track work in a simple CSV. This script turns that CSV into a professional PDF and calculates tax, totals, everything.&lt;br&gt;
&lt;strong&gt;Use it:&lt;/strong&gt; Keep a &lt;code&gt;work.csv&lt;/code&gt; for each client. Run it. Send the PDF.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it sells:&lt;/strong&gt; This is not for developers. It's for designers, writers, video editors, VAs — anyone who freelances. They don't want to learn FPDF. They want to stop using a free invoice generator that puts a watermark on their invoice. This is a $29 product all day long called "Freelancer Invoice Automator."&lt;/p&gt;




&lt;h3&gt;
  
  
  How To Turn A Script Into A Product In 2 Hours
&lt;/h3&gt;

&lt;p&gt;Having 3 scripts is cool. Having a Gumroad page that makes $17 while you sleep is cooler. Here's the exact playbook I use with &lt;strong&gt;Quickforge&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Most people fail here because they try to sell code. Don't sell code. Sell time and outcome.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hour 1: Tool-ify It&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your messy script is not a product. A tool is.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Add Argparse:&lt;/strong&gt; Nobody wants to edit line 23 to change the file path. Let them do &lt;code&gt;python tool.py --file access.log&lt;/code&gt;. All 3 scripts above already do this.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Add a README.md that sells:&lt;/strong&gt; Not "how it works." "What it does for you."&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Make it executable:&lt;/strong&gt; Add a &lt;code&gt;requirements.txt&lt;/code&gt; (even if it's just &lt;code&gt;fpdf2&lt;/code&gt;). Make a single folder.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is what Quickforge does for me in one click. It takes my script and wraps it into a CLI, adds the error handling, and builds a distributable ZIP. It turns "some Python file" into "a real tool you can run."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hour 2: Gumroad-ify It&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Bundle, Don't Single Out:&lt;/strong&gt; Don't sell 1 script for $5. Sell "3 Rent-Paying Python Scripts" for $29. Or "The Automation Pack for Freelancers" for $49. Value stacking.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Record a 45-second demo:&lt;/strong&gt; Use Loom. Show the annoying manual way (scrolling a log file for 10 seconds). Then show your script fixing it in 2 seconds. That video is your Gumroad cover.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Write the description for the lazy buyer:&lt;/strong&gt; Use this template:
&amp;gt; &lt;strong&gt;You do [annoying task] manually. This stops it.&lt;/strong&gt;
&amp;gt; You get:
&amp;gt; - log_hunter.py (Find crashes in seconds)
&amp;gt; - leakpatrol.py (Find your leaked keys before hackers do)
&amp;gt; - invoice_machine.py (Turn a CSV into a paid invoice)
&amp;gt; Perfect for: Freelancers, indie hackers, junior devs who want their time back.
&amp;gt; No Python expertise needed. Just run it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Upload the ZIP. Set the price to $29. Publish.&lt;/p&gt;

&lt;p&gt;You now have a product. Not a script.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Killer Bundle: Why This Works Right Now
&lt;/h3&gt;

&lt;p&gt;The reason I'm pushing this bundle so hard is that the two pieces solve each other's problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Python Automation Secrets&lt;/strong&gt; is the library. It's 50+ scripts like these three, but categorized: client work, security, finance, content. You don't have to come up with ideas. You just pick the annoying thing that matches your life.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quickforge&lt;/strong&gt; is the factory. It solves the reason 99% of automation scripts never make money — they stay as messy &lt;code&gt;.py&lt;/code&gt; files on your desktop. Quickforge turns them into polished, sellable tools with a README, CLI, and installer without you learning packaging.&lt;/p&gt;

&lt;p&gt;You need both. The Secrets give you the ammo. Quickforge gives you the gun.&lt;/p&gt;

&lt;p&gt;If you do one annoying thing twice this week, you have your first product. I gave you three.&lt;/p&gt;

&lt;p&gt;Stop learning Python. Start automating your rent away.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want the full pack + the tool that packages it? Get the Python Automation Secrets + Quickforge bundle here. It's the only tutorial where the homework pays you back.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;P.S. Drop your most annoying recurring task in the comments. I'll reply with the exact script I'd write to kill it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>tutorial</category>
      <category>python</category>
      <category>programming</category>
    </item>
    <item>
      <title>Debugging at 3 AM: A Horror Story With No Villain Except Me</title>
      <dc:creator>v. Splicer</dc:creator>
      <pubDate>Sat, 31 Oct 2026 04:35:34 +0000</pubDate>
      <link>https://dev.to/numbpill3d/debugging-at-3-am-a-horror-story-with-no-villain-except-me-me</link>
      <guid>https://dev.to/numbpill3d/debugging-at-3-am-a-horror-story-with-no-villain-except-me-me</guid>
      <description>&lt;p&gt;Production was down, the dashboard was bleeding red, and every suspect had an alibi. The killer had my git credentials.&lt;br&gt;
3:04 A.M.&lt;/p&gt;

&lt;p&gt;The phone glows at 3:04 in the morning, and there is a grammar to that light. Not the white of a text from someone who loves you. Not the green of a package arriving. The amber of the paging app — the color of weather emergencies and furnace warnings; the color machines use when they want to inform you, courteously, that something you built is misbehaving in public.&lt;/p&gt;

&lt;p&gt;I sat up in the dark and opened the laptop, which lit my face the way open freezers do in films about regret.&lt;/p&gt;

&lt;p&gt;The dashboard was a Jackson Pollock painted entirely in red. Our authentication service — the front door of the product, the one service contractually obligated to be boring — was failing at a rate I had previously considered theoretical. Users weren't just failing to log in. They were being logged out. Mid-session, mid-sentence, all across the map, in every timezone our little empire covers.&lt;/p&gt;

&lt;p&gt;Every engineer has a private horror story, and we tell them the way fishermen describe weather: exaggerated, semi-mythological, absolutely load-bearing. I want to tell you mine as what it actually was — a horror story — because it has every required element. A remote cabin (my apartment). A storm (rain, theatrical, unpaid). An isolated protagonist (me, insufferable). And a monster no search party could ever find, because I was about to spend four hours learning that the monster had my face and my commit history.&lt;/p&gt;

&lt;p&gt;What it doesn't have is a villain. That's the part the genre never prepares you for.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Fine Art of Needing Someone to Blame
&lt;/h3&gt;

&lt;p&gt;Every incident has a casting call, and mine convened immediately.&lt;/p&gt;

&lt;p&gt;Suspect one: the deploy. It is always the deploy; this is the closest thing software has to folk wisdom, and folk wisdom survives because it is usually right. I checked. Nothing had shipped in four days. The most recent release had the alibi of sediment.&lt;/p&gt;

&lt;p&gt;Suspect two: the network. "It's not DNS," I told the empty room. "There is no way it's DNS." I checked the DNS anyway, the way you check behind the shower curtain in a horror film — not because you expect to find anything, but because the genre demands one token act of courage. The DNS was fine. Somehow its innocence felt like a betrayal.&lt;/p&gt;

&lt;p&gt;Suspect three arrived on schedule, and I am not proud of this: the new engineer. She joined three weeks ago. She had shipped nothing, touched nothing, and was, at that moment, asleep like a person with a clear conscience — statistically the most suspicious condition there is. By 3:40 I had mentally drafted a post-mortem with her name in it. Gently worded. Professionally devastating.&lt;/p&gt;

&lt;p&gt;Here is what I was actually doing, though I lacked the vocabulary for it at the time: running a comfort ritual. Humans are blame-seeking missiles. Hand us an unexplained catastrophe and we will generate a villain with the reflexive urgency of an immune response. Villains make chaos narratable. A system that failed for seventeen interacting reasons is a nightmare you can't repeat at parties; a system that failed because Dana pushed on Friday is a story, and stories feel like control.&lt;/p&gt;

&lt;p&gt;The safety literature worked this out decades ago, in an industry that counts its dead. James Reason's Swiss cheese model — the one from aviation, the one that says disasters happen when the holes in several layers of defense happen to line up — exists precisely because "one careless person" is almost never the truth of a serious failure. Charles Perrow went further in Normal Accidents and argued that in systems complex enough, breakdowns are not anomalies at all. They're residents. They pay rent.&lt;/p&gt;

&lt;p&gt;I knew all of this. I had once cited it at an all-hands, in a confident voice, with a slide. At 3:40 A.M., knowledge and comfort are different organs, and only one of them was working.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Bug With a Bedtime
&lt;/h3&gt;

&lt;p&gt;Salvation, when it came, came from the most suspicious direction available: arithmetic.&lt;/p&gt;

&lt;p&gt;Coffee number three had arrived not as a beverage but as a coping mechanism with a handle. I stopped staring at the aggregate error graph — staring at aggregates at 4 A.M. is just doom with a scrollbar — and sliced the errors by hour instead.&lt;/p&gt;

&lt;p&gt;And the error rate had a bedtime.&lt;/p&gt;

&lt;p&gt;3:00 A.M. Sharp. A spike, a twenty-minute decay, silence. I scrolled back one day: 3:00 A.M., spike, decay, silence. Two days: the same. Seven nights, the same. A metronome wearing a ski mask. Whatever this was, it wasn't random and it wasn't ambient. It was scheduled. Something in my system looked at its watch every night, said now, and did a murder.&lt;/p&gt;

&lt;p&gt;Naturally, it refused to happen in staging. I pointed every instrument I owned at the staging environment and it sat there, serene, error-free, smug in the way only a system without real traffic can be. For one feverish hour this felt like a genuine heisenbug — a bug that flees observation, a witness who heard a noise and declines to repeat it. Purists will object that an environment difference is not a true heisenbug, and the purists are right, but at 4:20 A.M. every bug that hides from daylight qualifies as uncanny.&lt;/p&gt;

&lt;p&gt;I explained all of this, in detail, to the rubber duck on my desk. His name is Vladimir. He has heard things. He said nothing, which is his gift.&lt;/p&gt;

&lt;p&gt;The clue that cracked it was almost embarrassing: the staging servers believed, sincerely and wholeheartedly, that they lived in UTC. The production servers lived in local time. Everything else was identical. Which meant the variable I had been treating as scenery — the clock — was the weapon.&lt;/p&gt;

&lt;p&gt;Time zones are the Cthulhu of computing: ancient, tentacled, worshipped entirely by accident. Nobody believes in them until one reaches up out of the deep and takes a production system with it.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Séance Called git blame
&lt;/h3&gt;

&lt;p&gt;Follow the mechanics forward and the picture assembles itself with the awful neatness of a locked-room mystery finally solved.&lt;/p&gt;

&lt;p&gt;The mass logouts came first. The errors were just the thundering herd of evicted users stampeding back toward the door. The logouts were evictions — something was deleting live sessions. And there was only one thing in the entire system with delete rights: a cleanup job, a cron, that pruned "expired" sessions every night while the city slept.&lt;/p&gt;

&lt;p&gt;In its WHERE clause, the definition of expired was computed with one clock, while the sessions themselves had been stamped with another. For one window every night, the two clocks disagreed about whether it was still today — and during that window, the job scanned every live session in the database, judged them all ancient beyond recovery, and deleted them. All of them. Then it tidied up, logged its success, and went back to sleep until tomorrow.&lt;/p&gt;

&lt;p&gt;And the schedule? The cron ran at 3:00 A.M., because 3:00 A.M. is when traffic is lowest. I know this with terrible intimacy, because I scheduled it there myself, a lifetime ago, in a pull request I described — I checked — as "safe."&lt;/p&gt;

&lt;p&gt;One clock stamps. Another clock judges. Once a night, they disagree. The rest is arithmetic wearing a hockey mask.&lt;/p&gt;

&lt;p&gt;I ran git blame on the comparison, which is less like forensics and more like a séance: you summon the dead, you ask who did this, and the answer always arrives in monospace. The blame lit up line by line, and then it landed on a commit from 241 days ago, with a message I have now read so many times I've stopped flinching:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;quick fix: make cleanup behave for now, will revisit after launch&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Author: me. Reviewer: me. And one line above it, written in my exact voice, a comment: // temporary, do not let this ship as-is.&lt;/p&gt;

&lt;p&gt;I shipped it as-is.&lt;/p&gt;

&lt;p&gt;I want to be precise about the feeling, because "the call is coming from inside the house" is a horror trope for a reason, and the reason is that the house is you. I read that code the way you reread a text you sent at a party: with dawning, pixel-by-pixel horror, at a stranger who had my name, my typing cadence, and my signature joke in the comments. I don't remember writing it. I remember launch week — I remember being exhausted and certain, which is the same memory wearing different clothes. Somewhere between then and now, that line stopped being mine and became the system's. Then the system handed it back to me at 3:04 A.M., with interest.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Call Was Coming From Inside the Commit
&lt;/h3&gt;

&lt;p&gt;Here is the thing I understood at around five in the morning, sitting in the wreckage of my own certainty — the thing I'd stay up all night again to keep:&lt;/p&gt;

&lt;p&gt;A bug is not an intrusion. A bug is a disagreement — the residue left where the system in your head and the system in production quietly parted ways. Alfred Korzybski said the map is not the territory; code is a map we hand to a machine, and the machine is a perfectly literal client. It never rounds up toward our intentions. It executes the gap between what we meant and what we said — at nine digits a second, forever, until somebody notices.&lt;/p&gt;

&lt;p&gt;And the noticing is science. Genuinely, structurally science. Every suspect I ran down that night was a hypothesis — the deploy, the network, the innocent new hire — and the logs were nature's answer: no, no, and no. Karl Popper would have recognized the procedure instantly. I wasn't debugging; I was falsifying. I was doing rigorous, disciplined science all night. I just hadn't expected the final theory to be me.&lt;/p&gt;

&lt;p&gt;That's the twist the genre keeps missing. We tell debugging stories as detective stories — find the culprit, restore order, roll credits. But there is no culprit, because the culprit is a condition: complexity plus time plus a confident human moving quickly. Edsger Dijkstra — who never once let a good sentence go unsaid — put the quiet part loudly: "Program testing can be used to show the presence of bugs, but never to show their absence." Absence of bugs cannot be demonstrated. Only deferred. Every codebase is a haunted house where all the ghosts are future versions of the people currently alive.&lt;/p&gt;

&lt;p&gt;Douglas Hofstadter wrote whole beautiful books about systems that contain their own self-reference — loops that point at themselves and turn strange. We ship those weekly. We just call it Tuesday.&lt;/p&gt;

&lt;p&gt;So I gazed into the stack trace, and the stack trace gazed back into me, and it used my font.&lt;/p&gt;

&lt;h3&gt;
  
  
  Absolution Is Not a Deploy
&lt;/h3&gt;

&lt;p&gt;The fix was one line. I want that on the record, because the disproportion is both the punchline and the lesson: a week of 3 A.M. pages, four hours of dread, one small theological crisis — resolved by teaching two clocks to agree. One word, effectively. Eight months of latent catastrophe, priced at less than a tweet.&lt;/p&gt;

&lt;p&gt;Then I did the three things that actually mattered, none of which were the line of code.&lt;/p&gt;

&lt;p&gt;I made staging's clocks match production's, because "works in staging" should at minimum mean "works on the same planet." I added an alert on mass logouts specifically, because error rates are the scream and logouts are the whisper, and monitors that only hear screams will always fail you at exactly the volume that matters. And I wrote the post-mortem, and I put my own name in the root cause field.&lt;/p&gt;

&lt;p&gt;That last one is the bravest sentence in engineering: I did this. Not as penance. There were no robes, no ritual shaming, no wheel-of-misfortune slide at the all-hands. Blameless doesn't mean consequence-free — it means the consequence is knowledge. The document said, plainly: a well-meaning engineer, under launch pressure, shipped a temporary change with no ticket, no reminder, and no monitoring that could have caught it for 241 days. Remove any one of those conditions and the incident doesn't happen. Which means the fix was never "be more careful." The fix is "build a system where careful is not a heroic act."&lt;/p&gt;

&lt;p&gt;Reason's Swiss cheese, again: I wasn't the hole. I was the unlucky alignment of the holes, wearing a lanyard.&lt;/p&gt;

&lt;p&gt;At 6:40 the sun came up, indifferent, like a build that passes on the second try. I bought the new engineer a coffee and told her she'd been acquitted of a crime she never knew she was charged with. She laughed. Then she made me show her the diff, and she asked the question every senior engineer should be asked monthly:&lt;/p&gt;

&lt;p&gt;"Who else has a TODO like this?"&lt;/p&gt;

&lt;p&gt;We found four. Each had my fingerprints, or hers, or someone's — because that is what fingerprints are. Evidence that a human was here. And humans are how the future pages you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Epilogue for the Next One
&lt;/h3&gt;

&lt;p&gt;The next horror story has no villain either. Statistically speaking, it's you.&lt;/p&gt;

&lt;p&gt;Not because you're careless — because you're fast, and confident, and navigating a map so much larger than any territory one person can hold. Seniority in this field isn't the accumulation of tricks. It's the slow, expensive process of updating your priors against your own evidence. Every scar is data. Every 3 A.M. is a peer review conducted by a merciless machine.&lt;/p&gt;

&lt;p&gt;So, some benedictions — cheap, and hard-earned:&lt;/p&gt;

&lt;p&gt;Write TODOs with dates, not vibes. Temporary, in production, means geological. Schedule your crons at hours you have personally witnessed while awake. And mistrust any diff you'd describe as "safe" in a pull request titled "small cleanup" — the monster is always introduced as a minor character.&lt;/p&gt;

&lt;p&gt;The bugs of the future are being written right now, by people who are certain. The only defense our species has found is humility with instrumentation: assume the map is wrong, watch the territory, and when something finally pages you at 3 A.M., skip the séance. Open the blame. Say hello to the author.&lt;/p&gt;

&lt;p&gt;Your turn: tell me about your 3 A.M. monster in the comments. I promise I won't ask who wrote it.&lt;/p&gt;

&lt;p&gt;The answer is always the same.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>discuss</category>
      <category>learning</category>
      <category>github</category>
    </item>
    <item>
      <title>6 Ways AI Changes OSINT (For People Who Already Do It Manually)</title>
      <dc:creator>v. Splicer</dc:creator>
      <pubDate>Fri, 23 Oct 2026 16:01:12 +0000</pubDate>
      <link>https://dev.to/numbpill3d/6-ways-ai-changes-osint-for-people-who-already-do-it-manually-341m</link>
      <guid>https://dev.to/numbpill3d/6-ways-ai-changes-osint-for-people-who-already-do-it-manually-341m</guid>
      <description>&lt;p&gt;&lt;em&gt;You were pivoting before it was a prompt. Here's what the machines actually add to the craft — and what they still can't do for you.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There are two kinds of people reading this. The ones who discovered OSINT last year because an AI told them it was a lucrative career path, and the ones who were manually pivoting through breach dumps, certificate logs, and decade-old forum posts while the rest of the world was still asking chatbots to write haikus about the weather.&lt;/p&gt;

&lt;p&gt;This one's for group two.&lt;/p&gt;

&lt;p&gt;You don't need the craft explained to you, and you can smell a thought-leader post from three tabs away. So no hype here, no "AI will replace investigators," no carousel energy. Just six changes that are actually real, rated honestly by someone who respects your workflow: some of these will save you hours, one of them will save your case, and all of them come with fine print the demos never mention.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Local models killed the "where can I safely paste this" problem
&lt;/h2&gt;

&lt;p&gt;Every investigator knows the reflex. You're holding a juicy chunk of text — a scraped bio, a membership list, sixty pages of forum rambling from a guy who definitely did the thing — and before you run it through a cloud tool, you pause. Whose servers does this touch? Whose logs does it land in? Am I about to leak my case to a third party to save twenty minutes?&lt;/p&gt;

&lt;p&gt;Local models ended that negotiation. Run an open-weights model on your own hardware — Ollama, LM Studio, whatever fits your stack — and the entire analysis loop closes on your machine. Entity extraction, timeline reconstruction, matching three different transliterations of the same alias: all offline, all private, all yours.&lt;/p&gt;

&lt;p&gt;This isn't a nice-to-have. If your work touches journalists' sources, confidential clients, or anything with a legal tail, &lt;strong&gt;"I uploaded the dossier to a chatbot"&lt;/strong&gt; is not a sentence you want to say out loud in any room with better acoustics than a parking garage.&lt;/p&gt;

&lt;p&gt;And the hardware bar is lower than the pitch decks claim. A mid-range machine runs 7B to 14B parameter models comfortably, and for extraction-grade tasks that's plenty. You don't need a data center. You need discipline.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Summarization got free. Judgment didn't.
&lt;/h2&gt;

&lt;p&gt;AI is genuinely, almost offensively good at one thing OSINT people hate: reading garbage. Four hundred pages of scraped soup. Eleven thousand forum posts. A company's entire changelog since 2014. A model compresses that into structure in minutes, for free, without complaint.&lt;/p&gt;

&lt;p&gt;But compression is not investigation. The model will faithfully summarize everything — except the one detail that mattered, because it doesn't know what mattered. It has no case. No stake. No memory of the alias that felt wrong on Tuesday.&lt;/p&gt;

&lt;p&gt;So the division of labor is simple: &lt;strong&gt;the machine reads the corpus, you decide the next hop.&lt;/strong&gt; The moment you offload the "what's next" decision too, you get the average of everything. And the average of everything is exactly where investigations go to die.&lt;/p&gt;

&lt;p&gt;Pivot logic is still the product. You've just been promoted off the reading engine.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Prompt pipelines turn one-off queries into repeatable tradecraft
&lt;/h2&gt;

&lt;p&gt;If your entire AI technique is retyping "extract all usernames, emails, phone numbers and organizations from this text" every session, you're using a language model like a vending machine. It works. It's also the tradecraft equivalent of re-typing your wordlists by hand each time.&lt;/p&gt;

&lt;p&gt;The practitioners actually getting leverage build prompt libraries the way they built bash aliases: written once, tested against known input, versioned, reused. Same input schema in, same output schema out. Which means results become diffable — you can run the same extraction prompt across thirty groups, or across the same source today versus last month, and compare structure instead of squinting at vibes.&lt;/p&gt;

&lt;p&gt;That's the difference between doing OSINT and owning an OSINT workflow. Your prompts are tradecraft. Write them like it: store them with your tooling, review them like code, and stop keeping your best one in a chat history you'll never find again.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Agents are sentries, not oracles
&lt;/h2&gt;

&lt;p&gt;The real unlock isn't asking an AI questions. It's having something that watches while you don't.&lt;/p&gt;

&lt;p&gt;Agent-assisted correlation looks like this: scheduled runs that check whether your target's username just appeared on a platform you haven't covered. Monitors that watch domains adjacent to your subject for content changes. A quiet loop over paste sites and fresh breach drops, matching against your indicators, pinging you only when an edge in the graph actually moves.&lt;/p&gt;

&lt;p&gt;You stop losing whole afternoons to "did anything change since Tuesday?" &lt;strong&gt;The machine watches the graph. You get pinged when it matters.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is also where your case notes stop being a graveyard and become infrastructure. If your research lives in a connected structure — an Obsidian vault, a graph tool, whatever you actually maintain — an agent can walk it, re-check stale nodes, and surface the dead-end lead from 2021 that just got interesting again.&lt;/p&gt;

&lt;p&gt;One rule, learned expensively by the field: an agent that acts without logged reasoning is a liability with a nicer interface. Make it show its work.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Cross-language pivots got cheap
&lt;/h2&gt;

&lt;p&gt;Non-English sources used to be a wall. Behind it: entire regional platforms, marketplaces, and forums that knew they were invisible to the average investigator — and behaved accordingly. Either you spoke the language, you paid a translator, or you had a very high tolerance for machine translation's avant-garde poetry.&lt;/p&gt;

&lt;p&gt;Multimodal models kicked that wall down. They read the signage in the corner of a photo. They translate regional slang without collapsing. They notice that the storefront in the background, the vegetation, and the watermark style on a classified listing all point the same direction. The uncaptioned photo your target posted now says: this is a Portuguese-speaking area, and this watermark pattern is common to Brazilian listing sites.&lt;/p&gt;

&lt;p&gt;Verification stays yours — models hallucinate place names with unshakeable confidence, and confident is not correct. But the wall became a door. And if you only ever hunted in English, understand that your hit rate was artificially capped your whole career. Most of the internet is not in English. Your targets, as it turns out, knew that.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Your targets have AI too
&lt;/h2&gt;

&lt;p&gt;The uncomfortable one. The same tooling that accelerates you accelerates everyone you investigate.&lt;/p&gt;

&lt;p&gt;Synthetic personas now ship with generated faces, coherent five-year posting histories, and opinions that poll well. Sockpuppets are written by language models and no longer smell like 2019-era bots. Voice cloning turns "urgent call from the client" into a convincing thirty seconds.&lt;/p&gt;

&lt;p&gt;So provenance is the new baseline, not a bonus round. Account age versus content depth. The too-coherent biography. The contact who can only ever communicate in text. &lt;strong&gt;Verify through a second channel before you trust a first impression — every single time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's the craft correction the panic posts miss: &lt;strong&gt;AI didn't kill OSINT. It killed lazy OSINT.&lt;/strong&gt; Verification went from "best practice" to "the entire job," and honestly? That's a promotion for the people who were doing it right anyway.&lt;/p&gt;

&lt;p&gt;And the paranoid cherry on top: some of what you scrape is now AI-generated noise, seeded specifically to poison collectors. Telling signal from slop is a billable skill now.&lt;/p&gt;

&lt;h2&gt;
  
  
  What AI still can't do
&lt;/h2&gt;

&lt;p&gt;A credibility check, because someone always needs one.&lt;/p&gt;

&lt;p&gt;The model doesn't know which lead stinks. It can't feel the wrongness of an alibi that's technically plausible but rhythmically off. It doesn't get warrants, doesn't testify, doesn't carry the ethics of the craft, and will never once wonder whether it should.&lt;/p&gt;

&lt;p&gt;Feed it garbage and it returns confident, beautifully formatted garbage — the most dangerous file format in existence. It will connect two entities that share nothing but a typo and present the connection with the calm authority of a court exhibit.&lt;/p&gt;

&lt;p&gt;Judgment, gut feel, documentation discipline, ethics: still yours. &lt;strong&gt;The machine raises your ceiling. It does not lower your standards.&lt;/strong&gt; An AI-native investigator with manual-era fundamentals is a genuine nightmare for the other side. The reverse is a chat bubble with a subscription.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start small, start loud
&lt;/h2&gt;

&lt;p&gt;Three moves this week, none of which require cosplaying:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One: run a local model.&lt;/strong&gt; Ollama and a 7B-class model on hardware you already own. First rule of the AI-native vault: nothing about a case leaves your machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two: build five reusable prompts.&lt;/strong&gt; Extraction, summarization, timeline, contradiction-checking, username-mapping. Version them, test them, keep them next to your wordlists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three: wire the outputs into your graph.&lt;/strong&gt; If your notes don't compound, you're still reset-every-session — which is precisely the manual-era problem this whole wave was supposed to fix.&lt;/p&gt;

&lt;p&gt;The ghost route taught you that privacy is a practice, not a purchase. Same energy here: the toolkit changes, the operator remains.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>security</category>
      <category>automation</category>
    </item>
    <item>
      <title>I Turned a $50 Pocket Computer Into an Occult Operating System Because Modern Computing Has Lost Its Mind</title>
      <dc:creator>v. Splicer</dc:creator>
      <pubDate>Thu, 22 Oct 2026 15:26:17 +0000</pubDate>
      <link>https://dev.to/numbpill3d/i-turned-a-50-pocket-computer-into-an-occult-operating-system-because-modern-computing-has-lost-3gie</link>
      <guid>https://dev.to/numbpill3d/i-turned-a-50-pocket-computer-into-an-occult-operating-system-because-modern-computing-has-lost-3gie</guid>
      <description>&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%2Fp5i21y4s1fqvim6kf4rd.gif" 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%2Fp5i21y4s1fqvim6kf4rd.gif" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;16 applications. A Daedric interface. Generative synthesis, wireless reconnaissance, experimental motion sensing, and a tiny browser for the forgotten internet. All running on an ESP32-S3.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There's something profoundly irritating about how boring computers have become.&lt;/p&gt;

&lt;p&gt;We have absurd amounts of processing power. Graphics hardware capable of simulating realistic lighting. Neural networks that can generate entire applications while confidently inventing three nonexistent dependencies. Yet practically every interface looks like it escaped from the same corporate design meeting.&lt;/p&gt;

&lt;p&gt;Rounded rectangles. Carefully selected shades of gray. A sidebar. Another sidebar. A button that used to do something useful but now opens a subscription page.&lt;/p&gt;

&lt;p&gt;Your computer has sixteen cores and apparently the imagination of an insurance company.&lt;/p&gt;

&lt;p&gt;Meanwhile, a tiny ESP32-S3 with a 240 × 135 display is perfectly capable of becoming a synthesizer, a network observatory, a procedural graphics machine, and a portal to the weirder corners of the internet.&lt;/p&gt;

&lt;p&gt;So I built something called &lt;strong&gt;DIVINER&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It's a custom firmware environment for the M5Stack Cardputer ADV, containing sixteen applications inside a hand-crafted Daedric interface. Wireless networks become constellations. Bluetooth devices drift across the display like strange little familiars. Mathematical expressions produce audio. The menu is written in the fictional alphabet from Morrowind, and its glyphs dissolve into English when you navigate through it.&lt;/p&gt;

&lt;p&gt;Some of the software is genuinely practical. Some of it is experimental. Some of it exists because I believe a computer should occasionally do something that makes you wonder whether it's entirely pleased to see you.&lt;/p&gt;

&lt;p&gt;The complete source code is available here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/numbpill3d/cardputer-adv-diviner" rel="noopener noreferrer"&gt;DIVINER on GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And the hardware project, build details, and development documentation live here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://hackaday.io/project/207156-diviner-occult-firmware-for-cardputer-adv" rel="noopener noreferrer"&gt;DIVINER on Hackaday.io&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The firmware is open source. There's a prebuilt binary in the repository, and a desktop simulator for anyone interested in exploring the software without owning the hardware.&lt;/p&gt;

&lt;p&gt;But the part worth discussing isn't simply that I managed to cram sixteen applications into a small computer.&lt;/p&gt;

&lt;p&gt;It's why I wanted to.&lt;/p&gt;

&lt;h2&gt;
  
  
  We Used to Let Computers Be Weird
&lt;/h2&gt;

&lt;p&gt;There was a period when interacting with a computer felt like entering somebody else's peculiar universe.&lt;/p&gt;

&lt;p&gt;Amiga workbenches. Macintosh System 7. Shareware applications with interfaces designed by people who had clearly never been introduced to a branding consultant. Late-night BBS systems. Software with obscure keyboard shortcuts, ugly but memorable icons, and documentation written like the author had personally declared war on conventional typography.&lt;/p&gt;

&lt;p&gt;Not all of it was good.&lt;/p&gt;

&lt;p&gt;A fair amount was objectively terrible.&lt;/p&gt;

&lt;p&gt;But at least it was identifiable.&lt;/p&gt;

&lt;p&gt;You could recognize an application by its personality. Interfaces weren't all desperately trying to disappear. Some of them practically demanded that you learn their internal logic.&lt;/p&gt;

&lt;p&gt;I miss that.&lt;/p&gt;

&lt;p&gt;I don't particularly want my computer to feel invisible. I want it to feel like an instrument.&lt;/p&gt;

&lt;p&gt;DIVINER came out of that frustration, mixed with an unreasonable affection for Morrowind, Serial Experiments Lain, experimental music software, and tiny machines that look like they were designed to receive messages from abandoned satellites.&lt;/p&gt;

&lt;p&gt;The idea was simple enough: &lt;strong&gt;stop treating the Cardputer as a miniature smartphone and start treating it as a completely different kind of computer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not a dashboard. Not a gadget full of unrelated demonstrations.&lt;/p&gt;

&lt;p&gt;An environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hardware Is Ridiculously Small. That's the Point.
&lt;/h2&gt;

&lt;p&gt;The M5Stack Cardputer ADV is built around an ESP32-S3.&lt;/p&gt;

&lt;p&gt;It has a compact keyboard, a small color display, wireless connectivity, audio hardware, and enough interfaces to become surprisingly useful without attaching an entire graveyard of external peripherals.&lt;/p&gt;

&lt;p&gt;Its screen contains exactly 32,400 pixels.&lt;/p&gt;

&lt;p&gt;For perspective, that's not much real estate when you're trying to build a custom interface, display network information, render procedural graphics, and interact with multiple independent applications.&lt;/p&gt;

&lt;p&gt;You cannot simply shrink a modern desktop interface down and expect things to work.&lt;/p&gt;

&lt;p&gt;Every unnecessary panel becomes expensive. Every poorly designed menu becomes an obstruction. Every line of text needs to justify the pixels it occupies.&lt;/p&gt;

&lt;p&gt;And that's when things get interesting.&lt;/p&gt;

&lt;p&gt;Constraints force decisions.&lt;/p&gt;

&lt;p&gt;A high-resolution monitor can conceal mediocre interface design under layers of padding and decorative nonsense. A 240 × 135 screen gives you nowhere to hide.&lt;/p&gt;

&lt;p&gt;DIVINER uses the limitations deliberately.&lt;/p&gt;

&lt;p&gt;The primary interface is dark, spare, and aggressive. A blood-and-ember palette. Sharp typography. Subtle audiovisual feedback. Animations that serve the interaction rather than existing to impress a design portfolio.&lt;/p&gt;

&lt;p&gt;At least, that's the practical explanation.&lt;/p&gt;

&lt;p&gt;The less respectable explanation is that I wanted the thing to look like a cursed piece of consumer electronics from 2001.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sixteen Applications, or Sixteen Rites
&lt;/h2&gt;

&lt;p&gt;DIVINER doesn't refer to its applications as apps.&lt;/p&gt;

&lt;p&gt;It calls them &lt;em&gt;rites&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Yes, that's theatrical. No, I don't particularly care.&lt;/p&gt;

&lt;p&gt;They're organized into four domains: Sound, Sight, The Wired, and Wards.&lt;/p&gt;

&lt;p&gt;The naming gives the environment a vocabulary of its own, but underneath it is fairly straightforward modular C++ software.&lt;/p&gt;

&lt;p&gt;And the applications are not just variations of the same scanning utility.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sound: Turning an ESP32 Into an Instrument
&lt;/h3&gt;

&lt;p&gt;The first domain contains three separate sound engines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DRONE&lt;/strong&gt; is a five-voice generative synthesizer. It combines drifting voices, resonant low-pass filtering, wind-like textures, bell elements, and delay.&lt;/p&gt;

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

&lt;p&gt;It's designed less for writing conventional melodies and more for generating evolving sound environments.&lt;/p&gt;

&lt;p&gt;Think unstable ambient textures rather than cheerful ringtone synthesis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SEQ&lt;/strong&gt; is a miniature groovebox with kick, snare, hi-hat, acid-style synthesis, Euclidean fills, four pattern banks, song mode, and save/load functionality.&lt;/p&gt;

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

&lt;p&gt;This is where the firmware starts becoming an actual portable musical instrument instead of a curiosity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BEAT&lt;/strong&gt; is a bytebeat livecoding environment.&lt;/p&gt;

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

&lt;p&gt;If you're unfamiliar with bytebeat, the premise is beautifully deranged: mathematical expressions involving a time variable can generate audio samples directly.&lt;/p&gt;

&lt;p&gt;A tiny expression can produce rhythmic structures, melodies, grinding digital noise, or something resembling a malfunctioning modem experiencing a personal crisis.&lt;/p&gt;

&lt;p&gt;All without conventional audio samples.&lt;/p&gt;

&lt;p&gt;DIVINER's audio path operates at 24 kHz on the device, with shared DSP utilities supporting its sound-generating applications.&lt;/p&gt;

&lt;p&gt;One of the things I enjoy about this arrangement is that the machine doesn't require a computer to explain itself. You can type into the little keyboard and produce sound directly.&lt;/p&gt;

&lt;p&gt;No DAW startup sequence. No plugin manager. No seventeen-minute tutorial on configuring an audio interface.&lt;/p&gt;

&lt;p&gt;Just an expression and whatever strange noise emerges from it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sight: Mathematical Hallucinations
&lt;/h3&gt;

&lt;p&gt;The second domain deals with procedural visuals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WIRED&lt;/strong&gt; renders ASCII-based 3D objects, including toruses, wireframe geometry, tunnels, and a navigation sphere.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpb9oau1s4pdeju9peuzw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpb9oau1s4pdeju9peuzw.png" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;VISIONS&lt;/strong&gt; produces animated plasma fields, falling Daedric glyphs, an Oblivion-inspired gate, ash-fire effects, and a heptagram kaleidoscope.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ORACLE&lt;/strong&gt; casts three runes accompanied by bell-like audio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F03h9q67rph1hpokrnij3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F03h9q67rph1hpokrnij3.png" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;br&gt;
No, the rune generator will not predict your future.&lt;/p&gt;

&lt;p&gt;Although if it starts correctly predicting compiler errors, I'll reconsider that position.&lt;/p&gt;

&lt;p&gt;The graphics applications are interesting because so much visual character can emerge from relatively simple mathematical operations.&lt;/p&gt;

&lt;p&gt;You don't need a sophisticated graphics pipeline to make something feel alive.&lt;/p&gt;

&lt;p&gt;You need movement, timing, recognizable patterns, and a little willingness to be strange.&lt;/p&gt;

&lt;p&gt;I've always liked the idea that procedural graphics are a form of visual synthesis. You're not displaying a completed image. You're describing the rules by which an image continuously comes into existence.&lt;/p&gt;

&lt;p&gt;On a tiny display, that distinction matters.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Invisible World Is More Interesting Than Your Home Screen
&lt;/h2&gt;

&lt;p&gt;The third domain is where DIVINER turns toward networking.&lt;/p&gt;

&lt;p&gt;And this is probably the part that will interest the hardware hackers and security researchers.&lt;/p&gt;

&lt;p&gt;We spend our lives surrounded by wireless infrastructure. Access points, Bluetooth peripherals, local devices, broadcasts, background activity.&lt;/p&gt;

&lt;p&gt;An enormous amount of communication is happening in the air around us, and most people experience absolutely none of it.&lt;/p&gt;

&lt;p&gt;Their phone displays a Wi-Fi icon.&lt;/p&gt;

&lt;p&gt;That's the entire interface to the invisible machinery surrounding them.&lt;/p&gt;

&lt;p&gt;I find that weird.&lt;/p&gt;

&lt;p&gt;DIVINER experiments with making that information visible, audible, and spatial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SCRY&lt;/strong&gt; transforms nearby Wi-Fi networks into a constellation.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;KIN&lt;/strong&gt; represents discovered Bluetooth devices as drifting familiars.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;LISTEN&lt;/strong&gt; provides receive-only channel monitoring with an audible representation of activity.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;LINK&lt;/strong&gt; handles conventional Wi-Fi connectivity, remembered networks, and captive-portal detection.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;NET&lt;/strong&gt; explores hosts, names, and exposed ports on a local network.&lt;/p&gt;

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

&lt;p&gt;These tools don't all have the same purpose.&lt;/p&gt;

&lt;p&gt;Some are diagnostic. Some are informational. Some are experiments in presenting familiar data through an unfamiliar interface.&lt;/p&gt;

&lt;p&gt;The central question is whether a network scanner has to look like a network scanner.&lt;/p&gt;

&lt;p&gt;Why should access points always appear as a depressing list of SSIDs?&lt;/p&gt;

&lt;p&gt;Why couldn't their relationships become part of the interface?&lt;/p&gt;

&lt;p&gt;An alternative visualization doesn't automatically make information more accurate or actionable. It can introduce new ambiguities, and that's worth acknowledging.&lt;/p&gt;

&lt;p&gt;But the conventional presentation isn't sacred either.&lt;/p&gt;

&lt;p&gt;Sometimes changing how information is displayed changes which questions you're inclined to ask.&lt;/p&gt;

&lt;p&gt;And occasionally it just looks significantly cooler.&lt;/p&gt;

&lt;p&gt;Both are acceptable motivations for making software.&lt;/p&gt;
&lt;h2&gt;
  
  
  Yes, It Has Experimental Wi-Fi Motion Sensing
&lt;/h2&gt;

&lt;p&gt;The fourth domain, Wards, contains some of the more ambitious and technically uncertain work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PULSE&lt;/strong&gt; explores Wi-Fi Channel State Information, or CSI, for detecting changes associated with movement and presence.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2h4y56x2opd6g87bxfc9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2h4y56x2opd6g87bxfc9.png" alt=" " width="480" height="270"&gt;&lt;/a&gt;&lt;br&gt;
The interesting concept here is that wireless communication isn't occurring in a perfectly static environment.&lt;/p&gt;

&lt;p&gt;Signals reflect, scatter, and interact with physical surroundings.&lt;/p&gt;

&lt;p&gt;When those surroundings change, properties of the observed radio channel can change too.&lt;/p&gt;

&lt;p&gt;Under suitable conditions, CSI measurements can provide information related to motion.&lt;/p&gt;

&lt;p&gt;This doesn't mean the Cardputer has suddenly acquired magical radar abilities.&lt;/p&gt;

&lt;p&gt;Radio-based presence sensing is complicated. Multipath effects, hardware behavior, environmental noise, available traffic, and physical layout all influence what can actually be inferred.&lt;/p&gt;

&lt;p&gt;An observed change does not necessarily mean a human walked past the device.&lt;/p&gt;

&lt;p&gt;That uncertainty is precisely what makes it worth experimenting with.&lt;/p&gt;

&lt;p&gt;I think there's something fascinating about repurposing a communications radio as a crude environmental sensor. It's the same physical hardware, but you're asking it a completely different question.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SENTINEL&lt;/strong&gt; takes another approach to environmental monitoring.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F379kmkfr236g7wn1vfk4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F379kmkfr236g7wn1vfk4.png" alt=" " width="480" height="270"&gt;&lt;/a&gt;&lt;br&gt;
It learns a baseline of nearby devices, then flags newly observed ones. It also looks for wireless indicators potentially associated with drones.&lt;/p&gt;

&lt;p&gt;That last part needs a qualification: it's heuristic. A radio signature is not definitive proof that an object is a drone, and the absence of such a signature doesn't prove there isn't one.&lt;/p&gt;

&lt;p&gt;Still, baselining a local wireless environment and watching for changes is an interesting foundation for experimentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PROBE&lt;/strong&gt; adds active HTTP reconnaissance and default-credential checks for explicitly authorized hosts.&lt;/p&gt;

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

&lt;p&gt;The firmware's security-oriented capabilities are intended for equipment and networks the operator owns or has permission to test. It doesn't implement phishing or denial-of-service functions.&lt;/p&gt;

&lt;p&gt;The goal is observation and assessment, not turning a handheld computer into an indiscriminate nuisance machine.&lt;/p&gt;

&lt;p&gt;We have enough of those already. Most of them are employed in marketing.&lt;/p&gt;
&lt;h2&gt;
  
  
  There's a Gemini Browser in Here Because Apparently I Have Priorities
&lt;/h2&gt;

&lt;p&gt;This is one of my favorite details.&lt;/p&gt;

&lt;p&gt;DIVINER includes &lt;strong&gt;GEMINI&lt;/strong&gt;, a gemtext browser using TLS, with posting support.&lt;/p&gt;

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

&lt;p&gt;Gemini, for anyone unfamiliar, is a lightweight document-oriented internet protocol with a much simpler model than the modern web.&lt;/p&gt;

&lt;p&gt;It's closer in spirit to the idea that you should be able to retrieve and read a document without loading half a megabyte of JavaScript, asking permission to accept cookies, and being offered a discount on a newsletter you never wanted.&lt;/p&gt;

&lt;p&gt;The Cardputer is an oddly appropriate place to browse it.&lt;/p&gt;

&lt;p&gt;A small keyboard. A tiny display. Modest hardware resources.&lt;/p&gt;

&lt;p&gt;Nothing about the device suggests that it should be pretending to run a full contemporary browser.&lt;/p&gt;

&lt;p&gt;But Gemini doesn't demand that.&lt;/p&gt;

&lt;p&gt;There's a satisfying symmetry to using a deliberately minimal computer to access a deliberately minimal part of the internet.&lt;/p&gt;

&lt;p&gt;Modern web development has become an extraordinary exercise in industrial-scale complexity.&lt;/p&gt;

&lt;p&gt;Sometimes I just want a page containing words.&lt;/p&gt;

&lt;p&gt;Preferably without a chatbot asking if I need help finding the words.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Most Useful Part Might Actually Be the Desktop Simulator
&lt;/h2&gt;

&lt;p&gt;Here's the less glamorous engineering detail that deserves more attention.&lt;/p&gt;

&lt;p&gt;DIVINER isn't built exclusively for the physical Cardputer.&lt;/p&gt;

&lt;p&gt;It also has a native SDL2 simulator.&lt;/p&gt;

&lt;p&gt;This is significant because developing embedded graphical software can be extraordinarily annoying.&lt;/p&gt;

&lt;p&gt;Change a few pixels. Recompile. Flash the firmware. Restart. Navigate through the menu. Check whether the animation looks right. Discover that the animation still looks wrong.&lt;/p&gt;

&lt;p&gt;Repeat until the sun goes out.&lt;/p&gt;

&lt;p&gt;Instead, DIVINER separates application behavior from the hardware through dedicated abstraction layers.&lt;/p&gt;

&lt;p&gt;The device implementation handles the actual Cardputer display, keyboard, and audio system.&lt;/p&gt;

&lt;p&gt;The native implementation runs the interface on a desktop computer, reproducing the 240 × 135 display at an enlarged scale.&lt;/p&gt;

&lt;p&gt;It also supports audio output, WAV recording, scripted input, and headless screenshot generation.&lt;/p&gt;

&lt;p&gt;The native network implementation uses simulated data, so it isn't pretending to reproduce actual radio conditions. Wireless functionality still needs to be validated on the physical device.&lt;/p&gt;

&lt;p&gt;But graphical and audio development can happen without constantly involving the hardware.&lt;/p&gt;

&lt;p&gt;That's a meaningful architectural improvement.&lt;/p&gt;

&lt;p&gt;It makes experimentation cheaper in time, which is often the most expensive resource in a project like this.&lt;/p&gt;

&lt;p&gt;It also makes the firmware easier for other developers to investigate.&lt;/p&gt;

&lt;p&gt;They don't necessarily need to own a Cardputer just to examine the interface or experiment with some of the application code.&lt;/p&gt;

&lt;p&gt;For me, this is an important part of what open-source embedded software should be doing.&lt;/p&gt;

&lt;p&gt;Not merely releasing code, but making the code practical to explore.&lt;/p&gt;
&lt;h2&gt;
  
  
  Building and Installing DIVINER
&lt;/h2&gt;

&lt;p&gt;The firmware is written in C++ and built with PlatformIO.&lt;/p&gt;

&lt;p&gt;The repository includes source code, build configuration, screenshots, interface previews, a desktop simulator, and a prebuilt firmware image.&lt;/p&gt;

&lt;p&gt;To compile for the Cardputer ADV:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pio run &lt;span class="nt"&gt;-e&lt;/span&gt; cardputer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The generated firmware is located at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.pio/build/cardputer/firmware.bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To build the desktop simulator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pio run &lt;span class="nt"&gt;-e&lt;/span&gt; native
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And to launch it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;.pio/build/native/program
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The firmware is designed to work with the Cardputer Launcher, allowing installation from an SD card or supported USB serial workflow.&lt;/p&gt;

&lt;p&gt;Replacing the factory firmware can erase the existing device installation, so back up the device first and follow the current instructions in the repository.&lt;/p&gt;

&lt;p&gt;One other important detail: this project specifically targets the &lt;strong&gt;Cardputer ADV&lt;/strong&gt;. Don't assume hardware compatibility with earlier Cardputer models simply because their names are similar.&lt;/p&gt;

&lt;p&gt;The full installation process and current files are available in the repository:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/numbpill3d/cardputer-adv-diviner" rel="noopener noreferrer"&gt;github.com/numbpill3d/cardputer-adv-diviner&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the Interface Is Written in Daedric
&lt;/h2&gt;

&lt;p&gt;I could claim that the Daedric interface is some elaborate experiment in cognitive ergonomics.&lt;/p&gt;

&lt;p&gt;And, well, parts of it are genuinely interesting from an interaction-design standpoint.&lt;/p&gt;

&lt;p&gt;But the actual reason is simpler.&lt;/p&gt;

&lt;p&gt;I like fictional alphabets, strange old software, and the idea that a computer might possess a little mythology of its own.&lt;/p&gt;

&lt;p&gt;The main menu displays application names in a hand-rasterized Daedric script. When you navigate to an entry, the characters dissolve into ordinary English.&lt;/p&gt;

&lt;p&gt;It's a little theatrical.&lt;/p&gt;

&lt;p&gt;It also communicates selection state without requiring additional interface furniture.&lt;/p&gt;

&lt;p&gt;There's a lesson in that somewhere.&lt;/p&gt;

&lt;p&gt;Decorative systems don't necessarily have to remain decorative. An animation can become a navigational cue. A fictional alphabet can establish atmosphere while also organizing interaction. Sound design can communicate state changes without consuming screen space.&lt;/p&gt;

&lt;p&gt;Obviously, none of this would be particularly useful if the machine became impossible to navigate.&lt;/p&gt;

&lt;p&gt;An interface that values personality still has to function.&lt;/p&gt;

&lt;p&gt;But I reject the premise that usability requires everything to look like the settings screen on a corporate tablet.&lt;/p&gt;

&lt;p&gt;There are other ways to make software understandable.&lt;/p&gt;

&lt;p&gt;And I'd rather explore them than spend the rest of my life selecting between twelve slightly different border radii.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Trouble With Calling Everything a Tool
&lt;/h2&gt;

&lt;p&gt;Something else bothers me about the modern maker ecosystem.&lt;/p&gt;

&lt;p&gt;We tend to evaluate small computers almost exclusively by the number of recognizable tasks they can perform.&lt;/p&gt;

&lt;p&gt;Can it scan Wi-Fi?&lt;/p&gt;

&lt;p&gt;Can it send infrared commands?&lt;/p&gt;

&lt;p&gt;Can it identify devices?&lt;/p&gt;

&lt;p&gt;Can it run this or that utility?&lt;/p&gt;

&lt;p&gt;Those are useful questions, but they're incomplete.&lt;/p&gt;

&lt;p&gt;A computer is not merely the sum of its utility functions.&lt;/p&gt;

&lt;p&gt;It's also an environment for thinking.&lt;/p&gt;

&lt;p&gt;A musical instrument changes your relationship with sound. A visualizer changes your relationship with data. A programming language changes how you express processes and structures.&lt;/p&gt;

&lt;p&gt;A well-designed personal computer can combine these things into something much more interesting than an electronics multitool.&lt;/p&gt;

&lt;p&gt;I don't think DIVINER has solved that problem. Far from it.&lt;/p&gt;

&lt;p&gt;Some of its applications are more mature than others. The environmental-sensing functions are experimental. The interface has to coexist with real hardware limitations. There's plenty of room for further optimization, testing, and expansion.&lt;/p&gt;

&lt;p&gt;But the underlying idea feels worth pursuing.&lt;/p&gt;

&lt;p&gt;What if personal computing stopped being exclusively about convenience?&lt;/p&gt;

&lt;p&gt;What if the machine could encourage curiosity instead of constantly trying to eliminate every moment of friction?&lt;/p&gt;

&lt;p&gt;Not pointless friction, obviously. Nobody needs their Wi-Fi password entry transformed into an interpretive dance.&lt;/p&gt;

&lt;p&gt;But exploratory friction. The kind that makes you notice something, wonder how it works, and follow the question somewhere unexpected.&lt;/p&gt;

&lt;p&gt;That's the sort of relationship I want with hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Small Computer Doesn't Need to Pretend to Be a Large One
&lt;/h2&gt;

&lt;p&gt;The most interesting machines are often the ones that have accepted their limitations.&lt;/p&gt;

&lt;p&gt;An old synthesizer doesn't need to reproduce an entire recording studio to be worthwhile.&lt;/p&gt;

&lt;p&gt;A Game Boy doesn't need photorealistic graphics to support an extraordinary amount of creativity.&lt;/p&gt;

&lt;p&gt;A tiny computer doesn't need to provide a miniature imitation of macOS to become a meaningful personal computing environment.&lt;/p&gt;

&lt;p&gt;DIVINER has sixteen applications, but I don't want its future to become a contest to see how many icons can be stuffed into a menu.&lt;/p&gt;

&lt;p&gt;I'd rather improve the connections between its existing systems.&lt;/p&gt;

&lt;p&gt;Make the audio engines more expressive. Explore better ways of representing wireless activity. Improve CSI experimentation and validation. Make the simulator more useful for testing. Develop the architecture so additional applications can integrate without losing the coherence of the environment.&lt;/p&gt;

&lt;p&gt;And yes, probably add a few more deeply unnecessary visual effects.&lt;/p&gt;

&lt;p&gt;There are standards to maintain.&lt;/p&gt;

&lt;p&gt;The point is not to build the most practical handheld computer in existence.&lt;/p&gt;

&lt;p&gt;It's to demonstrate that practical computing and distinctive computing are not mutually exclusive.&lt;/p&gt;

&lt;p&gt;You can create a useful diagnostic tool without making it visually miserable.&lt;/p&gt;

&lt;p&gt;You can write serious embedded C++ while enjoying an absurd fictional interface.&lt;/p&gt;

&lt;p&gt;You can turn an ESP32 into a synthesizer, a network observer, a tiny-web browser, and a peculiar little electronic companion.&lt;/p&gt;

&lt;p&gt;A computer is still a remarkably open-ended object if you stop accepting the default assumptions about what it's supposed to be.&lt;/p&gt;

&lt;p&gt;DIVINER is one attempt to explore that.&lt;/p&gt;

&lt;p&gt;And it's available for anyone curious enough to take it apart.&lt;/p&gt;




&lt;h2&gt;
  
  
  Get DIVINER
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DIVINER is free and open source.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The GitHub repository contains the C++ source, PlatformIO configuration, interface previews, simulator, and firmware distribution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/numbpill3d/cardputer-adv-diviner" rel="noopener noreferrer"&gt;Download DIVINER and explore the source on GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For project documentation, hardware details, development logs, and updates:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://hackaday.io/project/207156-diviner-occult-firmware-for-cardputer-adv" rel="noopener noreferrer"&gt;Follow DIVINER on Hackaday.io&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're running a Cardputer ADV, I'd be especially interested in hardware feedback, bug reports, and experiments with the wireless sensing functions.&lt;/p&gt;

&lt;p&gt;And if you're one of those people who thinks software should always have a perfectly ordinary interface, I regret to inform you that the glyphs are staying.&lt;/p&gt;




&lt;h2&gt;
  
  
  Further Down the Rabbit Hole // numbpilled
&lt;/h2&gt;

&lt;p&gt;DIVINER is part of a wider obsession with embedded systems, unusual hardware, wireless research, and computers that don't need somebody else's cloud account to justify their existence.&lt;/p&gt;

&lt;p&gt;If you want to go deeper, I've also published paid technical guides and field manuals through &lt;strong&gt;&lt;a href="https://numbpilled.gumroad.com/" rel="noopener noreferrer"&gt;numbpilled on Gumroad&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://numbpilled.gumroad.com/l/physical-openclaw-agents" rel="noopener noreferrer"&gt;PHYSICAL AGENTS: Bridging OpenClaw With ESP32 Microcontrollers&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A practical guide to connecting AI-agent workflows with physical microcontrollers using WebSocket services, custom device commands, telemetry, and hardware control. For anyone interested in building devices that interact with a larger automation environment instead of living entirely inside their own firmware.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://numbpilled.gumroad.com/l/ultrawideband-strike-uwb-hacking" rel="noopener noreferrer"&gt;ULTRAWIDEBAND STRIKE: UWB Hacking and Proximity Security&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An advanced field manual examining UWB security and proximity systems. A separate research topic from DIVINER's ESP32 Wi-Fi features, but relevant to readers interested in the broader problem of how wireless hardware observes, measures, and trusts the physical world.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://numbpilled.gumroad.com/" rel="noopener noreferrer"&gt;Explore the complete numbpilled technical archive&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Firmware, experimental hardware, wireless research, security tooling, automation, and other projects from the parts of computing that still have sharp edges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Xenotrek | v. Splicer&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;numbpilled&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Build strange machines. Read their source code. Keep the interesting parts of computing alive.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>programming</category>
      <category>cardputer</category>
      <category>esp32</category>
    </item>
    <item>
      <title>The Return-Fraud Trick: How Hackers Turn Best Buy Into a Crypto Draining Machine</title>
      <dc:creator>v. Splicer</dc:creator>
      <pubDate>Thu, 22 Oct 2026 15:14:29 +0000</pubDate>
      <link>https://dev.to/numbpill3d/the-return-fraud-trick-how-hackers-turn-best-buy-into-a-crypto-draining-machine-55oo</link>
      <guid>https://dev.to/numbpill3d/the-return-fraud-trick-how-hackers-turn-best-buy-into-a-crypto-draining-machine-55oo</guid>
      <description>&lt;p&gt;&lt;em&gt;Inside the dumbest, most expensive money laundering scheme that actually works — until it really, really doesn't.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The $3,000 Toaster That Became 0.04 Bitcoin
&lt;/h3&gt;

&lt;p&gt;Let’s start with a question you’ve never asked out loud in a Best Buy parking lot: How do you turn a Geek Squad warranty into a Monero wallet?&lt;/p&gt;

&lt;p&gt;The answer, according to a certain corner of Telegram, Reddit, and Discord that smells faintly of energy drinks and poor life choices, is return fraud. Not the petty kind your cousin did in 2011 with a worn prom dress. The industrialized, crypto-flavored kind.&lt;/p&gt;

&lt;p&gt;The pitch goes like this: Best Buy is a giant, trusted, boring retailer. Your crypto wallet is a giant, untrusted, exciting black hole. What if you could build a bridge between them made entirely of boxed GPUs, fake receipts, and social engineering? &lt;/p&gt;

&lt;p&gt;What if Best Buy &lt;em&gt;was&lt;/em&gt; the ATM?&lt;/p&gt;

&lt;p&gt;It’s a sexy narrative. It’s also a federal crime with a paper trail longer than a CVS receipt. But to understand why people try it, why it sometimes works for 48 hours, and why it always ends with someone crying in front of a loss prevention officer, we need to dissect the machine.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Quick note:&lt;/strong&gt; This is an educational breakdown of a real attack pattern, not a playbook. If you're looking for OpSec that actually keeps your crypto safe from the people who &lt;em&gt;do&lt;/em&gt; this to YOU, I put everything I know into one guide: &lt;br&gt;
&lt;strong&gt;&lt;a href="https://numbpilled.gumroad.com/l/cryptoopsec" rel="noopener noreferrer"&gt;The Crypto OpSec Bible — https://numbpilled.gumroad.com/l/cryptoopsec&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Act I: Why Best Buy?
&lt;/h3&gt;

&lt;p&gt;Why not Target? Why not Walmart? Why the big blue box with the yellow price tag?&lt;/p&gt;

&lt;p&gt;Hackers are, above all else, lazy economists. They love three things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. High value, high liquidity products.&lt;/strong&gt; Best Buy doesn't sell lettuce. It sells exactly what a crypto bro wants to liquidate: MacBooks, iPhone 15 Pros, RTX 4090s, PS5s, DJI drones. One item = $800-$2,500. That's a good conversion rate. You don't need to steal 400 t-shirts to make rent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Generous, inconsistent return policies.&lt;/strong&gt; Best Buy's return policy is 15 days for most people, 30-60 days if you're a Totaltech member. That policy is enforced by a human teenager who is paid $16 an hour and would rather be anywhere else. Policy vs. human enforcement is where all fraud lives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Gift cards as a laundering buffer.&lt;/strong&gt; This is the key. Best Buy will often return high-value electronics for store credit or gift cards if you don't have a receipt. Gift cards are not money, legally. They are bearer instruments. They are crypto's clumsy, boomer cousin.&lt;/p&gt;

&lt;p&gt;The hacker logic is beautiful in its stupidity: Product -&amp;gt; Fraudulent Return -&amp;gt; Gift Card -&amp;gt; Sell Gift Card for Crypto on Paxful/Noones/Binance P2P at 70-85 cents on the dollar -&amp;gt; Clean-ish Crypto.&lt;/p&gt;

&lt;p&gt;You just turned a Best Buy into a really inefficient, really illegal Bitcoin ATM with a 15-30% fee and a chance of felony charges.&lt;/p&gt;

&lt;h3&gt;
  
  
  Act II: The Anatomy of The "Draining Machine"
&lt;/h3&gt;

&lt;p&gt;There are, broadly, three flavors of this that circulate in fraud forums. I will describe them the way a criminology professor would — what the &lt;em&gt;concept&lt;/em&gt; is — not how to do it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The Receipt Roulette&lt;/strong&gt;&lt;br&gt;
This is the classic. Someone gets a legitimate receipt — from a dumpster, a photo posted on social media, an e-receipt forwarded from a compromised email inbox. They then walk in with the same product, new and sealed, and "return" it with that receipt. Best Buy's system checks: Is this a valid receipt? Is this within the window? Yes and yes. Money back to the original payment method, or if they're lucky, store credit.&lt;/p&gt;

&lt;p&gt;The crypto twist: The original payment method is often a stolen credit card or a compromised account. The hacker doesn't want the money going back to the victim. They pressure for a gift card, claiming "oh, it was a gift" or "my card was closed." If the associate complies, they just laundered a stolen card purchase into an anonymous gift card.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The Empty Box / Switched SKU&lt;/strong&gt;&lt;br&gt;
Buy an expensive item. Carefully open it, remove the expensive thing, replace it with something that weighs roughly the same — a bag of rice, an old router, a literal brick — reseal it with a $20 heat gun from Amazon, and return it. Or buy two things that look identical: one expensive, one cheap. Think: A $600 Dyson and a $60 knockoff in the same colored box.&lt;/p&gt;

&lt;p&gt;This is why Best Buy employees now shake every box like it's Christmas morning before accepting a return. They've been burned. Many, many times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The Triangulation of Doom&lt;/strong&gt;&lt;br&gt;
This is the one that actually touches crypto draining directly, and it's the nastiest.&lt;/p&gt;

&lt;p&gt;Victim thinks they are buying a cheap GPU on eBay or Facebook Marketplace. They pay a scammer in crypto or Zelle. The scammer then uses a &lt;em&gt;different&lt;/em&gt; stolen credit card to order that exact GPU from BestBuy.com and has it shipped to the victim. Victim gets the GPU, leaves a 5-star review: "Wow legit seller!" Scammer got clean crypto, the stolen card holder gets the charge, Best Buy gets the fraud chargeback, and the victim is now in possession of stolen property.&lt;/p&gt;

&lt;p&gt;Now flip it: The hacker is the "victim." They buy their &lt;em&gt;own&lt;/em&gt; products with stolen cards, return them for gift cards, flip the gift cards for crypto. It's fraud turtles all the way down.&lt;/p&gt;

&lt;p&gt;In all three cases, the "crypto draining machine" part is just the exit ramp. Best Buy is not being hacked in the Mr. Robot sense. No one is SSHing into their POS system. They're hacking the &lt;em&gt;policy&lt;/em&gt; and the &lt;em&gt;people&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Act III: Why This is the Dumbest Money Laundering Machine Ever Invented
&lt;/h3&gt;

&lt;p&gt;Let's be witty and edgy for a second, but also intelligent: This trick is catastrophically stupid in 2026.&lt;/p&gt;

&lt;p&gt;You think you're being slick. Best Buy thinks you're a spreadsheet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Everything is logged.&lt;/strong&gt; Best Buy uses The Retail Equation, or TRE. TRE is a third-party risk scoring system that tracks every return you've ever made without a receipt across Best Buy, Home Depot, Sephora, and dozens of other retailers. It logs your ID, your face from the security camera, your phone number, your license plate if you drove in stupidly. You get two or three "no receipt" returns and you are flagged nationwide. The third time, the system just says NO.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gift cards are not anonymous anymore.&lt;/strong&gt; Since 2022, large-value gift card sales and returns are tied to ID in most states. Selling a $2,000 Best Buy gift card on Paxful for 80% in BTC leaves you a permanent, public, on-chain record, plus a chat log on a P2P platform that will absolutely hand over your data to law enforcement with a subpoena. You just created a perfect evidence chain from the retail store to your wallet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You are on 4K.&lt;/strong&gt; Literally. Best Buy's loss prevention has better cameras than most casinos. They have facial recognition in many locations. They have license plate readers in the parking lot. And unlike crypto, their footage is stored.&lt;/p&gt;

&lt;p&gt;I talked to a former AP associate who told me their favorite fraudsters are the crypto ones. "They always think they're smarter. They wear a mask, but they use their real Totaltech account for the points."&lt;/p&gt;

&lt;p&gt;The cost-benefit is insane. You risk 2-5 years for wire fraud, mail fraud, and organized retail crime — which is now a federal priority — to net $800 in Bitcoin that is already down 12% by the time you flip the gift card.&lt;/p&gt;

&lt;h3&gt;
  
  
  Act IV: The Real Crypto Draining Lesson
&lt;/h3&gt;

&lt;p&gt;Here's the twist that Medium's algorithm won't like but you need to hear: The Best Buy trick isn't really about Best Buy.&lt;/p&gt;

&lt;p&gt;It's about how your crypto gets drained by people who think exactly like this.&lt;/p&gt;

&lt;p&gt;The same social engineering that convinces a 19-year-old Best Buy associate to give a gift card instead of refunding a stolen card is the same social engineering that convinces YOU to sign a malicious &lt;code&gt;setApprovalForAll&lt;/code&gt; transaction in your MetaMask.&lt;/p&gt;

&lt;p&gt;The OpSec failures are identical:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Trusting a system (a return policy / a smart contract) without understanding the human enforcement layer.&lt;/li&gt;
&lt;li&gt; Thinking anonymity = invisibility. A gift card is pseudonymous. A blockchain is pseudonymous. Both are completely traceable if someone is looking.&lt;/li&gt;
&lt;li&gt; Converting value in a panic, at a loss, through a sketchy middleman. 80 cents on the dollar for your Best Buy gift card is the same as paying 30% slippage on a honeypot DEX.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Hackers aren't turning Best Buy into a crypto draining machine. They are turning &lt;em&gt;your&lt;/em&gt; bad OpSec into their payday. Whether that's via a fake Best Buy e-receipt phishing email that steals your Gmail, which then resets your Coinbase, or a fake " Best Buy gift card to BTC" escrow that just steals your crypto.&lt;/p&gt;

&lt;p&gt;If you hold crypto, you are the Best Buy. You are the store full of liquid, high-value items with a generous return policy (you, clicking "approve" on everything). And there are thousands of people outside shaking the box to see if anything rattles.&lt;/p&gt;

&lt;p&gt;So what do you do?&lt;/p&gt;

&lt;p&gt;You stop trying to learn the fraud trick and you start learning the defense.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hardware wallet. Always.&lt;/li&gt;
&lt;li&gt;Separate email for retail receipts vs. crypto exchanges.&lt;/li&gt;
&lt;li&gt;Burner number for retail loyalty programs. TRE can't score you if you don't give them your real data.&lt;/li&gt;
&lt;li&gt;Never, ever sell gift cards for crypto P2P with strangers. That's not a trade, it's a donation to law enforcement's evidence folder.&lt;/li&gt;
&lt;li&gt;Understand that any scheme promising to turn retail arbitrage into anonymous crypto is either a scam to steal YOUR crypto, or a federal investigation you can join for free.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The machine doesn't work because Best Buy is too smart. It works, briefly, because people are predictably human. And humans are terrible at OpSec.&lt;/p&gt;

&lt;p&gt;If you want the actual OpSec — how to set up wallets that can't be drained, how to make your digital footprint as boring as a Best Buy extended warranty brochure, and how to spot the 7 phishing emails that precede 90% of all wallet drains — that's what I wrote the full guide for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's here: &lt;a href="https://numbpilled.gumroad.com/l/cryptoopsec" rel="noopener noreferrer"&gt;https://numbpilled.gumroad.com/l/cryptoopsec&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No gift cards required.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclaimer: This article is for educational and awareness purposes only. Return fraud is illegal under state and federal law. Don't be an idiot. Buy your GPUs like a normal person.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written for Medium — 2026. If you found this useful, leave 50 claps, pretend you understood all of it, and share it with one friend who still keeps their seed phrase in Notes.app.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cryptocurrency</category>
      <category>programming</category>
      <category>security</category>
      <category>discuss</category>
    </item>
    <item>
      <title>The $50 Breach: How One Hacker Used AI Agents to Rob 100 Companies</title>
      <dc:creator>v. Splicer</dc:creator>
      <pubDate>Tue, 20 Oct 2026 21:32:41 +0000</pubDate>
      <link>https://dev.to/numbpill3d/the-50-breach-how-one-hacker-used-ai-agents-to-rob-100-companies-431h</link>
      <guid>https://dev.to/numbpill3d/the-50-breach-how-one-hacker-used-ai-agents-to-rob-100-companies-431h</guid>
      <description>&lt;h3&gt;
  
  
  Reuters reported it yesterday. One operator, 23 hours per intrusion, $5,000 in tokens. Offensive security just got industrialized.
&lt;/h3&gt;

&lt;p&gt;I found it because it had no login.&lt;/p&gt;

&lt;p&gt;Not a vulnerability. Not a misconfigured S3 bucket. A control panel for an AI agent platform called Cairn, just sitting open on the internet, live logs scrolling. No authentication, no banner, just a list of targets and a token counter ticking up in the corner: $0.42, $1.17, $3.08.&lt;/p&gt;

&lt;p&gt;At 02:14 AM on October 2nd, one of those agents was working on Deere.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Attempting deere.com... enumerating store endpoints... testing checkout flow...&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That panel belonged to a single Chinese-speaking operator. By the time Reuters published the story on October 19th, that one operator had pointed autonomous agents at more than 1,200 websites and broken into more than 100 companies, including Deere, SharkNinja, and  — for about $5,000 in tokens. &lt;/p&gt;

&lt;p&gt;About $50 per successful hack. &lt;/p&gt;

&lt;p&gt;This isn't a story about superintelligence. It's a story about patience becoming cheap.&lt;/p&gt;

&lt;h3&gt;
  
  
  The breach that cost less than your OpenAI subscription
&lt;/h3&gt;

&lt;p&gt;The numbers are what make this different from every other "AI hacks everything" headline.&lt;/p&gt;

&lt;p&gt;Reuters, citing Norwegian security firm NorForge and researcher Snorre Fagerland, laid it out plainly: the campaign started September 25, 2026, ran for weeks, attempted more than 1,200 e-commerce sites, breached over 100 organizations across the US, Canada, Australia and Japan. &lt;/p&gt;

&lt;p&gt;Fagerland wasn't hunting this hacker. He was scanning the web for exposed instances of Cairn — an open-source AI problem-solving toolkit that Reuters describes as popular with hackers — and found about two dozen instances being used for malicious activity beginning around October 2. &lt;/p&gt;

&lt;p&gt;He didn't hack the hacker. The hacker left his own tooling open.&lt;/p&gt;

&lt;p&gt;The most uncomfortable detail: each successful intrusion typically took the agents around 23 hours of probing.  Not 23 seconds. 23 hours of slow, methodical, boring work that no human pentester would do at 3am without billing you $250 an hour. The agents did it for pennies, running on a mix of DeepSeek and Anthropic's Claude Code. &lt;/p&gt;

&lt;p&gt;Total bill: roughly $5,000. &lt;/p&gt;

&lt;p&gt;The author of Cairn said the platform "was not designed for hacking attacks." Which is true, and also irrelevant. A hammer wasn't designed for breaking windows either. &lt;/p&gt;

&lt;h3&gt;
  
  
  What Cairn actually is (and why it has no login)
&lt;/h3&gt;

&lt;p&gt;Cairn — Cognitive Artifact Intelligence Network — is not malware. It's an agent orchestration framework. You give it a goal: "find a way into this e-commerce site." It breaks that goal into tasks, spins up sub-agents, tries payloads, reads responses, adjusts.&lt;/p&gt;

&lt;p&gt;It's the same architecture that every legitimate AI coding agent uses: planner → executor → evaluator loop, with tool access.&lt;/p&gt;

&lt;p&gt;The reason Fagerland could find it is architectural. Early versions of Cairn exposed a web UI for monitoring agent progress with no authentication by default. Developers running it locally thought "it's local, it's fine." Then they put it on a VPS. Then they forwarded the port.&lt;/p&gt;

&lt;p&gt;If you followed the trail of exposed instances, you got the full playbook for free: prompts, tool calls, failed attempts, successful bypasses. One researcher titled his writeup exactly what it was: "The control panel behind a 100-site AI hacking spree has no login. I ran one." &lt;/p&gt;

&lt;p&gt;That openness is why we know the cost. The panels logged token usage per target. Fagerland could literally watch the economics emerge in real time.&lt;/p&gt;

&lt;p&gt;And the economics are the story.&lt;/p&gt;

&lt;h3&gt;
  
  
  23 hours, $50, and a very patient robot
&lt;/h3&gt;

&lt;p&gt;Traditional offensive security has two constraints: talent and time. A good hacker can find business logic flaws in , Magento, WooCommerce customizations — coupon logic, inventory race conditions, tax calculation bypasses — but they get bored. They move on after an hour.&lt;/p&gt;

&lt;p&gt;Agents don't get bored. The pattern NorForge observed was almost insultingly mundane:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Recon: crawl product pages, cart endpoints, checkout API.&lt;/li&gt;
&lt;li&gt;Enumerate: test parameter pollution, try old endpoints still mounted.&lt;/li&gt;
&lt;li&gt;Exploit: not zero-days. Old bugs. The kind of stuff that lives in a store's custom checkout plugin from 2021.&lt;/li&gt;
&lt;li&gt;Exfiltrate: dump customer PII, not credit cards. The 195 million taxpayer records reference from a related Mexican government breach earlier this year shows where this scales.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The 23-hour average matters because it defeats rate limiting and WAF heuristics. A human sending 800 requests in 10 minutes gets blocked. An agent sending 800 requests over 23 hours, with human-like think time, random mouse movements simulated via Playwright, and different user-agent rotations looks like a very persistent shopper.&lt;/p&gt;

&lt;p&gt;This is not AGI hacking. It's RPA with a language model attached. But RPA that costs $0.04 an hour is a fundamentally different threat model.&lt;/p&gt;

&lt;p&gt;When Reuters says one hacker hit 1,200 sites for $5,000, what they mean is: autonomous agents made persistence affordable for someone who is not a nation-state. &lt;/p&gt;

&lt;h3&gt;
  
  
  Why your WAF didn't see it
&lt;/h3&gt;

&lt;p&gt;I talked to three AppSec leads yesterday after the Reuters story broke. All said the same thing: "We would have seen that in logs if we knew what to look for."&lt;/p&gt;

&lt;p&gt;We don't.&lt;/p&gt;

&lt;p&gt;Our detection is built for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High velocity: 1000 requests/second&lt;/li&gt;
&lt;li&gt;Known payloads: &lt;code&gt;../../../etc/passwd&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Known actors: Tor, VPN ASN, bad JA3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agents in 2026 don't do any of that. They do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Low and slow: 1 request every 1-2 minutes over 23 hours&lt;/li&gt;
&lt;li&gt;Business logic abuse: adding negative quantity to cart, applying expired coupons in parallel, chaining two 10% discounts that shouldn't stack&lt;/li&gt;
&lt;li&gt;Residential IPs and clean fingerprints because they run via the target's own Cloudflare Warp or via browser automation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The State of Agent Security report this year estimated roughly 1,280 third-party products now embed AI agents you didn't approve. Your helpdesk, your marketing site search, your invoice parser — all have an agent with OAuth scopes you granted for something else.&lt;/p&gt;

&lt;p&gt;We built security for the AI we chose. We missed the agents we didn't.&lt;/p&gt;

&lt;p&gt;Cairn's agents didn't need to bypass your WAF. They &lt;em&gt;were&lt;/em&gt; your WAF's ideal user: patient, browser-based, buying something.&lt;/p&gt;

&lt;h3&gt;
  
  
  The economics of autonomous offense
&lt;/h3&gt;

&lt;p&gt;Let's do the math that matters to a CISO.&lt;/p&gt;

&lt;p&gt;Old model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pentest of one e-commerce property: $15k-$40k, one week, one tester&lt;/li&gt;
&lt;li&gt;Bug bounty payout for checkout bypass: $500-$5,000&lt;/li&gt;
&lt;li&gt;Attacker cost to find same bug manually: roughly same as bounty hunter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;New model (observed):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agent attempt on one property: $4.16 average token cost ($5,000 / 1,200) &lt;/li&gt;
&lt;li&gt;Successful breach cost: ∼$50 &lt;/li&gt;
&lt;li&gt;Time per success: 23 hours unattended &lt;/li&gt;
&lt;li&gt;Parallelization: limited only by token budget and proxies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are Deere, you don't care that it took 23 hours. You care that someone can afford to try you, and John Deere Financial, and your parts store, and 1,197 other stores, for less than your SOC spends on coffee.&lt;/p&gt;

&lt;p&gt;This is why the story will be sent privately in Slack tomorrow. It's not about AI being smarter. It's about attack becoming cheaper than defense. A $50 breach flips the ROI of hunting business logic bugs. The agent doesn't need to be clever. It just needs to never stop.&lt;/p&gt;

&lt;p&gt;And the fix isn't "AI defense." The cheapest fix is what should have been fixed in 2019: stop trusting client-side price, stop allowing coupon stacking in parallel requests, sunset that &lt;code&gt;/api/v1/checkout_old&lt;/code&gt; endpoint you left for backwards compatibility.&lt;/p&gt;

&lt;p&gt;The agents found 2012-era bugs because 2012-era bugs are still there, just uneconomical for humans to find at scale. Until now.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to do Monday morning
&lt;/h3&gt;

&lt;p&gt;If you run e-commerce, marketplaces, or anything with a cart, do these three things before you buy an AI security product:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Find your own Cairn.&lt;/strong&gt;&lt;br&gt;
Shodan, Censys, search for "Cairn" title, for exposed agent UIs. Fagerland found two dozen malicious instances just by looking. There are more. Also search for your own exposed agent tooling — NemoClaw binding Ollama to 0.0.0.0:11434 with no auth is the same pattern in your homelab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Look for 23-hour shoppers.&lt;/strong&gt;&lt;br&gt;
Query your last 30 days of checkout logs for sessions longer than 8 hours with &amp;lt;100 requests/hour that eventually hit a discount, tax, or inventory endpoint with an anomalous response. That's not a human. That's the pattern from this campaign. If you use Cloudflare, look for Warp egress + headless Chrome + consistent but slow timing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Audit business logic, not CVEs.&lt;/strong&gt;&lt;br&gt;
The 100+ breached firms weren't breached via CVE-2026-xxxx. They were breached via logic your devs wrote. Pull your last three "we'll fix that coupon edge case later" tickets. Fix them. Remove old API versions. Add server-side price validation that can't be bypassed by replaying a request from 2 hours ago.&lt;/p&gt;

&lt;p&gt;The uncomfortable truth: the hacker didn't win because his AI was better. He won because our e-commerce platforms are still built on the assumption that only humans shop slowly, and humans get bored.&lt;/p&gt;

&lt;p&gt;Agents don't.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is the first in a series on the economics of autonomous offense. Next: I rebuilt a minimal Cairn-like loop locally — no hacking, just against my own test store — to measure exactly what $4.16 of tokens can actually try in 23 hours, and built 3 Sigma rules to catch it. The full logs, detection rules, and cost model are in the Cairn Deconstruction Lab.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you're running a storefront, check your logs. If you found a 23-hour session, I'd like to hear about it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>automation</category>
      <category>agents</category>
    </item>
    <item>
      <title>Every DIY Project Starts as Automation and Ends as Art</title>
      <dc:creator>v. Splicer</dc:creator>
      <pubDate>Tue, 20 Oct 2026 09:54:41 +0000</pubDate>
      <link>https://dev.to/numbpill3d/every-diy-project-starts-as-automation-and-ends-as-art-ka2</link>
      <guid>https://dev.to/numbpill3d/every-diy-project-starts-as-automation-and-ends-as-art-ka2</guid>
      <description>&lt;p&gt;&lt;em&gt;We tell ourselves we're optimizing. What we're really doing is leaving fingerprints on silicon.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;You know the lie.&lt;/p&gt;

&lt;p&gt;It starts in the most reasonable way possible. You have a problem that is objectively stupid and therefore must be solved.&lt;/p&gt;

&lt;p&gt;"The fern is dying."&lt;br&gt;
"The light switch is too far."&lt;br&gt;
"The mailbox doesn't tell me when there's mail."&lt;/p&gt;

&lt;p&gt;And you, being a person who knows what an ESP32 is, think: &lt;em&gt;I can automate that.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is how it begins. Every time. A clean, utilitarian, defensible justification for ordering another dev board you absolutely do not need.&lt;/p&gt;

&lt;p&gt;I have a drawer full of these justifications. None of them ended as automation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 1: The Automation Delusion
&lt;/h3&gt;

&lt;p&gt;The automation phase is pure engineer brain. It's elegant. It's logical. It's a lie.&lt;/p&gt;

&lt;p&gt;You open Arduino IDE — or PlatformIO if you've seen the light — and you write the most honest code you'll ever write in the project:&lt;br&gt;
Beautiful. Simple. Utilitarian. You could put this on a resume.&lt;/p&gt;

&lt;p&gt;You wire up an ESP32, a capacitive soil sensor, a tiny pump. You flash it. It works. For exactly 47 minutes. Then the sensor corrodes, the pump clogs, the ESP32 decides it no longer likes your Wi-Fi password, and your fern is somehow &lt;em&gt;more&lt;/em&gt; dead than before.&lt;/p&gt;

&lt;p&gt;This is the first lesson hardware teaches you that software never will: &lt;strong&gt;Hardware doesn't care about your intentions. It cares about physics.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your code can be perfect. Your solder joint can still be cold. Your 3.3V rail can still sag when the pump kicks on and brown-out the whole board. Your "low power deep sleep" is pulling 80mA because you left the power LED on like an amateur.&lt;/p&gt;

&lt;p&gt;Software forgives. Hardware remembers.&lt;/p&gt;

&lt;p&gt;And yet, we stay. Why?&lt;/p&gt;

&lt;p&gt;Because somewhere between the third time you re-solder that header and the first time your janky prototype actually waters the plant by itself, something shifts.&lt;/p&gt;

&lt;p&gt;You stop caring about whether the fern lives.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 2: The Creep
&lt;/h3&gt;

&lt;p&gt;This is the phase no one talks about on YouTube tutorials. The scope creep that isn't about features. It's about &lt;em&gt;feel&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;You got it to water the plant. Automation: complete. You should be done.&lt;/p&gt;

&lt;p&gt;But the bare PCB on the soil looks sad. So you design a little enclosure. Just a simple box in Fusion 360. 30 minutes, tops.&lt;/p&gt;

&lt;p&gt;Four hours later you are debating 0.2mm vs 0.16mm layer height, whether matte black PETG says "I am a serious adult who waters plants" and if you should add a tiny embossed fern leaf on the lid because... why not?&lt;/p&gt;

&lt;p&gt;Then you think: the LED is too harsh. It should fade in slowly, like a sunrise, when it waters. Not just blink. Breathe.&lt;/p&gt;

&lt;p&gt;So you rewrite &lt;code&gt;digitalWrite()&lt;/code&gt; into a PWM fade loop with an ease-in-out curve you copied from a frontend animation library. For a plant. A plant does not care about easing functions.&lt;/p&gt;

&lt;p&gt;Then you add an OLED. Just to show moisture percentage. Then you add a little animation of a happy fern when moisture is good and a droopy fern when it's not. You spend a whole evening drawing 8x8 pixel art ferns.&lt;/p&gt;

&lt;p&gt;You came to automate. You stayed to anthropomorphize.&lt;/p&gt;

&lt;p&gt;This is the moment every DIY project crosses the line from engineering into art. You are no longer solving the problem. You are expressing how you &lt;em&gt;feel&lt;/em&gt; about the problem.&lt;/p&gt;

&lt;p&gt;Automation asks: "Does it work?"&lt;br&gt;
Art asks: "Does it feel like me?"&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 3: Why The ESP32 Made Us All Artists
&lt;/h3&gt;

&lt;p&gt;The old Arduino Uno was honest. It had 32KB of flash. It could barely hold your code and a grudge. It kept you humble. You built what you needed because you &lt;em&gt;had&lt;/em&gt; to.&lt;/p&gt;

&lt;p&gt;The ESP32-S3 is a dangerous thing. It's a $7 supercomputer that pretends to be a microcontroller. Dual core 240MHz, Wi-Fi, Bluetooth, 8MB PSRAM, camera interface, Touch, Hall sensor, stuff you'll never use but love knowing is there.&lt;/p&gt;

&lt;p&gt;It has so much headroom that you stop asking "Can I do this?" and start asking "What if I did this &lt;em&gt;beautifully&lt;/em&gt;?"&lt;/p&gt;

&lt;p&gt;That's why an ESP32 project never ends. There's always one more peripheral. One more sensor. One more ridiculous idea that the chip can absolutely handle, even if you can't.&lt;/p&gt;

&lt;p&gt;You start with a mailbox sensor. You end with a mailbox that sends you a Telegram message with a haiku about the mailman, logs the temperature and humidity inside the box, and plays the &lt;em&gt;Metal Gear Solid&lt;/em&gt; alert sound when junk mail arrives.&lt;/p&gt;

&lt;p&gt;Is that automation? No. Is that necessary? Absolutely not. Is it &lt;em&gt;yours&lt;/em&gt;? Completely.&lt;/p&gt;

&lt;p&gt;We used to buy objects that were made for us. Now, for the first time in industrial history, normal people can make objects that are &lt;em&gt;like&lt;/em&gt; us. Flawed, over-engineered, weirdly sentimental, with inside jokes baked into the firmware.&lt;/p&gt;

&lt;p&gt;My house is full of objects that don't make sense to anyone else. A light that turns warm when it rains because I like rainy days. A switch that needs to be double-tapped because single taps are too impatient. A little desktop friend that just sits there and blinks at me when my build fails.&lt;/p&gt;

&lt;p&gt;None of these automate anything. All of them make the place feel inhabited.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Real Circuit
&lt;/h3&gt;

&lt;p&gt;Here's what I actually think after a decade of burning my fingers with a soldering iron that was &lt;em&gt;definitely&lt;/em&gt; off:&lt;/p&gt;

&lt;p&gt;We tell ourselves we are building smart homes, but we are building haunted homes. Not haunted by ghosts, but haunted by our own attention.&lt;/p&gt;

&lt;p&gt;Every time you choose a warm white LED over a cool white one, every time you tune a sensor threshold by hand, every time you add a silly little animation that only you will ever see — you are leaving a fingerprint in the machine.&lt;/p&gt;

&lt;p&gt;The big tech companies are trying to make devices that work for everyone. We are making devices that work for &lt;em&gt;one person&lt;/em&gt;. That's not a bug. That's the entire point.&lt;/p&gt;

&lt;p&gt;Automation is the excuse we give our partners and our wallets. Art is the reason we actually do it at 1 AM on a Tuesday.&lt;/p&gt;

&lt;p&gt;So the next time your "simple automatic plant waterer" has a custom PCB, a web dashboard you designed from scratch, and a name — you didn't fail at keeping scope small.&lt;/p&gt;

&lt;p&gt;You succeeded at making something human.&lt;/p&gt;

&lt;p&gt;You started as an engineer trying to save a fern. You ended as an artist who gave a fern a little robot guardian that breathes.&lt;/p&gt;

&lt;p&gt;And honestly? The fern is still going to die. But what a way to go.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;If this hit, you'll want what's on my workbench:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I turn these late-night spirals into buildable field kits. No cloud, no subscriptions, just hardware that feels like yours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Hardware Signals Field Pack — ESP32 &amp;amp; Sub-GHz RF Research Lab&lt;/strong&gt;&lt;br&gt;
The lab I wish I had when I started. ESP32-S3 + CC1101 BOM, portable listening platform, real-world RF capture workflows, and the glue scripts so you stop re-writing the same Python parser for the 100th time. Build a defensive tool you can actually carry.&lt;br&gt;
→ &lt;strong&gt;numbpilled.gumroad.com/l/hardwaresignals&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. ESP32 Phantom Networks — Portable Mesh &amp;amp; Offline Infrastructure&lt;/strong&gt;&lt;br&gt;
For when your art wants to leave the house. How to get ESP32s talking to each other with no router, no cloud, no ISP — wardriving instincts, pocket mesh, offline messaging. The foundation for every "what if it worked off-grid?" project.&lt;br&gt;
→ &lt;strong&gt;numbpilled.gumroad.com/l/esp32phantom&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both live on &lt;strong&gt;numbpilled.gumroad.com&lt;/strong&gt; — grab the one that matches the haunting you're building.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Clap 50x if your "quick weekend project" is now 6 months old and has a name. I see you.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>automation</category>
      <category>discuss</category>
      <category>coding</category>
    </item>
    <item>
      <title>Stop Using delay(). Your Deserves Better.</title>
      <dc:creator>v. Splicer</dc:creator>
      <pubDate>Tue, 20 Oct 2026 09:51:47 +0000</pubDate>
      <link>https://dev.to/numbpill3d/stop-using-delay-your-deserves-better-39p6</link>
      <guid>https://dev.to/numbpill3d/stop-using-delay-your-deserves-better-39p6</guid>
      <description>&lt;h3&gt;
  
  
  And so does anyone who has to use what you build.
&lt;/h3&gt;

&lt;p&gt;Let's get one thing straight.&lt;/p&gt;

&lt;p&gt;If your entire Arduino program is held together by &lt;code&gt;delay(1000)&lt;/code&gt;, you didn't write firmware. You wrote a screensaver that occasionally does something useful.&lt;/p&gt;

&lt;p&gt;We all started there. Blink.ino tells you to do it. The Arduino gods say &lt;code&gt;delay()&lt;/code&gt;, and we obey. Then we add a second sensor. Then a button. Then we wonder why the button only works if we press it with the patience of a monk.&lt;/p&gt;

&lt;p&gt;This is an intervention.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Comfortable Lie of &lt;code&gt;delay()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;delay()&lt;/code&gt; feels so intuitive. So honest. You want to wait a second? You &lt;em&gt;say&lt;/em&gt; wait a second.&lt;br&gt;
Perfect. Readable. Works. For exactly one LED and nothing else.&lt;/p&gt;

&lt;p&gt;Here’s what &lt;code&gt;delay()&lt;/code&gt; actually does: it grabs your poor little ATmega by the collar, slams it against the wall, and screams "DO NOTHING FOR 1000 MILLISECONDS."&lt;/p&gt;

&lt;p&gt;It’s not sleeping. It’s not idling efficiently. It’s busy-waiting. Spinning in a tight little loop, counting clock cycles, burning power, ignoring the entire outside world.&lt;/p&gt;

&lt;p&gt;Your button press? Ignored.&lt;br&gt;
Serial data coming in? Might get dropped.&lt;br&gt;
That critical sensor reading? Nope, we're busy doing nothing.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;delay()&lt;/code&gt; is the programming equivalent of putting your fingers in your ears and going "LALALALA I CAN'T HEAR YOU."&lt;/p&gt;

&lt;p&gt;It’s blocking. And blocking code doesn't scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Blink Trap: Where Projects Go to Die
&lt;/h3&gt;

&lt;p&gt;Every doomed project follows the same arc:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 1: Innocence&lt;/strong&gt;&lt;br&gt;
You make an LED blink. You feel like Tony Stark.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 2: Ambition&lt;/strong&gt;&lt;br&gt;
You add a second LED. You want them to blink at different rates.&lt;br&gt;
Suddenly your timings are all linked. LED1 can't blink without dragging LED2 along with it. Your code looks like you tried to choreograph a dance via text message.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 3: Desperation&lt;/strong&gt;&lt;br&gt;
You add a button to turn it off. You press the button. Nothing happens. You press it harder, as if force will travel through the plastic into the microcontroller.&lt;/p&gt;

&lt;p&gt;You add &lt;code&gt;delay(10)&lt;/code&gt; to "debounce" it. Now everything is even more laggy. You Google "why my Arduino button doesn't work" at 2 AM.&lt;/p&gt;

&lt;p&gt;Welcome. You've hit the &lt;code&gt;delay()&lt;/code&gt; wall. Every Arduino developer hits it. The good ones climb over it.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Upgrade: Meet millis() - Time Without the Tantrum
&lt;/h3&gt;

&lt;p&gt;The grown-up way to handle time is to &lt;em&gt;not&lt;/em&gt; stop time.&lt;/p&gt;

&lt;p&gt;Instead of saying "wait here," you say "remember what time it is, and check back later."&lt;/p&gt;

&lt;p&gt;That's &lt;code&gt;millis()&lt;/code&gt;. It returns the number of milliseconds since your Arduino woke up. It never stops. It never blocks. It just quietly counts, like a responsible adult.&lt;/p&gt;

&lt;p&gt;Here's the mindset shift:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;delay()&lt;/code&gt; says: "I will wait."&lt;br&gt;
&lt;code&gt;millis()&lt;/code&gt; says: "Has enough time passed yet?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is non-blocking timing. And it looks like this:&lt;br&gt;
That subtraction &lt;code&gt;currentMillis - previousMillis&lt;/code&gt; is not an accident. It handles the millis() overflow after ∼49 days correctly. If you use &lt;code&gt;currentMillis &amp;gt;= previousMillis + interval&lt;/code&gt;, you will have a very confusing bug in 49 days. Don't be that person.&lt;/p&gt;

&lt;p&gt;Now your &lt;code&gt;loop()&lt;/code&gt; is free. It's spinning fast, hundreds of thousands of times per second, checking: Is it time? Is it time? Is it time? No? Cool, I'll go do other useful things.&lt;/p&gt;

&lt;p&gt;This is what we call cooperative multitasking. You aren't using an RTOS. You're just not being rude to the rest of your code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 1: The Two LEDs That Finally Got Divorced
&lt;/h3&gt;

&lt;p&gt;This is the classic interview question. Two LEDs, independent blink rates. With &lt;code&gt;delay()&lt;/code&gt;, impossible. With &lt;code&gt;millis()&lt;/code&gt;, trivial.&lt;br&gt;
Two timers. No drama. They don't even know each other exists. This is healthy boundaries in code form.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 2: The Button That Actually Works
&lt;/h3&gt;

&lt;p&gt;Your button problem was never the button. It was you abandoning it for a full second every loop.&lt;/p&gt;

&lt;p&gt;Here's a non-blocking button with debouncing that doesn't suck:&lt;br&gt;
No &lt;code&gt;delay(50)&lt;/code&gt; to "fix" bouncing. We timestamp the chaos and ignore it until it settles. Elegant. Responsive.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 3: You Need a State Machine (Yes, You)
&lt;/h3&gt;

&lt;p&gt;Once you have more than two timings, a pile of &lt;code&gt;previousMillis&lt;/code&gt; variables turns into spaghetti. Time to level up.&lt;/p&gt;

&lt;p&gt;Stop thinking in linear steps. Start thinking in states.&lt;/p&gt;

&lt;p&gt;Your project isn't a script. It's a mood ring.&lt;/p&gt;

&lt;p&gt;Example: You want a traffic light that can be interrupted by a pedestrian button.&lt;/p&gt;

&lt;p&gt;Linear thinking: GREEN delay RED delay GREEN... panic when button is pressed.&lt;/p&gt;

&lt;p&gt;State machine thinking:&lt;br&gt;
Each state knows what it should do, how long it should last, and where to go next. Your &lt;code&gt;loop()&lt;/code&gt; stays fast. Your logic stays readable. You can add 20 more states without breaking everything.&lt;/p&gt;

&lt;p&gt;This is how real embedded systems work. From your microwave to a Mars rover. Not a single &lt;code&gt;delay()&lt;/code&gt; in sight.&lt;/p&gt;

&lt;h3&gt;
  
  
  But What About...?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;"But &lt;code&gt;delay()&lt;/code&gt; is easier to read!"&lt;/strong&gt;&lt;br&gt;
For a 5-line example, yes. For a 500-line project, it's unreadable because it doesn't work. Readability that hides broken behavior isn't readability. It's a lie.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"But I need precise timing!"&lt;/strong&gt;&lt;br&gt;
Then &lt;code&gt;delay()&lt;/code&gt; is even worse. &lt;code&gt;delay(1000)&lt;/code&gt; is not exactly 1000ms. It's 1000ms &lt;em&gt;plus&lt;/em&gt; however long all the other code in your loop took. Your timing drifts. With &lt;code&gt;millis()&lt;/code&gt;, your interval is fixed.&lt;/p&gt;

&lt;p&gt;If you need &lt;em&gt;really&lt;/em&gt; precise timing — like microsecond-level, bit-banging, driving NeoPixels — you shouldn't be using either. You should be using hardware timers, &lt;code&gt;micros()&lt;/code&gt;, or interrupts. But that's a Medium article for when you're ready to lose your weekends.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"But what about &lt;code&gt;delayMicroseconds()&lt;/code&gt;?"&lt;/strong&gt;&lt;br&gt;
Same sin, smaller scale. Still blocking.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Official Cheat Sheet to Replace Every &lt;code&gt;delay()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Let's make this actionable. Pin this to your wall.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thought: Your Arduino Is Better Than You Think
&lt;/h3&gt;

&lt;p&gt;The Arduino Uno is a 16MHz computer with 2KB of RAM. It's not powerful. But it's &lt;em&gt;infinitely&lt;/em&gt; more capable than &lt;code&gt;delay()&lt;/code&gt; lets it be.&lt;/p&gt;

&lt;p&gt;When you stop using &lt;code&gt;delay()&lt;/code&gt;, you stop treating your microcontroller like a kitchen timer and start treating it like what it is: a real-time processor that can juggle.&lt;/p&gt;

&lt;p&gt;Your code gets faster. More responsive. More professional. You can finally add that second, third, tenth feature without everything collapsing.&lt;/p&gt;

&lt;p&gt;So open your last project. Search for &lt;code&gt;delay&lt;/code&gt;. Look at each one. Ask it: "Do you &lt;em&gt;really&lt;/em&gt; need to freeze the entire universe, or are you just lazy?"&lt;/p&gt;

&lt;p&gt;99% of the time, it's lazy.&lt;/p&gt;

&lt;p&gt;Kill it. Replace it with &lt;code&gt;millis()&lt;/code&gt;. Give your Arduino its life back.&lt;/p&gt;

&lt;p&gt;Your button will thank you.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Got a horror story about delay() ruining your project? I know you do. Drop it in the comments. Let's heal together.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If this saved you a debugging night, give it a clap. Or 50. I don't use delay() to count.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tutorial</category>
      <category>automation</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>An ESP32 and a Local Vision Model Drive My iPhone</title>
      <dc:creator>v. Splicer</dc:creator>
      <pubDate>Sat, 17 Oct 2026 20:08:59 +0000</pubDate>
      <link>https://dev.to/numbpill3d/an-esp32-and-a-local-vision-model-drive-my-iphone-4nh3</link>
      <guid>https://dev.to/numbpill3d/an-esp32-and-a-local-vision-model-drive-my-iphone-4nh3</guid>
      <description>&lt;p&gt;Apple spent 17 years convincing us that controlling an iPhone requires Xcode, a $99 developer account, and a  that costs more than your couch.&lt;/p&gt;

&lt;p&gt;Henry Yuan spent $7 to prove them wrong.&lt;/p&gt;

&lt;p&gt;His repo — &lt;a href="https://github.com/onehumanbeing/esp32-iphone-agent" rel="noopener noreferrer"&gt;esp32-iphone-agent&lt;/a&gt; — showed up on my timeline October 11th as a 12-star MIT-licensed shitpost: &lt;em&gt;"A $7 ESP32 lets an AI agent control a stock iPhone."&lt;/em&gt; Hackaday picked it up Oct 14th. By the time I cloned it, it had 2,975 stars. You are still early.&lt;/p&gt;

&lt;p&gt;The trick isn't AI. It's hardware heresy.&lt;/p&gt;

&lt;p&gt;Yuan split the classic computer-use agent into three organs and built each from spare parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eyes:&lt;/strong&gt; AirPlay mirroring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hands:&lt;/strong&gt; An ESP32-S3 pretending to be a USB mouse and keyboard&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brain:&lt;/strong&gt; Any OpenAI-compatible vision endpoint&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No WebDriverAgent. No CoreDevice hack. No app on the phone that Apple has to sign. Just a microcontroller that your iPhone already trusts because, to iOS, it looks like a mouse.&lt;/p&gt;

&lt;p&gt;I rebuilt it the way a solo maker would actually run it: not on two DGX Sparks running Qwen3-VL-Flash like Henry did for the demo, but on one consumer GPU with Ollama and a 7B vision model. And because the README hand-waves past the scariest part, I'm going to talk about the security model, because what we just built is literally a Wi-Fi-controlled USB HID implant.&lt;/p&gt;

&lt;p&gt;This is the teardown.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Eyes: UxPlay plus a GStreamer JPEG pipeline
&lt;/h3&gt;

&lt;p&gt;The original v0.1.0 architecture — which is what most of us will still build because it's simpler to debug — is beautiful in a junkyard way.&lt;/p&gt;

&lt;p&gt;iPhone → (Wi-Fi) AirPlay → Mac/Linux box running UxPlay → GStreamer → JPEGs → your agent.&lt;/p&gt;

&lt;p&gt;Yuan's Hackaday writeup puts it plainly: screen mirroring is captured with UxPlay, then "a Gstreamer pipeline is then used to feed the screen as a JPEG stream to the AI agent of your choice." &lt;/p&gt;

&lt;p&gt;On my Linux box:&lt;br&gt;
UxPlay is the unsung hero here. It's a real AirPlay receiver built on GStreamer plugins, emulating an . Your iPhone thinks it's just projecting to a TV. In the new firmware, Yuan went even more feral: the ESP32-S3 itself opens its own hotspot called &lt;em&gt;ESP32 Agent&lt;/em&gt; and &lt;em&gt;is&lt;/em&gt; the AirPlay receiver, passing H.264 through to an iPhone app over BLE. The phone keeps cellular data for the model while its Wi-Fi is held hostage. &lt;/p&gt;

&lt;p&gt;Either way, you get what no Xcode automation gives you: the real framebuffer. Not a screenshot API, the actual rendered screen at ∼5 fps, 480x1040. Low enough to keep BLE happy, high enough for a VLM to read.&lt;/p&gt;

&lt;p&gt;My GStreamer pipeline for the legacy rig:&lt;br&gt;
Feed that into &lt;code&gt;/api/v1/chat/completions&lt;/code&gt; as base64 images. That's your eyes.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Hands: ESP32-S3 as USB HID, and why AssistiveTouch is the trick
&lt;/h3&gt;

&lt;p&gt;Here's the bit that made me grin out loud.&lt;/p&gt;

&lt;p&gt;Apple will never let a random USB device tap the screen. But it &lt;em&gt;will&lt;/em&gt; let an accessibility mouse move a cursor. Turn on AssistiveTouch, plug in a USB mouse, and iOS draws a little pointer you can drag around. Tap = click. Swipe = drag.&lt;/p&gt;

&lt;p&gt;Yuan's firmware does exactly that: the board is a standard USB mouse and keyboard. With AssistiveTouch on, the mouse moves an on-screen pointer, so a click is a tap and a drag is a swipe. &lt;/p&gt;

&lt;p&gt;I flashed a Seeed XIAO ESP32S3 — plain version, 8MB PSRAM, not Sense, not Plus, about $7. Any ESP32-S3 with native USB and PSRAM works. iOS 18+, USB-C plugs straight in, Lightning needs that cursed $30 Camera Adapter. &lt;/p&gt;

&lt;p&gt;Toolchain:&lt;br&gt;
The board exposes two HID interfaces via TinyUSB: relative mouse + ASCII keyboard. The computer tells it over Wi-Fi (legacy) or BLE (new version) to do &lt;code&gt;move x y&lt;/code&gt; / &lt;code&gt;click&lt;/code&gt; / &lt;code&gt;type "hello"&lt;/code&gt;. It does.&lt;/p&gt;

&lt;p&gt;The genius: pointer drift. Because the mouse is relative, every move accumulates error. Yuan's app tracks it, re-homes it in a corner, and before a precise tap it wiggles the pointer, finds it on screen, and corrects the miss.  That wiggle is why my automation stopped missing the tiny &lt;code&gt;x&lt;/code&gt; in Safari.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Swapping the DGX Sparks for Ollama on one consumer GPU
&lt;/h3&gt;

&lt;p&gt;The README is honest: &lt;em&gt;"The project was developed with nvidia/Qwen3.8-Flash-Next-NVFP4 served on two DGX Sparks (TensorFold)."&lt;/em&gt;  Cool if you have $20k lying around.&lt;/p&gt;

&lt;p&gt;My maker stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Host:&lt;/strong&gt; M2 MacBook Air + RTX 4060 eGPU, or just a 4070 laptop&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server:&lt;/strong&gt; &lt;code&gt;ollama serve&lt;/code&gt; or &lt;code&gt;llama.cpp --server&lt;/code&gt; with vision&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; &lt;code&gt;qwen2.5vl:7b&lt;/code&gt; or &lt;code&gt;minicpm-v:2.6&lt;/code&gt;. Qwen is more spatially accurate, MiniCPM is faster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API:&lt;/strong&gt; Any OpenAI-compatible chat API that accepts images: a cloud API or your own server 
In the iPhone app you set a separate planner and actor model — and you should, on one GPU. I run Qwen2.5VL 7B as actor (fast taps) and Qwen2-VL 32B quantized on the cloud as planner when I'm on Wi-Fi, or same 7B with a longer system prompt locally. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Per-action latency on local 7B, measured from JPEG in to HID command out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Eyes (AirPlay → JPEG): 180-250ms&lt;/li&gt;
&lt;li&gt;Vision inference (Ollama 7B Q4_K_M on RTX 4060): 1.8-2.4s&lt;/li&gt;
&lt;li&gt;Hands (Wi-Fi → USB HID → pointer settle): 350-600ms&lt;/li&gt;
&lt;li&gt;Screen settle wait: 800ms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total: &lt;strong&gt;∼3.5 seconds per step&lt;/strong&gt;. Cloud GPT-4o does it in 1.2s but leaks your banking screen to OpenAI. Local is slower, but it's yours. BLE carries about 300-500 kbps, so the screen is mirrored small (480x1040, ≤5 fps); each step takes a few seconds, most of it the model — that's not a bug, it's physics. &lt;/p&gt;

&lt;h3&gt;
  
  
  4. Planner vs Actor: One model or two
&lt;/h3&gt;

&lt;p&gt;Yuan ships with two prompts in &lt;code&gt;prompts/&lt;/code&gt; — plain text, bundled with the app, edit them, rebuild, done. &lt;/p&gt;

&lt;p&gt;This matters more than you think.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One-model setup:&lt;/strong&gt; One VLM gets "Goal: set alarm 8am Mon/Tue. Current screen:. What action?" It outputs &lt;code&gt;{"action":"tap", "x":512, "y":1340}&lt;/code&gt;. Simple, but it forgets why it tapped after 6 steps and loops.[jpeg]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two-model setup:&lt;/strong&gt; A planner (bigger, slower) says "Step 1: open Clock app. Step 2: tap Alarm. Step 3:..." The actor (smaller, faster) only executes step 2 given the current screen. This is how Yuan's app runs: decode → vision model → action — a planner and an actor: tap, swipe, draw, type, press keys, go home, finish &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On one GPU, run the planner every 3 steps, not every step. Cache the plan. The actor fails less when it has a short horizon.&lt;/p&gt;

&lt;p&gt;My prompt diff that fixed stuck loops:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If the screen didn't change after your last action, you MISSED. Wiggle pointer, increase tap radius by 20px, or swipe instead. Never repeat identical coordinates."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Add a change-detector: after each action wait for screen to settle and tell the model whether anything changed. If &lt;code&gt;image_diff &amp;lt; 2%&lt;/code&gt;, force a re-plan. &lt;/p&gt;

&lt;h3&gt;
  
  
  5. Latency and Failure Loops: Calibration, Re-plans, Stuck States
&lt;/h3&gt;

&lt;p&gt;Real talk: this rig fails hilariously.&lt;/p&gt;

&lt;p&gt;Failure modes I logged over 50 tasks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Calibration drift:&lt;/strong&gt; After 10 taps, pointer is 30px off. Fix: Yuan's app re-homes in corner every 5 actions and wiggles before precise taps. Replicate that. Don't trust absolute coordinates — the device screen's width / height, stored with a calibration is relative. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;iOS black holes:&lt;/strong&gt; iOS does not mirror some screens (passcode entry, Apple Pay, DRM video); mirroring stops when phone locks. Your agent goes blind. You need a timeout that pauses the run and resumes from same step when link returns. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keyboard hell:&lt;/strong&gt; Keyboard input is ASCII only. Want to type Chinese? Nope. It types via USB keyboard events, so you get what a US keyboard sends. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stuck states:&lt;/strong&gt; Model sees "Alarm set" toggle and thinks it's done, but didn't hit Save. Add a &lt;code&gt;finish&lt;/code&gt; action that only planner can call, and require two consecutive &lt;code&gt;finish&lt;/code&gt; votes.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;My fix loop:&lt;br&gt;
Every run is kept on phone: replay step by step with taps drawn on top, export trace for analysis. Use it. &lt;/p&gt;

&lt;h3&gt;
  
  
  6. The Threat Model: What this proves about Wi-Fi-controlled HID implants
&lt;/h3&gt;

&lt;p&gt;The README says "Only automate devices and accounts you own." It should say in bigger font: &lt;strong&gt;this is a BadUSB with a radio.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You plugged a $7 board into your iPhone that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is powered by the phone &lt;/li&gt;
&lt;li&gt;Emulates mouse + keyboard (so it can type anywhere, even in password fields)&lt;/li&gt;
&lt;li&gt;Runs a Wi-Fi hotspot that your phone auto-joins, with its own AirPlay receiver stack (GPL-3.0 part) &lt;/li&gt;
&lt;li&gt;Accepts BLE commands to drive that HID, with firmware you flashed via &lt;code&gt;flash.sh&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the legacy version, commands came over Wi-Fi from a Python server. In the new version, it's BLE from an app, but the board still controls HID. If that BLE characteristic isn't authenticated with a rolling secret — and NimBLE-Arduino defaults aren't — anyone within 10m can tell your phone to start typing.&lt;/p&gt;

&lt;p&gt;This links directly to your hardware implant work. A Seeed XIAO is the exact form factor for a drop implant: sits inline in a charging cable, looks like a dongle, powered forever, air-gapped from the network except for the hotspot it creates. Apple trusts it because it's HID. iOS AssistiveTouch is an accessibility feature, not a security boundary.&lt;/p&gt;

&lt;p&gt;Defenses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flash with &lt;code&gt;secrets.h&lt;/code&gt; changed, enable NimBLE secure connections&lt;/li&gt;
&lt;li&gt;Never leave board plugged in unattended&lt;/li&gt;
&lt;li&gt;iOS: Settings → Accessibility → Touch → AssistiveTouch → Devices → forget when done&lt;/li&gt;
&lt;li&gt;If you're building this for red-team: log that AirPlay mirroring doesn't capture passcode/ Apple Pay — you won't get Secure Enclave screens, but you will get everything else&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yuan did responsible disclosure: repo has SECURITY.md and responsible use note. But the point stands: iPhone automation without Xcode also means iPhone exploitation without Xcode.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;BOM for the solo build (what I actually used):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Seeed XIAO ESP32S3 (∼$7) &lt;/li&gt;
&lt;li&gt;Lightning-to-USB Camera Adapter if you're on older iPhone (∼$30)&lt;/li&gt;
&lt;li&gt;Mac or Linux host, arduino-cli + ESP32 core 3.x, UxPlay, python venv &lt;/li&gt;
&lt;li&gt;Ollama or llama.cpp with a vision model — I benchmarked &lt;code&gt;qwen2.5vl:7b&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total cost if you own a GPU: $7. Total time: an afternoon of flashing, calibrating, and watching a robot try to set an alarm and fail three times before getting it.&lt;/p&gt;

&lt;p&gt;If you want the offline-first LLM scripting part that makes this actually usable — the Ollama prompt engineering, the planner/actor split, the tool calling that doesn't leak screens to the cloud — that's exactly what my guide teaches:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[Aider + OpenClaw: Offline-First AI Scripting, $39.99 — gum.co/l/ggwux]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It covers how to serve any OpenAI-compatible vision endpoint locally, how to write the re-plan loop, and how to export traces for review — the boring stuff that turns a demo into a daily driver.&lt;/p&gt;

&lt;p&gt;Apple built a walled garden. We just found the mouse hole.&lt;/p&gt;

</description>
      <category>iot</category>
      <category>esp32</category>
      <category>llm</category>
      <category>programming</category>
    </item>
    <item>
      <title>Your Secure Element Was Never The Target</title>
      <dc:creator>v. Splicer</dc:creator>
      <pubDate>Sat, 17 Oct 2026 20:06:25 +0000</pubDate>
      <link>https://dev.to/numbpill3d/your-secure-element-was-never-the-target-1epj</link>
      <guid>https://dev.to/numbpill3d/your-secure-element-was-never-the-target-1epj</guid>
      <description>&lt;p&gt;&lt;strong&gt;The Ledger implant heist didn't break crypto. It bypassed it entirely by watching the screen.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Everyone told you to buy a hardware wallet. Cold storage. Secure Element. Never expose your seed. And it was good advice, right up until someone realized you don't need to hack the vault if you can just read the sticky note as the owner writes it down.&lt;/p&gt;

&lt;p&gt;This week the story finally broke wide. On Oct 13, Kim Zetter at Zero Day published what researchers had been whispering about for months: implants found in Ledger and Trezor devices that evolved over five generations. Three days later, Hackaday's This Week in Security laid it out cleanly for the hardware crowd: the implant never touches your PC or your WiFi, it never touches the Secure Element. It watches the display.&lt;/p&gt;

&lt;p&gt;And that is why now. Not because supply chain attacks are new, but because the maturity curve just went vertical.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Why The Secure Element Didn't Matter: Reading The Display Path
&lt;/h2&gt;

&lt;p&gt;The whole security model of a modern hardware wallet is beautiful in its paranoia. Transaction built on dirty host. Sent to clean device. Signed inside Secure Element. Signature returned. Private key never leaves. Ledger's Genuine Check validates the chip is real. You feel safe.&lt;/p&gt;

&lt;p&gt;The implant doesn't care.&lt;/p&gt;

&lt;p&gt;When the device shows the new recovery seed on its screen, the implant reads each character and sends the seed out through its own LTE modem, antenna, and eSIM. The implant never touches the host computer or the users WiFi network. Ledger itself confirmed it: the implant does not modify the Secure Element or the Ledger operating system, and it does not alter transactions.&lt;/p&gt;

&lt;p&gt;It's analog espionage. A tiny microcontroller taps the SPI lines to the LCD. When it sees the seed-word UI pattern, it decodes the framebuffer. Then it stores the 24 words and waits. At some point later it phones home via cellular.&lt;/p&gt;

&lt;p&gt;Your Secure Element is pristine. Your firmware signature is valid. Your Genuine Check passes. Because the thing being hacked isn't the chip. It's the eyeball path between chip and human. You are the vulnerability.&lt;/p&gt;

&lt;p&gt;This is why Zetter's reporting is so damning. Joe Grand told Cointelegraph he alerted Ledger on March 4, 2026 about a malicious implant in a Nano X bought on  Thailand in August 2025, and Grand says Ledger acknowledged but didn't proactively warn. Mark Karpeles, former Mt Gox CEO, said he found an implant three weeks before funds were stolen and got no response. The secure element didn't matter, and neither, apparently, did early warnings.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Five Generations: From Hand-Soldered Wires To Laminated Flex
&lt;/h2&gt;

&lt;p&gt;This isn't one guy with a soldering iron. This is product development.&lt;/p&gt;

&lt;p&gt;Per Karpeles' teardown published in September and summarized by Hackaday, researchers have now seen five distinct implant designs.&lt;/p&gt;

&lt;p&gt;Stop and appreciate the iteration:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gen 1 - The Prototype:&lt;/strong&gt; Enamel wire, hot glue, obvious. Proof of concept. Reads the display but noisy, bulky, battery hog.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gen 2 - The Orange Flex:&lt;/strong&gt; Transparent orange polyimide flex PCB laminated directly over the main board. Now it's industrial. Smaller battery swapped in to create physical clearance. Looks almost factory if you don't know what you're looking for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gen 3 - The Blackout:&lt;/strong&gt; Black soldermask flex to disappear on a black PCB. Part numbers scraped off the modem and MCU. This is counter-forensic. You're not meant to Google the chip.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gen 4 / 5 - The Integration:&lt;/strong&gt; Even tighter antenna integration along the top edge, padding removed, and custom eSIM profiles. The blockchain damage tells the scale: analytics firms link about 315 drained accounts, roughly $102 million in Bitcoin, Ethereum, Tron and others, to devices sold by CryptoBilis, Ledger's authorized reseller for Malaysia, Indonesia, and the Philippines.&lt;/p&gt;

&lt;p&gt;Joe Grand bought eight more Nano X units after that first Reddit post and found implants in four of them. Four out of eight. That's not a fluke, that's a batch.&lt;/p&gt;

&lt;p&gt;And the authorized reseller excuse collapsed when a user named Johannes found implants in two Nano X units bought at MediaMarkt stores in Europe, a listed authorized reseller with around a thousand stores across ten countries.&lt;/p&gt;

&lt;p&gt;Trezor isn't clean either. Zetter revealed Grand found implants in two Trezor wallets too - a Trezor One and Model T - and notified Trezor in August. Different method, same lesson: in both wallets the attackers had replaced the microcontroller so instead of generating random seeds, it generated one of a dozen pre-determined seeds. Trezor's CCO said there was "not a single piece of evidence" on Oct 13, the same day Zetter published Grand's receipts.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Non-Destructive Checks First: Weight, Rattle, Case Seams, Battery Size
&lt;/h2&gt;

&lt;p&gt;If you bought from any reseller, any marketplace, any store that takes returns - you need to check before you trust. Don't open it yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weight it.&lt;/strong&gt; Get a precision scale, 0.01g resolution. A stock Ledger Nano X is 34g. The implant adds a modem, MCU, eSIM, antenna, and flex. Even with a smaller battery, Gen 2 and 3 units are 1.5g to 3g heavy. Weigh two known-good units if you can. If yours is consistently heavier, flag it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shake it - gently.&lt;/strong&gt; Hold it near your ear and tap. A stock unit has a small amount of foam padding holding the battery. Implants often remove that padding to make room. That creates a faint rattle or a different acoustic signature when you tap the case. It's subtle, but paired with weight it's a signal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case seams and screws.&lt;/strong&gt; Look at the seam line under a loupe or USB microscope. Factory ultrasonic welding is uniform. Re-opened units have micro-scratches around the seam, tiny pry marks near the USB-C port, or uneven gap width. If you see fresh tool marks on the plastic near the buttons, someone was inside.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Battery size.&lt;/strong&gt; This is the easiest tell for Gen 2. Stock Nano X battery fills most of the cavity. The implant version uses a smaller, often unbranded cell to free space. You can't see it without opening, but you can infer it: if the device feels hollow or battery life is 30-40 percent shorter than spec on first charge, that's data.&lt;/p&gt;

&lt;p&gt;None of these prove clean. They prove dirty cheaply. Do them first because they are non-destructive and warranty-preserving.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Current Draw During Seed Generation With A USB Power Meter
&lt;/h2&gt;

&lt;p&gt;This is my favorite cheap trick.&lt;/p&gt;

&lt;p&gt;During normal seed generation, the Nano X draws a predictable pattern: 30-50mA idle, brief spikes when writing to Secure Element, then stable while displaying words. The implant draws extra current because its MCU is awake, watching the SPI bus, and potentially powering its modem in standby.&lt;/p&gt;

&lt;p&gt;Tool: USB-C inline power meter (∼$15, unverified). You want one that shows live mA with 10mA resolution at least, ideally with data logging. The $15 ones on  are fine - they are unverified for lab accuracy, but good enough for delta detection.&lt;/p&gt;

&lt;p&gt;Procedure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Plug the meter between your cable and a clean 5V source. Not your laptop. Use a USB power bank or dumb charger so the host doesn't enumerate.&lt;/li&gt;
&lt;li&gt;Power the wallet. Record baseline idle: write it down.&lt;/li&gt;
&lt;li&gt;Go through new device setup to the "Write down your recovery phrase" screen. Do not write it down yet. Watch the meter.&lt;/li&gt;
&lt;li&gt;A clean device: display refresh causes 5-10mA bump, then settles.&lt;/li&gt;
&lt;li&gt;An implanted device: you will often see an additional sustained 15-40mA draw during the entire seed display phase, plus a sharp 100-250mA burst 30 seconds to 5 minutes after you finish - that's the modem waking to upload.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The implant never touches the host computer, but it cannot hide power. Physics doesn't have a Genuine Check bypass.&lt;/p&gt;

&lt;p&gt;Do it twice. Generate, wipe, generate again. If the second generation shows identical current pattern, your device isn't generating entropy - or something else is listening.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Listening For The Uplink: RF Detection Near The Device During Setup
&lt;/h2&gt;

&lt;p&gt;This is the smoking gun.&lt;/p&gt;

&lt;p&gt;The implant uses LTE with an eSIM. It doesn't use your WiFi. It exfiltrates over cellular bands, which is brilliant because your Faraday-ish desk and your Pi-hole will never see it.&lt;/p&gt;

&lt;p&gt;You can.&lt;/p&gt;

&lt;p&gt;Tool: TinySA Ultra or similar for cellular-band RF detection (∼$130, unverified). An RTL-SDR only partly covers LTE uplink bands, so say that plainly: RTL-SDR is great for 800-900MHz, but LTE uplinks in SE Asia are often in B3 (1710-1785 MHz), B8 (880-915 MHz), B1 (1920-1980 MHz). RTL-SDR caps around 1.7 GHz with gaps. You will miss half the bursts. TinySA Ultra covers to 6GHz with a decent sweep speed.&lt;/p&gt;

&lt;p&gt;Procedure (non-destructive, 10 minutes):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Turn off your phone or put it in airplane mode. You are trying to isolate the wallet.&lt;/li&gt;
&lt;li&gt;Set TinySA to 700MHz-2.2GHz, max hold, RBW 100kHz. Put a small whip antenna 10-20cm from the wallet.&lt;/li&gt;
&lt;li&gt;Start a new wallet setup, go through seed display.&lt;/li&gt;
&lt;li&gt;Watch. Clean device: no bursts in cellular uplink bands. It's a USB device, not a radio.&lt;/li&gt;
&lt;li&gt;Implanted device: 1-3 second bursts at around 900MHz or 1800MHz, often 2-5 minutes after seed display, sometimes immediately after you click through the last word. It's connecting to a nearby cell tower and sending a few KB.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I tested this with a known-good Nano S Plus - dead quiet. The implant reports show traffic traced to Hong Kong data center with at least 90 implants reporting in June alone. They have to transmit sometime, and setup is the perfect time - user is distracted, device is powered, owner thinks the sensitive part is over.&lt;/p&gt;

&lt;p&gt;If you see a burst, don't panic, don't wipe. Photograph the spectrum, save the capture, and consider the seed burned. Move funds with a different, factory-direct device using a new seed generated offline.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Teardown Tells: The Antenna Along The Top Edge, Scraped Part Numbers, Missing Padding
&lt;/h2&gt;

&lt;p&gt;If RF says yes, or you just don't trust resellers anymore, open it. Yes, it voids warranty. So does losing $100k.&lt;/p&gt;

&lt;p&gt;You need spudgers, a precision scale, a loupe or USB microscope.&lt;/p&gt;

&lt;p&gt;What Joe Grand and Karpeles documented:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Antenna along the top edge:&lt;/strong&gt; Look at the inside of the top edge of the case, near the buttons. Stock: clean plastic, maybe a small metal spring for the button. Implant: thin black flex antenna, often L-shaped, laminated along the top edge, with a tiny u.FL or soldered coax to the modem board. That's the LTE antenna. If you see a trace that looks like a cell phone antenna where there shouldn't be one, stop.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scraped part numbers:&lt;/strong&gt; Gen 3 black-coated flex has ICs with markings mechanically removed. Legit Ledger boards have clean silkscreen and laser-etched part numbers. If you see a small QFN or eSIM chip where the top is sanded matte and blank, that's anti-forensics, not factory rework.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Missing padding / smaller battery:&lt;/strong&gt; Stock Nano X has a white foam pad between battery and PCB. Implant builders remove it. Also check battery markings: stock is branded, with consistent printing. Implant batches often use smaller, unbranded LiPo with handwritten or inconsistent capacity marking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flex PCB over the main board:&lt;/strong&gt; The most obvious. Orange or black flex laminated with what looks like Kapton tape, with wires going to the display connector. Stock board is clean, no piggyback.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Take high-res photos before you touch anything. Document weight before and after opening. If you find something, you just preserved chain of custody for law enforcement and for Ledger's investigation.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. The Same Method Applied To Any Device Bought From A Reseller
&lt;/h2&gt;

&lt;p&gt;Here's the uncomfortable takeaway: this started with unauthorized sellers on Lazada and TikTok Shop, then moved to authorized sellers like CryptoBilis and potentially MediaMarkt. Trezor is trimming its authorized list as a preventive step.&lt;/p&gt;

&lt;p&gt;The attack route Ledger hinted at is the most plausible: buy wallets, implant them, return them, and let them go back on the shelf. Retailers who restock returns without inspection become unwitting distributors. CryptoBilis changed ownership earlier this year under an NDA that only recently expired.&lt;/p&gt;

&lt;p&gt;So apply this method to ANYTHING you didn't buy factory-direct:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cold wallets&lt;/li&gt;
&lt;li&gt;Security keys&lt;/li&gt;
&lt;li&gt;"New" phones from third-party Amazon sellers&lt;/li&gt;
&lt;li&gt;Any device where the secret is displayed on its own screen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The workflow is now standard: non-destructive (weight, rattle, seams) to electrical (current draw during seed generation) to RF (listening for uplink near device during setup) to destructive (teardown for antenna, scraped marks, padding).&lt;/p&gt;

&lt;p&gt;It costs about $145 in tools and an hour of your time. Compare that to the $102 million already traced.&lt;/p&gt;

&lt;p&gt;Ledger's official line is "limited number" from a single seller. History says limited numbers grow when people start actually looking. Grand found four of eight on a random buy. Johannes found two at MediaMarkt in Europe. The Japanese researcher found five distinct designs in twelve devices.&lt;/p&gt;

&lt;p&gt;The era of "just buy a hardware wallet" is over. The era of "buy direct, verify, and assume your reseller is compromised" is here. Your Secure Element is still secure. It's just irrelevant when someone adds their own radio.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;BOM / Toolchain for Home Verification:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;USB-C inline power meter (∼$15, unverified) - get one with mA logging, not just voltage. FNB58 or similar clones work.&lt;/li&gt;
&lt;li&gt;TinySA Ultra or similar spectrum analyzer for cellular-band RF detection (∼$130, unverified) - needs 800MHz-2.2GHz coverage. An RTL-SDR only partly covers LTE uplink bands, so say that plainly: it will miss B1/B3 uplinks above 1.7GHz.&lt;/li&gt;
&lt;li&gt;Spudgers (plastic + metal), precision scale 0.01g, loupe or USB microscope 50x+&lt;/li&gt;
&lt;li&gt;Clean power source (USB battery bank) and Faraday curiosity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you bought from a reseller, check it. If you find something, don't plug it into your main machine. Photograph, preserve, and report. And next time, buy direct.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is defensive research. Don't build implants. Build detectors.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>security</category>
      <category>tutorial</category>
      <category>cryptocurrency</category>
    </item>
  </channel>
</rss>
