
Modular toolkit for digital identity wallets and verifiers, offering core utilities and an OpenID Verifiable Presentations over BLE transport implementation, plus sample wallet and verifier apps.
The Kapun SDK is a Kotlin Multiplatform toolkit for building digital-identity wallets and verifiers on Android and iOS. It includes credential formats, DCQL, issuance, presentation, wallet, cryptography, trust, proximity, and visualization modules.
The repository also contains sample Android wallet and verifier applications and an iOS sample. The samples are demonstrations and may require application-specific wallet or backend configuration.
The implementations follow the relevant OpenID4VCI, OpenID4VP, ISO/IEC 18013-5, SD-JWT VC, DCQL, and Open Badges specifications.
The project is actively evolving. Check the releases for published versions; APIs and implementation details may change between releases.
This project evolved from the former Heidi SDK and is now maintained as the Kapun SDK under the KapunSDK organization. Older documentation and package references may still use the Heidi name.
./gradlew :examples:android-wallet:assembleDebug
./gradlew :examples:android-wallet:installDebug
./gradlew :examples:android-verifier:assembleDebug
./gradlew :examples:android-verifier:installDebugFor a faster local debug build, compile only the ABI used by the connected device:
./gradlew :examples:android-wallet:assembleDebug -PandroidAbis=arm64-v8aRelease builds should omit this option so that all supported Android ABIs are included. The -PandroidAbis option is provided by the UniFFI plugin v1.2.3.
Use Android-specific Gradle tasks such as assembleDebug rather than the root build task during app development. The root build also runs JVM targets; on macOS that includes the macOS Rust library needed by JVM/JNA binding generation.
Rust outputs are shared between SDK modules automatically in this checkout. The root build configures
all UniFFI modules to use the visible cargo-target directory, which is ignored by Git and survives
Gradle's clean task. This means developers do not need to set CARGO_TARGET_DIR for normal SDK
builds. To remove the Rust cache as well, run:
./gradlew cleanCargoCacheWhen the SDK is included in another KMP project, the included SDK build still uses this same checkout-local directory. If the consumer is configured as a separate Gradle build that does not load the SDK root build configuration, set the same absolute path in both builds:
export CARGO_TARGET_DIR="/absolute/path/to/shared/cargo-target"
./gradlew :app:assembleDebugOpen sample-ios-kapun.xcodeproj in Xcode, select a simulator or device, and run the sample-ios-kapun target. Device builds require your own provisioning profile. The sample requires iOS 16 or newer.
If the build needs Android SDK information, set ANDROID_HOME and create a root local.properties file containing:
sdk.dir=/path/to/your/android/sdkThe sample sources are available in examples/android-wallet, examples/android-verifier, and sample-ios-kapun.xcodeproj.
Released artifacts are available from Maven Central. Add mavenCentral() to your repositories and depend on the module you need, for example:
dependencies {
implementation("org.kapunsdk:kapun-wallet:1.0.0")
}Replace 1.0.0 with the release you want.
To publish JVM artifacts to your local Maven repository:
./gradlew publishJvmPublicationToMavenLocal -PARTIFACT_VERSION=1.0.0-LOCALThe resulting JVM coordinates use the org.kapunsdk group, for example org.kapunsdk:kapun-trust-jvm:1.0.0-LOCAL. Publishing all targets requires the corresponding Rust toolchains. Release signing is disabled by default.
Bug reports and feature requests are welcome in the issue tracker. See CONTRIBUTING.md before opening a pull request. Pull requests should include tests or a short explanation when tests are not applicable.
Please report security vulnerabilities privately according to the security policy. By participating in this project, you agree to follow the Code of Conduct.
This project is licensed under the Apache License 2.0. See LICENSE.
The Kapun SDK is a Kotlin Multiplatform toolkit for building digital-identity wallets and verifiers on Android and iOS. It includes credential formats, DCQL, issuance, presentation, wallet, cryptography, trust, proximity, and visualization modules.
The repository also contains sample Android wallet and verifier applications and an iOS sample. The samples are demonstrations and may require application-specific wallet or backend configuration.
The implementations follow the relevant OpenID4VCI, OpenID4VP, ISO/IEC 18013-5, SD-JWT VC, DCQL, and Open Badges specifications.
The project is actively evolving. Check the releases for published versions; APIs and implementation details may change between releases.
This project evolved from the former Heidi SDK and is now maintained as the Kapun SDK under the KapunSDK organization. Older documentation and package references may still use the Heidi name.
./gradlew :examples:android-wallet:assembleDebug
./gradlew :examples:android-wallet:installDebug
./gradlew :examples:android-verifier:assembleDebug
./gradlew :examples:android-verifier:installDebugFor a faster local debug build, compile only the ABI used by the connected device:
./gradlew :examples:android-wallet:assembleDebug -PandroidAbis=arm64-v8aRelease builds should omit this option so that all supported Android ABIs are included. The -PandroidAbis option is provided by the UniFFI plugin v1.2.3.
Use Android-specific Gradle tasks such as assembleDebug rather than the root build task during app development. The root build also runs JVM targets; on macOS that includes the macOS Rust library needed by JVM/JNA binding generation.
Rust outputs are shared between SDK modules automatically in this checkout. The root build configures
all UniFFI modules to use the visible cargo-target directory, which is ignored by Git and survives
Gradle's clean task. This means developers do not need to set CARGO_TARGET_DIR for normal SDK
builds. To remove the Rust cache as well, run:
./gradlew cleanCargoCacheWhen the SDK is included in another KMP project, the included SDK build still uses this same checkout-local directory. If the consumer is configured as a separate Gradle build that does not load the SDK root build configuration, set the same absolute path in both builds:
export CARGO_TARGET_DIR="/absolute/path/to/shared/cargo-target"
./gradlew :app:assembleDebugOpen sample-ios-kapun.xcodeproj in Xcode, select a simulator or device, and run the sample-ios-kapun target. Device builds require your own provisioning profile. The sample requires iOS 16 or newer.
If the build needs Android SDK information, set ANDROID_HOME and create a root local.properties file containing:
sdk.dir=/path/to/your/android/sdkThe sample sources are available in examples/android-wallet, examples/android-verifier, and sample-ios-kapun.xcodeproj.
Released artifacts are available from Maven Central. Add mavenCentral() to your repositories and depend on the module you need, for example:
dependencies {
implementation("org.kapunsdk:kapun-wallet:1.0.0")
}Replace 1.0.0 with the release you want.
To publish JVM artifacts to your local Maven repository:
./gradlew publishJvmPublicationToMavenLocal -PARTIFACT_VERSION=1.0.0-LOCALThe resulting JVM coordinates use the org.kapunsdk group, for example org.kapunsdk:kapun-trust-jvm:1.0.0-LOCAL. Publishing all targets requires the corresponding Rust toolchains. Release signing is disabled by default.
Bug reports and feature requests are welcome in the issue tracker. See CONTRIBUTING.md before opening a pull request. Pull requests should include tests or a short explanation when tests are not applicable.
Please report security vulnerabilities privately according to the security policy. By participating in this project, you agree to follow the Code of Conduct.
This project is licensed under the Apache License 2.0. See LICENSE.