Private, browser-based file tools. No uploads. No accounts. No servers.
- What is FileForge?
- Live Demo
- Tools
- Privacy
- Tech Stack
- Project Structure
- Getting Started
- Architecture
- Security Audit
- Browser Support
- Contributing
- License
FileForge is a 100% client-side file processing toolkit that runs entirely in your browser. It converts, resizes, compresses, crops, and inspects files using modern Web APIs β your files never leave your device.
There is no backend, no cloud storage, no analytics, and no accounts. Open the page, use a tool, download your result.
Try FileForge directly in your browser:
https://anfaalresearch.github.io/FileForge/
| Tool | Description | Formats |
|---|---|---|
| Image Converter | Convert images between formats | PNG Β· JPG Β· WEBP Β· GIF Β· BMP |
| Image Resizer | Resize with custom dimensions or presets | Any image |
| Image Compressor | Reduce file size with a quality slider + before/after compare | PNG Β· JPG Β· WEBP |
| Image Cropper | Crop with free or locked aspect ratios, rotate & zoom | Any image |
| Image to PDF | Combine multiple images into a single PDF | Any image β PDF |
| File Size Reducer | Compress with live size estimation | PNG Β· JPG Β· WEBP |
| File Information | Inspect metadata β name, MIME, size, dimensions | Any file |
FileForge was designed from the ground up with privacy as the first constraint, not an afterthought.
- β No server uploads β files are processed entirely in-browser using the Canvas API and FileReader API
- β
No tracking β zero analytics, zero telemetry, zero cookies (except
localStoragefor theme preference) - β No accounts β nothing to sign up for
- β Core processing runs locally β file operations happen directly in your browser
- β
Object URLs revoked β all
URL.createObjectURLblobs are revoked after use to free memory
Note: The only external resource loaded at runtime is jsPDF 2.5.1 from the Cloudflare CDN, used solely for PDF generation. All other functionality is self-contained.
| Layer | Technology |
|---|---|
| Structure | HTML5 (semantic, accessible markup) |
| Styling | Vanilla CSS3 (custom properties, grid, glassmorphism) |
| Logic | Vanilla JavaScript ES2020+ (IIFEs, async/await, Canvas API) |
| Font | Inter via Google Fonts |
| PDF generation | jsPDF 2.5.1 via CDN |
| Image processing | HTML5 Canvas API |
| File reading | FileReader API + File Drag & Drop API |
| Routing | URL ?tool= query param + history.pushState |
| Persistence | localStorage (theme + recently used tools only) |
FileForge/
βββ index.html # Landing page (hero, tool cards, privacy section)
βββ tools.html # All tools shell (SPA-style panel switching)
βββ README.md
β
βββ css/
β βββ style.css # Full design system β tokens, components, layouts
β βββ responsive.css # Breakpoint overrides (1024px, 768px, 480px)
β
βββ js/
βββ utils.js # Shared FF namespace β helpers, toast, drop zones
βββ app.js # Theme toggle, sidebar nav, tool switching, routing
βββ scene.js # Hero background canvas ambient animation
β
βββ image-converter.js # Tool: format conversion
βββ image-resizer.js # Tool: resize + aspect ratio lock + presets
βββ image-compressor.js # Tool: quality slider + before/after compare
βββ image-cropper.js # Tool: canvas crop box + rotate + zoom
βββ image-pdf.js # Tool: multi-image β PDF (uses jsPDF)
βββ file-reducer.js # Tool: compression with live size estimate
βββ file-info.js # Tool: file metadata inspector
FileForge requires no build step, no npm, no dependencies to install.
git clone https://github.com/anfaalresearch/FileForge.git
cd FileForge
# macOS
open index.html
# Linux
xdg-open index.html
# Windows
start index.htmlSome browsers restrict file:// protocol for certain APIs. Use any static server:
# Python 3
python3 -m http.server 3000
# Node.js
npx serve .
# PHP
php -S localhost:3000Then open http://localhost:3000.
All shared utilities live on the window.FF object, defined in utils.js and available to every tool script:
FF.formatFileSize(bytes) β "1.4 MB"
FF.getFileExtension(filename) β "png"
FF.mimeToExt(mime) β "jpg"
FF.mimeToFriendly(mime) β "JPEG"
FF.changeExt(filename, ext) β "photo.webp"
FF.loadImage(file) β Promise<HTMLImageElement>
FF.downloadBlob(blob, filename) β triggers browser download + auto-revoke
FF.setupDropZone(zone, input, cb) β wires drag & drop + file input
FF.show(el) / FF.hide(el) β add/remove .hidden class
FF.toast(message, type) β type: 'success' | 'error' | 'warning' | 'info'
Every tool follows the same IIFE structure:
(function () {
'use strict';
// 1. Query all DOM elements needed by this tool
const upload = document.querySelector('#myToolUpload');
// 2. Wire up drag & drop and file input via FF.setupDropZone
FF.setupDropZone(upload, fileInput, handleFile);
// 3. handleFile β validate, update file card, show controls
function handleFile(file) { /* ... */ }
// 4. Core processing β async, uses Canvas API or jsPDF
async function processFile() { /* ... */ }
// 5. resetTool β revoke object URLs, clear state, restore upload zone
function resetTool() { /* ... */ }
})();tools.html is a single-page shell. Panels are toggled via the .hidden CSS class.
| Trigger | Behaviour |
|---|---|
Page load with ?tool=resizer |
Opens Image Resizer directly |
| Sidebar link click | Switches panel + pushes URL via history.pushState |
| Browser back/forward | popstate listener re-reads URL and switches panel |
| Sidebar search | Filters sidebar links by name in real time |
| Finding | Severity | Status |
|---|---|---|
| File contents never sent to any server | β | β By design |
URL.createObjectURL blobs revoked after use |
β | β Implemented |
Filename sanitized before innerHTML injection |
Low | β Fixed |
No eval() or document.write anywhere |
β | β Clean |
localStorage stores only theme + tool IDs, never file data |
β | β Clean |
| All async processing wrapped in try/catch with user feedback | β | β Handled |
| File size limits enforced before processing | β | β 100MB images Β· 500MB info |
CORS canvas taint impossible β all sources are local File objects |
β | β N/A |
| Browser | Support |
|---|---|
| Chrome / Edge 90+ | β Full |
| Firefox 90+ | β Full |
| Safari 15+ | β Full |
| Safari iOS 15+ | β Full |
| Chrome Android | β Full |
Requires: Canvas API Β· FileReader API Β· File Drag & Drop Β· CSS Custom Properties Β·
URL.createObjectURLΒ·history.pushState
- Fork the repo
- Create a branch:
git checkout -b feat/my-new-tool - Follow the tool pattern above
- Test in Chrome and Firefox
- Open a pull request
- Create
js/my-tool.jsfollowing the IIFE tool pattern - Add
<div id="panel-mytool" class="tool-panel">intools.html - Add
<a class="sidebar-link" data-tool="mytool">intools.html - Register the name in
toolNamesinapp.js - Add a card in
index.html - Add
<script src="js/my-tool.js"></script>intools.html
MIT Β© 2026 Anfaal
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files, to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software.
Made with β‘ for the open web.