Skip to content

Commit ff6755b

Browse files
committed
chore: initial hard fork to Solstice
Rebranded from ArchiveTune to Solstice. Modified package name to urstark.solstice. Updated icons to Solar Icons. Maintained copyright notices for original author Rukamori as per GPLv3.
1 parent c076a60 commit ff6755b

2,998 files changed

Lines changed: 26195 additions & 7416 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/ISSUE_TEMPLATE/bug_report.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ body:
1515
label: Required pre-submission checklist
1616
description: Reports that skip these checks are difficult to triage and may be closed.
1717
options:
18-
- label: I have tested this bug on the [latest nightly version](https://github.com/ArchiveTuneApp/ArchiveTune/actions).
18+
- label: I have tested this bug on the [latest nightly version](https://github.com/SolsticeIO/ArchiveTune/actions).
1919
required: true
2020
- label: This report describes one specific bug, not multiple unrelated problems.
2121
required: true

.github/workflows/header.yml

Lines changed: 58 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -9,115 +9,79 @@ jobs:
99
steps:
1010
- uses: actions/checkout@v6
1111

12-
- uses: actions/setup-go@v6
13-
with:
14-
go-version: '1.26'
15-
16-
- name: Install addlicense
17-
run: go install github.com/google/addlicense@latest
18-
19-
- name: Write Kotlin header banner
20-
run: |
21-
YEAR=$(date +%Y)
22-
cat > banner.txt <<EOF
23-
ArchiveTune ($YEAR)
24-
© Rukamori — github.com/rukamori
25-
GPL-3.0 License | Contributors: see git history
26-
Do not remove or alter this notice. - Per GPL-3.0 Section 4 & Section 5
27-
EOF
28-
29-
- name: Find duplicate Kotlin headers
12+
- name: Add or Update Kotlin headers
3013
run: |
3114
python3 <<'PY'
3215
from pathlib import Path
3316
34-
marker = "GPL-3.0 License | Contributors: see git history"
35-
duplicates = []
17+
SOLSTICE_HEADER = """/*
18+
* Solstice (2026)
19+
* © Stark — github.com/urstark
20+
*
21+
* Based on ArchiveTune (2026)
22+
* © Rukamori — github.com/rukamori
23+
*
24+
* GPL-3.0 License | Contributors: see git history
25+
* Do not remove or alter this notice. - Per GPL-3.0 Section 4 & Section 5
26+
*/
27+
"""
28+
29+
SOLSTICE_ONLY_HEADER = """/*
30+
* Solstice (2026)
31+
* © Stark — github.com/urstark
32+
*
33+
* GPL-3.0 License | Contributors: see git history
34+
* Do not remove or alter this notice. - Per GPL-3.0 Section 4 & Section 5
35+
*/
36+
"""
37+
38+
total_updated = 0
3639
3740
for path in Path(".").rglob("*.kt"):
3841
if ".git" in path.parts or "build" in path.parts:
3942
continue
4043
41-
count = path.read_text(encoding="utf-8").count(marker)
42-
if count > 1:
43-
duplicates.append((path, count))
44-
45-
if duplicates:
46-
print("Duplicate Kotlin headers found:")
47-
for path, count in duplicates:
48-
print(f"{path}: {count}")
49-
else:
50-
print("No duplicate Kotlin headers found.")
51-
PY
52-
53-
- name: Remove existing Kotlin headers
54-
run: |
55-
python3 <<'PY'
56-
from pathlib import Path
57-
58-
archive_marker = "ArchiveTune ("
59-
license_marker = "GPL-3.0 License | Contributors: see git history"
60-
total_removed = 0
61-
62-
for path in Path(".").rglob("*.kt"):
63-
if ".git" in path.parts or "build" in path.parts:
44+
try:
45+
content = path.read_text(encoding="utf-8")
46+
except UnicodeDecodeError:
6447
continue
6548
66-
text = path.read_text(encoding="utf-8")
67-
removed = 0
68-
69-
while text.startswith("/*"):
70-
end = text.find("*/")
49+
has_rukamori = False
50+
has_stark = False
51+
text_without_header = content
52+
53+
while text_without_header.startswith("/*"):
54+
end = text_without_header.find("*/")
7155
if end == -1:
7256
break
73-
74-
header = text[:end + 2]
75-
if archive_marker not in header or license_marker not in header:
57+
header = text_without_header[:end + 2]
58+
if "GPL-3.0 License" in header:
59+
if "© Rukamori" in header:
60+
has_rukamori = True
61+
if "© Stark" in header:
62+
has_stark = True
63+
text_without_header = text_without_header[end + 2:].lstrip("\r\n")
64+
else:
7665
break
77-
78-
text = text[end + 2:].lstrip("\r\n")
79-
removed += 1
80-
81-
if removed:
82-
path.write_text(text, encoding="utf-8")
83-
total_removed += removed
84-
print(f"{path}: removed {removed} existing header(s)")
85-
86-
print(f"Removed {total_removed} existing Kotlin header(s).")
87-
PY
88-
89-
- name: Add current Kotlin header
90-
run: |
91-
find . -path "./.git" -prune -o -path "*/build" -prune -o -type f -name "*.kt" -print0 | xargs -0 -r "$(go env GOPATH)/bin/addlicense" -v -f banner.txt
92-
rm banner.txt
93-
94-
- name: Verify Kotlin headers are unique
95-
run: |
96-
python3 <<'PY'
97-
from pathlib import Path
98-
import sys
99-
100-
marker = "GPL-3.0 License | Contributors: see git history"
101-
duplicates = []
102-
103-
for path in Path(".").rglob("*.kt"):
104-
if ".git" in path.parts or "build" in path.parts:
105-
continue
106-
107-
count = path.read_text(encoding="utf-8").count(marker)
108-
if count > 1:
109-
duplicates.append((path, count))
110-
111-
if duplicates:
112-
print("Duplicate Kotlin headers remain:")
113-
for path, count in duplicates:
114-
print(f"{path}: {count}")
115-
sys.exit(1)
116-
117-
print("Every Kotlin file has at most one ArchiveTune header.")
66+
67+
# Now prepend the new header
68+
new_content = content
69+
if has_rukamori or has_stark:
70+
if has_rukamori:
71+
new_content = SOLSTICE_HEADER + text_without_header
72+
else:
73+
new_content = SOLSTICE_ONLY_HEADER + text_without_header
74+
else:
75+
new_content = SOLSTICE_ONLY_HEADER + text_without_header
76+
77+
if content != new_content:
78+
path.write_text(new_content, encoding="utf-8")
79+
total_updated += 1
80+
print(f"{path}: updated header")
81+
82+
print(f"Updated {total_updated} Kotlin header(s).")
11883
PY
11984
12085
- uses: stefanzweifel/git-auto-commit-action@v7
12186
with:
122-
commit_message: Kotlin Header
123-
87+
commit_message: Update Kotlin Headers

ArchiveTuneKoiverseServer.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
https://archivetune-api.koiiverse.cloud
1+
https://solstice-api.koiiverse.cloud

CONTRIBUTING.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 🛠️ Engineering & Build Guide
22

3-
This document defines the protocols for setting up the development environment, understanding the underlying technology stack, and compiling **ArchiveTune** from the source.
3+
This document defines the protocols for setting up the development environment, understanding the underlying technology stack, and compiling **Solstice** from the source.
44

55
---
66

@@ -17,7 +17,7 @@ To ensure build stability and environment parity, the following hardware and sof
1717

1818
### **Technical DNA (Skill Requirements)**
1919

20-
The ArchiveTune codebase is built on a modern, reactive architecture. Contributors are expected to have a high level of familiarity with:
20+
The Solstice codebase is built on a modern, reactive architecture. Contributors are expected to have a high level of familiarity with:
2121

2222
* **Kotlin (Advanced):** Proficiency in Coroutines, Flow API, and functional paradigms.
2323
* **Jetpack Compose:** Understanding of State Hoisting, Recomposition optimization, and Material 3 design systems.
@@ -28,7 +28,7 @@ The ArchiveTune codebase is built on a modern, reactive architecture. Contributo
2828

2929
## 📐 Architectural Manifesto
3030

31-
ArchiveTune follows a strict **Clean Architecture** approach. This separation of concerns ensures that the audio engine remains independent of the UI layer.
31+
Solstice follows a strict **Clean Architecture** approach. This separation of concerns ensures that the audio engine remains independent of the UI layer.
3232

3333
1. **UI Layer (Compose):** Handles user interactions and renders state emitted by ViewModels.
3434
2. **Domain Layer:** Contains business logic, Use Cases, and high-level audio processing interfaces.
@@ -41,14 +41,14 @@ ArchiveTune follows a strict **Clean Architecture** approach. This separation of
4141

4242
1. **Clone the Source:**
4343
```bash
44-
git clone https://github.com/ArchiveTuneApp/ArchiveTune.git
45-
cd ArchiveTune
44+
git clone https://github.com/SolsticeIO/Solstice.git
45+
cd Solstice
4646

4747
```
4848

4949

5050
2. **Secret Management:**
51-
ArchiveTune uses a modular properties system. If your build requires specific API keys (e.g., Discord Client IDs), define them in your `local.properties`:
51+
Solstice uses a modular properties system. If your build requires specific API keys (e.g., Discord Client IDs), define them in your `local.properties`:
5252
```properties
5353
# Path to your Android SDK
5454
sdk.dir=/Users/yourname/Library/Android/sdk
@@ -96,5 +96,5 @@ Before initiating a Pull Request, every contributor must run the following quali
9696
---
9797

9898
<div align="center">
99-
<sub>ArchiveTune: Engineering audio freedom. Part of the <strong>Koiverse</strong> ecosystem.</sub>
99+
<sub>Solstice: Engineering audio freedom. Part of the <strong>Koiverse</strong> ecosystem.</sub>
100100
</div>

PRIVACY.md

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
# ArchiveTune Privacy Notice
1+
# Solstice Privacy Notice
22

33
Last updated: 2026-04-20
44

55
## Scope
66

7-
This notice covers the Android ArchiveTune app in this repository. It explains what the app stores on your device, what it can send to external services when you use specific features, and what Android permissions it requests.
7+
This notice covers the Android Solstice app in this repository. It explains what the app stores on your device, what it can send to external services when you use specific features, and what Android permissions it requests.
88

9-
This notice is based on the current source code and build configuration. It does not replace the privacy terms of YouTube or YouTube Music, Last.fm, ListenBrainz, Discord, GitHub, lyrics providers, the ArchiveTune canvas service, or any Together server you choose to use.
9+
This notice is based on the current source code and build configuration. It does not replace the privacy terms of YouTube or YouTube Music, Last.fm, ListenBrainz, Discord, GitHub, lyrics providers, the Solstice canvas service, or any Together server you choose to use.
1010

1111
## Privacy Summary
1212

1313
- Most core app data is stored locally on your device.
14-
- ArchiveTune does not secretly harvest, sell, or broker your personal data.
15-
- ArchiveTune does not silently send your data to unrelated third-party services.
14+
- Solstice does not secretly harvest, sell, or broker your personal data.
15+
- Solstice does not silently send your data to unrelated third-party services.
1616
- Optional network features send only the data needed to provide those features.
1717
- If data leaves your device, it is because you used a specific online feature or integration that requires that transfer.
1818
- Android backup and device-transfer features may copy part of the app's local data unless excluded by the app's backup rules.
@@ -36,13 +36,13 @@ The app stores data locally to provide playback, library, search, lyrics, sync,
3636

3737
## Data the App May Send Off Your Device
3838

39-
ArchiveTune does not silently forward your data to unrelated services. It only contacts external services when you use online features, and the exact payload depends on the feature you use and how you configure it.
39+
Solstice does not silently forward your data to unrelated services. It only contacts external services when you use online features, and the exact payload depends on the feature you use and how you configure it.
4040

4141
| Service or feature | Data that may be sent | When it happens |
4242
| --- | --- | --- |
4343
| YouTube or YouTube Music | Search terms, media playback requests, library or playlist requests, and signed-in session values such as visitor data, sync identifiers, cookies, or token values | When you browse, stream, sync, or sign in |
4444
| Lyrics providers | Song title, artist name, album identifiers, or similar lookup data needed to fetch lyrics | When lyrics features are enabled or lyrics are requested |
45-
| ArchiveTune canvas service | Song and artist names, album ID, or album URL, plus a bearer token if configured in the app build | When canvas or artwork lookup features are used |
45+
| Solstice canvas service | Song and artist names, album ID, or album URL, plus a bearer token if configured in the app build | When canvas or artwork lookup features are used |
4646
| Last.fm | Now playing and scrobble metadata, plus your Last.fm session information | When Last.fm scrobbling is enabled |
4747
| ListenBrainz | Playback history or scrobble metadata and your ListenBrainz token | When ListenBrainz sync is enabled |
4848
| Discord Rich Presence | Current track, artist, album, images, configured URLs or labels for presence cards, and Discord OAuth tokens required by the official Social SDK | When Discord Rich Presence is enabled |
@@ -70,7 +70,7 @@ If you deny a permission, the related feature may stop working or provide reduce
7070

7171
## Backups, Device Transfer, and Local Retention
7272

73-
ArchiveTune currently enables Android backup support. The backup and data-transfer rules exclude some cache and download paths, including the ExoPlayer cache, the download directory, and `exoplayer_internal.db`. Other app data, including local database content and app preferences, may still be included in Android cloud backup or device transfer depending on your Android settings and device behavior.
73+
Solstice currently enables Android backup support. The backup and data-transfer rules exclude some cache and download paths, including the ExoPlayer cache, the download directory, and `exoplayer_internal.db`. Other app data, including local database content and app preferences, may still be included in Android cloud backup or device transfer depending on your Android settings and device behavior.
7474

7575
The app also provides a manual backup feature that creates a ZIP archive containing app settings and database files. This is a user-triggered export action.
7676

@@ -107,14 +107,14 @@ You can control a significant amount of privacy-related behavior from the app an
107107

108108
## Changes to This Notice
109109

110-
This file should be reviewed whenever ArchiveTune changes its permissions, storage model, external integrations, backup behavior, or network architecture.
110+
This file should be reviewed whenever Solstice changes its permissions, storage model, external integrations, backup behavior, or network architecture.
111111

112112
## Project Contact
113113

114114
For questions or corrections, use the project repository and issue tracker.
115115

116-
- Repository: [https://github.com/ArchiveTuneApp/ArchiveTune](https://github.com/ArchiveTuneApp/ArchiveTune)
117-
- Issues: [https://github.com/ArchiveTuneApp/ArchiveTune/issues](https://github.com/ArchiveTuneApp/ArchiveTune/issues)
116+
- Repository: [https://github.com/SolsticeIO/Solstice](https://github.com/SolsticeIO/Solstice)
117+
- Issues: [https://github.com/SolsticeIO/Solstice/issues](https://github.com/SolsticeIO/Solstice/issues)
118118

119119
## Technical Appendix
120120

@@ -123,12 +123,12 @@ This appendix maps the main statements above to concrete implementation surfaces
123123
| Topic | What the code shows | Main files |
124124
| --- | --- | --- |
125125
| Permissions and backup behavior | The manifest declares network, media, microphone, Bluetooth, notification, boot, wake-lock, and foreground-service permissions. It also enables backup, cleartext traffic, and audio playback capture. Separate XML files exclude selected caches and internal playback database files from Android backup and device transfer. | `app/src/main/AndroidManifest.xml`, `app/src/main/res/xml/data_extraction_rules.xml`, `app/src/main/res/xml/backup_rules.xml` |
126-
| Local database contents | The Room schema includes songs, artists, albums, playlists, search history, lyrics, audio format metadata, and playback event records. | `app/schemas/moe.rukamori.archivetune.db.InternalDatabase/9.json` |
127-
| Settings and tokens stored locally | DataStore preference keys include UI settings, proxy settings, history toggles, Together values, YouTube session values, account name or email fields, Last.fm session values, ListenBrainz token values, Discord values, and update-cache keys. | `app/src/main/kotlin/moe/archivetuneapp/archivetune/constants/PreferenceKeys.kt` |
128-
| YouTube signed-in state | The Innertube layer exposes visitor data, data sync ID, cookie, PO token values, proxy state, and login-for-browse behavior as part of the current playback auth state. | `innertube/src/main/kotlin/moe/archivetuneapp/archivetune/innertube/YouTube.kt` |
129-
| Manual backup export | The backup view model writes app settings plus database files into a ZIP archive chosen by the user. | `app/src/main/kotlin/moe/archivetuneapp/archivetune/viewmodels/BackupRestoreViewModel.kt` |
130-
| External network integrations | Build configuration defines keys for Last.fm, Together, and canvas services. The updater fetches release information and caches related metadata in app preferences. | `app/build.gradle.kts`, `app/src/main/kotlin/moe/archivetuneapp/archivetune/utils/Updater.kt` |
131-
| Canvas service requests | The canvas module sends song and artist names, album IDs, or album URLs to `https://artwork-archivetune.koiiverse.cloud/` and can attach a bearer token. | `canvas/src/main/kotlin/moe/archivetuneapp/archivetune/canvas/ArchiveTuneCanvas.kt` |
126+
| Local database contents | The Room schema includes songs, artists, albums, playlists, search history, lyrics, audio format metadata, and playback event records. | `app/schemas/urstark.solstice.db.InternalDatabase/9.json` |
127+
| Settings and tokens stored locally | DataStore preference keys include UI settings, proxy settings, history toggles, Together values, YouTube session values, account name or email fields, Last.fm session values, ListenBrainz token values, Discord values, and update-cache keys. | `app/src/main/kotlin/moe/solsticeapp/solstice/constants/PreferenceKeys.kt` |
128+
| YouTube signed-in state | The Innertube layer exposes visitor data, data sync ID, cookie, PO token values, proxy state, and login-for-browse behavior as part of the current playback auth state. | `innertube/src/main/kotlin/moe/solsticeapp/solstice/innertube/YouTube.kt` |
129+
| Manual backup export | The backup view model writes app settings plus database files into a ZIP archive chosen by the user. | `app/src/main/kotlin/moe/solsticeapp/solstice/viewmodels/BackupRestoreViewModel.kt` |
130+
| External network integrations | Build configuration defines keys for Last.fm, Together, and canvas services. The updater fetches release information and caches related metadata in app preferences. | `app/build.gradle.kts`, `app/src/main/kotlin/moe/solsticeapp/solstice/utils/Updater.kt` |
131+
| Canvas service requests | The canvas module sends song and artist names, album IDs, or album URLs to `https://artwork-solstice.koiiverse.cloud/` and can attach a bearer token. | `canvas/src/main/kotlin/moe/solsticeapp/solstice/canvas/SolsticeCanvas.kt` |
132132
| Public feature claims | The repository README and store metadata describe privacy, YouTube integration, lyrics, music recognition, Last.fm, ListenBrainz, Discord Rich Presence, and other network-backed features that must stay aligned with this notice. | `README.md`, `fastlane/metadata/android/en-US/full_description.txt` |
133133
| Current dependency posture | The current Android dependency declarations show Compose, Room, Hilt, Ktor, Media3, Coil, Timber, and related libraries. They do not currently show Firebase, Crashlytics, Sentry, mobile ad SDKs, or mobile analytics SDKs in the Android app dependency definitions reviewed for this notice. | `app/build.gradle.kts`, `gradle/libs.versions.toml` |
134134

0 commit comments

Comments
 (0)