DevIdiot!
Intl.Segmenter: split text without breaking emoji
This note has an interactive demo. Try it in the originalIf you have ever animated a headline letter by letter and watched an emoji turn into a row of broken boxes, the problem was never your CSS: it was split(""). Intl.Segmenter splits text into the pieces a reader actually perceives, and as of October 16, 2026 it is Baseline Widely available.Type anything into the demo above. The top row is what text.split("") gives you; the bottom row is Intl.Segmenter. With a family emoji, a flag and a word
BullMQ vs RabbitMQ: Which Queue for Node.js?
Short answer: For BullMQ vs RabbitMQ: if you run a Node.js application (or a few Node.js services) and already have Redis, use BullMQ. If messages must be routed between many services, written in different languages, through a standalone broker that you operate on its own, use RabbitMQ. They overlap on “do this work later”, but they are different kinds of tools.For the details of each tool, see the BullMQ documentation and the RabbitMQ documentation. BullMQ and RabbitMQ solve different prob
Build a local crop-planning overlay with the Canvas API
A thumbnail can have enough pixels and still cut off the thing that makes it recognizable. Before exporting several versions, it helps to make the crop itself visible.This small, dependency-free HTML page displays a local still image, dims the area a crop will discard, and lets you move the retained rectangle. It does not upload the file or save an edited copy. Save the code as crop-overlay.html and open it in a modern browser. What to checkStart with the intended final aspect ratio. Move t
I built a client-side cache in Rust and compiled it to WebAssembly
I built Blaze Cache, a high-performance client-side caching library written in Rust and compiled to WebAssembly.The goal was simple: make browser caching fast, predictable, and easy to integrate — without turning it into a heavy framework. Why Wasm?Most browser caches are pure JavaScript. That works, but I wanted:More predictable performanceA cleaner core data structureA single engine that multiple adapters could shareSo the hot path (storage, TTL, tags, eviction) runs in Rust → Wasm. After
Reading the DPI back out of a PDF-to-image result: pixels 72 points
I ran the same 4-page PDF through four PDF-to-image converters. At their defaults PDF24, iLovePDF and Smallpdf returned 1008Ă—1440, 1050Ă—1500 and 2100Ă—3000 pixels, and ImgIng gave 1008Ă—1440, 1512Ă—2160 or 2100Ă—3000 depending on the preset. None of the results said what DPI it had used. The word "point" is easy to leave vague, so I worked the DPI backwards from the pixel counts, and it came down to one line of arithmetic. A PDF page has points, not pixelsThe page size inside a PDF is written i
What one 4-page sample can and cannot tell you before you fix a preview DPI
I wanted to fix one number before building a preview pipeline for PDF manuals: the DPI. Pick too low and a preview may look soft on a dense screen, pick too high and every page costs more bytes to serve. The only thing I had to decide with was one 4-page brochure converted a handful of ways. This is a list of what that one file settled, and what it quietly left open.The brochure is the first four pages of an eight-page Wikimedia Commons PDF from Wiki Education Foundation and others, CC BY-SA 3.0
Why the same A4 page at 300 DPI is 2480 or 2481 pixels wide depending on the tool
Ask two PDF converters for the same A4 page at 300 DPI and one hands back a PNG 2481 pixels wide while the other says 2480. Nothing is broken, and a calculator is enough to see why. I ran one A4 page (595.276 Ă— 841.89 pt, generated by me) through four things on a single Apple M4 machine, once each: poppler's pdftoppm 26.08.0, PyMuPDF 1.26.5, pdf.js 4.4.168 in a desktop Chromium 149, and ImgIng, a PDF to image tool in the desktop browser at https://imging.ai/ with its three presets of 144, 216 an
Polymarket Attack: $2,7 Million Stolen from Users
An analysis of the October 29 Polymarket security incident showing how a compromised third-party domain registrar enabled malicious code injection via an external script, bypassing browser sessions to drain funds and positions.On October 29, unknown individuals changed code on Polymarket’s website, replacing a file that the company was uploading from an external partner. The problem was started by DebugBear, a company that measures the speed of websites. According to DebugBear, its Internet addr
pdf.js render() resolves fine on a huge page, but the canvas reads back transparent
A failed render ought to look like a failure: a rejected promise, an exception, something in the console. With pdf.js on an oversized page it does not. The promise resolves, the code after await runs, and the canvas you hand to the next step is empty. All numbers below come from one machine (Apple M4, desktop Chromium 149.0.7827.55, pdfjs-dist 4.4.168), single runs, on a blank vector page I generated myself. Other browsers and phones have different limits, and I did not test them. What the
Where to put a pixel-budget check in a PDF rendering pipeline: after the viewport, before the canvas
Questions about rendering a PDF page to a bitmap are usually about which DPI to pick. This post is about a different one: at which step of the pipeline the size gets checked, because a check placed after the render call cannot catch this failure. The numbers below come from one machine (Apple M4, desktop Chromium 149, pdf.js 4.4.168, poppler 26.08.0, PyMuPDF 1.26.5), run once each on pages I generated myself. Browser limits differ, so none of this transfers to other browsers or devices without t
stageshow skill: How to Make Clean Product UI Demos With Your AI Coding Agent
The stageshow skill is a new add-on for AI coding agents that helps them build "faux UI": simplified product screens, feature cards, bento grids and short cursor animations for landing pages and docs. It was released on 31 October 2026 by designer Benji Taylor, and if you run a small product or make content about software, it's worth a look. This is a research-based walkthrough based on the project's GitHub repo and the author's launch write-up. What problem it solvesMost small teams need p
How to Learn React Hooks (and Stop Fighting useEffect)
The first React app I wrote with hooks had a useEffect that fetched a user profile. It worked on the first load. Then I added the user ID to the dependency array because the linter told me to, and the network tab filled up with the same request, over and over, until the tab froze.I fixed it by deleting the dependency array. That was the wrong fix, and it took me an embarrassingly long time to understand why.Most people learn hooks the way I did: copy a pattern, hit a bug, paste a Stack Overflow
Controlled input work depends on state placement: compare 10, 100, and 500 fields
Field count alone does not determine whether a form should use controlled or uncontrolled inputs. Even with controlled inputs, placing state in each field meant editing one field invoked only one input component.The experiment compared parent-owned values, field-local state, and DOM-owned values across forms with 10, 100, and 500 fields. Reducing repeated component work requires looking at state placement as well as whether inputs are controlled. Count component calls for the same input ope
What I Learned Building a Shopify Post-Purchase Tracking Widget
I still remember the exact moment I realized how much time I was wasting on support emails. I was helping a friend manage her Shopify store, and we were drowning in "Where is my order?" (WISMO) messages. We’d spend hours manually checking carrier websites, copying tracking numbers, and pasting them into email replies. It was exhausting, unscalable, and frankly, a terrible customer experience. The post-purchase phase felt like a black hole for the buyer.So I decided to build something. The P
Architecting a Headless Shopify Tracking Widget for Post-Purchase
When I first started helping a friend manage their Shopify store, I thought the hard part was getting sales. I was wrong. The real nightmare started after the checkout. Every day, my inbox flooded with "Where is my order?" (WISMO) emails. Customers were anxious, and I was spending hours copy-pasting tracking numbers from carrier websites.I tried a few off-the-shelf apps, but they either bloated the page load time with heavy third-party scripts or locked the branding behind expensive paywalls. I
Building an Etsy Fee Calculator: The Math, The Mistakes
When I first started selling my handmade goods on Etsy, I made a classic rookie mistake: I looked at the sale price, subtracted my material costs, and assumed the rest was profit.A few months in, I sat down to do my taxes and realized my bank account didn't match my spreadsheet. I was bleeding money. I had completely overlooked the compounding nature of Etsy's fees. Between the listing fees, transaction fees, payment processing, and the sudden surprise of offsite ads fees, my actual margins were
Designing a Serverless Etsy Fee Calculator from Scratch
When I first started selling handcrafted leather goods on Etsy, I thought I had my margins figured out. I would price an item, subtract the cost of materials, and call it a day. But at the end of the month, my bank account didn't match my spreadsheet. I was bleeding money to hidden fees, offsite ad charges, and payment processing costs that I hadn't fully accounted for. I tried using the built-in tools, but they felt like black boxes. I just wanted to see the exact math laid out in front of me.
Six parsing changes that made invoice extraction trustworthy
First version worked on my test invoice. Then a real accountant sent twelve.It got the date on nine of them, the total on six, and the right total on four. The failures were not random — they clustered into six patterns, and fixing those six is what turned a demo into something I would let a bookkeeper use.This is the second post in a series about DocExtract, where the PDF never leaves the browser. The first post covered the architecture and the walls; this one is about the specific parsing deci
Factory Droid 1.0 Script Mode: Hundreds of Tool Calls from One Model Request in a JS Sandbox
On 29 October 2026 Factory shipped Droid 1.0 and made programmatic tool calling the default. The model no longer emits one tool call, waits for the result, and repeats. It writes a short JavaScript program that runs inside a sandbox, can fire hundreds of tool calls in a single model request, and only returns the printed summary.That change matters once you leave toy demos. In a normal agent loop every tool result is appended to the context window. After a few dozen file reads, search results or
Case Converter: Batch-Renaming PascalCase React Components to kebab-case Without Breaking Imports
Last Tuesday we agreed on a file naming rule. Components move to kebab-case, so ChatWidget.tsx becomes chat-widget.tsx, and the old PascalCase files disappear.The trigger was mundane. Two teammates on macOS kept hitting broken checkouts because DateRange.tsx and daterange.tsx are two files in CI on Linux, but a single file on their laptops. Same repo, two views of it.Eleven components. Sounds like one slow afternoon.I spent most of that afternoon on three problems that have nothing to do with co