Works · 03
OmniDL · Universal Downloader
A universal media-fetching engine — paste any link and it just works; download images and videos from 1000+ sites in one place. Runs locally on Android · fully offline · zero servers, powered by Kotlin + Python + yt-dlp.
Why I built it
It started with a very specific annoyance: to save one image I had to install one app; to save a video, another; for watermarked videos on certain sites, a third tool. Downloading should not be fragmented per site — it should be one engine with a shell on top.
yt-dlp had already proven that “one engine that eats the whole web” is possible, but it’s a command-line tool. What I wanted was to put that engine in my pocket: running locally on Android, never passing through any server.
Architecture choices
- Kotlin shell + Python engine: UI and task management are native Kotlin; parsing and downloading reuse yt-dlp directly (Python). The two talk over a process bridge, each doing what it’s best at.
- Fully offline: all parsing happens locally, and links never touch a third-party server. That’s both a privacy promise and zero ops — the project can quietly stay alive for years.
- Batch queues: downloading isn’t a one-shot action but a pipeline — full-page image scraping, resumable transfers.
Where the difficulty is
The single biggest challenge was porting the Python runtime to Android: every device family has its own opinions about ABIs, storage permissions, and background survival. The final approach packages the Python environment as a self-checking resource bundle that runs a health check at startup and fixes what’s missing — instead of stacking if-else in the main program.
Where it stands
- Parsing support for 1000+ sites (following yt-dlp upstream updates)
- Full-page image scraping + one-tap video downloads, all queue-managed
- Fully offline; has served my own daily downloads for two years