![ConvertX](images/logo.png) # ConvertX [![Docker](https://github.com/C4illin/ConvertX/actions/workflows/docker-publish.yml/badge.svg?branch=main)](https://github.com/C4illin/ConvertX/actions/workflows/docker-publish.yml) [![ghcr.io Pulls](https://img.shields.io/badge/dynamic/json?logo=github&url=https%3A%2F%2Fipitio.github.io%2Fbackage%2FC4illin%2FConvertX%2Fconvertx.json&query=%24.downloads&label=ghcr.io%20pulls&cacheSeconds=14400)](https://github.com/C4illin/ConvertX/pkgs/container/ConvertX) [![Docker Pulls](https://img.shields.io/docker/pulls/c4illin/convertx?style=flat&logo=docker&label=dockerhub%20pulls&link=https%3A%2F%2Fhub.docker.com%2Frepository%2Fdocker%2Fc4illin%2Fconvertx%2Fgeneral)](https://hub.docker.com/r/c4illin/convertx) [![GitHub Release](https://img.shields.io/github/v/release/C4illin/ConvertX)](https://github.com/C4illin/ConvertX/pkgs/container/convertx) ![GitHub commits since latest release](https://img.shields.io/github/commits-since/C4illin/ConvertX/latest) ![GitHub repo size](https://img.shields.io/github/repo-size/C4illin/ConvertX) ![Docker container size](https://ghcr-badge.egpl.dev/c4illin/convertx/size?color=%230375b6&tag=latest&label=image+size&trim=) A self-hosted online file converter. Supports over a thousand different formats. Written with TypeScript, Bun and Elysia. ## Features - Convert files to different formats - Process multiple files at once - Password protection - Multiple accounts ## Converters supported | Converter | Use case | Converts from | Converts to | |------------------------------------------------------------------------------|---------------|---------------|-------------| | [libjxl](https://github.com/libjxl/libjxl) | JPEG XL | 11 | 11 | | [resvg](https://github.com/RazrFalcon/resvg) | SVG | 1 | 1 | | [libheif](https://github.com/strukturag/libheif) | HEIF | 7 | 6 | | [Vips](https://github.com/libvips/libvips) | Images | 45 | 23 | | [XeLaTeX](https://tug.org/xetex/) | LaTeX | 1 | 1 | | [Calibre](https://calibre-ebook.com/) | E-books | 26 | 19 | | [Pandoc](https://pandoc.org/) | Documents | 43 | 65 | | [GraphicsMagick](http://www.graphicsmagick.org/) | Images | 167 | 130 | | [Inkscape](https://inkscape.org/) | Vector images | 7 | 17 | | [Assimp](https://github.com/assimp/assimp) | 3D Assets | 77 | 23 | | [FFmpeg](https://ffmpeg.org/) | Video | ~472 | ~199 | Any missing converter? Open an issue or pull request! ## Deployment ```yml # docker-compose.yml services: convertx: image: ghcr.io/c4illin/convertx container_name: convertx restart: unless-stopped ports: - "3000:3000" environment: - JWT_SECRET=aLongAndSecretStringUsedToSignTheJSONWebToken1234 # will use randomUUID() if unset volumes: - ./data:/app/data ``` or ```bash docker run -p 3000:3000 -v ./data:/app/data ghcr.io/c4illin/convertx ``` Then visit `http://localhost:3000` in your browser and create your account. Don't leave it unconfigured and open, as anyone can register the first account. If you get unable to open database file run `chown -R $USER:$USER path` on the path you choose. ### Environment variables All are optional, JWT_SECRET is recommended to be set. | Name | Default | Description | |---------------------------|---------|-------------| | JWT_SECRET | when unset it will use the value from randomUUID() | A long and secret string used to sign the JSON Web Token | | ACCOUNT_REGISTRATION | false | Allow users to register accounts | | HTTP_ALLOWED | false | Allow HTTP connections, only set this to true locally | | ALLOW_UNAUTHENTICATED | false | Allow unauthenticated users to use the service, only set this to true locally | | AUTO_DELETE_EVERY_N_HOURS | 24 | Checks every n hours for files older then n hours and deletes them, set to 0 to disable | | WEBROOT | | The address to the root path setting this to "/convert" will serve the website on "example.com/convert/" | | FFMPEG_ARGS | | Arguments to pass to ffmpeg, e.g. `-preset veryfast` | > [!WARNING] > If you can't login, make sure you are accessing the service over https or set HTTP_ALLOWED=true ### Docker images There is a `:latest` tag that is updated with every release and a `:main` tag that is updated with every push to the main branch. `:latest` is recommended for normal use. The image is available on [GitHub Container Registry](https://github.com/C4illin/ConvertX/pkgs/container/ConvertX) and [Docker Hub](https://hub.docker.com/r/c4illin/convertx). | Image | What it is | |-------|------------| | `image: ghcr.io/c4illin/convertx` | The latest release on ghcr | | `image: ghcr.io/c4illin/convertx:main` | The latest commit on ghcr | | `image: c4illin/convertx` | The latest release on docker hub | | `image: c4illin/convertx:main` | The latest commit on docker hub | ### Tutorial Tutorial in french: Tutorial in chinese: ## Screenshots ![ConvertX Preview](images/preview.png) ## Development 0. Install [Bun](https://bun.sh/) and Git 1. Clone the repository 2. `bun install` 3. `bun run dev` Pull requests are welcome! See below and open issues for the list of todos. ## Todo - [x] Add messages for errors in converters - [x] Add searchable list of formats - [ ] Add options for converters - [ ] Divide index.tsx into smaller components - [ ] Add tests - [ ] Make the upload button nicer and more easy to drop files on. Support copy paste as well if possible. - [ ] Make errors logs visible from the web ui - [ ] Add more converters: - [ ] [deark](https://github.com/jsummers/deark) - [ ] LibreOffice - [ ] [dvisvgm](https://github.com/mgieseki/dvisvgm) ## Contributors Image with all contributors ## Star History Star History Chart