Fair Go PDF
No worries, PDF tools done right. Free, no-signup, privacy-first browser tools for common image and
PDF tasks — compress, convert, resize, merge, split, and more.
Your files never leave your browser. Every tool runs entirely as client-side JavaScript. There
is no backend, no upload, and no server that ever sees your files — you could disconnect from the
internet after the page loads and every tool would still work. No account, no email gate, no
watermarked output.
fairgopdf.au →
Dark mode, same privacy
One of 79 tools, each its own page
Tools (v1)
79 tools across three categories — 13 image, 53 PDF, 13 utilities.
Image tools
| Tool | URL | What it does |
|---|
| Compress Image | /compress-image/ | Shrink JPEG/PNG/WebP by quality or down to a target file size, with resize/crop, format change, background colour for JPEG, a keep-the-original safeguard and ZIP download |
| Convert Image Format | /convert-image/ | Convert between PNG, JPG, WebP, GIF, BMP and SVG |
| HEIC to JPG | /heic-to-jpg/ | Convert iPhone HEIC/HEIF photos to JPG |
| Resize Image | /resize-image/ | Resize by exact pixel dimensions or by percentage |
| Crop & Rotate Image | /crop-rotate-image/ | Rotate, flip, and drag-to-crop |
| Add Border to Image | /add-border-to-image/ | Add a solid colour frame around one or more images |
| Image Colour Filters | /image-colour-filters/ | Greyscale, sepia, brightness, contrast and saturation |
| Round Corners / Circle Crop | /round-corners-image/ | Round an image's corners or crop it to a circle |
| Watermark Image | /watermark-image/ | Stamp custom text across one or more images |
| Social Media Cropper | /social-media-cropper/ | Crop to exact Instagram/X/YouTube/LinkedIn/Facebook sizes |
| Collage Studio | /collage-studio/ | Drag, resize and rotate photos anywhere on a board, no fixed grid |
PDF tools
| Tool | URL | What it does |
|---|
| Merge PDF | /merge-pdf/ | Combine PDFs and JPG/PNG/WebP pictures into one, in any order, with a Pages box per file (1-3, 7, 10-, last, except 2), sort buttons, blank pages for double-sided printing, bookmarks per file, title/author and file name |
| Split PDF | /split-pdf/ | Extract picked pages, or split by custom ranges, every N pages, equal parts, top-level bookmarks or a maximum file size; thumbnails show which file each page goes into, several files download as a ZIP |
| Compress PDF | /compress-pdf/ | Reduce PDF file size (quick clean or strong/rasterised) |
| Images to PDF | /images-to-pdf/ | Combine JPG/PNG images into a single PDF |
| HEIC to PDF | /heic-to-pdf/ | Turn one or more iPhone HEIC/HEIF photos into a single PDF |
| PDF to Images | /pdf-to-images/ | Export every page as a PNG, JPG or WebP |
| Organise PDF Pages | /organise-pdf/ | Pick pages (click, Shift/Ctrl-click, odd/even, typed ranges) then rotate, delete, duplicate, move or drag them as a group; add blank pages or pages from another PDF; undo/redo; reverse order |
| Extract PDF Text | /extract-pdf-text/ | Pull all text out of a PDF to copy or download as .txt |
| OCR PDF | /ocr-pdf/ | Make a scanned PDF searchable and copyable with on-device text recognition (self-hosted PaddleOCR engine, ~33 MB on first use) |
| Tag PDF | /tag-pdf/ | Add accessibility tags, bookmarks, language and a title to a mostly-text PDF, with a review screen for headings and image descriptions |
| Edit PDF Metadata | /pdf-metadata/ | View, change, or clear title, author, subject and keywords |
| Add Page Numbers | /add-page-numbers/ | Stamp page numbers in any position/format, with zero-padding for Bates-style numbering |
| Watermark PDF | /watermark-pdf/ | Add a custom text watermark across every page |
|
Utilities
| Tool | URL | What it does |
|---|
| Convert to Markdown | /convert-to-markdown/ | Convert a PDF, Word (.docx) or HTML file to Markdown |
| AI Writing Checker | /ai-writing-checker/ | Flag AI-sounding words, filler phrases and cliché patterns in any text |
| Password Generator | /password-generator/ | Passwords, ready-made rule sets (server, database, API key, Wi-Fi) and EFF-wordlist passphrases, in batches, with honest entropy and crack-time figures, export and print |
| QR Code Generator | /qr-code-generator/ | QR codes for links, social profiles, text, Wi-Fi, contact cards, email, locations, events, phone, SMS, WhatsApp, lost-and-found tags and app downloads, with your own colours, shapes, icon or logo and ready-made looks; download as PNG, SVG, JPG or WebP |
| UUID Generator | /uuid-generator/ | Generate random v4 UUIDs, one or in bulk |
| Hash / Checksum Generator | /hash-generator/ | Generate SHA-1/256/384/512 hashes of text or a file |
| JSON Formatter | /json-formatter/ | Pretty-print, minify and validate JSON |
| Case Converter | /case-converter/ | Convert text between UPPERCASE, lowercase, camelCase and more |
| Colour Picker & Converter | /colour-picker/ | Pick a colour and convert between HEX, RGB and HSL live |
| Word & Character Counter | /word-counter/ | Count words, characters, sentences and paragraphs, with reading time |
| Read Aloud | /read-aloud/ | Have a PDF, Word doc, .txt file or pasted text read aloud, with live word highlighting |
| Handwriting Worksheets | /handwriting-worksheets/ | Printable cursive or print handwriting practice sheets with traceable letters |
| Calendar Generator | /calendar-generator/ | Printable 12-month calendar PDF for any year, mark birthdays and custom dates |
Coming soon (v2 backlog)
- Cryptographically verified e-signatures
- PDF to Excel
- Import a file directly from Google Drive / OneDrive / Dropbox on a tool's dropzone — technically
feasible without routing the file through a server (each provider's picker fetches the file bytes
straight from the provider to the browser), but deliberately deferred: it needs loading each
provider's own JS SDK live from their servers, which can't be self-hosted, a real expansion of the
Content-Security-Policy's trusted domains, and an OAuth app registration (plus Google's app
verification review) per provider. The bigger reason, though, is positioning, not engineering: an
opt-in "Sign in with Google" button is the first thing on the page that visibly contradicts the
"nothing talks to anyone except this site" promise the Privacy Policy and Terms & Conditions are
built on, even though the file itself would never touch Fair Go PDF's own (non-existent) server
Some of these genuinely require server-side processing (format conversion beyond what browsers
support natively) and are out of scope for v1 on purpose; others are feasible
client-side but deliberately deferred as bigger scoped efforts. If you want to tackle one, see
Contributing.
Also considered: a downloadable desktop app
Packaging this site as an installable native app via Tauri (Rust + the OS's
built-in webview, so a few MB rather than Electron's 100+ MB) is feasible since every tool is
already 100% client-side — the existing site could serve as the frontend almost unchanged, with
local fonts swapped in so it's genuinely offline from a fresh install, not just after one visit.
Deliberately not started yet: it needs a Rust toolchain that isn't part of this project anywhere
else, and a trustworthy (no "unknown publisher" warning) install needs paid code-signing on both
Windows and macOS. A free unsigned Windows build is the realistic first step whenever this gets
picked up.
Other pages
- Blog — articles on PDF/image know-how, Australian privacy law and industry-specific use cases
- FAQ — common questions about privacy, cost, file limits and browser support
- Support — optional one-off or recurring support via Stripe. The Stripe Payment Link
URLs on this page are placeholders (
href="#") — create real ones in your Stripe Dashboard
(Payment Links → New, no backend required) and swap them into support/index.html before this
page goes live.
- Privacy Policy — what data is (and isn't) collected
Tech stack
Plain HTML, CSS and vanilla JavaScript — no build step, no framework, no bundler. Each tool is
a static page that uses two well-maintained open-source libraries, self-hosted under
assets/vendor/ (not loaded from a CDN — browsers block cross-origin Worker construction, which
pdf.js needs, and self-hosting also means these tools keep working even if a third-party CDN is
ever down):
pdf-lib — creating/editing PDFs (merge, split, rotate, compress, images→PDF)
@cantoo/pdf-lib — a pdf-lib fork with PDF encryption support, used only by Protect PDF and Unlock PDF (the original pdf-lib has no encryption support)
pdf.js — rendering PDF pages to canvas (thumbnails, PDF→images)
mammoth.js — converting Word (.docx) to HTML (Convert to Markdown)
turndown — converting HTML to Markdown (Convert to Markdown)
qr-code-styling (MIT, Denys Kozak) — draws the QR code with custom dot and corner shapes, colours and a centre logo (QR Code Generator); it bundles Kazuhiko Arase's qrcode-generator (MIT). The content formats follow QRcodly (MIT) and the built-in icons are drawn from Feather (MIT)
- EFF Large Wordlist (CC BY 3.0 US, Electronic Frontier Foundation) — the 7,776 words behind the passphrases, unchanged; attribution in
assets/vendor/eff-large-wordlist.LICENSE.txt (Password Generator)
- Secure Password Generator (MIT, RadMageIRL) — the idea for the presets and sentence-style passphrases, and the role-tagged word lists in
assets/tools/password-syntax-words.js (Password Generator)
SheetJS — reading .xlsx/.xls/.ods spreadsheets (Excel to PDF)
- — decoding HEIC/HEIF photos to JPEG (HEIC to PDF, HEIC to JPG), bundles (LGPL-3.0) compiled to WebAssembly
This keeps the site trivially deployable to any static host, with nothing to compile and no
node_modules required to run it locally.
Running locally
Because a couple of tools load ES modules and fetch worker scripts, open the site through a local
web server rather than double-clicking index.html (browsers restrict module loading from
file://). Any static file server works, for example:
npx serve .
# or
python -m http.server 8000
Then open the printed local URL (e.g. http://localhost:3000 or http://localhost:8000).
Project structure
/
├── index.html # Homepage listing all tools
├── faq/index.html # FAQ
├── privacy-policy/index.html # Privacy policy
├── 404.html
├── robots.txt
├── sitemap.xml
├── vercel.json # Legacy URL redirects + response headers (see Deploying)
├── assets/
│ ├── style.css # Shared styles (light + dark)
│ ├── tools.js # Shared helpers (dropzone, downloads, formatting)
│ ├── img/og-card.png # Social share image
│ ├── vendor/ # Self-hosted pdf-lib / pdf.js (see Tech stack)
│ └── tools/ # Per-tool logic, one file per tool
│ ├── pdf-common.js # Shared pdf-lib / pdf.js loader + helpers
│ ├── compress-image.js
│ ├── merge-pdf.js
│ └── ...
├── compress-image/index.html # Each tool lives at its own clean URL
├── merge-pdf/index.html
├── ...
├── partials/ # Master copies of the shared header and footer
└── scripts/sync-partials.py # Copies the partials into every page (see CONTRIBUTING)
Each tool page is self-contained: its own index.html plus one JS file in assets/tools/, sharing
the common CSS and helper functions.
Deploying
The live site is deployed on Vercel, which builds nothing (there's no build
step) and simply serves the repo's static files on every push to main. vercel.json defines
legacy-URL redirects and response headers; the custom domain (fairgopdf.au) is configured in the
Vercel project's dashboard, not in a repo file.
Being a plain static site, it deploys just as easily to GitHub Pages, Netlify, Cloudflare Pages or
any other static host — point the host at the repo root and nothing else is needed. A CNAME file
containing fairgopdf.au is still in the repo for that case; it's inert on Vercel but is what
GitHub Pages reads to serve a custom domain if you fork this and deploy there instead.
Contributing
Bug reports, new tools, and improvements are welcome — see CONTRIBUTING.md.
License
MIT