🎧 A sleek, open-source listening app that connects to your music server. AI-powered mixes shaped by your moments, phone sensors & AudioMuse-AI. Discover artists, albums, and, Audiobookshelf audiobooks and podcasts. Your listening, your way, one app.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗A music player for your own music server (Navidrome or another OpenSubsonic server, Emby or Jellyfin), with mixes made for the moment from AudioMuse-AI's sound search: for the time of day, the weather or a mood you describe, named by an AI service of your choice if you like. Audiobooks and podcasts from Audiobookshelf play alongside.
Siansa is open source under the GNU GPL, version 3 or later (LICENSE): the code is here to read, build and improve. Website: siansa.app. Docs: docs.siansa.app (the docs folder until then).
https://siansa.app/fdroid/repo, then search for Siansa.More in the install guide.
Siansa is in beta. There's no APK to download here: the app comes from
Both update on their own. Or build it from this source (below): a build of your own is signed with your own key, so it can't update an installed copy from Play or F-Droid, and the other way round.
http://192.168.1.10:4533), username, password.http://192.168.1.10:8000) and its API token if authentication is on. Text search (CLAP) must be enabled.google/gemini-2.5-flash; any OpenRouter model id works).audiomuse-plugin/) and choose it
under Settings › Crossfade and levelling. It measures each song's loudness and how it starts and ends, for
levelling and smooth crossfades, and finds similar albums and artists.Inside the app, with Settings › Help › Debug logs on, the log records each start (version, phone, settings that change behaviour), why the app last closed (crash, freeze, killed for memory, swiped away; Android 11+), every error in background work, playback decisions, downloads and covers. Report a problem on the same page sends it with your words.
Every push to main and every pull request runs .github/workflows/ci.yml:
| Check | What it catches |
|---|---|
Build (assembleRelease) | Syntax and type errors; the release APK must compile and shrink with R8. |
Unit tests (app/src/test) | Mistakes in the app's own logic: server addresses, cover detection, ReplayGain, release types, name matching, the home-network check. Run in seconds, no phone needed. |
Screenshot tests (app/src/test/java/app/siansa/screenshots) | Parts of the app drawn in light and dark, at normal and 130 % font size, and compared pixel by pixel with the approved pictures in app/src/test/screenshots: words cut off, text too faint in light mode, gaps that moved. Drawn on the build machine (Roborazzi on Robolectric), no phone needed. Pull requests only. When a new look is meant, label the pull request record screenshots: .github/workflows/screenshots.yml draws the pictures again, commits them to it and comments on it with each picture that differs from main, before and after. Merging the pull request approves them. |
Plugin tests (audiomuse-plugin/tests) | Mistakes in the AudioMuse-AI plugin: loudness against the BS.1770 reference, fade shapes, the ramp layout the app reads, similar lists and when they rebuild. |
| Android Lint | Likely crashes, wrong Android API use for older versions, and security issues. Errors appear as annotations on the commit. |
Secret scan (gitleaks, .gitleaks.toml) | Passwords, tokens or API keys committed anywhere in the history. |
Emulator tests (app/src/androidTest) | The app on an Android emulator against a real Navidrome behind a phone-speed link: animated covers downloaded once and shown as stills in lists, songs playing while covers load, and a tour of every page that plays songs from several of them. Screenshots of every page and the app's log go to the ci-screens branch. They run after each merge to main and nightly, and on a pull request labelled ui (.github/workflows/ui-tests.yml, on GitHub's runner, again on each push while the label is on), and report problems without holding back releases (song start times on the throttled emulator vary too much to fail on; slow starts are listed in the run). |
Dependabot (.github/dependabot.yml) | Weekly pull requests for outdated libraries and alerts for known vulnerabilities in them. |
Every pull request, push and nightly run builds the app and runs Lint, the unit tests, the plugin tests and the secret scan, whatever changed, and compiles the emulator tests so a pull request can't break them unseen. The emulator tests run every night, and after merges to main that can change the app. Gradle's build cache reuses unchanged work. Pull requests and the quick checks run on GitHub's runners; pushes to main, the emulator tests and releases run on the owner's own runner when the RUNS_ON repository variable names it (see .github/workflows/ci.yml).
A release is published from main when the build, Lint, unit tests and secret scan pass. A failing check shows a red cross on the commit, and its details are in the run's annotations.
Inside the app, with Settings → Logs → Keep a log on, the log records each start (version, phone, settings that change behaviour), why the app last closed (crash, freeze, killed for memory, swiped away; Android 11+), every error in background work, playback decisions, downloads and covers. Problems on the Logs page shows only warnings and errors.
GitHub Actions builds the app on every push to main and publishes a release once all quality checks pass. The version comes from version.txt (e.g. 0.0.3beta). Each change adds a note in changelog.d/ (see its README). When changes are merged to main and the checks pass, CI raises the version by the size of the change (fixes 0.1.3 → 0.1.4, new features 0.1.3 → 0.2.0, 1.0 only when asked for; see changelog.d/README.md), tags v<version> with the notes, records the section in CHANGELOG.md and the version in version.txt, sends the APK to the F-Droid repository and the app bundle to Google Play's beta (closed and internal testing). Edits to older changelog sections are copied to their releases too. RELEASES.md lists every release with the pull requests in it and is updated after each release.
The release signing key isn't in the repository: CI gets it from the secrets SIGNING_KEYSTORE_BASE64, SIGNING_KEYSTORE_PASSWORD, SIGNING_KEY_ALIAS and SIGNING_KEY_PASSWORD, and a build without them is unsigned.
To build locally: gradle :app:assembleRelease with Gradle 8.14+, JDK 17 and the Android SDK (platform 36). To sign it with a key of your own, set SIANSA_KEYSTORE (the file's path), SIANSA_KEYSTORE_PASSWORD, SIANSA_KEY_ALIAS and SIANSA_KEY_PASSWORD in the environment.
Bug reports and feature requests go in this repository's issues, or Settings › Help › Report a problem in the app, which sends the log along. Pull requests are welcome here: one issue per pull request, with a note in changelog.d/ and tests for what changes (see CLAUDE.md for the conventions CI checks).
Siansa is free software under the GNU General Public License, version 3 or later. The AudioMuse-AI plugin in audiomuse-plugin/ is under the AGPL 3, as AudioMuse-AI is. The libraries the app is built on and their licences are listed at siansa.app/licenses.