A premium, local-first, markdown-based note-taking application designed for absolute privacy, performance, and flexibility. NodaNotes implements an offline-first WebDAV synchronization engine, robust flat-file history versioning, and secure vault encryption, built with a shared Rust Core powering a Native Kotlin Android App and a Tauri Desktop Client.
NodaNotes is built on a Rust-First, UI-Second philosophy. The core business logic is entirely isolated in Rust, making the client apps thin, performant, and visual-only layers ("dumb monitors").
graph TD
subgraph Client Shells [User Interface & Presentation]
A["Kotlin Android App (Jetpack Compose)"]
C["macOS/Desktop App (Tauri + SvelteKit)"]
end
subgraph Bridges [Binding Layers]
B["crates/android-bridge (JNI Glue)"]
D["crates/tauri-shell (Tauri Commands)"]
end
subgraph Core [Shared Business Logic]
E["crates/core (Rust Core Engine)"]
end
subgraph Data [Storage & State]
F[("SQLite Cache (FTS5 Index)")]
G["Local Vault (.md Files + Frontmatter)"]
H["WebDAV Cloud Storage"]
end
A -- "JNI Calls" --> B
C -- "IPC Commands" --> D
B --> E
D --> E
E --> F
E --> G
E -- "Zero-Byte Marker Sync" --> H
- All notes are saved directly as raw
.mdfiles in a standard directory structure. - Metadata (ULID IDs, title, created/updated timestamps, tags, pin status, and colors) is stored inside the note using YAML frontmatter.
- SQLite is strictly utilized as a cache and full-text index. If deleted, the cache automatically rebuilds from disk on startup in under 2 seconds.
- Employs a custom WebDAV sync engine written in Rust.
- Utilizes the Zero-Byte Marker Protocol inside
.noda/sync/to isolate self-sync footprints and prevent infinite loop conflicts common in WebDAV endpoints (e.g. InfiniCloud). - Audits remote changes and determines synchronization updates in 0.1 seconds on empty-run cycles.
- Implements an independent version history saved as flat
.mdfiles under.noda/history/. - Compares proposed snapshots against current file hashes to suppress duplicate entries and eliminate database bloat.
- Supports flexible and mandatory update matrices.
- Shares the same Rust core on mobile via a high-performance JNI bridge.
- Employs runtime CPU architecture detection (
Build.SUPPORTED_ABIS) and a 4-tier asset matcher to download, verify, and execute the correct architecture-specific update package seamlessly.
- Embeds a local MCP HTTP-POST & SSE server directly into the daemon (
:4040) for secure, token-gated AI context integrations. - Exposes 5 core tools to let AI coding assistants (like Antigravity) safely search, read, write, edit, and trash notes with strict sandboxing and automatic snapshot backups.
- Rustup (targets:
aarch64-linux-androidfor mobile, native host for desktop) - Android SDK & NDK (for mobile JNI compiler)
- Node.js & Bun (for SvelteKit landing page & Tauri building)
To compile the core library and run cargo tests:
# Test core functionalities
cargo test --manifest-path crates/core/Cargo.tomlCompile the Rust JNI library and launch the debug package on your connected device:
cd android
# Set JAVA_HOME and install to debug device
JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home" ./gradlew installDebugTo run the SvelteKit-powered desktop app in development mode:
# Start tauri development server
npm run tauri devThis project is licensed under the MIT License - see the LICENSE file for details.











