- Swift 55%
- Kotlin 26%
- Shell 9%
- 9%
- Ruby <1%
- 1 more language <1%
Livtet — Mobile #
Native Android and iOS clients for Livtet, a personal library manager. The mobile apps are graphical shells over a shared Rust core that also powers the Tauri desktop application with additional support for interacting with the hosted Bibliograph AppView for ATProto support.
This repository hosts only the mobile clients and the build glue that
ties them to the shared core - vendored here as the core/ git submodule.
What is here #
| Path | Contents |
|---|---|
android/ |
Native Android app (Kotlin + Jetpack Compose, package net.olamaelcu.livtet) |
ios/ |
Native iOS app (SwiftUI + UniFFI, bundle net.olamaelcu.livtet) |
core/ |
Git submodule — Rust workspace with the shared domain, search, sync, FFI, and plugin crates |
fastlane/ |
Store metadata, screenshots, and Fastlane lanes for both platforms |
scripts/ |
Standalone shell helpers invoked by the mise.toml task graph |
.mise.toml |
Cross-platform toolchain declaration (Rust, Java/Kotlin/Gradle, Xcode, SOPS, …) |
The Android and iOS clients are separate products that share the
Livtet brand name. They are not Tauri targets. Tauri configuration
(.browserslistrc, tauri.conf.json, web bundler output) is not
present in this repository and is irrelevant to the mobile builds.
Architecture #
+-----------------------+ +-----------------------+
| Android (Kotlin / | | iOS (SwiftUI / |
| Jetpack Compose) | | Swift) |
+----------+------------+ +-----------+-----------+
| UniFFI-generated Kotlin | UniFFI-generated Swift
| bindings (Bridge.kt) | bindings (LivtetKit)
v v
+----------------------+----------------------+
| core/livtet-ffi | UniFFI surface (Android, iOS)
+----------------------+----------------------+
| core/livtet-core | Unison crate (data + covers + search + types)
+----------------------+----------------------+
| core/livtet-data | SeaORM entities, services, SQLite access
+----------------------+----------------------+
| core/livtet-{types,search,sync,covers,plugins,plugins-lua,backup,cli,…}
+----------------------------------+----------------------------------+
| shared SQLite (livtet.dat / livtet.db)
Both clients compile a curated subset of livtet-core into a static
library or xcframework through core/livtet-ffi, then call into
it through UniFFI bindings generated by uniffi-bindgen. The bindings
are build artifacts — see GETTING_STARTED.md
for the regeneration flow and the platform-specific AGENTS.md for the
rules around them.
Status #
Early development. Current published versions:
- Android:
versionName 0.1.1,versionCode 2,applicationId net.olamaelcu.livtet. Three product flavors —playstore,fdroid,generic. - iOS: targets iOS 17+, bundle identifier
net.olamaelcu.livtet. The product name and every path component that contains it is the 6-letter formLivtet(see ios/AGENTS.md).
Both apps share a common end-user surface today (Dashboard, Library, Add Book wizard on Android; Add Book wizard is "ships in a follow-up" on iOS). See the per-platform READMEs for what is and is not wired up.
Quick start #
git clone <repo-url> livtet-mobile
cd livtet-mobile
git submodule update --init --recursive
direnv allow # or: mise trust && mise install
direnv allow (or mise install) provisions the full toolchain
declared in .mise.toml — Rust, Java + Gradle + Android SDK + NDK,
XcodeGen + CocoaPods + SwiftLint, SOPS, and the helpers used by the
Mise task graph.
From there, pick your platform:
- Android — see android/README.md and
mise run android-dev-init, thenmise run android-build/apk(alias for the emulator + build + install union task). - iOS (macOS only) — see ios/README.md and
mise run ios-dev-init, thenmise run ios-build/ios-run-simulator. - Rust core —
cd core && cargo test. The mobile clients do not call into the core directly; they consume it throughlivtet-ffi.
A longer walk-through lives in GETTING_STARTED.md.
Contributing #
Bug reports, patches, and design proposals are welcome. Read
CONTRIBUTING.md before opening a pull request — it
covers the worktree workflow, the DCO signoff convention, the
per-platform rules of engagement, and how FFI changes are expected to
flow through core/ and the regenerated bindings.
Each platform has its own agent / contributor notes:
License #
Source code in this repository is licensed under the Mozilla Public License, v. 2.0. Copyright (c) 2026 Jacky Alcine yo@jacky.wtf.