p2r3 / convert
Truly universal online file converter
AI Architecture Analysis
This repository is indexed by RepoMind. By analyzing p2r3/convert in our AI interface, you can instantly generate complete architecture diagrams, visualize control flows, and perform automated security audits across the entire codebase.
Our Agentic Context Augmented Generation (Agentic CAG) engine loads full source files into context on-demand, avoiding the fragmentation of traditional RAG systems. Ask questions about the architecture, dependencies, or specific features to see it in action.
Repository Overview (README excerpt)
Crawler viewConvert to it! **Truly universal online file converter.** Many online file conversion tools are **boring** and **insecure**. They only allow conversion between two formats in the same medium (images to images, videos to videos, etc.), and they require that you _upload your files to some server_. This is not just terrible for privacy, it's also incredibly lame. What if you _really_ need to convert an AVI video to a PDF document? Try to find an online tool for that, I dare you. Convert.to.it aims to be a tool that "just works". You're almost _guaranteed_ to get an output - perhaps not always the one you expected, but it'll try its best to not leave you hanging. For a semi-technical overview of this tool, check out the video: https://youtu.be/btUbcsTbVA8 Usage • Go to convert.to.it • Click the big blue box to add your file (or just drag it on to the window). • An input format should have been automatically selected. If it wasn't, yikes! Try searching for it, or if it's really not there, see the "Issues" section below. • Select an output format from the second list. If you're on desktop, that's the one on the right side. If you're on mobile, it'll be somewhere lower down. • Click **Convert**! • Hopefully, after a bit (or a lot) of thinking, the program will spit out the file you wanted. If not, see the "Issues" section below. Issues Ever since the YouTube video released, we've been getting spammed with issues suggesting the addition of all kinds of niche file formats. To keep things organized, I've decided to specify what counts as a valid issue and what doesn't. > [!IMPORTANT] > **SIMPLY ASKING FOR A FILE FORMAT TO BE ADDED IS NOT A MEANINGFUL ISSUE!** There are thousands of file formats out there. It can take hours to add support for just one. The math is simple - we can't possibly support every single file. As such, simply listing your favorite file formats is not helpful. We already know that there are formats we don't support, we don't need tickets to tell us that. When suggesting a file format, you must _at minimum_: • Make sure that there isn't already an issue about the same thing, and that we don't already support the format. • Explain what you expect the conversion to be like (what medium is it converting to/from). It's important to note here that simply parsing the underlying data is _not sufficient_. Imagine if we only treated SVG images as raw XML data and didn't support converting them to raster images - that would defeat the point. In other words, try to avoid crude "binary waterfalls". • Provide links to existing browser-based solutions if possible, or at the very least a reference for implementing the format, and make sure the license is compatible with GPL-2.0. If this seems like a lot, please remember - a developer will have to do 100x more work to actually implement the format. Doing a bit of research not only saves them precious time, it also weeds out "unserious" proposals that would only bloat our to-do list. **If you're submitting a bug report,** you only need to do step 1 - check if the problem isn't already reported by someone else. Bug reports are generally quite important otherwise. Though please note, "converting X to Y doesn't work" is **not** a bug report. However, "converting X to Y works but not how I expected" likely **is** a bug report. Deployment Local development (Bun + Vite) • Clone this repository ***WITH SUBMODULES***. You can use for that. Omitting submodules will leave you missing a few dependencies. • Install Bun. • Run to install dependencies. • Run to start the development server. _The following steps are optional, but recommended for performance:_ When you first open the page, it'll take a while to generate the list of supported formats for each tool. If you open the console, you'll see it complaining a bunch about missing caches. After this is done (indicated by a message in the console), use to get a JSON string with the cache data. You can then save this string to to skip that loading screen on startup. If you run into issues where your changes seem to not be applying, try disabling this cache. Docker (prebuilt image) Docker compose files live in the directory, so run compose with from the repository root: Alternatively download the separately and start it by executing in the same directory. This runs the container on . Docker (local build for development) Use the override file to build the image locally: The first Docker build is expected to be slow because Chromium and related system packages are installed in the build stage (needed for puppeteer in ). Later builds are usually much faster due to Docker layer caching. Contributing The best way to contribute is by adding support for new file formats (duh). If you don't have a format to add but are eager to help, take a look at our issues. There are plenty of suggestions there. Here's how adding a format works works: Creating a handler Each "tool" used for conversion has to be normalized to a standard form - effectively a "wrapper" that abstracts away the internal processes. These wrappers are available in src/handlers. Below is a super barebones handler that does absolutely nothing. You can use this as a starting point for adding a new format: For more details on how all of these components work, refer to the doc comments in src/FormatHandler.ts. You can also take a look at existing handlers to get a more practical example. There are a few additional things that I want to point out in particular: • Pay attention to the naming system. If your tool is called , then the class should be called , and the file should be called . • The handler is responsible for setting the output file's name. This is done to allow for flexibility in rare cases where the _full_ file name matters. Of course, in most cases, you'll only have to swap the file extension. • The handler is also responsible for ensuring that any byte buffers that enter or exit the handler _do not get mutated…