This project is a command-line tool for downloading APK files from various sources.
- ApkCombo
- F-Droid
- RuStore (some apps may be unavailable from non-Russian IP addresses and appear as not found)
- Nashstore (may not work for non-Russian IP addresses)
- ApkPure (WIP)
apkd [flags]-
--package,-p: Specify the package name(s) of the app(s) to download. You can optionally pin a specific version code using the format<pkg>:<version code>. Examples:apkd -p com.example.app apkd -p com.example.app:123456
-
--source,-s: Specify the source(s) for downloading APKs. Example:apkd -s apkpure -p com.example.app
-
--config: Path to YAML config file. CLI flags override config values. If not specified, apkd tries~/.config/apkd/config.yml. Example:apkd --config ./apkd.yaml -p com.example.app
-
--file,-f: Provide a file containing a list of package names. Each line can be either<pkg>or<pkg>:<version code>. Example:apkd -f packages.txt
Example
packages.txt:com.example.app com.example.otherapp:123456 -
--dev: Enable batch download mode for all apps from a specific developer. You need to specify the application package from the developer whose apps should be searched and downloaded using the-p/--packageflag. Example:apkd --dev --package com.example.app
-
--force,-F: Force download even if the file already exists. Example:apkd -F -p com.example.app
-
--output-dir,-O: Specify the output directory for downloaded APKs. Example:apkd -O ./downloads -p com.example.app
-
--output-file,-o: Specify the output file name for downloaded APKs. Example:apkd -o app.apk -p com.example.app
-
--proxy: Set a global proxy URL for all network traffic. Example:apkd --proxy http://127.0.0.1:8080 -p com.example.app
-
--source-proxy: Set proxy URL for a specific source in formatsource=proxy-url(can be repeated). Example:apkd --source-proxy rustore=http://127.0.0.1:8081 --source-proxy fdroid=http://127.0.0.1:8082 -p com.example.app
-
--workers: Number of worker goroutines for task processing. Must be greater than 0. Example:apkd --workers 5 -p com.example.app
-
--proxy-insecure: Skip TLS certificate verification for HTTPS requests sent through proxy. Useful for debugging with intercepting proxies. Example:apkd --proxy http://127.0.0.1:8080 --proxy-insecure -p com.example.app
-
--verbose,-v: Set verbosity level. Use-vor-vvfor more detailed logs. Example:apkd -v -p com.example.app
-
--version,-V: Print the version information and exit. Example:apkd -V
-
--list-sources,-l: List all available sources. Example:apkd -l
Download an APK for a specific package from a specific source:
apkd -p com.example.app -s apkpure -O ./downloadsDownload a specific version code:
apkd -p com.example.app:123456 -s fdroid -O ./downloadsUse global debug proxy:
apkd --proxy http://127.0.0.1:8080 -p org.fdroid.fdroidUse source-specific proxy overrides:
apkd --proxy http://127.0.0.1:8080 --source-proxy rustore=http://127.0.0.1:8081 -p ru.vk.storeUse intercepting proxy with disabled TLS verification:
apkd --proxy http://127.0.0.1:8080 --proxy-insecure -p org.fdroid.fdroidUse config defaults and override one value from CLI:
apkd --config ./apkd.yaml --proxy http://127.0.0.1:8080 -p org.fdroid.fdroidConfig format is YAML. Current version is 2. Precedence is:
- CLI flags
- Config values
- Built-in code defaults
When a CLI flag overrides a config value, the tool logs it.
Relative paths in config (for example defaults.output_dir) are resolved relative to the config file location.
Default config lookup path (when --config is omitted):
~/.config/apkd/config.yml
Example apkd.yaml (version 2):
version: 2
defaults:
sources: [rustore, fdroid]
output_dir: ./downloads
force: false
verbose: 1
runtime:
workers: 3
network:
timeout: 30s
retry:
max_attempts: 10
delay_ms: 1000
max_delay_ms: 10000
retry_status: [429, 500, 502, 503, 504]
proxy:
global: http://127.0.0.1:8080
insecure_skip_verify: false
per_source:
rustore: http://127.0.0.1:8081
sources:
rustore:
app_version: "1.103.1.0"
app_version_code: "1103100"
headers:
User-Agent: "RuStore/1.103.1.0 ..."
ruStoreVerCode: "1103100"In version 2, source profile fields (app_version, app_version_code, firmware_lang, etc.) are placed directly under the source key instead of under a nested profile: key used in version 1:
# version 1
sources:
rustore:
profile:
app_version: "1.93.0.3"
app_version_code: "1093003"
headers:
User-Agent: "RuStore/1.93.0.3 ..."
ruStoreVerCode: "1093003"
# version 2
sources:
rustore:
app_version: "1.103.1.0"
app_version_code: "1103100"
headers:
User-Agent: "RuStore/1.103.1.0 ..."
ruStoreVerCode: "1103100"Version 1 configs are still supported for backward compatibility and are automatically converted on load.
If no source config is provided for RuStore (or profile fields are left at their built-in defaults), the tool automatically fetches the latest RuStore app version on first request and updates the relevant headers. To pin a specific version, set app_version and app_version_code explicitly.
This project is licensed under the MIT License.