mrkeyoor.com_
Wed 02 Sept 16:52 UTC
Self-Hostedevaluationupdated 02 Sept 2026

ConvertX review

ConvertX is a self-hosted web app that sends uploaded files through familiar command-line converters such as FFmpeg, ImageMagick, LibreOffice, Pandoc, and Calibre. It gives households or small teams one browser interface for more than 1,000 advertised format paths, with accounts, conversion history, and batch processing.

trackingstars / 7d
Verdict

Our ConvertX run installed 265 packages in 32 seconds and built in 10 seconds, but it exposed no test target for the harness to run. Use it on a trusted network when its broad converter catalog saves more time than maintaining individual tools. Do not expose it to untrusted users until you have isolated converter processes, capped resources, and resolved the open LaTeX file-read report.

We ran it

Lab card: what happened when we ran ConvertXScreenshot of ConvertX (github.com/C4illin/ConvertX)
Install✓ · 32s265 packages · 151 MB
Build✓ · 10s
Testsn/ano test script
Repo124 files~8,536 lines of source · 0.6 MB · 6 CI workflows · Dockerfile · tests dir

Answers from our run

Does ConvertX build from source?

Dependencies installed in 32 seconds (265 packages), and the build succeeded in 10 seconds. We cloned commit acee10f into a clean Debian container with 3 CPUs and no project-specific setup.

Does ConvertX have tests you can run?

Not through a standard command: the project exposes no test script or target that our harness could run.

Who should not use ConvertX?

Public upload services or untrusted multi-user deployments: issue 573 reports that an authenticated LaTeX upload can read files available to the container, and current main still invokes latexmk without content filtering or a sandbox.

What are the alternatives to ConvertX?

Stirling-PDF, Gotenberg, CloudConvert. Our ConvertX run installed 265 packages in 32 seconds and built in 10 seconds, but it exposed no test target for the harness to run.

Setup4/5Simple container start, with security and storage work left to you
Docs4/5Clear deployment and format table; API and hardening are thin
Community4/518,667 stars and a September 2026 push with active reports
Maturity2/5v0.18.0 is active, but no package test target is exposed

Who it’s for

Home-lab users who want one private browser interface for many file types.
Small trusted teams that can keep registration closed and put the app behind HTTPS.
Administrators comfortable maintaining a container full of native conversion tools.
Developers who want a TypeScript and Bun front end around established converter binaries.

Who it’s NOT for

Public upload services or untrusted multi-user deployments: issue 573 reports that an authenticated LaTeX upload can read files available to the container, and current main still invokes latexmk without content filtering or a sandbox.
Organizations that require SSO, group policies, per-user quotas, or format permissions: those controls remain an open feature request in issue 146.
Low-memory hosts handling large media: issue 364 reports container failure during a 7.3 GB upload and trouble converting a 900 MB file.
FUSE-backed storage where cleanup must be dependable: issue 584 reports an endless deletion loop that stopped auto-delete and pinned a CPU core.
Teams requiring a runnable automated test gate from the package manifest: our harness found a tests directory but no test script or target.
Users who need conversion-specific options in the web interface: compression levels and conversion settings remain open requests.

Setup reality

Our sandbox installed 265 Bun packages in 32 seconds and used 151 MB. The build passed in 10 seconds. We skipped tests because the package has no test script or target, despite a tests directory being present.

The shortest deployment uses a published container on port 3000 with a persistent /app/data volume. Set a stable JWT_SECRET, use HTTPS, keep account registration closed after the first account, and do not enable unauthenticated access on an exposed service.

The image supplies numerous native converters, so format behavior depends on those bundled programs. Storage cleanup defaults to 24 hours, while conversion concurrency defaults to unlimited. The repository includes a Dockerfile and compose file, but operators still need backups, memory limits, upload limits, and a reverse proxy for internet access.

Twenty converter engines expose more than 1,000 format paths

ConvertX wraps 20 converter engines in a single web interface. FFmpeg handles hundreds of media formats, while ImageMagick, GraphicsMagick, LibreOffice, Pandoc, Calibre, Inkscape, Assimp, and smaller utilities cover images, office files, books, vectors, data, and 3D assets. Users can submit multiple files, protect access with accounts, and return to conversion history. This is useful when the alternative is teaching every household member which command-line program accepts a particular source file.

The application code is compact relative to the software inside its container. Our checkout had 124 files, about 8,536 lines of source, and occupied 0.6 MB. TypeScript, Bun, and Elysia provide the server and HTML interface; SQLite data and uploaded or converted files live under /app/data. The Dockerfile then installs the actual converter programs from Debian packages. That division keeps the app understandable, though every native engine brings its own file parser, resource profile, and output quirks.

What happened when we ran it

Our sandbox installed 265 packages in 32 seconds and used 151 MB on disk. The build completed successfully in 10 seconds. We tested commit acee10f in a fresh unprivileged container with 3 CPUs and 8 GB of RAM. The source tree included 6 CI workflow files, a Dockerfile, a compose file, and a tests directory. Nothing in the supplied install or build log failed.

