Convert almost anything, on your own server. Nothing ever leaves it.
A self-hosted file converter for the public internet, with every converter locked in a sandbox.
490+ formats · 26 languages · runs on a Raspberry Pi · no accounts, cookies, database or tracking
Get Started · Docker Image · Documentation · Security Policy
Seven colour schemes, two interfaces and 26 languages, with right-to-left layouts where a language needs one.
Free online converters are paid for with your files. Upload a contract, a medical scan or a client's CAD drawing and it now sits on a stranger's server, next to an ad network.
HRConvert2 gives you the same convenience with none of that. Drag a file in, pick a format, download the result. The conversion happens on hardware you control, your visitors never make an account, and their files are deleted on a schedule you set.
| Promise | What it means |
|---|---|
| 🏠 Nothing transmitted | Every conversion runs on your server, with local tools. No CDN, no analytics, no telemetry. |
| 👤 No accounts, no cookies | Visitors are anonymous. Each gets an isolated folder nobody else can see. |
| 🗑️ Files expire | Uploads and results are deleted automatically after an age you choose. |
| 🧱 Sandboxed converters | Every tool that parses an upload runs in a bubblewrap sandbox with no network. |
| 🌍 Built for strangers | Designed to be put on the public internet and attacked, and documented that way. |
Every conversion travels the same path:
flowchart LR
A["Browser<br/>no account, no cookie"] -->|upload| B["HRConvert2"]
B --> C["Pipeline<br/>image, video, document, 3D ..."]
C --> E
subgraph S["bubblewrap sandbox, no network"]
E["ImageMagick, FFmpeg,<br/>LibreOffice, OpenSCAD ..."]
end
The result comes back the same way, and expires on the schedule you set.
sudo git clone https://github.com/zelon88/HRConvert2 /opt/HRConvert2
sudo bash /opt/HRConvert2/Documentation/Build/hrconvert2-setup.shTwo commands. Clone where only root can change it, such as /opt, because root will not install a tree another account could change. The installer pulls every dependency, creates the storage, sets up the AppArmor profile, PHP and the systemd units, installs HRConvert2 beside its storage, outside the web root, then tells you exactly what is working. Add -y to skip the confirmations.
Then open http://your-server/HRProprietary/HRConvert2/convertCore.php and start converting.
docker run -d -p 8080:80 --cap-add SYS_ADMIN zelon88/hrconvert2SYS_ADMIN lets the container build the sandbox every converter runs in. Leave it off and the container cannot build one. No process that converts or serves a user's file holds SYS_ADMIN, or any other capability. Run php convertCore.php -v inside the container to confirm the sandbox works.
cd /var/www/html/HRProprietary/HRConvert2
sudo php convertCore.php -v # Check every component & say what is wrong
sudo php convertCore.php -fp # Repair permissions & the web server setup| Category | Examples |
|---|---|
| Documents | doc, docx, odt, rtf, txt, pdf |
| Spreadsheets | xls, xlsx, ods, csv |
| Presentations | ppt, pptx, odp |
| Images | jpg, png, gif, webp, heic, avif, svg, ico, tiff |
| Video | mp4, mkv, avi, mov, webm, flv, and 50+ more |
| Audio | mp3, flac, aac, wav, opus, wma, and 30+ more |
| Subtitles | srt, vtt, ass, sub, sbv, ttml, and more |
| E-Books | epub, mobi, azw, azw3, azw4 |
| Archives | zip, rar, 7z, tar, gz, bz2 |
| 3D Models | obj, stl, ply, collada, and OpenSCAD sources |
| Drawings & Vectors | dxf, dia, vdx, svg |
| Bootable Disk Images | x86, ARM, UEFI and MBR/GPT hybrid ISOs |
| OCR | Extract text from images and PDFs |
| Identify | Size, type, character set & hashes of any file, and whether its name matches what it holds |
| Live Streams | Capture and convert m3u8 playlists |
| Remote Files | Fetch a file from a URL. Off by default. |
HRConvert2 assumes every tool that parses a hostile file can be exploited. So the sandbox is the security boundary, and everything else is a layer on top of it.
- 🧱 Sandboxed converters. ImageMagick, FFmpeg, LibreOffice, Inkscape, OpenSCAD and every other converter run inside bubblewrap. Each sees only its own input and output, with no network at all.
- 🧼 Hostile inputs disarmed. OpenSCAD sources are rewritten before they render. Archive links are pruned before they reach anything. Stream URLs are inspected before FFmpeg sees them. Fetched files are checked before they are placed.
- 📋 An audited supply chain. Every dependency is declared in one manifest with minimum and maximum versions. Every pipeline carries an approval record for the dependencies it uses, and approvals expire every year.
- 🏆 Reports are welcome and credited. Every advisory is accepted, and every reporter is credited publicly once the fix ships. Two were credited in v4.0.0. See the Security Policy.
- 🔍 Checked by machine as well as by hand. Two independent linters, in Python and Bash, check every change, and each check is proven against faults planted on purpose. Every error the application can raise is documented with its cause and its fix.
- 🔑 No guessable secrets. Sessions derive from a per-install secret, and updates need shell access.
Visitors switch language from the page. Nothing to install.
English · Français · Español · 中文 · हिन्दी · العربية · Русский · Українська · বাংলা
Deutsch · 한국어 · Italiano · Português · Tiếng Việt · Türkçe · 日本語 · Bahasa Indonesia
Polski · Nederlands · Kiswahili · မြန်မာ · اردو · فارسی · עברית · ܣܘܪܝܝܐ · ܐܪܡܝܐ
Arabic, Hebrew, Persian, Urdu and both Syriac script languages get proper right-to-left layouts. A new language is one folder, with no change to the core.
Everything is manageable from the terminal:
php convertCore.php -v # Check every component, dependency & feature
php convertCore.php --status # System state & the listener
php convertCore.php --config # Interactive configuration
php convertCore.php --config --repair # Add any setting the configuration is missing
php convertCore.php --setup --check-depends # Audit every dependency
php convertCore.php --pipeline --verify # Confirm every pipeline loaded
php convertCore.php -u=latest # Update to the newest release
php convertCore.php -c=now # Clean every expired session nowEvery command exits with a status a script can act on. See the full command reference.
| Minimum | |
|---|---|
| OS | Debian or Ubuntu Linux |
| Web server | Apache 2.4 |
| PHP | 8.0 or later |
| Hardware | Raspberry Pi Model B+. Any x86 or x64 machine is comfortable. |
| Sandbox | Bubblewrap |
The installer handles every dependency. The authoritative list is depends.php.
- 🌍 Translations. Add a folder.
- 🎨 Interfaces. Fork a UI folder and make it yours.
- 🐛 Bug reports. Include the steps that reproduce it and the output of
php convertCore.php -v. - 🔐 Security reports. Report them privately from the Security tab, never in an issue. Every report is accepted, and every reporter is credited once the fix ships. See the Security Policy.
GNU General Public License v3.0. Free to use, free to modify, free to self-host. If you improve it, send it back.
Built by @zelon88 for people who would rather not hand their files to strangers.


