diff --git a/.github/workflows/pr-label-check.yml b/.github/workflows/pr-label-check.yml
index d41a482..3378f29 100644
--- a/.github/workflows/pr-label-check.yml
+++ b/.github/workflows/pr-label-check.yml
@@ -15,15 +15,16 @@ jobs:
HAS_MAJOR=$(echo "$LABELS" | grep -c '"major"' || true)
HAS_MINOR=$(echo "$LABELS" | grep -c '"minor"' || true)
HAS_PATCH=$(echo "$LABELS" | grep -c '"patch"' || true)
+ HAS_CHORE=$(echo "$LABELS" | grep -c '"chore"' || true)
- COUNT=$((HAS_MAJOR + HAS_MINOR + HAS_PATCH))
+ COUNT=$((HAS_MAJOR + HAS_MINOR + HAS_PATCH + HAS_CHORE))
if [ "$COUNT" -eq 0 ]; then
- echo "::error::PR must have one of: major, minor, patch label"
+ echo "::error::PR must have one of: major, minor, patch, chore label"
exit 1
elif [ "$COUNT" -gt 1 ]; then
- echo "::error::PR must have exactly one version label (major, minor, or patch). Found multiple."
+ echo "::error::PR must have exactly one label (major, minor, patch, or chore). Found multiple."
exit 1
fi
- echo "✓ Version label found"
+ echo "✓ Label found"
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 4af2680..55aad5e 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -6,6 +6,7 @@
# - "major" label → 1.2.3 → 2.0.0
# - "minor" label → 1.2.3 → 1.3.0
# - "patch" label → 1.2.3 → 1.2.4 (also the default fallback)
+# - "chore" label → no release (CI housekeeping, docs, relicense, etc.)
# 3. Decodes your keystore from a GitHub secret
# 4. Builds a signed release APK with the new version
# 5. Creates a GitHub Release with the APK attached
@@ -27,13 +28,11 @@ permissions:
contents: write
jobs:
- build:
+ detect:
runs-on: ubuntu-latest
-
+ outputs:
+ type: ${{ steps.bump.outputs.type }}
steps:
- - name: Checkout repository
- uses: actions/checkout@v4
-
- name: Detect bump type from merged PR labels
id: bump
env:
@@ -41,9 +40,12 @@ jobs:
run: |
# Find the PR associated with this merge commit
COMMIT_SHA="${{ github.sha }}"
- LABELS=$(gh pr list --state merged --search "$COMMIT_SHA" --json labels -q '.[0].labels[].name' 2>/dev/null || echo "")
+ LABELS=$(gh pr list --state merged --search "$COMMIT_SHA" --repo "${{ github.repository }}" --json labels -q '.[0].labels[].name' 2>/dev/null || echo "")
- if echo "$LABELS" | grep -qi "major"; then
+ if echo "$LABELS" | grep -qi "chore"; then
+ echo "type=chore" >> "$GITHUB_OUTPUT"
+ echo "Chore PR — skipping release"
+ elif echo "$LABELS" | grep -qi "major"; then
echo "type=major" >> "$GITHUB_OUTPUT"
elif echo "$LABELS" | grep -qi "minor"; then
echo "type=minor" >> "$GITHUB_OUTPUT"
@@ -52,6 +54,15 @@ jobs:
fi
echo "Bump type: $(grep type "$GITHUB_OUTPUT" | cut -d= -f2)"
+ build:
+ needs: detect
+ if: needs.detect.outputs.type != 'chore'
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
- name: Determine next version
id: version
env:
@@ -70,7 +81,7 @@ jobs:
# Parse semver
IFS='.' read -r MAJOR MINOR PATCH <<< "$LATEST"
- BUMP="${{ steps.bump.outputs.type }}"
+ BUMP="${{ needs.detect.outputs.type }}"
if [ "$BUMP" = "major" ]; then
MAJOR=$((MAJOR + 1))
diff --git a/CLAUDE.md b/CLAUDE.md
index 57f44e3..1905de0 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -2,18 +2,20 @@
## PR Creation Rules
-When creating a PR to `master`, you MUST add exactly one version label based on the changes:
+When creating a PR to `master`, you MUST add exactly one label based on the changes:
- **`major`** — Breaking changes, major new features, architecture overhaul
- **`minor`** — New features, significant enhancements, new UI screens
- **`patch`** — Bug fixes, small tweaks, translation updates, dependency bumps
+- **`chore`** — CI/workflow changes, docs-only edits, relicensing, repo housekeeping (no release is cut)
Use `gh pr create --label
-
+
@@ -33,7 +33,7 @@ Castla ist eine kostenlose Open-Source-Lösung, die den Bildschirm deines Androi
- **Volle Touch-Steuerung** — Tippe, wische und interagiere direkt vom Tesla-Bildschirm (über Shizuku)
- **Audio-Streaming** — Geräteaudio direkt auf Tesla-Lautsprecher streamen (Android 10+)
- **100% lokal & privat** — Alle Daten bleiben im WiFi/Hotspot
-- **Komplett kostenlos** — Keine Werbung, keine Paywalls. Open Source unter GPL-3.0
+- **Komplett kostenlos** — Keine Werbung, keine Paywalls. Open Source unter Apache-2.0
## Funktionen
@@ -84,6 +84,20 @@ Castla sammelt **keinerlei Daten**. Siehe [Datenschutzerklärung](PRIVACY.md).
+## Verwendete Open-Source-Projekte
+
+Castla baut auf großartigen Open-Source-Projekten auf:
+
+- [Shizuku](https://shizuku.rikka.app/) — privilegierter API-Zugriff ohne Root
+- [NanoHTTPD](https://github.com/NanoHttpd/nanohttpd) — eingebetteter HTTP-/WebSocket-Server
+- [ZXing](https://github.com/zxing/zxing) — QR-Code-Generierung
+- [AndroidX / Jetpack Compose](https://developer.android.com/jetpack) — modernes Android-UI-Toolkit
+- [Kotlin Coroutines](https://github.com/Kotlin/kotlinx.coroutines) — asynchrone Streaming-Pipeline
+
+Einige Techniken des privilegierten Modus wurden von [scrcpy](https://github.com/Genymobile/scrcpy) inspiriert. Es ist kein scrcpy-Quellcode enthalten.
+
+Siehe [NOTICE](NOTICE) für die vollständige Liste der Drittanbieter-Attributionen.
+
## Lizenz
-[GNU General Public License v3.0](LICENSE)
+[Apache License 2.0](LICENSE)
diff --git a/README.es.md b/README.es.md
index cbeb324..8ac3fa9 100644
--- a/README.es.md
+++ b/README.es.md
@@ -6,7 +6,7 @@
-
+
@@ -33,7 +33,7 @@ Castla es una solución gratuita y de código abierto que transmite la pantalla
- **Control táctil completo** — Toca, desliza e interactúa directamente desde la pantalla de Tesla (vía Shizuku)
- **Streaming de audio** — Audio del dispositivo directo a los altavoces de Tesla (Android 10+)
- **100% local y privado** — Todos los datos permanecen en tu WiFi/hotspot
-- **Completamente gratis** — Sin anuncios, sin muros de pago. Código abierto bajo GPL-3.0
+- **Completamente gratis** — Sin anuncios, sin muros de pago. Código abierto bajo Apache-2.0
## Funciones
@@ -84,6 +84,20 @@ Castla **no recopila ningún dato**. Ver [Política de Privacidad](PRIVACY.md).
+## Construido con
+
+Castla se apoya en el trabajo de grandes proyectos de código abierto:
+
+- [Shizuku](https://shizuku.rikka.app/) — acceso a APIs privilegiadas sin root
+- [NanoHTTPD](https://github.com/NanoHttpd/nanohttpd) — servidor HTTP + WebSocket embebido
+- [ZXing](https://github.com/zxing/zxing) — generación de códigos QR
+- [AndroidX / Jetpack Compose](https://developer.android.com/jetpack) — toolkit moderno de UI para Android
+- [Kotlin Coroutines](https://github.com/Kotlin/kotlinx.coroutines) — pipeline de streaming asíncrono
+
+Algunas técnicas del modo privilegiado se inspiraron en [scrcpy](https://github.com/Genymobile/scrcpy). No se incluye código fuente de scrcpy.
+
+Consulta [NOTICE](NOTICE) para la lista completa de atribuciones de terceros.
+
## Licencia
-[GNU General Public License v3.0](LICENSE)
+[Apache License 2.0](LICENSE)
diff --git a/README.fr.md b/README.fr.md
index dc58971..49f6485 100644
--- a/README.fr.md
+++ b/README.fr.md
@@ -6,7 +6,7 @@
-
+
@@ -33,7 +33,7 @@ Castla est une solution gratuite et open source qui diffuse l'écran de votre t
- **Contrôle tactile complet** — Touchez, glissez et interagissez directement depuis l'écran Tesla (via Shizuku)
- **Streaming audio** — Audio de l'appareil directement sur les haut-parleurs Tesla (Android 10+)
- **100% local et privé** — Toutes les données restent sur votre WiFi/hotspot
-- **Entièrement gratuit** — Sans pub, sans paywall. Open source sous GPL-3.0
+- **Entièrement gratuit** — Sans pub, sans paywall. Open source sous Apache-2.0
## Fonctionnalités
@@ -84,6 +84,20 @@ Castla **ne collecte aucune donnée**. Voir la [Politique de Confidentialité](P
+## Construit avec
+
+Castla s'appuie sur d'excellents projets open source :
+
+- [Shizuku](https://shizuku.rikka.app/) — accès aux API privilégiées sans root
+- [NanoHTTPD](https://github.com/NanoHttpd/nanohttpd) — serveur HTTP + WebSocket embarqué
+- [ZXing](https://github.com/zxing/zxing) — génération de codes QR
+- [AndroidX / Jetpack Compose](https://developer.android.com/jetpack) — boîte à outils UI Android moderne
+- [Kotlin Coroutines](https://github.com/Kotlin/kotlinx.coroutines) — pipeline de streaming asynchrone
+
+Certaines techniques du mode privilégié s'inspirent de [scrcpy](https://github.com/Genymobile/scrcpy). Aucun code source de scrcpy n'est inclus.
+
+Voir [NOTICE](NOTICE) pour la liste complète des attributions tierces.
+
## Licence
-[GNU General Public License v3.0](LICENSE)
+[Apache License 2.0](LICENSE)
diff --git a/README.ja.md b/README.ja.md
index 35b6042..bd58a11 100644
--- a/README.ja.md
+++ b/README.ja.md
@@ -6,7 +6,7 @@
@@ -33,7 +33,7 @@ Castla는 안드로이드 폰의 화면을 로컬 WiFi 네트워크를 통해
- **완전한 터치 컨트롤** — 테슬라 화면에서 직접 터치, 스와이프, 조작 (Shizuku 사용)
- **오디오 스트리밍** — 기기 오디오를 테슬라 스피커로 직접 전송 (Android 10+)
- **100% 로컬 & 프라이빗** — 모든 데이터는 WiFi/핫스팟 내에서만. 인터넷 전송 제로.
-- **완전 무료** — 광고 없음, 결제벽 없음. GPL-3.0 오픈소스.
+- **완전 무료** — 광고 없음, 결제벽 없음. Apache-2.0 오픈소스.
## 기능
@@ -100,6 +100,20 @@ Castla 덕분에 드라이브가 즐거워지셨다면 커피 한 잔 사주세
+## 사용된 오픈소스
+
+Castla는 훌륭한 오픈소스 프로젝트들의 도움으로 만들어졌습니다:
+
+- [Shizuku](https://shizuku.rikka.app/) — 루트 없이 특권 API 접근
+- [NanoHTTPD](https://github.com/NanoHttpd/nanohttpd) — 내장 HTTP + WebSocket 서버
+- [ZXing](https://github.com/zxing/zxing) — QR 코드 생성
+- [AndroidX / Jetpack Compose](https://developer.android.com/jetpack) — 현대적 Android UI 툴킷
+- [Kotlin Coroutines](https://github.com/Kotlin/kotlinx.coroutines) — 비동기 스트리밍 파이프라인
+
+일부 특권 모드 기법은 [scrcpy](https://github.com/Genymobile/scrcpy)의 접근 방식에서 영감을 받았습니다. scrcpy의 소스 코드는 포함되어 있지 않습니다.
+
+전체 서드파티 고지는 [NOTICE](NOTICE) 파일을 참조하세요.
+
## 라이선스
-[GNU General Public License v3.0](LICENSE)
+[Apache License 2.0](LICENSE)
diff --git a/README.md b/README.md
index 2d8241d..f493b1a 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
-
+
@@ -33,7 +33,7 @@ Castla is a free, open-source solution that streams your Android phone's screen
- **Full Touch control** — Tap, swipe, and interact with your phone directly from the Tesla screen (via Shizuku).
- **Audio streaming** — Stream your device's audio directly to Tesla's speakers (Android 10+).
- **100% local & private** — All data stays on your WiFi/hotspot. Zero data is sent to the internet.
-- **Completely free** — No ads, no paywalls. Open-source under GPL-3.0.
+- **Completely free** — No ads, no paywalls. Open-source under Apache-2.0.
## Features
@@ -137,15 +137,30 @@ If Castla made your road trips better and helped you navigate with Waze on the b
+## Built with
+
+Castla stands on the shoulders of great open-source projects:
+
+- [Shizuku](https://shizuku.rikka.app/) — privileged API access without root
+- [NanoHTTPD](https://github.com/NanoHttpd/nanohttpd) — embedded HTTP + WebSocket server
+- [ZXing](https://github.com/zxing/zxing) — QR code generation
+- [AndroidX / Jetpack Compose](https://developer.android.com/jetpack) — modern Android UI toolkit
+- [Kotlin Coroutines](https://github.com/Kotlin/kotlinx.coroutines) — async streaming pipeline
+
+Some privileged-mode techniques were inspired by [scrcpy](https://github.com/Genymobile/scrcpy). No scrcpy source code is included.
+
+See [NOTICE](NOTICE) for the full list of third-party attributions.
+
## License
-This project is licensed under the [GNU General Public License v3.0](LICENSE).
+This project is licensed under the [Apache License 2.0](LICENSE).
```
-Copyright (C) 2024 Castla
+Copyright 2024 Castla
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+ http://www.apache.org/licenses/LICENSE-2.0
```
diff --git a/README.zh-CN.md b/README.zh-CN.md
index d71ffb4..08a1f99 100644
--- a/README.zh-CN.md
+++ b/README.zh-CN.md
@@ -6,7 +6,7 @@
-
+
@@ -33,7 +33,7 @@ Castla是一款免费开源解决方案,通过本地WiFi网络将安卓手机
- **完整触控** — 直接在特斯拉屏幕上点触、滑动、操控手机(通过Shizuku)
- **音频串流** — 将设备音频直接传输到特斯拉扬声器(Android 10+)
- **100%本地且私密** — 所有数据仅在WiFi/热点内传输
-- **完全免费** — 无广告、无付费墙。GPL-3.0开源
+- **完全免费** — 无广告、无付费墙。Apache-2.0开源
## 功能
@@ -84,6 +84,20 @@ Castla **不收集任何数据**。详情请查看 [隐私政策](PRIVACY.md)。
+## 使用的开源项目
+
+Castla 建立在出色的开源项目之上:
+
+- [Shizuku](https://shizuku.rikka.app/) — 无需 root 的特权 API 访问
+- [NanoHTTPD](https://github.com/NanoHttpd/nanohttpd) — 嵌入式 HTTP + WebSocket 服务器
+- [ZXing](https://github.com/zxing/zxing) — 二维码生成
+- [AndroidX / Jetpack Compose](https://developer.android.com/jetpack) — 现代 Android UI 工具包
+- [Kotlin Coroutines](https://github.com/Kotlin/kotlinx.coroutines) — 异步流式管道
+
+部分特权模式技术受 [scrcpy](https://github.com/Genymobile/scrcpy) 启发。本项目未包含 scrcpy 源代码。
+
+完整的第三方归属列表请参见 [NOTICE](NOTICE)。
+
## 许可证
-[GNU General Public License v3.0](LICENSE)
+[Apache License 2.0](LICENSE)
diff --git a/app/src/main/assets/demo_icons/amap.png b/app/src/main/assets/demo_icons/amap.png
deleted file mode 100644
index ad1dc03..0000000
Binary files a/app/src/main/assets/demo_icons/amap.png and /dev/null differ
diff --git a/app/src/main/assets/demo_icons/apple_music.png b/app/src/main/assets/demo_icons/apple_music.png
deleted file mode 100644
index 7f662ce..0000000
Binary files a/app/src/main/assets/demo_icons/apple_music.png and /dev/null differ
diff --git a/app/src/main/assets/demo_icons/baidu_maps.png b/app/src/main/assets/demo_icons/baidu_maps.png
deleted file mode 100644
index c453e4d..0000000
Binary files a/app/src/main/assets/demo_icons/baidu_maps.png and /dev/null differ
diff --git a/app/src/main/assets/demo_icons/disney_plus.png b/app/src/main/assets/demo_icons/disney_plus.png
deleted file mode 100644
index 8337fca..0000000
Binary files a/app/src/main/assets/demo_icons/disney_plus.png and /dev/null differ
diff --git a/app/src/main/assets/demo_icons/kakao_navi.png b/app/src/main/assets/demo_icons/kakao_navi.png
deleted file mode 100644
index f13cd21..0000000
Binary files a/app/src/main/assets/demo_icons/kakao_navi.png and /dev/null differ
diff --git a/app/src/main/assets/demo_icons/maps.png b/app/src/main/assets/demo_icons/maps.png
deleted file mode 100644
index 82c6280..0000000
Binary files a/app/src/main/assets/demo_icons/maps.png and /dev/null differ
diff --git a/app/src/main/assets/demo_icons/melon.png b/app/src/main/assets/demo_icons/melon.png
deleted file mode 100644
index ec58b6a..0000000
Binary files a/app/src/main/assets/demo_icons/melon.png and /dev/null differ
diff --git a/app/src/main/assets/demo_icons/naver_map.png b/app/src/main/assets/demo_icons/naver_map.png
deleted file mode 100644
index bf154a6..0000000
Binary files a/app/src/main/assets/demo_icons/naver_map.png and /dev/null differ
diff --git a/app/src/main/assets/demo_icons/netflix.png b/app/src/main/assets/demo_icons/netflix.png
deleted file mode 100644
index 83df9b4..0000000
Binary files a/app/src/main/assets/demo_icons/netflix.png and /dev/null differ
diff --git a/app/src/main/assets/demo_icons/prime_video.png b/app/src/main/assets/demo_icons/prime_video.png
deleted file mode 100644
index 2cad069..0000000
Binary files a/app/src/main/assets/demo_icons/prime_video.png and /dev/null differ
diff --git a/app/src/main/assets/demo_icons/spotify.png b/app/src/main/assets/demo_icons/spotify.png
deleted file mode 100644
index ab21cf3..0000000
Binary files a/app/src/main/assets/demo_icons/spotify.png and /dev/null differ
diff --git a/app/src/main/assets/demo_icons/sygic.png b/app/src/main/assets/demo_icons/sygic.png
deleted file mode 100644
index 37b3c5a..0000000
Binary files a/app/src/main/assets/demo_icons/sygic.png and /dev/null differ
diff --git a/app/src/main/assets/demo_icons/tmap.png b/app/src/main/assets/demo_icons/tmap.png
deleted file mode 100644
index 2978ed1..0000000
Binary files a/app/src/main/assets/demo_icons/tmap.png and /dev/null differ
diff --git a/app/src/main/assets/demo_icons/waze.png b/app/src/main/assets/demo_icons/waze.png
deleted file mode 100644
index 0ef8e0d..0000000
Binary files a/app/src/main/assets/demo_icons/waze.png and /dev/null differ
diff --git a/app/src/main/assets/demo_icons/youtube.png b/app/src/main/assets/demo_icons/youtube.png
deleted file mode 100644
index 84e49f7..0000000
Binary files a/app/src/main/assets/demo_icons/youtube.png and /dev/null differ
diff --git a/app/src/main/assets/demo_icons/yt_music.png b/app/src/main/assets/demo_icons/yt_music.png
deleted file mode 100644
index a5b8d27..0000000
Binary files a/app/src/main/assets/demo_icons/yt_music.png and /dev/null differ
diff --git a/app/src/main/jniLibs/arm64-v8a/libcloudflared.so b/app/src/main/jniLibs/arm64-v8a/libcloudflared.so
deleted file mode 100755
index c1eafa9..0000000
Binary files a/app/src/main/jniLibs/arm64-v8a/libcloudflared.so and /dev/null differ