{"id":31847905,"url":"https://github.com/wireapp/kalium","last_synced_at":"2026-04-02T23:44:07.025Z","repository":{"id":37078983,"uuid":"425862083","full_name":"wireapp/kalium","owner":"wireapp","description":"🍌 An SDK for creating Wire clients on Android and JVM. Expanding to iOS and Web.","archived":false,"fork":false,"pushed_at":"2025-10-03T12:36:54.000Z","size":197649,"stargazers_count":54,"open_issues_count":3,"forks_count":6,"subscribers_count":20,"default_branch":"develop","last_synced_at":"2025-10-03T13:28:56.462Z","etag":null,"topics":["android-library","chat-application","chat-sdk","e2ee","jvm","kotlin","kotlin-multiplatform","multiplatform-kotlin-library"],"latest_commit_sha":null,"homepage":"https://wireapp.github.io/kalium/","language":"Kotlin","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wireapp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"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":"2021-11-08T14:07:20.000Z","updated_at":"2025-10-03T12:36:56.000Z","dependencies_parsed_at":"2023-09-22T13:54:22.027Z","dependency_job_id":"7bb4dcd2-5273-4896-b73b-74eed826dde5","html_url":"https://github.com/wireapp/kalium","commit_stats":null,"previous_names":[],"tags_count":115,"template":false,"template_full_name":null,"purl":"pkg:github/wireapp/kalium","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wireapp%2Fkalium","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wireapp%2Fkalium/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wireapp%2Fkalium/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wireapp%2Fkalium/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wireapp","download_url":"https://codeload.github.com/wireapp/kalium/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wireapp%2Fkalium/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279010951,"owners_count":26084841,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-12T02:00:06.719Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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-library","chat-application","chat-sdk","e2ee","jvm","kotlin","kotlin-multiplatform","multiplatform-kotlin-library"],"created_at":"2025-10-12T09:58:26.934Z","updated_at":"2026-04-02T23:44:07.018Z","avatar_url":"https://github.com/wireapp.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\u003cimg src=\"/.idea/icon.png\" alt=\"Kalium Logo\" style=\"max-width:100%;\"\u003e\n\n# Kalium\n[![JVM \u0026 JS Tests](https://github.com/wireapp/kalium/actions/workflows/gradle-jvm-tests.yml/badge.svg)](https://github.com/wireapp/kalium/actions/workflows/gradle-jvm-tests.yml)\n[![codecov](https://codecov.io/gh/wireapp/kalium/branch/develop/graph/badge.svg?token=UWQ1P7DY7I)](https://codecov.io/gh/wireapp/kalium)\n\n## How to build\n\n### Dependencies\n\n- JDK 21 (ex: openjdk-21-jdk on Ubuntu)\n- Git (required for build process)\n\n### Supported Platforms\n\n- Android (see the [Android](https://github.com/wireapp/wire-android) module)\n- JVM (see the [cli](https://github.com/wireapp/kalium/tree/develop/cli) module)\n- iOS (see the [iOS Build Guide](docs/IOS_BUILD.md))\n- JavaScript (just a tiny bit)\n\n### Compile-time flags\n\nKalium currently uses the following compile-time Gradle properties:\n\n- `USE_UNIFIED_CORE_CRYPTO`\n  - Default: `false` (see `gradle.properties`)\n  - Controls whether Kalium uses the unified `core-crypto-kmp` artifact (`true`) or platform-specific crypto artifacts (`false`).\n  - Override example:\n    ```bash\n    ./gradlew \u003ctask\u003e -PUSE_UNIFIED_CORE_CRYPTO=true\n    ```\n\n- `kalium.providerCacheScope`\n  - Purpose: shared compile-time policy that defines cache scope for provider-level in-memory caches.\n  - Required: Kalium defines no default; consumer builds must set it explicitly.\n  - Allowed values:\n    - `GLOBAL`: process-global caches shared across provider instances.\n    - `LOCAL`: each provider instance keeps its own cache.\n  - Current consumers:\n    - `UserStorageProvider`\n    - `UserAuthenticatedNetworkProvider`\n  - Extension rule: any new provider cache should follow this same policy instead of introducing a new compile-time flag.\n  - Override example:\n    ```bash\n    ./gradlew \u003ctask\u003e -Pkalium.providerCacheScope=GLOBAL\n    ```\n\n### Release artifacts\n\nKalium release automation now publishes two separate build outputs:\n\n- Android-only AAR\n  - Artifact: `logic-android-aar`\n  - Build command:\n    ```bash\n    ./gradlew :logic:bundleAndroidMainAar -PUSE_UNIFIED_CORE_CRYPTO=false\n    ```\n- KMP bundle for Android, JVM, and iOS\n  - Artifact: `logic-kmp`\n  - Uses the unified `core-crypto-kmp` dependency, so `USE_UNIFIED_CORE_CRYPTO` must be `true`.\n  - Build command:\n    ```bash\n    ./gradlew :logic:bundleAndroidMainAar :logic:jvmJar :logic:allMetadataJar :logic:sourcesJar :logic:assembleKaliumLogicReleaseXCFramework -PUSE_UNIFIED_CORE_CRYPTO=true\n    ```\n\nEach GitHub release upload also includes a per-bundle SHA-256 manifest\n(`logic-android-aar-SHA256SUMS.txt` / `logic-kmp-SHA256SUMS.txt`) and a matching\nGitHub build provenance bundle (`*-provenance-bundle.json`).\n\nThe `cli` can be executed on the terminal of any machine that \nsatisfies the dependencies mentioned above, and is capable of actions like:\n- Logging in\n- Create a group conversation\n- Add user to group conversation\n- Receive and send text messages in real time\n- Remove another client from your account remotely\n- Refill MSL key packages\n\n#### Building dependencies on macOS 12\n\nJust run `make`, which will download and compile dependencies listed above from source, \nthe output will be `$PROJECT_ROOT$/native/libs`\n\n#### Running on your machine\n\nWhen running any tasks that require the native libraries (`libsodium`, `cryptobox-c` \nand `cryptobox4j`), you need to pass their location as VM options like so:\n\n```\n-Djava.library.path=./path/to/native/libraries/mentioned/before\n```\n\nFor example, if you want to run the task `jvmTest` and the libraries are in `./native/libs`:\n\n```\n./gradlew jvmTest -Djava.library.path=./native/libs\n```\n\n#### Running the CLI\n\nYou can see all commands and options by running `login --help`\n\n```\nUsage: cliapplication login [OPTIONS] COMMAND [ARGS]...\n\nOptions:\n  -e, --email TEXT     Account email\n  -p, --password TEXT  Account password\n  --environment TEXT   Choose backend environment: can be production, staging\n                       or an URL to a server configuration\n  -h, --help           Show this message and exit\n\nCommands:\n  create-group\n  listen-group\n  delete-client\n  add-member\n  remove-member\n  console\n  refill-key-packages\n  mark-as-read                Mark a conversation as read\n  update-supported-protocols\n```\n\n##### JVM\n\n```\n./gradlew :sample:cli:assemble\njava -jar cli/build/libs/cli.jar login --email \u003cemail\u003e --password \u003cpassword\u003e listen-group \n```\n\nor if you want the jar file deleted after your run:\n\n```\n./gradlew :sample:cli:run  --console=plain --quiet --args=\"login --email \u003cemail\u003e --password \u003cpassword\u003e listen-group\"\n```\n\n##### Native (Mac)\n\nFor running on arm64 mac\n```\n./gradlew :sample:cli:macosArm64Binaries\n./cli/build/bin/macosArm64/debugExecutable/cli.kexe login\n```\n\n#### Detekt rules\n\nWe use and try to maintain our codestyle uniformed, so apart from having our checks in place in our\nCI. You can have live feedback using the IDE, here is how:\n\n1. IntelliJ -\u003e Settings -\u003e Plugins -\u003e Marketplace -\u003e Search and install \"Detekt\"\n2. Settings -\u003e Tools -\u003e Detekt -\u003e set: (replace $PROJECT_ROOT accordingly to your machine)\n\n    - Configuration Files: $PROJECT_ROOT/detekt/detekt.yml\n    - Baseline File: $PROJECT_ROOT/detekt/baseline.yml (optional)\n    - Plugin Jars: $PROJECT_ROOT/detekt-rules/build/libs/detekt-rules.jar (this will add our custom\n      rules to provide live feedback)\n\nor\n\nYou can run locally in your terminal:\n\n```\n./gradlew clean detekt\n```\n\n#### Dependency Graph\n\n```mermaid\n%%{\n  init: {\n    'theme': 'neutral'\n  }\n}%%\n\ngraph LR\n  :logic[\"logic\"]\n  subgraph :core\n    :core:common[\"common\"]\n    :core:data[\"data\"]\n    :core:logger[\"logger\"]\n    :core:util[\"util\"]\n    :core:cryptography[\"cryptography\"]\n    :core:common[\"common\"]\n    :core:cryptography[\"cryptography\"]\n    :core:libsodium[\"libsodium\"]\n    :core:data[\"data\"]\n  end\n  subgraph :data\n    :data:persistence[\"persistence\"]\n    :data:network[\"network\"]\n    :data:network-util[\"network-util\"]\n    :data:persistence[\"persistence\"]\n    :data:persistence-test[\"persistence-test\"]\n    :data:data-mappers[\"data-mappers\"]\n    :data:protobuf[\"protobuf\"]\n    :data:persistence-test[\"persistence-test\"]\n    :data:network-model[\"network-model\"]\n    :data:network-util[\"network-util\"]\n    :data:network[\"network\"]\n    :data:network-model[\"network-model\"]\n    :data:data-mappers[\"data-mappers\"]\n  end\n  subgraph :domain\n    :domain:work[\"work\"]\n    :domain:calling[\"calling\"]\n    :domain:cells[\"cells\"]\n    :domain:backup[\"backup\"]\n    :domain:nomaddevice[\"nomaddevice\"]\n    :domain:userstorage[\"userstorage\"]\n    :domain:usernetwork[\"usernetwork\"]\n    :domain:userstorage[\"userstorage\"]\n    :domain:work[\"work\"]\n    :domain:nomaddevice[\"nomaddevice\"]\n    :domain:usernetwork[\"usernetwork\"]\n    :domain:backup[\"backup\"]\n    :domain:cells[\"cells\"]\n    subgraph :messaging\n      :domain:messaging:hooks[\"hooks\"]\n      :domain:messaging:sending[\"sending\"]\n      :domain:messaging:hooks[\"hooks\"]\n      :domain:messaging:sending[\"sending\"]\n    end\n  end\n  subgraph :test\n    :test:data-mocks[\"data-mocks\"]\n    :test:data-mocks[\"data-mocks\"]\n    :test:mocks[\"mocks\"]\n    :test:mocks[\"mocks\"]\n  end\n\n  :core:common --\u003e :core:data\n  :core:common --\u003e :core:logger\n  :core:common --\u003e :core:util\n  :core:common --\u003e :data:persistence\n  :core:common --\u003e :data:network\n  :core:common --\u003e :data:network-util\n  :core:common --\u003e :core:cryptography\n  :domain:messaging:hooks --\u003e :core:data\n  :domain:messaging:hooks --\u003e :core:common\n  :domain:messaging:hooks --\u003e :core:logger\n  :data:persistence --\u003e :core:logger\n  :data:persistence --\u003e :core:util\n  :data:persistence-test --\u003e :data:persistence\n  :logic --\u003e :core:common\n  :logic --\u003e :domain:work\n  :logic --\u003e :core:data\n  :logic --\u003e :data:network-util\n  :logic --\u003e :core:logger\n  :logic --\u003e :domain:calling\n  :logic --\u003e :data:network\n  :logic --\u003e :data:data-mappers\n  :logic --\u003e :core:cryptography\n  :logic --\u003e :data:persistence\n  :logic --\u003e :data:protobuf\n  :logic --\u003e :core:util\n  :logic --\u003e :domain:cells\n  :logic --\u003e :domain:backup\n  :logic --\u003e :domain:nomaddevice\n  :logic --\u003e :domain:userstorage\n  :logic --\u003e :domain:usernetwork\n  :logic --\u003e :domain:messaging:sending\n  :logic --\u003e :domain:messaging:hooks\n  :logic --\u003e :data:persistence-test\n  :logic --\u003e :test:data-mocks\n  :domain:userstorage --\u003e :data:persistence\n  :domain:userstorage --\u003e :core:util\n  :domain:userstorage --\u003e :core:data\n  :domain:work --\u003e :core:common\n  :domain:work --\u003e :core:data\n  :domain:work --\u003e :core:logger\n  :domain:work --\u003e :core:util\n  :test:data-mocks --\u003e :core:data\n  :test:data-mocks --\u003e :data:persistence\n  :test:data-mocks --\u003e :data:network-model\n  :test:data-mocks --\u003e :core:util\n  :domain:nomaddevice --\u003e :core:common\n  :domain:nomaddevice --\u003e :data:protobuf\n  :domain:nomaddevice --\u003e :domain:messaging:hooks\n  :domain:nomaddevice --\u003e :domain:usernetwork\n  :domain:nomaddevice --\u003e :domain:userstorage\n  :domain:nomaddevice --\u003e :data:persistence\n  :data:network-util --\u003e :core:logger\n  :test:mocks --\u003e :data:network-model\n  :domain:messaging:sending --\u003e :core:common\n  :domain:messaging:sending --\u003e :core:data\n  :domain:messaging:sending --\u003e :core:logger\n  :domain:messaging:sending --\u003e :core:util\n  :domain:usernetwork --\u003e :data:network\n  :core:cryptography --\u003e :core:logger\n  :core:cryptography --\u003e :core:libsodium\n  :domain:backup --\u003e :core:libsodium\n  :domain:backup --\u003e :data:protobuf\n  :data:network --\u003e :data:network-model\n  :data:network --\u003e :core:logger\n  :data:network --\u003e :data:protobuf\n  :data:network --\u003e :core:util\n  :data:network --\u003e :data:network-util\n  :data:network --\u003e :test:mocks\n  :data:network-model --\u003e :core:logger\n  :data:network-model --\u003e :core:util\n  :core:data --\u003e :data:network-model\n  :core:data --\u003e :core:util\n  :domain:cells --\u003e :core:common\n  :domain:cells --\u003e :data:network\n  :domain:cells --\u003e :core:data\n  :domain:cells --\u003e :core:util\n  :domain:cells --\u003e :data:persistence\n  :data:data-mappers --\u003e :core:data\n  :data:data-mappers --\u003e :data:protobuf\n  :data:data-mappers --\u003e :data:persistence\n  :data:data-mappers --\u003e :core:cryptography\n  :data:data-mappers --\u003e :data:network-model\n  :data:data-mappers --\u003e :core:util\n\nclassDef kotlin-multiplatform fill:#C792EA,stroke:#fff,stroke-width:2px,color:#fff;\nclass :core:common kotlin-multiplatform\nclass :core:data kotlin-multiplatform\nclass :core:logger kotlin-multiplatform\nclass :core:util kotlin-multiplatform\nclass :data:persistence kotlin-multiplatform\nclass :data:network kotlin-multiplatform\nclass :data:network-util kotlin-multiplatform\nclass :core:cryptography kotlin-multiplatform\nclass :domain:messaging:hooks kotlin-multiplatform\nclass :data:persistence-test kotlin-multiplatform\nclass :logic kotlin-multiplatform\nclass :domain:work kotlin-multiplatform\nclass :domain:calling kotlin-multiplatform\nclass :data:data-mappers kotlin-multiplatform\nclass :data:protobuf kotlin-multiplatform\nclass :domain:cells kotlin-multiplatform\nclass :domain:backup kotlin-multiplatform\nclass :domain:nomaddevice kotlin-multiplatform\nclass :domain:userstorage kotlin-multiplatform\nclass :domain:usernetwork kotlin-multiplatform\nclass :domain:messaging:sending kotlin-multiplatform\nclass :test:data-mocks kotlin-multiplatform\nclass :data:network-model kotlin-multiplatform\nclass :test:mocks kotlin-multiplatform\nclass :core:libsodium kotlin-multiplatform\n\n```\n#### Logo\n\nThe logo is adapted from [OpenMoji](https://openmoji.org/) – the open-source emoji and icon project. License: [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwireapp%2Fkalium","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwireapp%2Fkalium","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwireapp%2Fkalium/lists"}