ZenConverter
ZenConverter
Private, local-first file conversion for Android.
English | 中文
ZenConverter is a local file converter for Android. Pick a file on your phone, convert it on your phone, and keep it off someone else's server.
The app is built with native Kotlin and Jetpack Compose. File access goes through Android's Storage Access Framework, and longer jobs run in a foreground service. The app deliberately stays narrow: supported routes are verified on a physical Android device, and their known limits are written down instead of hidden.
Note: very large media files still need adequate free storage, memory, and power. Keep the device available while a long foreground conversion is running.
Desktop users already have plenty of good open-source converters. Android feels rougher. Many converter apps are cluttered, ad-heavy, oddly priced, or built around uploading your file somewhere first.
ZenConverter is the local-first Android converter I wanted to use:
- no network transfer for conversion work,
- no ads, accounts, paywalls, or remote uploads,
INTERNETpermission is only used for manual update checks,- no extra permissions unless the app actually needs them,
- large videos are treated as real use cases, even if that path is still rough,
- the support list lives in the public support matrix.
Current Status
Stable routes have been verified on a physical Android device. Beta routes
work within the stated compatibility limits. Planned work is listed last.
| Area | Status | Notes |
|---|---|---|
| Native Android shell | Done | Kotlin, Compose, Material 3, foreground service pipeline. |
| Task queue and results | Done | Direct share/open import, mixed-file routing, per-file target selection, file basics, per-task progress and failures, compact before/after conversion details, cancellation, output sharing, and best-effort opening of the result or its location. |
| Video conversion | Done | MP4 / MKV / MOV outputs use FFmpeg true video and audio re-encoding, including MP4-to-MP4. Codec, bitrate, resolution, frame rate, audio, and advanced processing can be adjusted. Enabling a compression preset fixes the CRF, video quality/size strategy, and AAC audio bitrate. |
| Video to animated GIF | Done | FFmpeg palette-based GIF export automatically uses at most the first 30 seconds, 30 fps, and 900 frames. The default short-side cap is 480 px, with 720 px and Original options. |
| Audio extraction and conversion | Done | Video audio extraction and MP3 / M4A / WAV / FLAC / WMA targets all use FFmpeg true audio re-encoding. Applicable bitrate, sample-rate, channel, and encoder checks are wired. |
| Advanced audio/video processing | Stable | Video supports short reverse playback, fade, mirror, rotation, and frame fit/crop. Audio supports reverse playback, non-model afftdn noise reduction, fade, volume/mute, and echo. Reverse playback has conservative safety limits. |
| Image conversion | Stable / Beta | JPG / JPEG / JFIF / JPE, PNG, WEBP, GIF, HEIC / HEIF, and ICO inputs; JPG / JFIF / PNG / WEBP / ICO / PDF outputs. HEIC / HEIF remains device-decoder dependent. GIF can use its first frame or split frames into a folder. Metadata and animation timing are not copied. |
| Metadata safety | Stable | A separate privacy tool can inspect images/videos. JPG / JPEG / JFIF can be cleaned in place without re-encoding, with removed metadata backed up in app data for same-image restore. |
| PDF tools | Stable | Image/PDF conversion, PDF merge, selectable-text export to TXT / lightweight MD, plus password-based PDF encryption and decryption. No OCR or password cracking is included. |
| Office conversion | Beta | DOCX / PPTX / XLSX can produce PDF, TXT, or lightweight MD locally. Chinese text can render with bundled CJK fonts, but layout fidelity is limited and source files are capped at 64 MiB. |
| ZIP archive handling | Planned | A later scope item once streaming and archive-safety boundaries are designed. |
Architecture
flowchart LR
Pick["Add files"]
Configure["Configure each task"]
Queue["Ready queue"]
Service["Foreground service"]
Engine["FFmpeg / Native / Office"]
Output["Save output"]
Pick --> Configure --> Queue --> Service --> Engine --> Output
The UI does not do conversion work. Each task is routed to an engine based on the input, output, and selected mode:
Compatibility: FFmpeg true re-encode path for connected video/audio targets, GIF output, and advanced processing.Native: Android platform bitmap/PDF handling where no media engine is needed.Office: Local first-pass Office rendering path for DOCX, PPTX, and XLSX.SafeCache: future fallback for file providers that cannot provide usable descriptors.
More detail lives in docs/architecture.md and docs/technical-route.md.
Development setup notes are in docs/development-setup.md.
License
ZenConverter's own source code is licensed under the GNU Affero General Public License v3.0 or later.
Third-party libraries, native binaries, and bundled fonts keep their own licenses. Details are tracked in docs/license-and-attribution.md and third_party/THANKS.md.
