Open-source project
Jasonzhu1207/ZenConverter avatar
Jasonzhu1207/ZenConverter

ZenConverter: local file conversion on Android, without the upload step

Local Android file converter built with Kotlin and Jetpack Compose. Convert files on device, with no ads, accounts, or upload-based fallback.

1,402 stars48 forksKotlinAGPL-3.0

At a glance

What is it?
ZenConverter is a Kotlin and Jetpack Compose Android app that converts images, audio, video and documents on the device. The support matrix is public, and so are the limits of each route.
Who is it for?
ZenConverter fits Android users who handle private media and will not send files to a conversion website, and it is worth installing from the GitHub release or Google Play to check one specific route before trusting it with a batch. It is the wrong tool if you need a desktop-grade format matrix, a server-side pipeline, or a headless CLI, since the README describes an Android app with a foreground service rather than a command line.
Can I use it commercially?
Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
Is it still maintained?
Yes. The repository last received commits 4 days ago.
What is it written in?
Mainly Kotlin, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 18, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The problem ZenConverter picks: conversion without a server round trip

Most online converters ask you to upload a file first. That is fine for a public PDF and awkward for a passport scan, a voice memo, or a video of your family. ZenConverter is built for the second case. The README states the app is a local file converter for Android: you pick a file on the phone, convert it on the phone, and the file stays off someone else's server.

The target user is an Android owner who already knows what format they want and does not want an account, a subscription, or an ad interstitial between them and the result. The README is explicit that the app has no ads, accounts, paywalls or remote uploads, and that the INTERNET permission is used only for manual update checks and on-demand model or font downloads. That distinction matters: an offline converter that still ships a network permission deserves scrutiny, and this one names the two features that use it.

The project also refuses to pretend every route is finished. Supported routes are verified on a physical Android device, and the README says known limits are written down instead of hidden, in a public support matrix at formats/support-matrix.md.

How the conversion pipeline is put together

The app is native Kotlin with a Jetpack Compose UI, Material 3 styling, and a foreground service pipeline for longer jobs. File access goes through Android's Storage Access Framework, so the app reads the document tree the user grants rather than scanning storage on its own.

Conversion work is not a single engine. Video and audio routes call FFmpeg for true re-encoding, including MP4 to MP4, which the README calls out because a container copy would be cheaper but would not actually re-encode. Image super-resolution and 2x video frame interpolation run through Tencent NCNN with Vulkan GPU acceleration, using Real-ESRGAN 4x models and RIFE respectively. Those two paths download models on demand and verify them with SHA-256.

The queue is the part that shows the app is meant for batches, not one-off taps. The README lists direct share and open import, gallery and folder batch import, same-type batch option configuration, mixed-file routing, per-file target selection, per-task progress and failures, cancellation, output sharing, and best-effort opening of the result or its location. Mixed-file routing is the interesting one: you can throw a folder at it and each file takes its own path.

Installing ZenConverter and converting one video to GIF

The README offers two install paths: the Google Play listing under the package name org.zenconverter.app, and the GitHub releases page. There is no command-line install, because this is an Android application rather than a CLI tool.

The repository is a Gradle project with a gradlew wrapper at the top level and an app/ module. The wrapper is what you would invoke for a local build, and the README does not document a signed release build, so treat the debug output as the path the repository actually supports.

For a first real use, the video to animated GIF route is the clearest demonstration because the README states its caps outright. Open the app, import a video through share, open, or the gallery picker, then choose the GIF target. The README says GIF export automatically uses at most the first 30 seconds, 30 fps, and 900 frames, with a default short-side cap of 480 px and 720 px or Original as alternatives. The app exports a palette-based GIF through FFmpeg.

If your clip is longer than 30 seconds, the conversion will not fail; it will simply stop at the cap. Trim the source first, or accept a partial export.

Where ZenConverter stops being the right tool

The support matrix is the honest part of the project, and it is also where the constraints live. HEIC and HEIF input remains device-decoder dependent, which means the same APK can behave differently on two phones. If your workflow is built on iPhone photos, that is a real risk and not something the app can paper over.

