English | 中文
Local-first Markdown memos on Android — no cloud lock-in.
Menu · Home · Detail
- Local plain text — memos are standard Markdown files
- Voice recording — capture thoughts hands-free
- Home screen widgets — quick capture and recent notes
- Tags — organize with
#tags, including nested tags like#tag1/tag2 - Full-text search — indexed local search
- Material 3 — clean UI with dynamic color
- Heatmap — GitHub-style contribution graph for writing habits
- Daily review — flashback to this day in previous years
- S3 backup (recommended) — object storage with end-to-end encryption
- Git / WebDAV — optional built-in backup paths
- LAN sharing — share notes to other Lomo devices on the local network
Notes live entirely on your device. Pick one path:
- S3 (recommended) — the only built-in option with end-to-end encryption; what the author uses day to day, and the most actively maintained
- Any file sync — Syncthing, Nextcloud, or anything else that syncs the local folder
- Git / WebDAV — built-in backups (WebDAV has mainly been tested with Nutstore)
Obsidian / Rclone notes
Lomo’s S3 sync is compatible with the Obsidian Remotely Save plugin. That plugin has not been actively maintained for a long time, so for Android-to-Android syncing it is better to point Lomo’s S3 sync at the root of your Obsidian vault. Custom folder sync is supported; on Linux, Rclone is usually the better desktop companion.
I wanted a Memos / Flomo-style lightweight, timestamped capture flow — but strictly offline, with local Markdown as the single source of truth. The name is Local Memo. Lomo is fully compatible with Thino daily-note format, so you can treat it as a native Android client for Thino data.
Maintenance & development notes
Maintenance: Lomo is tailored to my own workflow and I use it heavily. As long as it stays in my daily toolchain, I plan to keep maintaining it.
Development: This project was built almost entirely with Google Antigravity and Codex. If you have concerns about AI-generated code stability, feel free to fork and adapt it.
- Download the latest APK from Releases
- Install on an Android device (Min SDK 26)
- On first launch, choose a local folder for your memos
Building from source is covered under Building below.
If Lomo is useful to you, you can support the project here: Sponsor page.
Tech stack
- Languages: Kotlin + Rust (production native infrastructure through BoltFFI/JNI; stage-0 UniFFI/JNA remains historical evidence only)
- UI: Jetpack Compose (Material 3)
- Architecture: MVVM + Clean Architecture (Domain / Data / UI)
- DI: Koin
- Async: Coroutines & Flow
- Data:
- Markdown workspace storage through the Storage Access Framework
- Rust-owned SQLite derived index and durable
.lomostate
Building
Prerequisites: JDK 26 · Android SDK API 37 · Rustup · just
# Install pinned Rust tools, targets, and Android NDK
just bootstrap
# Build and validate Debug APK
just android debug
# Run Rust and Kotlin host tests
just test
# Iterative / full pre-merge gates
just check
just cinative-bindings/src and native .so files are generated build outputs; a clean checkout is the
expected input. Signed release builds use just android release and require explicit keystore
configuration documented in quality/release.md.
Production FFI identity is native-bindings / com.lomo.nativebridge / liblomo_native_jni.so.
Current contracts live in fixtures/contracts/; executable baselines live in fixtures/baselines/.
Android Studio may still be used for editing and device work, but repository verification and native generation must use the commands above.
This project is licensed under the GNU General Public License v3.0.



