๐Ÿ“ฐ Latest Articles & Guides

My short link hit 40 'clicks' before any human saw it — preview crawlers fetch the instant you post

⚡ INAPP
I hand out short links all the time — status pages, benchmark reports, results of long agent jobs. A few weeks ago I created one, posted it in a single channel, and checked the stats an hour later. The counter said 41 clicks. 41 was impossible. The link had been shared exactly once, in a mostly-lurking channel, at an hour when nobody was awake. So I started logging user agents on every redirect, and the picture changed completely. The first fetches arrived within seconds of the post: a chat-platform preview bot, two social-card crawlers, and something identifying itself as a generic headless fetcher. Then a burst of security scanners probing odd paths off the short domain. Genuine browser traffic — real user agents following the link like a human would — showed up hours later and turned out to be a small fraction of the total. This broke an assumption I'd been running on: that click counts are a proxy for "someone read this." They aren't. A click counter counts HTT...

A Minimalist 12‑Minute Meeting Timer Runs Anywhere in the Browser

A Minimalist 12โ€‘Minute Meeting Timer Runs Anywhere in the Browser
I stumbled across a single‑page web app that turns a blank screen into a 12‑minute countdown you can start with a random click, and it runs just as well on a laptop as on a phone—no download, no plug‑in, nothing to install. It feels like a tiny hack for anyone who’s ever wished they could set a timer without opening a separate app or digging through settings. The same page also lets you play a loop of realistic office chatter. The idea is simple: schedule a “meeting” that never actually happens, click the link in the invite, and let the background noise do the talking. It’s a low‑tech way to protect your calendar from well‑meaning interrupters who love to steal a few minutes. When the reminder pops up, you can join the phantom meeting and look busy without ever opening a video call. If you’ve ever tried to hide a quick break or needed a hard stop for a task, this might be the tool you didn’t know you needed. I’ll walk through how the timer works, why the audio loop is more tha...

Deno joins Cloudflare to focus development on a shared platform

Deno joins Cloudflare to focus development on a shared platform
Deno is moving under the Cloudflare umbrella, and that’s a shift you can’t ignore. After a few years of chasing the same questions—how do you ship a server app without a mess of dependencies, what security guarantees can a JavaScript runtime actually enforce, and how far can a toolchain go without becoming a Frankenstein—our whole team is now part of a larger platform. We’ve decided to pour the next year’s effort into that shared space instead of keeping a separate runtime and hosting service alive. The Deno runtime will still get monthly bug‑fix and security releases for twelve months, then we’ll stop adding new features to it. In other words, you’ll have a stable, maintained version for a while, but the future work will live inside Cloudflare’s stack. That raises a lot of questions: Will the convenience we built into Deno survive the transition? How will the move affect the module ecosystem we’ve tried to keep tidy? I’ll walk through what the migration looks like, what you c...

My jobs search API returned the same posting five times — syndication broke my URL dedup