Image conversion has a second gap: metadata and animation timing are not copied. A GIF can use its first frame or split frames into a folder, but the timing data does not survive. If you need EXIF preserved through a conversion, this is not the tool for that job, and the README does not claim otherwise.

Video frame interpolation is marked Experimental for a reason the README states directly: mobile GPU driver and memory variance across chipsets. On a device with a weak Vulkan implementation, a 2x interpolation job is the most likely thing in the app to fail or run very slowly. The README also warns that very large media files need adequate free storage, memory, and power, and that the device should stay available while a long foreground conversion runs. That is not boilerplate. A foreground service keeps the job alive, but it does not give the phone more RAM.

How it differs from cloud converters and from desktop FFmpeg wrappers

The obvious alternative is a browser converter such as CloudConvert or an online image compressor. The difference is not quality, it is where the bytes go. A cloud converter uploads the source, converts on a server, and returns a link. ZenConverter never uploads the file, which removes the transfer time and the question of what happens to your data afterwards. It also removes the ability to convert a 4 GB video on a phone with 3 GB free, which the cloud service would not care about.

The other alternative is a desktop FFmpeg wrapper such as HandBrake or a command-line ffmpeg invocation. Those give you a far wider format matrix and scriptable batch jobs. ZenConverter gives you a touch interface, a queue, and per-file target selection on the device that already has the file. If your files live on a laptop, the desktop tool wins on every axis except convenience. If they live in your phone's gallery, moving them to a laptop is the step ZenConverter exists to skip.

Licence, maintenance and what a fork has to carry

ZenConverter is licensed under AGPL-3.0, and the repository carries a NOTICE file alongside the LICENSE. The AGPL is a strong copyleft licence, and its network clause is the part that surprises people: if you modify the app and let users interact with it over a network, the source of that modified version has to be offered to them. Distributing a modified APK triggers the ordinary copyleft obligations. This is a description of the licence text, not legal advice, and anyone shipping a derivative should read the LICENSE and NOTICE in full.

The repository is not archived, and the last push was on 2026-09-14, with a continuous pre-release for v0.2.3 published the same day and v0.2.3 tagged on 2026-09-12. The release cadence across v0.2.2 and v0.2.3 is roughly every two weeks, which tells you upgrades are frequent enough that pinning to a specific tag is worth doing if you depend on one route.

Upgrade cost is mostly the model downloads. Super-resolution and frame interpolation fetch NCNN models on demand and verify them with SHA-256, so a new model set means a fresh download rather than an APK update. The native/ and third_party/ directories in the repository, including woff2_compress.cc, indicate the build also carries native components, which is the part most likely to break for anyone forking the project on a different toolchain.

Editorial conclusion

ZenConverter fits Android users who handle private media and will not send files to a conversion website, and it is worth installing from the GitHub release or Google Play to check one specific route before trusting it with a batch. It is the wrong tool if you need a desktop-grade format matrix, a server-side pipeline, or a headless CLI, since the README describes an Android app with a foreground service rather than a command line. Before relying on it, open formats/support-matrix.md and confirm the exact input and output pair you need is listed as Stable, because the README marks HEIC and HEIF as device-decoder dependent and frame interpolation as experimental.

Frequently asked questions

Does ZenConverter upload my files to a server?

No. The README states that conversion work involves no network transfer and that the app has no remote uploads. The INTERNET permission is described as being used only for manual update checks and on-demand model or font downloads.

Which formats can ZenConverter convert on Android?

The README lists JPG, JPEG, JFIF, JPE, PNG, WEBP, GIF, HEIC, HEIF and ICO as image inputs, with JPG, JFIF, PNG, WEBP, ICO and PDF as outputs, plus video, audio and document routes. The authoritative list is the support matrix at formats/support-matrix.md, which marks each route as Stable or Beta.

Is ZenConverter free and does it have ads?

The README describes the app as having no ads, accounts or paywalls, and the source is published under AGPL-3.0. It is distributed through Google Play as org.zenconverter.app and through GitHub releases.

Official sources

  1. Jasonzhu1207/ZenConverter on GitHub
  2. License: AGPL-3.0
  3. Project website
  4. README
  5. Releases
Community notes

Community notes