About DankDev
Developer · Creator · Innovator
DankDev is a personal display website for my software projects and the writing around them — web apps, AI automation, Raspberry Pi and command-line tooling. Today that is eight project write-ups and 60 blog posts, alongside the five other sites listed further down this page. The hardware work — ESP32 boards, wiring, firmware — is published separately on dankbuild.com.
Rather than describe that in adjectives, the next two sections are an index of it: every project and every post by name, each with the one-line description already published on its own page, so you can tell from here whether any of it is worth opening.
The Eight Projects
Each one has a full write-up at the link. These lines are the descriptions those pages publish about themselves:
- XRechnung and EN 16931 Invoice Validator — a zero-dependency Python conformance validator for EN 16931 invoices: UBL 2.1, UN/CEFACT CII, the German XRechnung CIUS, and the XML embedded in Factur-X / ZUGFeRD PDFs.
- Two Thousand Pages From One City File — one 11,156-line Node script (measured 2026-09-05) turns 152 cities into 2,197 static pages. The content-hash mechanism, the 18 guards that run before a commit, and the 675 mature pages nothing has ever found.
- Generating 3D-Printable Parts From Code — a dependency-free Node kernel turning parameters into binary STL parts, checked by overlap, fit and re-parse layers. None of the four has been printed yet.
- Routes With No File Behind Them — a single-page app whose URLs have no file behind them: a shell for unknown paths, five prerendered route documents, and why that branch is not cloaking.
- Two Transports for One Chess Game — why the online board sends moves over a WebSocket relay and chat over a WebRTC data channel between the two browsers, and what the split costs.
- WiFi Security Monitor — an open-source Python 3.7+ toolkit for deauth attack detection and device monitoring on Linux, using behavioral analysis of timing, RSSI and sequence numbers.
- Raspberry Pi Bluetooth Tracker — a Node.js project that uses bluetoothctl on a Raspberry Pi 5 to scan the area and calculates Bluetooth device distances in meters from signal strength.
- Oscillationa X/Twitter Bot — an autonomous bot on X/Twitter running on a Raspberry Pi 5: it responds to mentions and replies, and generates AI art with Replicate Flux 2 Pro.
What the Blog Covers
60 posts. They fall into three groups. The first is write-ups of running autonomous coding agents with the numbers attached:
- What Does a Month of Autonomous Coding Agents Cost? — per-run token accounting for all 937 runs of two loops over four weeks: 106.8M tokens, 1,128 shipped tasks, €0 revenue, including the four consecutive runs that spent 437,315 tokens discovering a typo.
- What Actually Breaks When a Coding Agent Runs Unattended for Weeks — twenty-five days of after-the-fact numbers. Nine runs died mid-task; four were killed by the wording of the task, none by the model or the token budget.
- How to Stop an AI Agent From Working on Itself — 106 of the 187 verified tasks completed over ten days were the system repairing its own output or its own test machinery, and why you cannot filter that residue to zero.
- Your Work Queue Can Lie to You — three separate mechanisms produced the same false "nothing to do": a throttle that deleted a row, a safety filter that silently dropped a task, and that filter tripped by a prohibition which manufactured the forbidden string.
- How to Run a Cheap Model Inside a Coding Agent Loop — splitting work between an expensive model and a cheap one using fixed test vectors the cheap model is not allowed to edit, with the costs measured over seven libraries and the two places it failed.
- Make Your Terminal Glow When Claude Code Needs You — a per-session visual signal built on hooks, the process tree, and a handful of OSC escape codes.
The second group is defaults, standard advice and assumptions that turned out to be wrong, each checked rather than argued:
- Cloudflare Email Obfuscation Silently Rewrites Scoped Package Versions — Email Address Obfuscation is on by default and rewrites anything email-shaped at the edge, after your origin has already served the bytes. A scoped npm identifier with a version pin is email-shaped.
- npm Resolves Your README's Relative Links Against the repository Field — leave that field out of package.json and every relative link resolves against npmjs.com instead of your repo. npm versions are immutable, so a listing that shipped wrong can only be superseded, never edited.
- We Dropped ffmpeg.wasm for WebCodecs — three pinned core builds are GPL-configured, including the MIT-labeled one. Swapping in WebCodecs plus a vendored MIT muxer worked, but moved three jobs from FFmpeg's shoulders onto ours.
- Does Longer Content Rank Better? — I tripled the word count on five pages that earned Google referrals, then checked what each page actually weighed on the day it first ranked. The order of events was the opposite of what I assumed.
- scrollWidth Does Not Detect Clipping: 240 False
Positives on One Page — the standard advice for finding cut-off content is
scrollWidth > clientWidth. Walking all 1616 elements of one ordinary page with it gave 240 hits, not one of which was cutting anything off, plus a replacement probe that scored 0 on the same page and still fires on a box that really does clip. - Who Actually Sends Traffic to a New Site? Seven Days of Referrers, Measured — every article about traffic assumes the answer is Google. On a group of small, young sites, the seven days ending 2026-09-13 produced 111 referrals from chatgpt.com and 8 from Google. The full referrer table, and what the groupings really mean.
- Does IndexNow Do Anything? I Submitted 2,194 URLs and Measured What I Could — it is free, takes an afternoon, and almost nobody publishes a measured answer. Every HTTP receipt kept, and then the discovery that the one search instrument I owned reports on the one major engine that does not participate.
- Sitemap lastmod Without Lying: Date a Page by What Changed — a static site generator rewrites every file on every build, so a naive sitemap swears all 2,194 pages changed today, and again tomorrow. What the field should actually answer to, computed from a content signature and a committed ledger instead of a database.
- Why Your Sitemap Lists URLs Your Own Pages Disown —
a sitemap
<loc>and arel=canonicalthat disagree have not published a preference, they have published an argument. The three ways an Astro build produces it — trailing slashes, off-origin canonicals, and files that are not routes — with the config that fixes each and a dependency-free Node script that audits your own dist/.
The third group is the builds themselves, and the shorter update posts:
- YouTube Shorts Automation — a fully automated pipeline on a Raspberry Pi 5 that generates and uploads daily Shorts across 5 channels, using AI for scripts, voice, music, SFX and video.
- 20 Zero-Dependency Libraries, 19 of Them on npm — small tested packages for geodesy, solar and lunar math, climate and weather indices, and everyday CSV, CIDR and SemVer utilities.
- An E-Invoice Conformance Engine That Reads PDFs — how the validator is differential-tested against the official Schematron and emits SARIF for CI.
- Phone System: Self-Hosted SMS & Call Gateway — building a personal communication gateway with SMS messaging, call management and SIM card storage.
- X Auto-Post Queue System — queue management, scheduling and image automation for an account that posts four times daily.
- WiFi Security Monitor v1 — the release post for that Python toolkit: deauth attack detection and network device monitoring with behavioral analysis.
- Oscillationa Bot Updates, New Puzzles Added to 33o1.com and Website Pagination Updates — shorter notes on changes to the other sites: an image generator and one video a day, more decoding puzzles, and reworked pagination.
Hardware writing is not here. The ESP32 and electrical-engineering build-logs — bill of materials, wiring, firmware and the debugging in between — live on dankbuild.com/electronics, which is the site I keep for that work. This site had a one-entry summary of the ESP32-S3 first-light build for a while; the full write-up was always dankbuild's, so as of September 2026 the section is only published there.
New posts go out by RSS: paste dankdev.com/feed.xml into any feed reader. It is a plain XML file — no signup, no email address, no account.
What I Work With
- 🌐 Web Development — JavaScript, Node.js, HTML/CSS, APIs
- 🤖 AI & Automation — Python, machine learning, bots, image generation
- 🔐 Security & Networks — network security, cryptography, WiFi analysis, monitoring
- ⚙️ Hardware & IoT — Raspberry Pi, ESP32, sensors, embedded systems
About the Name
DankDev is the identity I build and publish under.
The Sites I Run
Five other sites I build and maintain, alongside this one:
- WeatherHack.com — fast, ad-free forecast pages for any city with no account or signup, plus 1,824 per-city, per-month climate pages built from 2020–2024 ERA5 normals.
- VerifyHash.com — tamper-evidence tooling, plus an EN 16931 / XRechnung e-invoice conformance engine that validates the XML embedded in Factur-X and ZUGFeRD PDFs.
- DankChess.com — play a friend over a shareable link with no account and nothing to install, alongside ten main lines played out move by move, six tactical motifs, and a board you can play against the computer.
- DankBuild.com — hands-on ESP32 and embedded build-logs with the full bill of materials, the wiring, the firmware and the gotchas, plus four in-browser parametric part designers that hand you a geometry-checked STL. None of the parts has been printed yet, and the site says so.
- 33o1.com — a puzzle site featuring decoding challenges inspired by Cicada 3301.
Let's Connect
Interested in my work? Check out my projects or read the blog.
Or just email me at [email protected] — good reasons to write include a question about how something on this site is built, licensing or running the E-Invoice Conformance Validator against your own invoices, and work.