The test step was skipped because package.json had no test script or target. That is different from a passing suite, even though the repository contains converter, database, helper, and page test files. Our lab results make no claim about whether those files pass under another command. The 151 MB measurement covers the installed Bun packages in the harness, not the final deployment image with FFmpeg, TeX, LibreOffice, Calibre, and the rest of the native tools.

Port 3000 should sit behind HTTPS and closed registration

The sample deployment maps port 3000 and persists /app/data. On first visit, anyone who reaches an unconfigured instance can create the first account, a risk the README calls out directly. ACCOUNT_REGISTRATION defaults to false after that initial setup. HTTP_ALLOWED and ALLOW_UNAUTHENTICATED are also false by default and are described as local-only switches. An internet deployment needs HTTPS at the reverse proxy, a stable random JWT_SECRET, restricted network access during setup, and a plan for uploaded files.

Our 265-package install did not exercise login, registration, file isolation, or session renewal. ConvertX supports multiple accounts, but issue 146 still requests OpenID Connect, group mappings, per-user limits, and format permissions. Administrators who need those controls would have to place another access layer in front of the app, and that does not create internal authorization between ConvertX users. Hiding the history page is cosmetic; it does not replace access control or deletion.

XeLaTeX still reads paths available to the container

Open issue 573 documents an authenticated file-read path in v0.17.0: a crafted .tex upload can ask XeLaTeX to include a server file in the generated PDF. Current main still passes user-supplied LaTeX to latexmk without content inspection or a converter sandbox, and the Dockerfile does not switch away from root. The latest v0.18.0 notes mention a different path-traversal fix. They do not claim to resolve this LaTeX report, which remained open when checked.

The missing test command matters most around boundaries like this. Six CI workflows exist and the tree contains converter tests, yet our 10-second build was the last runnable verification exposed by the package manifest. A public conversion service accepts hostile parsers' favorite input: arbitrary files. If untrusted users must have access, isolate each conversion with a read-only base, no host secrets, tight CPU and memory limits, bounded execution time, and a job-specific directory. Disabling XeLaTeX is the safer choice until the file-read path is closed.

Large uploads and FUSE cleanup can exhaust a small host

ConvertX defaults MAX_CONVERT_PROCESS to 0, which means unlimited concurrent conversion processes. Issue 364 reports memory exhaustion with a 7.3 GB upload and a later 900 MB conversion on a constrained system. The project does not promise those sizes will fit. Put explicit request-size, memory, process, and time limits around the container, then test the largest files you intend to accept. Unlimited concurrency is a poor default for a shared server running FFmpeg, LibreOffice, or ImageMagick jobs.

Automatic cleanup also deserves a test on the chosen volume. Issue 584 reports that deletion on a FUSE mount looped for 89 days, consumed one CPU core, and prevented later cleanup from being scheduled. Our 3-CPU sandbox did not run the service long enough to assess that path. The default 24-hour retention setting is useful only when deletion completes. Monitor file age and disk use independently, and do not treat the application's timer as your sole data-retention control.

September 2026 work is active, with 129 open issues and PRs

GitHub recorded 18,667 stars, a September 1, 2026 last push, and 129 combined issues and pull requests. Release v0.18.0 arrived on June 21 with PDF-to-DOCX support, a dynamic port fix, an Assimp correction, and a path-traversal security fix. The current push date matters more than the older release date when judging activity. The open queue includes feature requests, support questions, converter-specific failures, resource reports, and security reports, so 129 is not a defect count.

ConvertX earns a trial for a trusted home lab because our 265-package setup built cleanly and the browser workflow covers an unusually wide format catalog. Production judgment turns on isolation, not the polished upload page. Run it behind HTTPS, close registration, set a persistent secret, cap every resource, and verify deletion. For public or mutually untrusted users, the open XeLaTeX report and absent test target are strong reasons to choose a narrower service with a smaller attack surface.

Alternatives

ProjectWhat it isPick it when
Stirling-PDF gh↗A self-hosted web application focused on PDF conversion and editing.pick this instead when nearly every job is a PDF and a narrower tool is easier to secure.
Gotenberg gh↗A containerized API for turning documents, HTML, and URLs into PDFs.pick this instead when applications need a PDF API rather than a general user-facing converter.
CloudConvertA hosted conversion service with a broad format catalog and API.pick this instead when outsourcing converter maintenance and capacity is worth sending files to a third party.

What people are saying

  1. [github-trending] C4illin/ConvertX

Sources

  1. ConvertX README
  2. ConvertX v0.18.0 release
  3. Issue 573: authenticated LaTeX local file inclusion
  4. Current XeLaTeX converter source
  5. Issue 364: large upload memory use
  6. Issue 584: FUSE cleanup loop
  7. Issue 146: SSO and permission request

More self-hosted reviews

nebula · pansou · birdnet-go · arcbox · LiveTalking · TypeWords · the whole board →