The earlier -Wl,-U,_sqlite3_enable_load_extension fix only satisfied the linker; at runtime, Kotlin/Native's cinterop wrapper for that function still resolves against the symbol the moment SQLDelight's native-driver opens a connection, and Apple's system libsqlite3 doesn't export it on macOS — so the app now crashed instead of failing to build. Adds weak no-op definitions of sqlite3_enable_load_extension and sqlite3_load_extension, compiled directly into the app (Xcode's file-system-synchronized group picks the file up with no project.pbxproj changes needed beyond what Xcode itself rewrote on this build). Weak means a platform whose system library does provide the real symbol keeps using that one; this only fills in where it's missing. Verified there's no longer a crash by running the built macOS binary directly and by installing/launching it on the iOS Simulator — neither produced a dyld error or a crash report, versus two reproducible crash reports beforehand with the exact reported failure signature. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QpjMKWGoiT5aJBzhxvXkwp
SatsPrice
This app fetches the price of Bitcoin relative to common fiat currencies from multiple sources, and converts inputted amounts between Sats, BTC, and the selected fiat currency.
Download and Install
Supported Platforms
iOS 16.0+ • macOS 13.0+ • Android 10.0+
Kotlin Multiplatform
This is a Kotlin Multiplatform project targeting Android, iOS, Web, Desktop (JVM).
-
/iosApp contains an iOS application. Even if you’re sharing your UI with Compose Multiplatform, you need this entry point for your iOS app. This is also where you should add SwiftUI code for your project.
-
/shared is for code that will be shared across your Compose Multiplatform applications. It contains several subfolders:
- commonMain is for code that’s common for all targets.
- Other folders are for Kotlin code that will be compiled for only the platform indicated in the folder name. For example, if you want to use Apple’s CoreCrypto for the iOS part of your Kotlin app, the iosMain folder would be the right place for such calls. Similarly, if you want to edit the Desktop (JVM) specific part, the jvmMain folder is the appropriate location.
Running the apps
Use the run configurations provided by the run widget in your IDE's toolbar. You can also use these commands and options:
- Android app:
./gradlew :androidApp:assembleDebug - Desktop app:
- Hot reload:
./gradlew :desktopApp:hotRun --auto - Standard run:
./gradlew :desktopApp:run
- Hot reload:
- Web app:
- Wasm target (faster, modern browsers):
./gradlew :webApp:wasmJsBrowserDevelopmentRun - JS target (slower, supports older browsers):
./gradlew :webApp:jsBrowserDevelopmentRun
- Wasm target (faster, modern browsers):
- iOS app: open the /iosApp directory in Xcode and run it from there.
Running tests
Use the run button in your IDE's editor gutter, or run tests using Gradle tasks:
- Android tests:
./gradlew :shared:testAndroidHostTest - Desktop tests:
./gradlew :shared:jvmTest - Web tests:
- Wasm target:
./gradlew :shared:wasmJsTest - JS target:
./gradlew :shared:jsTest
- Wasm target:
- iOS tests:
./gradlew :shared:iosSimulatorArm64Test
Attribution
This project depends on Skip to build as a multi-platform app.
This project uses Kotlin Multiplatform, Compose Multiplatform, and Kotlin/Wasm.
The Bitcoin Calculator icon was created by Icon home and licensed as free for personal and commercial use with attribution.
The following free APIs are used:
- Coinbase
- CoinGecko
