runlocally
Engineering notes
How the runlocally tools are built: the technologies each tool uses, what they are, and how they fit together. One technical article per tool.
Merge PDF July 1, 2026How Merge PDF is built
The technology behind Merge PDF: combining several PDFs in the browser with pdf-lib (copyPages across documents → addPage → save), controlling the page order, and why merged output isn't deduplicated.
Split PDF June 30, 2026How Split PDF is built
The technology behind Split PDF: extracting page ranges in the browser with pdf-lib (PDFDocument.load → copyPages → addPage → save), and parsing a 1-based page range into the set of pages to keep.
Fix ZIP Filenames June 29, 2026How Fix ZIP Filenames is built
The technology behind Fix ZIP Filenames: re-decoding garbled ZIP entry names from their raw Shift_JIS/CP932 bytes with the browser's TextDecoder, then re-writing the archive with the UTF-8 filename flag set, using @zip.js/zip.js.
ZIP Viewer June 28, 2026How ZIP Viewer is built
The technology behind ZIP Viewer: listing a .zip without extracting it by reading only the central directory with @zip.js/zip.js (ZipReader.getEntries), and surfacing the UTF-8 filename flag — no decompression, no Web Worker.
Create ZIP June 27, 2026How Create ZIP is built
The technology behind Create ZIP: building a .zip in the browser with @zip.js/zip.js (ZipWriter + BlobWriter, deflate), setting the UTF-8 filename flag so non-ASCII names survive on Windows, and the Web Workers zip.js uses for compression.
WebP to JPG June 26, 2026How WebP to JPG is built
The technology behind the WebP to JPG converter: decoding WebP natively with an <img> element, encoding to JPG or PNG on a 2D canvas (with alpha matting and resizing), and the static Astro/Preact PWA shell — no WASM and no Web Worker.
HEIC to JPG June 25, 2026How HEIC to JPG is built
The technology behind the HEIC to JPG converter: the HEIF/HEVC format, decoding it with libheif compiled to WebAssembly in a Web Worker, the OffscreenCanvas encode path with a Safari fallback, the Service Worker that makes it an offline PWA, and the Cloudflare Pages routing and caching details.