Notes
Blog
Notes on browser-only tooling, privacy-first SaaS alternatives, and how TaskKit's tools work under the hood.
-
The tab character that defeats your XSS filter: allowlist schemes, escape everything
A link like [click](java	script:alert(1)) sails through a naive javascript: blocklist, because the browser strips the tab before it resolves the scheme and your string comparison doesn't. Here is how TaskKit's hand-written Markdown renderer stays safe: allowlist the four schemes that are safe, normalize the URL to the string the browser will actually see, and escape every text run by default.
Read post -
The part of a URL your server never sees: shareable links that upload nothing
Everything after the # in a URL stays in the browser. It is never in the request line, never in the Referer header, never in your access logs. Here is how TaskKit packs a whole document into the fragment so a share link decodes on the recipient's machine and the data never touches a server, plus the one hard ceiling on the trick.
Read post -
You can't cancel synchronous JavaScript: Web Workers as the browser's only kill switch
AbortController is cooperative. It can't stop a runaway regex or a multi-megabyte JSON.stringify, and a setTimeout on the main thread can't even fire while one is running. The only true preemption primitive in the browser is Worker.terminate(). Two patterns from TaskKit.
Read post -
When client:load breaks SSR: the Node-imports trap in Astro on Cloudflare
Why a perfectly working React component crashes the build with 'DOMMatrix is not defined' the moment you move from astro dev to a Cloudflare Workers deploy — and the one-line fix.
Read post -
Browser-only Markdown→PDF with Mermaid: pagination math, SVG rasterisation, and the bugs in between
How TaskKit's markdown editor exports a real PDF — with rendered Mermaid diagrams — entirely in the browser. Plus the four bugs that took longer to find than the fix.
Read post