Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
翻訳待ち
District AI for Android, the native Android app, is open source under Apache-2.0. The service it talks to is not. Signing in needs a District AI account.
翻訳待ち
ビジネスKotlin · PythonGitHub @distronode-corporationオンライン所有者未確認
Have you tried it? One tap is enough. No sign-in needed.
District AI for Android: the native client (Kotlin, Jetpack Compose)
翻訳待ち
Loading the full README. The saved excerpt is shown below.
The native Android client for District AI, by
Distronode. It is the app published on
Google Play as
com.distronode.districtai: calls and transcripts, the shared inbox, contacts and their
intelligence dossiers, multi-party rooms, a self-managed softphone that places and answers
calls through Android's Telecom framework, push notifications, and workspace settings.
Kotlin, Jetpack Compose and Material 3, on a small set of Gradle modules. Apache-2.0.Read the full README ↗The native Android client for District AI, by
Distronode. It is the app published on
Google Play as
com.distronode.districtai: calls and transcripts, the shared inbox, contacts and their
intelligence dossiers, multi-party rooms, a self-managed softphone that places and answers
calls through Android's Telecom framework, push notifications, and workspace settings.
The Overview, in a fictional review workspace.
Kotlin, Jetpack Compose and Material 3, on a small set of Gradle modules. Apache-2.0. It runs on Android 8.0 (API level 26) and later.
Languages: English and Canadian French (fr-CA), since 3.0. The app follows the device's language or, on Android 13 and later, its own language setting; any French reads in Canadian French, and every other language in English.
The app is a client of the District AI API. Everything it shows comes from that service, and signing in needs a District AI account. There is no offline mode and no local server.
Without an account with us. Today this app needs a District AI account to sign in. We want the District AI apps to work without an account with us too. We have not worked out what that looks like or whether it can work, and the answer depends on what people would use them with, so we are asking before we build anything: tell us what you would connect them to.
Links: project page · GitLab mirror (read-only mirror; issues and pull requests live on GitHub) · CHANGELOG
android-37.0 (compileSdk 37) and build tools 37.0.0.
targetSdk is 36 and minSdk is 26. Point the build at the SDK with ANDROID_HOME or a
local.properties file containing sdk.dir=... (it is gitignored)../gradlew assembleDebug # debug APK: app/build/outputs/apk/debug/
./gradlew testDebugUnitTest # every module's unit tests (Robolectric included)
./gradlew detekt lintDebug # static analysis and Android Lint
./gradlew :koverLogUnit :koverVerifyUnit # aggregate coverage and its floors
scripts/verify-release-minification.sh # R8 release build, serializers retained
That is also what CI runs, in one job: see .github/workflows/ci.yml and CONTRIBUTING.md.
The debug build installs as com.distronode.districtai.debug, so it can sit beside a release
install on the same device.
Every configuration is dependency-locked (<module>/gradle.lockfile). Changing a version in
gradle/libs.versions.toml does nothing until the lockfiles are regenerated; the command is
in the "Regenerating the lockfiles" note in build.gradle.kts.
app/ The application: screens (ui/), navigation, Telecom and calls,
push, app links, sign-in, and the wiring in AppContainer.
core/core-model/ API response and request types, and the contract fixture tests.
core/core-network/ The HTTP client over OkHttp, the API interfaces, and the mapping of
the API's error envelopes into one result type.
core/core-auth/ Token storage (Android Keystore) and the refresh coordinator.
core/core-data/ Repositories over core-network, and the active-workspace state.
core/core-designsystem/ Colour, type, shape and the primitive composables. Depends on no
other module.
core/core-media/ The LiveKit wrapper behind a CallEngine interface.
build-logic/ Convention plugins shared by every module.
contracts/ API contract fixtures generated by the server (see below).
parity/ A snapshot of the iOS client's endpoint list (see below).
config/detekt/ detekt configuration.
scripts/ Verification scripts; see scripts/README.md.
.maestro/ A Maestro smoke flow, run locally with scripts/smoke-emulator.sh.
docs/ARCHITECTURE.md describes how the modules fit together.
This repository has no generated API client and the API has no published schema. What stops a
server-side rename from shipping silently is contracts/: JSON bodies produced by the
server's own test suite from its real route handlers, committed here, and decoded in
:core:core-model (and a few other modules) with a strict decoder that rejects unknown keys.
The gate has two halves, one in each repository:
This is the beginning of the README. Read the rest at the original. Read the full README ↗