No cloud. No account. No upload. Your files never leave your computer.
A single Windows app that bundles many file utilities behind one clean, offline interface.
Jdot Utilities is an offline desktop app (Windows .exe) for the everyday file
chores that usually send you to a sketchy upload-your-file website: converting
documents and images, and a full set of PDF tools. Everything runs on your
machine — there is no server, no account, and no network call at runtime.
It's built around a tool registry: every utility is one self-describing file, and the interface builds itself from what those files declare. Adding a new converter doesn't touch the UI.
Inspired by the idea of all-in-one converters like ConvertX, but its own independent project — a native offline desktop app rather than a self-hosted web server.
- Fully offline & private. No telemetry, no uploads, no accounts. Verifiable — there are no network calls in the code.
- Drop-and-go. The Convert tab's Home landing auto-detects a dropped file's type and routes it to the right tool.
- Real PDF toolkit — merge, split, rotate, delete/extract pages, images↔PDF, PDF→images, PDF→text, OCR, watermark, and two ways to compress.
- Shrink a PDF with nothing installed — the built-in shrinker needs no Ghostscript; ideal for scans and phone-photo PDFs.
- Document conversion — Markdown, HTML, Word (
.docx), plain text, PDF — any-to-any. - Documents & Ebooks — Word, ODT, EPUB, LaTeX (
.tex), reStructuredText, Org, AsciiDoc, Markdown, HTML and Jupyter notebooks, powered by a bundled pandoc (no install) that runs sandboxed and fully offline. - Video & Audio — MP4, MKV, MOV, WebM, AVI, GIF and MP3/WAV/FLAC/AAC/M4A/OGG/Opus, with audio extraction and video→GIF, via a bundled ffmpeg (no install, offline). Its own top-level tab.
- Ebooks — EPUB, Kindle (MOBI/AZW3), FB2, comics and more, via Calibre (an optional one-click install).
- Image conversion — PNG, JPG, WebP, AVIF, TIFF, GIF, BMP, Windows ICO, plus HEIC/HEIF (iPhone photos), with resize presets and quality.
- Tells you what's missing — if an optional engine isn't installed, the app says so on launch and on the tool, instead of failing after you press Convert. LibreOffice can be installed in one click via Windows Package Manager.
- Verifiably offline — the PDF renderer runs in a session that refuses every non-local address, and a test asserts remote requests are blocked while local images still load.
- Data conversion — JSON, YAML, CSV, TSV, XML, any-to-any.
- Office (via installed LibreOffice) — Word, spreadsheet, and presentation families, each to PDF.
- All Tools tab — every capability as a simple card: what it does and its formats, one click to open.
- Visual page picker — Rotate, Delete, and Extract show page thumbnails; click to choose pages instead of typing numbers, and see the rotation before you apply it.
- Reorder before merging — drag files into order (or use the up/down buttons) when merging PDFs or building a PDF from images.
- Batch — drop 100+ files, per-file progress, a concurrency limit, cancel, and sorting by name, date, size, or type.
- Three themes — Light, Grey, Black, with the brand-blue accent.
| Tool | Category | Converts |
|---|---|---|
| Document Converter | Document | md · html · docx · txt → html · md · txt · pdf · docx |
| Image Converter | Image | png · jpg · webp · avif · tiff · gif · svg · heic · heif · bmp · ico → png · jpg · webp · avif · tiff · gif · bmp · ico |
| Data Converter | Data | json · yaml · csv · tsv · xml (any → any) |
| Word / Spreadsheets / Presentations | Office | docx·doc·odt·rtf / xlsx·xls·ods·csv / pptx·ppt·odp — each → pdf (needs LibreOffice) |
| Merge PDFs | many PDFs → one | |
| Split PDF | one PDF → many (per-page / every-N / ranges) | |
| Rotate / Delete / Extract pages | pdf → pdf | |
| Images → PDF | images → one PDF | |
| PDF → Images | pdf → png / jpg per page | |
| PDF → Text | pdf → txt (text layer) | |
| OCR → Text | scanned pdf / image → txt (offline OCR) | |
| Shrink PDF (built-in) | pdf → smaller pdf, no extra software (pages become images) | |
| Compress / PDF-A | pdf → smaller pdf keeping text, or archival PDF/A (needs Ghostscript) | |
| Watermark PDF | stamp diagonal text on every page | |
| Edit PDF Info | set title / author / subject / keywords |
Full capability list — current and planned — is in FORMATS.md. Release notes are in CHANGELOG.md.
Users: grab the latest .exe from the
Releases page — either the
installer or the single-file portable build. No setup, no dependencies.
Two tools use an external engine (both auto-detected; path configurable in Settings). The app checks for them on launch and tells you if either is missing, rather than failing mid-conversion:
- Office conversions need LibreOffice.
- Compress / PDF-A needs Ghostscript (or a bundled copy — see below). For plain compression you don't need it at all — Shrink PDF (built-in) works with nothing installed.
Everything else — including OCR, which ships its own English model — is self-contained and works with no setup.
Note on unsigned builds: releases aren't code-signed yet, so Windows SmartScreen may warn on first run ("More info → Run anyway"). Signing is wired into the build (see Code signing) and just needs a certificate.
On some machines — outdated or broken GPU drivers, virtual machines, or remote desktop sessions — an accelerated window can open but never become interactive. The app now detects a GPU-process crash or a startup hang and automatically restarts itself with hardware acceleration turned off. If it ever stays frozen, force software rendering yourself, no UI needed:
- Launch once with
--safe-mode(e.g."Jdot Utilities.exe" --safe-mode), or - set the environment variable
JDOT_DISABLE_GPU=1before launching.
Either one starts the app in software-rendering mode and remembers the choice, so later launches stay that way. You can flip it back under Settings → Performance → Hardware acceleration.
git clone https://github.com/AxialForge/jdot-utilities.git
cd jdot-utilities
npm install
npm run devNode 20+ to run the app; Node 22+ to run
npm test(the test script uses anode --testglob that needs Node 21+).npm installfetches the prebuilt native binaries (sharp,@napi-rs/canvas). If a postinstall is blocked on npm 11+, runnpm approve-scripts electrononce.
npm run build:win # NSIS installer + portable .exe -> ./dist
npm run build:portable # single-file portable .exe onlyBuild on Windows (or the Windows CI runner) so the correct native binaries are
fetched. The app icon comes from build/icon.ico.
Pushing a tag builds and publishes a release automatically — see
.github/workflows/build.yml:
git tag v0.5.0 && git push origin v0.5.0 # → CI builds the .exe, attaches it to a ReleaseSigning is wired into the build; it just needs a certificate. Set two environment
variables (locally, or as repository secrets for CI) and the .exe is signed:
| Variable | Value |
|---|---|
CSC_LINK |
your code-signing .pfx as base64, or a path to it |
CSC_KEY_PASSWORD |
the .pfx password |
Without them, the build succeeds unsigned (Windows SmartScreen will warn on first run).
Compress / PDF-A uses Ghostscript. It auto-detects an installed copy, or you can
ship one inside the app: put gswin64c.exe and its DLLs in resources/bin/ and
enable the extraResources entry in electron-builder.yml.
npm test # 184 unit/integration tests (plain Node)
npx electron test/electron-pdf.js # PDF-output checks (needs Chromium)
npx electron test/electron-ops.js # collect/explode + OCR tools end-to-endGhostscript tests skip themselves when gs isn't installed.
The heart of the app is a tool registry and three "kinds" that describe how a utility moves files. That's all the UI and the runners need — everything else is the tool's own business.
| Kind | Flow | Examples |
|---|---|---|
convert |
N in → N out (one output per input) | Image, Document, Rotate/Delete/Extract, PDF→Text |
collect |
N in → 1 out | Merge PDFs, Images→PDF |
explode |
1 in → N out | Split PDF, PDF→Images |
A tool is a single file in src/tools/ that exports a descriptor and its handler.
The registry auto-discovers it; the rail, format list, and option fields render
themselves from what it declares. No central switchboard to edit.
src/
config.js Branding in one place (rename the app here)
main/ Electron main process (CommonJS) — IPC + all Node-side work
registry.js Auto-discovers tools; validates the three kinds
convert.js Batch runner: concurrency, cancel, collision-safe naming
ops.js Runners for collect (N→1) and explode (1→N)
pdfops.js PDF merge/split/rotate/delete/extract (pdf-lib)
pdftext.js pdfraster.js PDF → text / images (pdfjs + @napi-rs/canvas)
imgpdf.js htmlutil.js pagespec.js pdfrender.js …supporting engines
office.js LibreOffice locator + headless convert
tools/ One file per utility (auto-discovered)
renderer/index.html The entire UI — self-contained, no build step
For the full developer guide (architecture, gotchas, how PDF metadata is handled, the ESM-pdfjs wrinkle, etc.) see CLAUDE.md.
- Copy
src/tools/_template.jstosrc/tools/your-tool.js. - Fill in the descriptor:
id,name,category,kind,inputFormats,outputFormats, optionaloptionsandexcludePairs. - Implement
convert()(forconvert) orrun()(forcollect/explode). - Restart. It appears in the right tab automatically (PDF-category tools go to PDF Tools, everything else to Convert).
A tool can be pure JavaScript, use a prebuilt native module (like sharp),
or shell out to a bundled binary (the ffmpeg/pandoc sidecar pattern is
documented in _template.js). Either way it stays offline — the binary ships
inside the app.
Shipped so far: the PDF toolkit, OCR, data conversion, compression (both with and without Ghostscript), and BMP/ICO. Next up, each a focused block because each adds a large binary or a new engine:
- Bundle LibreOffice so Office conversions need no install (~400 MB).
- Audio/video via a bundled
ffmpeg(~80 MB). - More document formats via a
pandocsidecar (LaTeX, EPUB, AsciiDoc…).
The complete plan, with the engine and bundle cost for each, is in FORMATS.md.
Jdot Utilities makes no network requests on its own — no telemetry, no accounts, no automatic checks of any kind. Your files are read and written locally and nothing is ever transmitted. It works with the network cable unplugged, by design.
The one and only time it touches the network is when you press Settings → Check for updates, which asks GitHub whether a newer version exists. Nothing downloads or installs without a further, explicit click, and the app never checks on its own — so if you never press it, it never connects.
These builds are not code-signed yet — Windows SmartScreen may warn on first run ("More info" → "Run anyway"). Signing is being set up through the SignPath Foundation open-source program; the policy below describes how it will work once it's live.
Once active: free code signing provided by SignPath.io, certificate by SignPath Foundation.
- Builds are produced from public source by GitHub Actions on a version tag
(see
.github/workflows/build.yml), with the product name and version set as signed metadata. Signing is requested only for tagged releases, and each signing request is approved manually before the signed build is published. - Roles — AxialForge (Joseph Costarella) is the sole maintainer: author, committer and reviewer of all changes, and the approver of each release and signing request.
- Privacy — This program will not transfer any information to other networked systems unless specifically requested by the user. The only such action is the optional, manual Check for updates described above. No telemetry, no analytics, no account.
The same policy is published on the download page.
MIT — see LICENSE.