/00 — boot sequence

Hello.

cd ../open-source

aiyu-ayaan/Pull

Pull

Android download manager: segmented multi-connection HTTP, torrents and magnet links, video sites via yt-dlp, built-in browser with ad blocker. Material 3 Expressive. Open source (GPL-3.0).

  • active
  • 4 stars
  • Kotlin
  • GPL-3.0
  • pushed 2d ago
Pull preview

// readmeaiyu-ayaan/Pull

Pull logo

Pull

A download manager that splits every file into parallel segments.

Android Kotlin Compose License Status Telemetry

Pull is an Android download manager built around one idea: a single connection rarely uses your whole line, so split the file into segments, download them in parallel and keep re-splitting the slowest part until the file is done. It also downloads torrents and video-site links, and has its own browser.

Pull splash animation: the comet's head shoots in, then its three trails stretch out behind it

The splash animation, recorded on an API 37 emulator. The comet is the logo: speed, with trails.

Pull is in alpha. There are no benchmark numbers yet, so this README makes no speed claim against other download managers. The method for measuring one is in 08-benchmarking.md.

What it does

HTTP and HTTPS downloads

  • Segmented engine. The first request doubles as segment 0, then the remainder splits into parallel segments. A worker that finishes early takes half of the biggest remaining section.
  • Resume. Pause, lose the connection or kill the app: Pull resumes from the saved segment table. It checks the ETag, Last-Modified and size first, and refreshes expired links.
  • HTTP/1.1 per segment. HTTP/2 would put every segment on one TCP connection and defeat the point.
  • Retry with backoff, per-download and global connection limits, a speed limit and a queue.

Torrents and magnet links

Magnet links and .torrent files through libtorrent4j. The details screen has tabs for trackers, peers, pieces and per-torrent options.

Video sites

Links to supported video sites go through yt-dlp, with a format picker and saved format preferences.

Browser

A built-in multi-tab WebView browser in its own task with an ad blocker, intrusive popup blocker, and automatic download capture.

  • Multi-tab management. Independent tabs with separate back/forward history, tab switcher grid, and live tab counter.
  • Ad blocker. Intercepts ad, tracker and banner network requests in shouldInterceptRequest, returning empty responses and 1×1 transparent placeholders.
  • Popup & redirect blocker. Suppresses unprompted window.open calls, rate-limits aggressive popup bursts, and stops spam redirects to new tabs or external ad networks.
  • Cosmetic filtering. Injects CSS hiding rules to collapse blank ad slots and transparent click-jack overlays.
  • Shield panel. Per-page blocked counters with quick toggles for ad blocking, popup blocking, and cosmetic filtering.

Add a download

Paste a URL, open a link with Pull, or share to it. The share target is a bottom sheet over the app you shared from. Pull warns before you download the same thing twice.

Foreground service

Downloads run in a foreground service with specialUse on Android 14 and up, because Android 15 limits dataSync services to six hours. Notifications show progress and have a pause-all action.

Look and feel

Material 3 Expressive with dynamic color, light and dark themes, and shape-morphing components. The design follows the sibling apps Rewire, Findex and Domus.

Privacy

No accounts and no telemetry. The browser never continues past an SSL error.

Project layout

app/        Compose UI, Hilt, Room, the foreground service, the browser, torrents and video
engine/     The segmented HTTP engine: pure Kotlin and OkHttp, with no Android UI code, so it is tested on the JVM
development/
├── docs/   Design docs (start with docs/README.md)
├── brand/  Logo, geometry source and the splash recording
└── TODO.md Phased task list

Design docs: overview · architecture · download engine · foreground service · browser · UI · scope · benchmarking

Tech stack

AreaChoice
LanguageKotlin 2.4
UIJetpack Compose, Material 3 Expressive, dynamic color
DI, asyncHilt, Coroutines and Flow
PersistenceRoom and DataStore
HTTPOkHttp, with HTTP/1.1 clients for segments
Torrentslibtorrent4j
Videoyt-dlp, FFmpeg and aria2c through youtubedl-android

SDK: minSdk 26, targetSdk 36, compileSdk 37. Versions are in gradle/libs.versions.toml.

Install

Download the APK for your phone from Releases. Each release has one APK per CPU type, so you download only the native code your phone runs:

APKFor
Pull-<version>-arm64-v8a.apkAlmost every phone made since 2017
Pull-<version>-armeabi-v7a.apkOlder 32-bit phones
Pull-<version>-x86_64.apk, Pull-<version>-x86.apkEmulators and Chromebooks

After that, Pull updates itself. Settings → Updates checks GitHub, downloads the APK for your CPU and hands it to Android's installer. You can pick the Stable, Beta or Alpha channel there. The check reads only the public release list and sends no data about you.

Releases

A commit on master whose subject starts with !alpha, !beta, !stable, !fix, !feat or !major opens a release PR. The PR bumps VERSION and writes CHANGELOG.md. Merging it builds the signed APKs and publishes the GitHub Release. The rules are in .github/workflows/release.yml.

Build and run

You need Android Studio (current stable) or JDK 17+ with the Android SDK, and a device or emulator on API 26+.

# Build and install the debug build
./gradlew :app:installDebug

# Engine tests on the JVM
./gradlew :engine:test

The debug build installs as com.aiyu.pull.debug.

The logo

The mark is a comet: a ball diving down and to the right with three trails behind it. The geometry lives in comet.py, and development/brand/logo/README.md has the colours, the splash timings and the usage rules.

License

Pull is released under the GNU General Public License v3.0.

It has to be GPL-3.0: the video downloader uses youtubedl-android, which is GPL-3.0 and bundles FFmpeg and aria2c, so the combined app must be GPL-3.0 too. Source for any build you distribute must be available under the same license.

ComponentLicense
yt-dlpUnlicense
youtubedl-android, FFmpeg build, aria2cGPL-3.0 (aria2 itself is GPL-2.0-or-later)
libtorrent4j and libtorrentMIT and BSD-3-Clause
OkHttp, Room, Hilt, Compose, KotlinApache-2.0

Pull reuses architecture ideas from other download managers and no code or assets from Free Download Manager. The table is a summary, so check each project for its exact terms before you release.

// stack

  • Kotlin
  • Android
  • Android APP
  • Bittorrent
  • Download Manager
  • FDM Alternative
  • Foss
  • IDM Alternative
  • android
  • android-app
  • bittorrent
  • download-manager
  • fdm-alternative
  • foss
  • idm-alternative
  • jetpack-compose
  • kotlin
  • magnet-link
  • material-you
  • material3

// specs

status
Working
type
Mobile
year
2026
language
Kotlin
license
GPL-3.0
stars
4
branch
master

Repository data last synced