{"id":33935905,"url":"https://github.com/deutsia/deutsia-radio","last_synced_at":"2026-04-29T02:07:18.528Z","repository":{"id":326779347,"uuid":"1101740549","full_name":"deutsia/deutsia-radio","owner":"deutsia","description":"A privacy-focused, censorship-resistant multinet Android radio player built with Claude Code. Supports I2P, clearnet and Tor streaming.","archived":false,"fork":false,"pushed_at":"2026-01-12T06:52:24.000Z","size":9718,"stargazers_count":4,"open_issues_count":4,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-12T13:49:30.121Z","etag":null,"topics":["android","i2p","material-design-3","privacy","radio","radio-streaming","radio-streaming-application","security","tor"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/deutsia.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-22T06:29:21.000Z","updated_at":"2026-01-12T06:52:28.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/deutsia/deutsia-radio","commit_stats":null,"previous_names":["deutsia/deutsia-radio"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/deutsia/deutsia-radio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deutsia%2Fdeutsia-radio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deutsia%2Fdeutsia-radio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deutsia%2Fdeutsia-radio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deutsia%2Fdeutsia-radio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deutsia","download_url":"https://codeload.github.com/deutsia/deutsia-radio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deutsia%2Fdeutsia-radio/sbom","scorecard":{"id":1241272,"data":{"date":"2026-01-12T06:52:35Z","repo":{"name":"github.com/deutsia/deutsia-radio","commit":"5b0df731b8ad1842fcaa0a93a162d212a3dd41b6"},"scorecard":{"version":"v5.3.0","commit":"c22063e786c11f9dd714d777a687ff7c4599b600"},"score":6.3,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#packaging"}},{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: Dependabot: .github/dependabot.yml:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dependency-update-tool"}},{"name":"Maintained","score":0,"reason":"project was created within the last 90 days. Please review its contents carefully","details":["Warn: Repository was created within the last 90 days."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: gradle/wrapper/gradle-wrapper.jar:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":9,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/scorecard.yml:18","Info: jobLevel 'actions' permission set to 'read': .github/workflows/scorecard.yml:19","Info: topLevel 'contents' permission set to 'read': .github/workflows/build.yml:10","Info: topLevel permissions set to 'read-all': .github/workflows/scorecard.yml:10","Info: topLevel 'contents' permission set to 'read': .github/workflows/test.yml:10","Info: topLevel 'contents' permission set to 'read': .github/workflows/trivy.yml:12","Warn: topLevel 'security-events' permission set to 'write': .github/workflows/trivy.yml:13","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#token-permissions"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#security-policy"}},{"name":"Code-Review","score":0,"reason":"Found 0/10 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#code-review"}},{"name":"Pinned-Dependencies","score":10,"reason":"all dependencies are pinned","details":["Info:   9 out of   9 GitHub-owned GitHubAction dependencies pinned","Info:   2 out of   2 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":2,"reason":"badge detected: InProgress","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":7,"reason":"SAST tool is not run on all commits -- score normalized to 7","details":["Warn: 23 commits out of 29 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#sast"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v1.6.3 not signed: https://api.github.com/repos/deutsia/deutsia-radio/releases/275780682","Warn: release artifact v1.6.2 not signed: https://api.github.com/repos/deutsia/deutsia-radio/releases/274712875","Warn: release artifact v1.6.1 not signed: https://api.github.com/repos/deutsia/deutsia-radio/releases/274140104","Warn: release artifact v1.6.0 not signed: https://api.github.com/repos/deutsia/deutsia-radio/releases/274004458","Warn: release artifact v1.5.2 not signed: https://api.github.com/repos/deutsia/deutsia-radio/releases/273726819","Warn: release artifact v1.6.3 does not have provenance: https://api.github.com/repos/deutsia/deutsia-radio/releases/275780682","Warn: release artifact v1.6.2 does not have provenance: https://api.github.com/repos/deutsia/deutsia-radio/releases/274712875","Warn: release artifact v1.6.1 does not have provenance: https://api.github.com/repos/deutsia/deutsia-radio/releases/274140104","Warn: release artifact v1.6.0 does not have provenance: https://api.github.com/repos/deutsia/deutsia-radio/releases/274004458","Warn: release artifact v1.5.2 does not have provenance: https://api.github.com/repos/deutsia/deutsia-radio/releases/273726819"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#signed-releases"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#branch-protection"}},{"name":"Contributors","score":3,"reason":"project has 1 contributing companies or organizations -- score normalized to 3","details":["Info: found contributions from: anthropics"],"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#contributors"}},{"name":"CI-Tests","score":10,"reason":"15 out of 15 merged PRs checked by a CI test -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#ci-tests"}}]},"last_synced_at":"2026-01-12T13:49:39.776Z","repository_id":326779347,"created_at":"2026-01-12T13:49:39.790Z","updated_at":"2026-01-12T13:49:39.790Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28385017,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-13T10:34:27.190Z","status":"ssl_error","status_checked_at":"2026-01-13T10:34:26.289Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","i2p","material-design-3","privacy","radio","radio-streaming","radio-streaming-application","security","tor"],"created_at":"2025-12-12T14:03:06.714Z","updated_at":"2026-04-29T02:07:18.509Z","avatar_url":"https://github.com/deutsia.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\u003cimg width=\"192\" height=\"192\" src=\"assets/crop.png\" align=\"center\" alt=\"\"\u003e\n\n\u003cbr\u003e\u003c/br\u003e\n\n# deutsia radio\n[![Build](https://github.com/deutsia/deutsia-radio/actions/workflows/build.yml/badge.svg)](https://github.com/deutsia/deutsia-radio/actions/workflows/build.yml)\n[![Tests](https://github.com/deutsia/deutsia-radio/actions/workflows/test.yml/badge.svg)](https://github.com/deutsia/deutsia-radio/actions/workflows/test.yml)\n[![Trivy](https://github.com/deutsia/deutsia-radio/actions/workflows/trivy.yml/badge.svg)](https://github.com/deutsia/deutsia-radio/actions/workflows/trivy.yml)\n[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/deutsia/deutsia-radio/badge)](https://securityscorecards.dev/viewer/?uri=github.com/deutsia/deutsia-radio)\n\nPrivacy-focused, censorship-resistant multinet radio player with Material You.\n\n[ar](https://app.deutsia.com/ar/) | [de](https://app.deutsia.com/de/) | [es](https://app.deutsia.com/es/) | [fa](https://app.deutsia.com/fa/) | [fr](https://app.deutsia.com/fr/) | [hi](https://app.deutsia.com/hi/) | [it](https://app.deutsia.com/it/) | [ja](https://app.deutsia.com/ja/) | [ko](https://app.deutsia.com/ko/) | [my](https://app.deutsia.com/my/) | [pt](https://app.deutsia.com/pt/) | [ru](https://app.deutsia.com/ru/) | [tr](https://app.deutsia.com/tr/) | [uk](https://app.deutsia.com/uk/) | [vi](https://app.deutsia.com/vi/) | [zh](https://app.deutsia.com/zh/)\n\n[\u003cimg src=\"https://img.shields.io/badge/Get_it_on_GitHub-181717?style=for-the-badge\u0026logo=github\" alt=\"Get it on GitHub\" height=\"55\"\u003e](https://github.com/deutsia/deutsia-radio/releases/latest) \u0026nbsp; [\u003cimg src=\"https://img.shields.io/badge/Get_it_on_Obtainium-181717?style=for-the-badge\u0026labelColor=181717\u0026logo=data:image/svg%2Bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIHZpZXdCb3g9Ii0wLjE5IDIwLjMyIDUxMi41OSA0NzEuMDkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zMC4zOTQgLTU0LjY4KSI+PGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iNzguMTIxIiB4Mj0iMTgzLjkwNSIgeTE9IjU4MC44ODIiIHkyPSI0NTguOTM3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuODM0NiAwIDAgLTIuODM0NiAtNTEuMzI0IDE3NjUuMDY0KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzliNThkYyIvPjxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzMyMWM5MiIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNzguMzkxIiB4Mj0iMTgzLjY0NiIgeTE9IjU4MC41NzEiIHkyPSI0NTkuMjM2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuODM0NiAwIDAgLTIuODM0NiAtNTEuMzI0IDE3NjUuMDY0KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzliNThkYyIvPjxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzMyMWM5MiIvPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggZD0iTTM4MC4xIDU0Mi42Yy02LjUtMy40LTQ0LjMtMjQuNC0yMjEuNC0xMjIuNy00OS4zLTI3LjQtOTYuOC01My43LTEwNS41LTU4LjUtMTkuOC0xMC45LTIyLjgtMTMuNi0yMi44LTIwLjEgMC0zLjQgNy45LTI1LjQgMjYuNC03My41IDE0LjUtMzcuNyAyNy40LTcwLjggMjguNS03My41IDIuNy02LjEgNy0xMS4zIDExLjItMTMuNSAzLjktMiAxMDIuNC0zOCAxMDcuNS0zOS4yIDUuNC0xLjMgMTAuMSAxLjIgMTIuOSA3LjEgMS4zIDIuOCA2LjggMTcuMiAxMi4yIDMyLjFzMTMuNCAzNi44IDE3LjkgNDguOGMxMC4xIDI3LjUgMTAuNSAzMS40IDMuNSAzNS41LTEuOSAxLjEtMTQuMSA1LjktMjcuMSAxMC42cy0yNS40IDkuNi0yNy42IDEwLjljLTUgMi45LTUuNyA3LjQtMS44IDExIDEuNiAxLjQgMjYuNiAxNS43IDU1LjYgMzEuNyA4MS4yIDQ0LjggNzYuNyA0Mi43IDgyLjEgMzYuOSAyLjctMi45IDUxLjEtMTI2LjIgNTMuOS0xMzcuMiAxLjItNC43IDEuMS01LjMtMS41LTcuNC0zLjUtMi44LTMtMi45LTM0LjggOC4zLTMxLjYgMTEuMi0zNC42IDExLjQtMzguOCAzLjEtMi4yLTQuNC0zNi4yLTk3LjgtMzguMy0xMDUuMy0xLjQtNC45LjMtOS41IDQuNC0xMi4yIDEuNy0xLjEgMjYuNS0xMC42IDU1LTIxLjEgNDIuNC0xNS42IDUzLjEtMTkuMSA1OC43LTE5LjIgNy4xLS4xIDggLjQgMTM4LjQgNzIuNSA5IDUgMTMuOSAxMC4zIDEzLjkgMTUuMSAwIDEuOS0zMi4zIDg3LjctNzEuOCAxOTAuNS01NS43IDE0NS4xLTcyLjUgMTg3LjYtNzUgMTg5LjgtNC4zIDMuOS03LjcgMy43LTE1LjctLjV6IiBzdHlsZT0iZmlsbDp1cmwoI2EpO3N0cm9rZTp1cmwoI2IpO3N0cm9rZS13aWR0aDouMzk0O3N0cm9rZS1taXRlcmxpbWl0OjExLjMzODYiLz48L2c+PC9zdmc+\" alt=\"Get it on Obtainium\" height=\"44\"\u003e](https://github.com/ImranR98/Obtainium)\n\u003cbr\u003e\n\n[\u003cimg src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on.png\" alt=\"Get it on F-Droid\" height=\"75\"\u003e](https://f-droid.org/en/packages/com.opensource.i2pradio/)\n\n[\u003cimg src=\"https://raw.githubusercontent.com/zapstore/zapstore/master/assets/images/badge.png\" alt=\"Get it on Zapstore\" height=\"55\"\u003e](https://zapstore.dev/apps/naddr1qqtkxmmd9ehhqetwwdhh2unrv5hxjvnswfskg6t0qgsrrtsvcg6q8cwwhuea7cnyfelpfh5m9zncns8sza8a0pjylt6cazcrqsqqqlstmp6eny)\n---\n\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n    \u003cimg src=\"assets/browse_fixed.png\" width=\"30%\"  alt=\"\"/\u003e\n    \u003cimg src=\"assets/add_fixed2.png\" width=\"30%\"  alt=\"\"/\u003e\n    \u003cimg src=\"assets/3.png\" width=\"30%\"  alt=\"\"/\u003e\n\u003c/div\u003e\n\n---\n\n## Updates\n- **New Release: v1.8.0** - Android Auto support, bug fixes\n\n---\n\n## Features\n- **Multinet Support** - Clearnet, I2P (.i2p), and Tor (.onion) with custom [Darknet API](http://api.deutsia.com) providing Tor/I2P stations\n- **Force Tor Modes** - Proxy-or-fail enforcement with instant leak prevention\n- **50,000+ Stations** - Access RadioBrowser API or add custom streams\n- **Material You** - Dynamic theming along with 6 color schemes and Dark/Light mode\n- **Stream Recording** - Record across multiple stations\n- **App Lock** - Secure your listening with biometric/PIN protection and optional database encrpytion \n- **17 Languages** - Multilingual interface support\n- **Add any station** Support for Tor, Clearnet, I2P and per-station level custom proxy stations\n- **Full DNS Protection** - No DNS leaks to ISP/System DNS in Force Tor/Proxy modes, backed by 47 unit and integration tests\n- **Disable API connections** - Completely disable API connections + external cover art and utilize the app with only your local library\n\n---\n\n## Privacy \u0026 Security\n\n**Optional Database Encryption** via SQLCipher:\n- All local data encrypted at rest (stations, settings, history)\n- App lock with biometric/PIN protection\n- Secure storage for favorites and playback data\n\n**Credential Protection** via Android Jetpack Security:\n- Proxy passwords encrypted with AES-256-GCM\n- Hardware-backed encryption keys (when available)\n- Secure credential storage for custom proxy authentication\n\n**Tor Integration** via InviZible Pro SOCKS5 proxy:\n- Instant disconnect detection (\u003c 100ms)\n- Fail-safe proxy enforcement - no clearnet fallback\n- Automatic stream termination on proxy changes\n\n**Force Tor Modes:**\n- **Force Tor All** - Route everything through Tor\n- **Force Tor Except I2P** - Tor for clearnet, I2P proxy for .i2p domains\n\n**I2P Integration** via HTTP proxy (port 4444):\n- Seamless .i2p domain routing\n- Compatible with official I2P Android app\n\n**Custom Proxies**\n- Support for Digest and Basic auth\n- Support for SOCKS4, SOCKS5, HTTP, and HTTPS proxies\n- Force modes for maximum privacy\n\n---\n\n## Requirements\n- Android 7.0 (API 24) or higher\n- **For Tor:** [InviZible Pro](https://invizible.net) - Use **proxy mode** (not VPN mode) for best compatibility (click on the three dot menu in the upper right hand corner to switch). Proxy mode is easy to configure and allows running a separate VPN in the background if desired. Using Tor as a full device VPN will make I2P streaming almost impossible due to its latency. Other Android Tor proxy providers can also be used, InviZible Pro is recommended and simplest to set up. \n- **For I2P:** [I2P Android](https://geti2p.net/en/download) or [InviZible Pro](https://invizible.net) via i2pd\n\n---\n\n## Installation\n\nDownload the latest APK from the [Releases](https://github.com/deutsia/deutsia-radio/releases) page. A universal APK is provided that works on all supported devices (Android 7.0+).\n\nYou can also use [Obtainium](https://github.com/ImranR98/Obtainium) to keep the app updated automatically.\n\n\u003e **Security note:** [Obtainium](https://github.com/ImranR98/Obtainium) with [App Verifier](https://github.com/soupslurpr/AppVerifier) is the most secure way to download and verify the app, as it pulls directly from GitHub releases with Sigstore verification.\n\n### Verifying the release \n\nReleases are signed with [Sigstore](https://www.sigstore.dev/). To verify, download both the `.apk` and `.apk.sigstore` files from the same release, then run from the directory containing the downloaded files:\n\n```bash\n# Replace version number with the release you downloaded\ncd ~/Downloads\ncosign verify-blob \\\n  --bundle deutsia-radio-v1.7.0.apk.sigstore \\\n  --certificate-identity siewargottlichschon@gmail.com \\\n  --certificate-oidc-issuer https://github.com/login/oauth \\\n  deutsia-radio-v1.7.0.apk\n```\n### Verifying from Zapstore\n\nIf you downloaded from Zapstore, you can verify the release was published by the correct developer. The app's Nostr public key is:\n```\nnpub1xxhqes35q0sua0enma3xgnn7zn0fk29838q0q96067ryf7h4369sq0f29n\n```\n---\n\n## Tech Stack\n- Kotlin + Material Design 3\n- ExoPlayer (Media3) for audio\n- OkHttp with SOCKS/HTTP proxy support\n- Coil for proxy-aware image loading\n- Room + SQLCipher for encrypted database\n\n---\n\n## Building\n\n```bash\ngit clone https://github.com/deutsia/deutsia-radio.git\ncd deutsia-radio\n./gradlew assembleDebug\n```\n\nAPK output: `app/build/outputs/apk/debug/`\n\nNote: Java 21 (LTS) is required to build this project. Java 25+ is not yet supported by the Gradle/Kotlin toolchain. Set JAVA_HOME=/usr/lib/jvm/java-21-openjdk before building.\n\n---\n\n## FAQ\n\n**Do I need Tor or I2P to use this app?**\n\nNo. Clearnet works on its own and gives you access to 50,000+ stations via the RadioBrowser API, like a normal radio app. Tor and I2P are completely optional for users who want privacy or access to darknet stations.\n\n**How do I remain private/anonymous while using this app?**\n\nBy default, the app connects directly from your IP address. To stay anonymous, you need to enable a Force mode in settings and/or run a VPN in the background. There are several options depending on your setup:\n\n- **Force Tor All:** Routes all traffic (streams, API calls, cover art) through Tor. Nothing touches the internet directly. If Tor disconnects, all traffic is blocked - there are no clearnet fallbacks. Try it yourself by disconnecting from Invizible Pro midstream while playing a clearnet station - the connection will not continue playing any more than what's left in the buffer.  \n- **Force Tor Except I2P:** Routes clearnet traffic through Tor, but sends I2P traffic through the I2P HTTP proxy instead. This avoids the unnecessary latency of routing I2P over Tor.\n- **Force Custom Proxy:** Routes all traffic through a proxy you configure (SOCKS4, SOCKS5, HTTP, or HTTPS). Useful if you run your own proxy or use a non-Tor proxy provider. \n- **Force Custom Proxy Except Tor/I2P:** Routes clearnet traffic through your custom proxy, while Tor and I2P stations use their native proxies.\n\nFor maximum privacy:\n1. Enable a Force mode (Tor or Custom Proxy)\n2. Disable the RadioBrowser API in settings if you don't need clearnet stations\n3. Disable cover art loading if you want to eliminate all image requests\n4. Enable database encryption to protect your local data at rest\n5. Run a VPN in the background alongside InviZible Pro's proxy mode for an extra layer of protection if you don't fully trust the app or any of the APIs it connects to. Radio stations are low bandwidth, so most quality VPNs will still handle Tor and even I2P stations without issue.\n\nAll Force modes are fail-safe - if the proxy goes down, traffic is blocked, not leaked. This includes DNS leak prevention - in Force modes, all DNS queries are resolved through the proxy rather than your system/ISP DNS. \n\n***If you do not trust this app, run a trusted VPN in the background***\n\n**Is there a darknet website to download this app?**\nYes. You can download anonymously via the I2P site:\n`http://deutsiampy3y6z2gceje5llbi4vakzj67wamyjdqlzv2tines25q.b32.i2p/`\n\nThere is no Tor mirror for the website. If you need to download over Tor, go to the [GitHub Releases](https://github.com/deutsia/deutsia-radio/releases) or [app website](https://app.deutsia.com) page using Tor Browser.\n\n**Do clearnet stations block Tor in Force Tor mode?**\nSometimes, but rarely. The vast majority of clearnet stations do not block Tor.\n\n**How do I import my stations from another app?**\nGo to Settings and use the import option. Supported formats are CSV, JSON, M3U, and PLS.\n\n**Why is cleartext traffic enabled in the manifest?**\nI2P (`.i2p`) and Tor (`.onion`) sites use `http://` rather than `https://`. Cleartext traffic must be enabled for these domains to work.\n\n**Why doesn't SOCKS4 fully protect my privacy like SOCKS5 and others?**\n\nSOCKS4 does not support remote DNS resolution. When using Force Custom Proxy with a SOCKS4 proxy, DNS queries are resolved locally through your system/ISP DNS, which can leak the domains you're connecting to. SOCKS5 resolves DNS through the proxy itself, preventing these leaks. If DNS privacy matters to you, use SOCKS5, http, or https instead of SOCKS4 for your custom proxy. The app will show a warning when you select SOCKS4 as a reminder.\n\n**What data does this app collect?**\nNone. All data (proxy passwords, stations, history, settings, favorites) is stored locally on your device. There is no cloud sync, no analytics, and no telemetry. You can optionally encrypt all local data with SQLCipher.\n\n**Does cover art load through my proxy?**\nYes - when a Force mode is enabled (and only then); station artwork is routed through the same proxy pipeline as streams, with full DNS leak prevention. If the proxy disconnects, image loading is blocked rather than falling back to a direct connection.\n\n**Can I use a different proxy instead of InviZible Pro?**\nYes. Any SOCKS5 proxy that routes through Tor will work. You can also configure a custom proxy (SOCKS4, SOCKS5, HTTP, or HTTPS) with optional authentication in the app's proxy settings.\n\n**Does enabling Tor (non force mode) hide my IP?**\nNot inherently. Without enabling a force mode, all clearnet traffic (streams, cover art) will be loaded from your direct IP. Enabling this non force mode just allows you to access Tor stations easily without going the extra mile of routing everything through Tor. \n\n**Does cover art load through my proxy?**\nYes. Station artwork is loaded through the same proxy pipeline as streams across all three networks (clearnet, I2P, and Tor). In Force modes, all image requests include full DNS leak prevention, DNS is resolved through the proxy, not your system resolver. If the proxy disconnects, image loading is blocked rather than falling back to a direct connection. You can also disable cover art entirely in settings to eliminate all image requests.\n\n---\n\n## Submit Stations\n\nYou can submit darknet stations (I2P/Tor) via the [Radio Registry API](https://api.deutsia.com).\n\nPlease note that you **cannot** submit clearnet stations here, even if they are part of a darknet website. If the stream source is not `.i2p` or `.onion`, please submit it to the [RadioBrowser database](https://www.radio-browser.info/add) instead.\n\n---\n\n## Support Development\n\n**Monero (XMR):**\n```\n83GGx86c6ZePiz8tEcGYtGJYmnjuP8W9cfLx6s98WAu8YkenjLr4zFC4RxcCk3hwFUiv59wS8KRPzNUUUqTrrYXCJAk4nrN\n```\n\n---\n\n##  Acknowledgments\n- [RadioBrowser](https://www.radio-browser.info/) - Station database\n- [InviZible Pro](https://invizible.net) - Tor/DNSCrypt/I2P integration\n- [I2P Project](https://geti2p.net/) - Anonymous networking on Android\n- Built with [Claude Code](https://github.com/anthropics/claude-code)\n- [SQLCipher](https://www.zetetic.net/sqlcipher/) - Database encryption\n- [Tor/I2P Station API](http://api.deutsia.com) - Tor/I2P API, open-sourced [here](https://github.com/deutsia/Radio-Registry-API)\n---\n\n## License\n\n    deutsia radio\n\n    Copyright (c) 2024 deutsia\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n\n        http://www.apache.org/licenses/LICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n\n---\n\n\u003cdiv align=\"center\"\u003e\n    \u003cimg src=\"assets/4.png\" width=\"30%\"  alt=\"\"/\u003e\n    \u003cimg src=\"assets/1.png\" width=\"30%\"  alt=\"\"/\u003e\n    \u003cimg src=\"assets/gps.png\" width=\"30%\"  alt=\"\"/\u003e\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeutsia%2Fdeutsia-radio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeutsia%2Fdeutsia-radio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeutsia%2Fdeutsia-radio/lists"}