CI build for Nightly version of ArchiveTune. Redefining the YouTube Music Experience on Android.
๐ Runs at 0:00 AM every day, UTC 0 time zone ๐
Don't forget to leave a โญ for this repository if you visit. Thank you so much
Warning
- This is unofficial Nightly build of AchieveTune. If you wanna download official ArchiveTune, please check out this repository.
- We DO NOT ACCEPT any issues, bug reports, or new ideas on "this repository". If you wanna create an issue or bug report, please create it here.
This repository contains the nightly build setup for ArchiveTune, an advanced YouTube Music client for Android. Read bellow to read more about this app.
โน๏ธ ArchiveTune README โน๏ธ
Redefining the YouTube Music Experience on Android.
Itโs high-performance, totally private, and packed with features for people who really care about their experience.
Official Website โข Features โข Download โข Screenshots โข Support
ArchiveTune isnโt just another generic YouTube Music wrapper. Itโs a fully custom-built player made from the ground up, because we think your music should stay private, look clean, and work exactly the way you expect. If you care about sound quality and want something that actually feels good to use, this is it.
Important
Geographic Availability: If YouTube Music is not supported in your region, a VPN or proxy set to a supported region is required for initial data fetching.
Join Our Telegram Channels for Support and Discussion.
ArchiveTune belongs to everyone. Help us localize the experience for your region.
Interested in building the project or contributing? ArchiveTune is built on a high-performance Kotlin stack. Read the Build & Contribution Guide โ
We stand on the shoulders of open-source giants:
- Metrolist by Mostafa Alagamy For Base framework.
- Kizzy by dead8309 For Discord Integration.
- SimpMusic by maxrave-dev For Lyrics API Provider.
- BetterLyrics For word-by-word Lyrics API Provider & Artwork Provider.
- Material Color Utilities
- Read You and Seal for Ui Components.
- The global community of translators and beta testers.
ArchiveTune is an independent third-party client.
- Not affiliated with Google LLC or YouTube.
- Does not bypass YouTube's technical protections.
- Users are encouraged to support artists by purchasing music via official channels.
๐ฅ ArchiveTune CONTRIBUTING ๐ฅ
This document defines the protocols for setting up the development environment, understanding the underlying technology stack, and compiling ArchiveTune from the source.
To ensure build stability and environment parity, the following hardware and software configurations are mandatory.
- IDE: Android Studio Ladybug (2024.2.1) or newer.
- Java Runtime: JDK 17 (Amazon Corretto or Azul Zulu recommended for deterministic builds).
- Android SDK: API Level 34+ (Upside Down Cake).
- Version Control: Git 2.40+.
The ArchiveTune codebase is built on a modern, reactive architecture. Contributors are expected to have a high level of familiarity with:
- Kotlin (Advanced): Proficiency in Coroutines, Flow API, and functional paradigms.
- Jetpack Compose: Understanding of State Hoisting, Recomposition optimization, and Material 3 design systems.
- Gradle (KTS): Ability to navigate Kotlin DSL build scripts and Version Catalogs (
libs.versions.toml). - Modern Android Architecture: Deep understanding of MVVM, Repository patterns, and UDF (Unidirectional Data Flow).
ArchiveTune follows a strict Clean Architecture approach. This separation of concerns ensures that the audio engine remains independent of the UI layer.
- UI Layer (Compose): Handles user interactions and renders state emitted by ViewModels.
- Domain Layer: Contains business logic, Use Cases, and high-level audio processing interfaces.
- Data Layer: Manages the single source of truthโcoordinating between the YouTube Music API (Retrofit) and the local encrypted cache (Room).
- Service Layer (Media3): A specialized background layer managing the
MediaSessionand low-latency audio pipelines.
- Clone the Source:
git clone https://github.com/koiverse/ArchiveTune.git
cd ArchiveTune
- Secret Management:
ArchiveTune uses a modular properties system. If your build requires specific API keys (e.g., Discord Client IDs), define them in your
local.properties:
# Path to your Android SDK
sdk.dir=/Users/yourname/Library/Android/sdk
- Syncing the Core: Open the project in Android Studio. The IDE will automatically trigger a Gradle sync. We use Version Catalogs to ensure all dependencies (Media3, Hilt, Compose) are locked to tested versions.
Use the Gradle Wrapper to execute verified build scripts.
| Command | Output | Context |
|---|---|---|
./gradlew assembleDebug |
app-debug.apk |
Local testing & feature development. |
./gradlew assembleRelease |
app-release.apk |
Production-ready, R8-optimized build. |
./gradlew bundleRelease |
app-release.aab |
Optimized bundle for distribution. |
./gradlew clean |
N/A |
Flushes build cache to resolve sync issues. |
Before initiating a Pull Request, every contributor must run the following quality gates:
- Linting:
./gradlew lintDebug(Ensures adherence to Android XML/Compose standards). - Formatting:
./gradlew ktlintCheck(Ensures consistent Kotlin styling). - Logic Verification:
./gradlew testDebugUnitTest(Runs the architectural unit tests).
Important
Heap Memory: If you experience GC overhead limit exceeded, ensure your gradle.properties has sufficient memory allocated:
org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=1g
Warning
Compose Compiler: If the build fails due to a Compose version mismatch, verify that the kotlinCompilerExtensionVersion in the build script matches the current Kotlin version.
Repository secrets (required for nightly builds):
| Secret | Description |
|---|---|
SIGNING_KEY_BASE64 |
Your Android signing key (.jks or .keystore) converted to base64. Used to sign the APK. Generate with: openssl base64 < YOUR_KEY.jks | tr -d '\n' | tee YOUR_KEY.jks.base64 |
KEYSTORE_PASSWORD |
Password used to protect your keystore file. Must match the password set when creating the keystore. |
KEY_ALIAS |
The alias name assigned to your signing key inside the keystore. Used during APK signing process. |
KEY_PASSWORD |
Password for the specific key alias within the keystore. May be different from keystore password. |
LASTFM_API_KEY |
Last.fm API key for scrobbling and integrated Last.fm features. Get it from Last.fm API. |
LASTFM_SECRET |
Last.fm API secret corresponding to your API key. Required for authenticated Last.fm requests. |
TOGETHER_BEARER_TOKEN |
Uhm... I don't know how to explain it, but this secret is for using the online feature of Music Together. You can see the details in this message: https://t.me/ArchiveTuneGC/1/7766 |
PAT_TOKEN |
GitHub Personal Access Token with Actions (trigger/run workflows), Contents (commit, push, create release), and optionally Workflows (cancel failed builds) permissions. |
Optional secrets (for Telegram notifications):
| Secret | Description |
|---|---|
TELEGRAM_BOT_TOKEN |
Telegram Bot API token. Create a bot via @BotFather to get the token. |
TELEGRAM_CHAT_ID |
Telegram chat ID for the target group or channel. For private groups, forward a message to @userinfobot to get the ID. |
TELEGRAM_THREAD_ID |
Thread ID for Telegram topics/threads in supergroups. Only needed if posting to a specific thread in a group. |
Note
- Telegram secrets are only required if you want build notifications sent to Telegram. The nightly build works without them.
To automatically trigger the nightly build at a specific time, set up a cron-job using cron-job.org or any similar service:
Title: Anything you want
URL:
https://api.github.com/repos/${{ github.repository }}/actions/workflows/trigger.yml/dispatches
${{ github.repository }} is your-username/your-repo-name so change it to your name and repository name.
Headers:
| Header | Value |
|---|---|
Accept |
application/vnd.github.v3+json |
Authorization |
Bearer YOUR_GITHUB_PAT |
Content-Type |
application/json |
Request menthod: POST
Body:
{
"ref":"main"
}Timeout: You can set 1 second if you can't wait.
Cron Schedule Examples:
| Schedule | Cron Expression | Description |
|---|---|---|
| Daily at midnight (UTC) | 0 0 * * * |
Runs every day at 00:00 UTC |
| Daily at midnight (UTC+0) | @daily |
Same as above, simplified |
| Every 6 hours | 0 */6 * * * |
At minute 0 of every 6th hour |
| Weekly on Sunday | 0 0 * * 0 |
Every Sunday at midnight |
Tip
- The workflow uses
repository_dispatchtrigger, so the external cron service needs a PAT token withreposcope to send the dispatch event. - Alternatively, you can use GitHub's built-in scheduler by adding a
scheduletrigger to the workflow, but the external cron-job.org method gives you more control.
- For nightly builds, see
.github/workflows/nightly-build.yml
- Latest dev build in ArchiveTune repository:
- ArchiveTune Repository















