Local-first file tools for the browser: crop, resize, rotate, compress and convert images (including HEIC), merge/split/rotate PDFs, turn Markdown into PDF, convert CSV ⇄ JSON. 24 tools, everything runs on your device. Nothing is uploaded anywhere.
| Chrome, Edge, Brave, Opera | Chrome Web Store |
| Firefox | Firefox Add-ons |
| Any browser, no install | andronaft.github.io/FileForge — installable as an app, works offline |
After installing: click the toolbar icon or press Alt+Shift+F, right-click any image → Edit image in FileForge, or right-click a PDF link → Open PDF in FileForge.
| Group | Tool | What it does |
|---|---|---|
| Images | Crop | Drag a rectangle or type exact pixels, aspect-ratio presets |
| Images | Resize | Presets (4K, Full HD, HD…), pixels or percent, batch, keeps aspect ratio |
| Images | Rotate & flip | 90° / 180° / 270°, mirror horizontally or vertically, batch |
| Images | Compress | Quality slider, target size in KB, optional max dimension, shows how much was saved |
| Images | Convert | JPEG ⇄ PNG ⇄ WebP (GIF, BMP, SVG, AVIF accepted as input) |
| Images | HEIC to JPG | iPhone HEIC/HEIF → JPEG, PNG or WebP (libheif in a sandboxed frame) |
| Images | Watermark | Text in a corner, centred, or tiled diagonally, with live preview |
| Images | Remove metadata | Shows camera, date, exposure and GPS (with a map link), then strips EXIF, GPS, XMP, IPTC and comments without re-encoding |
| Images | Favicon & app icons | favicon.ico + PNG set + Apple touch + PWA icons + HTML snippet + webmanifest |
| Merge | Combine PDFs in the order you choose | |
| Split | Extract page ranges, every page separately, or chunks of N pages | |
| Rotate | All pages or a selection, several files at once | |
| Delete pages | Remove listed pages | |
| Page numbers | Header or footer, several formats, custom start | |
| Watermark | Diagonal text such as DRAFT or CONFIDENTIAL on every page | |
| Compress | Lossless (compact structure, drop metadata, text stays) or re-render pages as JPEG for scans | |
| Remove metadata | Shows and strips title, author, software, dates, keywords and XMP | |
| Images to PDF | One image per page, fit-to-image or A4 / Letter with margins | |
| PDF to images | PNG or JPEG at 72 / 150 / 300 dpi | |
| PDF to text | Text layer as .txt or Markdown with a heading per page, wrapped lines re-joined | |
| Text & data | Markdown to PDF | Live preview, three stylesheets, A4 / Letter, print-to-PDF or HTML download |
| Text & data | CSV ⇄ JSON | Auto-detects direction and delimiter, handles quoted cells |
| Text & data | JSON format | Pretty / minify, sort keys, points at the exact error position |
| Text & data | Base64 | Encode text or any file (optionally as a data: URL), decode to text or file |
Multiple results can be downloaded as a single ZIP or copied to the clipboard. Images can be pasted from the clipboard, dropped anywhere on the page, or opened from the OS "Open with" menu when the web version is installed as an app. Batches show a progress bar with a Cancel button, Ctrl/⌘+Enter runs the tool, and every tool remembers the options you used last time.
- Open
chrome://extensionsand switch on Developer mode. - Click Load unpacked and choose this folder (for Firefox:
about:debugging→ Load Temporary Add-on →dist/firefox/manifest.jsonafterpython3 scripts/package.py). - Click the FileForge icon in the toolbar, or right-click an image on any page and pick Edit image in FileForge.
The context menu asks for permission to read images from that site only when you first use it. The extension requests no host permissions up front.
Any static server works. For example:
python3 -m http.server 8765Then open http://localhost:8765/app/index.html.
python3 scripts/package.pyThis writes dist/fileforge-chrome-<version>.zip and dist/fileforge-firefox-<version>.zip. The Firefox build swaps the background service worker for an event page, moves the optional host permission to optional_permissions, adds the Gecko add-on id and drops the sandbox page (so HEIC conversion is web-only on Firefox).
manifest.json Chrome extension manifest (Manifest V3)
background.js Service worker: toolbar button + image context menu
app/index.html The app shell
app/app.js Router, drop zone, file list, results
app/util.js Shared helpers (download, zip, page ranges, widgets)
app/tools/image.js Canvas-based image pipeline and the five image tools
app/tools/pdf.js PDF tools built on pdf-lib
app/tools/markdown.js Markdown → PDF / HTML using marked
app/tools/data.js CSV ⇄ JSON, JSON format, Base64
app/heic-sandbox.* Sandboxed page that runs heic2any (needs eval)
scripts/package.py Builds Chrome and Firefox zips
vendor/ pdf-lib, fontkit, pdf.js, marked, JSZip, heic2any, Noto Sans subset (vendored, no build step)
icons/ Extension icons (generated by scripts/make_icons.py)
No build step, no framework, no dependencies to install.
- Everything runs in browser memory. Very large files (hundreds of MB) may be slow or fail.
- "Compress PDF" rasterises pages, so text stops being selectable. Use it for scans and photo PDFs.
- HEIC conversion needs the sandboxed page, which Firefox extensions do not support; the web version works everywhere.
- DOCX ⇄ PDF is not implemented (needs a server-side converter).
https://andronaft.github.io/FileForge/ is the same app without the extension parts, deployed from main
by the pages workflow. The privacy policy the stores link to is
https://andronaft.github.io/FileForge/privacy.html.
See docs/PUBLISHING.md: a vX.Y.Z tag (or Actions → release → Run workflow)
builds both zips, creates a GitHub Release and submits them
to the Chrome Web Store and addons.mozilla.org.
Store listing text: docs/store-listing.md; changes per version: CHANGELOG.md.
See PRIVACY.md. Short version: no uploads, no accounts, no analytics.
