* light wallpapers: v4 color formula all 6 light wallpapers recalculated with the new formula: received messages are white (read more often, max readability), sent messages muted in the hue — same pattern as Telegram. tint/chroma tuned per wallpaper on device. the formula lives outside the app (node script), only the resulting oklch constants are in kotlin. LIGHT is served from _background/_tint/ _colors; DARK/SIMPLEX/BLACK keep the generator. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * wallpapers: tune dark theme + refine light pattern intensity Calibrated full dark theme palette for all 6 preset wallpapers using the shared chroma formula (bg-anchored, two-cluster muted/color, per-hue P3 saturation). Each wallpaper now has its own dark bg, tint, and bubble colors instead of a shared neutral gray. Hearts hue shifted from 15° to 5° (slightly cooler), school from 239° to 249° (slightly warmer); hearts, school and travel had per-wallpaper saturation reduced for visual balance. wallpaperBackgrounds() now accepts a dark color override. Light pattern tint also refined for flowers/hearts/kids/school/travel using a coverage+sharpness regression on the pattern textures, so dense patterns like hearts read calmer and sparse ones like flowers read clearer. Light bubbles and backgrounds unchanged from the v4 formula. Cats remains the calibration anchor for both themes. * wallpapers: tune black theme (#6912) * wallpapers: tune black theme Replaced the legacy hex-derived BLACK palette with calibrated values for all 6 preset wallpapers. Pure black bg (#000000) replaces the near-black gray (#070707) — with the chroma formula's "muted side at zero" rule the BLACK theme now reads as truly hyper-contrast. Each wallpaper's tint and bubble colors are tuned to its own hue (cats 70°, flowers 130°, hearts 5°, kids 192°, school 249°, travel 315°) with chroma pulled to per-hue P3 boundary, capped to keep pattern visibility consistent across textures. * fix color space * wallpapers: recalibrate all presets + hue-tinted panels Recalculated bg/tint/bubble colors for all 6 wallpapers across LIGHT/DARK/BLACK using unified oklch formula. Added subtle hue tint to panel backgrounds (status bar, top app bar, nav bar) so they pick up the wallpaper's color. Hearts and school use different hues in dark themes, so added PresetWallpaper.hue(theme) to handle that. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * wallpapers: formula dev tools, normalized patterns, desktop fixes - Formula dev UI (developer tools only): sliders for all color parameters per theme (LIGHT/DARK/BLACK), live preview, copyable Kotlin code output - oklch color formula ported to Kotlin (generateSchemeLight/Dark/Black) - sRGB gamut boundary for Desktop (maxChromaSRGB), P3 for Android - Normalized pattern PNGs (consistent element size across wallpapers) - Desktop pattern scale 0.55 + draft/final rendering (fast during drag, SCALE_SMOOTH on release) - Hue-tinted toolbar via ThemeColor.TOOLBAR + AppColors.toolbar - Received tint slider for light themes Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * wallpapers: fix toolbar color picker + received tint default Toolbar color: direct replacement instead of alpha-mixing, picker opens with actual visible toolbar color (panelBackgroundColor), copy-code hint shows file and line number. Received tint: default derived from hardcoded colors (fallback 0.005). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * wallpapers: extend pattern depth slider range to 10 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * wallpapers: add BG Lightness slider for light themes Offset ±0.05 to formula background L, independent of other slots. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * wallpapers: denser hearts pattern + recalibrated LIGHT colors Tuned LIGHT theme colors for all 6 presets via the formula sliders. Hearts pattern PNG replaced with a denser variant (all four density variants regenerated). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * wallpapers: revert iOS hearts variants to old format The denser hearts PNG is shipped only as the multiplatform @4x file (used by Android and Desktop). iOS still uses the old pattern renderer which expects the old non-normalized layout, so the @1x/@2x/@3x variants are reverted to their previous state to avoid visual breakage on iOS. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
Android App Development
This is a guide to contributing to the develop of the SimpleX android and desktop apps.
Project Overview
This is the Kotlin Multiplatform (KMP) mobile and desktop client for SimpleX Chat, sharing code between Android and Desktop (JVM) platforms using Compose Multiplatform for UI.
Build Commands
# Android debug APK
./gradlew assembleDebug
# Android release APK
./gradlew assembleRelease
# Desktop distribution (current OS)
./gradlew :desktop:packageDistributionForCurrentOS
# Run desktop/JVM tests
./gradlew desktopTest
# Run Android instrumented tests (requires connected device/emulator)
./gradlew connectedAndroidTest
# Build native libraries for all platforms
./gradlew common:cmakeBuild -PcrossCompile
# Clean build
./gradlew clean
Architecture
Module Structure
common/- Shared code (Compose UI, models, business logic)src/commonMain/- Cross-platform codesrc/androidMain/- Android-specific implementationssrc/desktopMain/- Desktop-specific implementations
android/- Android app containerdesktop/- Desktop JVM app container
Key Components (common/src/commonMain/kotlin/chat/simplex/common/)
model/ChatModel.kt- Main state container with reactive properties (MutableState, MutableStateFlow)model/SimpleXAPI.kt- API bindings to Haskell core library via FFIplatform/Core.kt- FFI interface to nativelibapplibraryplatform/- Platform abstraction layer (expect/actual pattern for Android/Desktop specifics)views/- Compose UI screens organized by feature (chat, chatlist, call, usersettings, etc.)ui/theme/- Design system (colors, typography, shapes)
Native Integration
The app calls into a Haskell core library via JNI/FFI:
- CMake builds in
common/src/commonMain/cpp/android/andcpp/desktop/ - Cross-compilation toolchains in
cpp/toolchains/ - Built libraries go to
cpp/desktop/libs/(organized by platform)
Configuration
local.properties (create from local.properties.example)
compression.level=0 # APK compression (0-9)
enable_debuggable=true # Debug mode
application_id.suffix=.debug # Multiple app instances on same device
app.name=SimpleX Debug # App name for debug builds
gradle.properties
Contains versions (Kotlin, Compose, AGP) and app version info. Key settings:
kotlin.jvm.target=11database.backend=sqlite(orpostgres)
Testing
Tests are in:
common/src/commonTest/kotlin/- Cross-platform testscommon/src/desktopTest/kotlin/- Desktop-specific tests (run with./gradlew desktopTest)android/src/androidTest/- Android instrumented tests
Resources & Localization
- String resources:
common/src/commonMain/resources/MR/base/strings.xml+ 21 language variants - Uses Moko Resources (
dev.icerock.moko:resources) for cross-platform resource management - The
adjustFormattinggradle task validates string resources during build
Platform-Specific Notes
Android
- Min SDK 26, Target SDK 35
- NDK 23.1.7779620
- Supports ABI splits:
arm64-v8a,armeabi-v7a - Deep linking requires SHA certificate fingerprint in
assetlinks.json(see README.md)
Desktop
- Distributions: DMG (macOS), MSI/EXE (Windows), DEB (Linux)
- Mac signing/notarization configured via
local.properties - Video playback uses VLCJ
Gotchas
SHA Signature for verification for app links/deep links
In order for the SimpleX app to be automatically adopted for opening links from https://simplex.chat the SHA certificate fingerprint for the App installed on the phone must be in the hosted assetlinks.json file on simplex.chat.
The accepted fingerprints are in the sha256_cert_fingerprints list.
To find your SHA certificate fingerprint perform the following steps.
- Build and install your development version of the app as usual
- From the terminal in Android studio run
adb shell pm get-app-links chat.simplex.app - Copy the signature listed in
signaturesin the result - Add your signature to assetlinks.json in the website repo and make a PR. On approval, wait a few minutes for the changes to propagate to the public website and then you should be able to verify SimpleX.
More information is available here. If there is no response when running the pm get-app-links command, the intents in AndroidManifest.xml are likely misspecified. A verification attempt can be triggered using adb shell pm verify-app-links --re-verify chat.simplex.app.
Note that this is not an issue for the app store build of the app as this is signed with our app store credentials and thus there is a stable signature over users. Developers do not have general access to these credentials for development and testing.
Adding icons
-
Find a Material symbol in Rounded category.
-
Set weight to 400, grade to -25 and size to 48px.
-
Click on the icon, choose Android and download XML file.
-
Update the color to black (#FF000000) and the size to "24.dp", as in other icons.
For example, this is add reaction icon.