mirror of
https://github.com/priyanshujain/sanderling.git
synced 2026-10-02 19:17:10 +00:00
78 lines
1.8 KiB
Markdown
78 lines
1.8 KiB
Markdown
# Folio
|
|
|
|
A minimal Kotlin Multiplatform personal-ledger app: login with demo
|
|
credentials, create accounts, add credits and debits. Shared UI across
|
|
Android, iOS, and Web via Compose Multiplatform. Doubles as the example
|
|
sanderling runs its property-based specs against.
|
|
|
|
## Stack
|
|
|
|
- Kotlin Multiplatform + Compose Multiplatform (shared UI)
|
|
- kotlinx.serialization for file-backed persistence
|
|
- kotlinx.coroutines for state flows
|
|
|
|
## Prerequisites
|
|
|
|
- `just`
|
|
- JDK 17
|
|
- Android SDK (auto-discovered under `$ANDROID_HOME`, `~/Library/Android/sdk`,
|
|
or the Homebrew cask)
|
|
- Xcode 16+ and `xcodegen` (`brew install xcodegen`) for iOS
|
|
|
|
## Android
|
|
|
|
```sh
|
|
just install # build + install on a booted emulator / device
|
|
just uninstall
|
|
just clean
|
|
```
|
|
|
|
## iOS
|
|
|
|
```sh
|
|
just ios # default device: iPhone 17 Pro
|
|
IOS_DEVICE="iPhone 15" just ios # pick a different simulator
|
|
```
|
|
|
|
`just ios` regenerates `iosApp/iosApp.xcodeproj` from `iosApp/project.yml`,
|
|
builds the KMP framework, links it into the SwiftUI host, installs, and
|
|
launches.
|
|
|
|
## Demo credentials
|
|
|
|
```
|
|
email: [email protected]
|
|
password: ledger123
|
|
```
|
|
|
|
## Run a sanderling test (Android)
|
|
|
|
```sh
|
|
just test
|
|
```
|
|
|
|
If no device is connected, sanderling boots the single AVD it finds. With multiple
|
|
AVDs, pick one:
|
|
|
|
```sh
|
|
AVD=Pixel_7 just test
|
|
```
|
|
|
|
Persistent settings can live in `.env` alongside the justfile:
|
|
|
|
```
|
|
AVD=Pixel_7
|
|
DURATION=5m
|
|
```
|
|
|
|
Traces land in `./sanderling/runs/<timestamp>/`.
|
|
|
|
## How it connects to sanderling
|
|
|
|
- UI elements expose state via content descriptions (`account:$id:$balance`,
|
|
`ledger_row:$id:$signed`, `ledger_balance:$cents`, `active_account:$id`,
|
|
`focused_input:$field`)
|
|
- `sanderling/spec.ts` imports `@sanderling/spec`, reads state via `s.ax.*`,
|
|
asserts properties, and weights the actions the fuzzer picks from
|
|
- `just test` invokes `sanderling test` against the installed APK
|