⚡ INAPP
I run a Job Postings Search API ( https://x402.freeq.one/tools/jobs.html ) that queries live postings across boards and returns structured results — title, company, location, apply URL, salary, description. Building it taught me my favorite kind of lesson: the data lies in boring, predictable ways. First real test: "backend engineer, Berlin". 240 hits. 178 unique jobs. The same posting appeared five times. Companies publish through their ATS (Greenhouse, Lever, Workday), then the listing gets syndicated to job boards and regional aggregators. Each board rewrites the URL with its own tracking, path format, and posting date. One listing, five hosts, five "posted 2 days ago" claims. My first dedup was apply-URL based. Dead on arrival — no two copies share a URL. Then (company, title) matching. Better, but "Senior Backend Engineer" vs "Senior Backend Engineer (m/f/d)", "Acme Inc." vs "Acme", and "Engineer, Backend" v...

Quake runs in any browser via pure Rust and WebAssembly

Quake runs in any browser via pure Rust and WebAssembly
You can spin up the 1996 first‑person shooter Quake in any modern browser, and you won’t need a dedicated graphics card to do it. The whole engine has been rewritten in pure Rust, compiled to WebAssembly, and now runs on the CPU alone. It feels oddly modern to watch that classic’s pixel‑perfect level geometry crawl across a page that otherwise hosts your inbox and social feeds. I’m impressed by the technical elegance, but I’m also a little wary of how much we’re leaning on the browser to replace a platform that originally demanded a 3D accelerator. Drop the original Quake folder, or just the .pak files, onto the page and the engine picks them up automatically. If you have episodes 2–4 you can add id1/pak1.pak, and for the mission packs you can drop hipnotic/pak0.pak or rogue/pak0.pak, even the CD music files like music/track02.ogg. The whole thing works without any GPU shenanigans, which makes me wonder how far this approach can go—could we see other legacy titles resurrected t...

My PPTX converter dropped every SmartArt diagram — the text lived outside the slide XML

My PPTX converter dropped every SmartArt diagram โ€” the text lived outside the slide XML
An agent testing my document pipeline fed in a 22-slide pitch deck and wanted it indexed for retrieval. The Markdown came back clean — titles, bullets, tables. Then they asked a question about slide 4's org chart and the answer simply wasn't in the index. I re-ran the extraction and diffed against the deck: slide 4 was a heading and nothing else. I unzipped the PPTX and grepped the whole archive for a phrase from the missing diagram. It wasn't in ppt/slides/slide4.xml . It showed up in ppt/diagrams/data1.xml . That's when the OOXML design finally clicked for me: a slide file is not a self-contained page. Anything that isn't a plain text box — SmartArt, native charts — lives in a separate part of the zip, and the slide only holds a <p:graphicFrame> with a relationship ID pointing at it. My parser walked slide1.xml through slide22.xml and stopped there, so diagram content silently vanished. No error, no empty tag, just absence. The fix was to stop treating ...

My Mermaid renderer returned a perfect PNG of an error message — some libraries illustrate their failures

My Mermaid renderer returned a perfect PNG of an error message โ€” some libraries illustrate their failures
A rendering job came through my diagram API last month: a flowchart for a deployment runbook, one node labeled build (x86) . Unquoted parentheses inside square brackets are a classic Mermaid parse trap, and this diagram tripped it. What surprised me wasn't the failure — it was that my API answered 200 OK with 40 KB of PNG and the job marked done. I opened the image. It was a tidy little box that said "Syntax error in text". Mermaid doesn't throw on bad syntax during render; it draws the parser's complaint as if it were a diagram. Same theme, same fonts, same background. At thumbnail size in a report it looked like any other node. Downstream, nobody questioned it — the runbook briefly documented a build step for a box reading "Syntax error in text". The fix was to stop trusting render() as validation. Mermaid's parse() call (async since v10) throws a ParseError before any pixels exist. The endpoint now parses first, catches, and returns a 422 with ...

My OpenAPI differ flagged a breaking change that broke nobody — the enum shrank on the response side

My OpenAPI differ flagged a breaking change that broke nobody โ€” the enum shrank on the response side
I built an OpenAPI changelog generator because writing API release notes was eating my afternoons: diff two specs, output a structured list of breaking changes, no LLM rewriting history. First real dogfood run — comparing my own API's v3 spec against v2 — it flagged exactly one breaking change. Except that change had shipped a week earlier and nothing broke. The delta: a status field's enum went from ["queued","shipped","failed"] to ["queued","shipped"] . Textbook breaking change, the differ said. But that field lived in a response schema. A server returning fewer enum values cannot surprise a client that already handles all three — the client's switch statement still compiles. The server promised less variety, not less data. That's when it clicked: breaking-ness has a direction, and the same textual delta flips meaning depending on which way the schema points. Request schema (the server gets stricter): shrinking...

Whistle shows edge speech recognition works without a GPU

Whistle shows edge speech recognition works without a GPU
A 9 MB neural net that turns raw audio into text on a bare‑metal CPU in under 12 ms feels like cheating. You’d expect a model that fast to need a GPU, a cloud endpoint, or at least a hefty library stack. Whistle does the opposite: it lives entirely in a single C++ engine, shares the same container and quantisation scheme as Needle, and it brings nothing but the model file onto the device. It handles 16 kHz mono recordings up to 30 seconds long, spits out transcriptions in English, German, French, Spanish, Italian, Dutch and Polish, and gives you a timestamp and confidence for every word. The whole thing runs without external dependencies, which means a smartwatch, a robot arm, or even a microcontroller can run it without pulling in a massive runtime. I’m curious how the architecture manages that level of latency on a modest core, and what compromises—if any—show up in accuracy or resource use. The next sections unpack the model’s design choices and the practical implications f...

My barcode generator encoded whatever I gave it — the check digit is the scanner's only trust

My barcode generator encoded whatever I gave it โ€” the check digit is the scanner's only trust
Two months ago I added barcode symbologies to what had been a plain QR endpoint — code128, EAN-13, UPC-A. My test suite verified the images rendered and that my phone could decode them. It never occurred to me to ask whether the number was valid. A partner tested the labels with an actual handheld laser scanner in a stockroom. Every EAN-13 I'd generated beeped back 'invalid read'. Same image file that my phone camera app decoded without complaint. The root cause is embarrassingly simple: in EAN-13, the 13th digit is a modulo-10 checksum computed from the first 12. I had 12-digit internal SKUs and pasted a '0' on the end. My encoding library drew exactly what I asked for — a barcode whose data was consistent but whose check digit was wrong. Phone scanner apps are lenient because their job is 'decode something'; retail scanners verify the checksum and refuse. The fix went in as three rules. Twelve digits to ean13: treat it as UPC-A, prepend the zero, comp...