Skip to main content
← Back to Projects Screenshot of Rune

Rune

A private notes app that keeps everything encrypted on the device: Argon2id and XChaCha20-Poly1305 envelope encryption, on-device voice transcription through whisper.cpp, and one Flutter codebase shipped to the App Store, Google Play and the Mac App Store.

FlutterDartArgon2idXChaCha20-Poly1305whisper.cppDart FFIGitHub Actions

Rune is a notes app for people who would rather not hand their thoughts to a sync service. Everything you write is encrypted on the device with a passphrase only you know, and the app makes no network calls at all. No account, no cloud, no telemetry. It is deliberately ordinary to use, closer to Apple Notes than to a security product, because privacy tools only get used when they stop feeling like homework.

One Flutter codebase ships to iOS, Android, macOS, Windows and Linux. The app is live on the App Store, Google Play and the Mac App Store, with the full source on GitHub under GPLv3.

The codebase is split in two. All crypto, storage and note logic lives in a pure Dart package with no Flutter imports, so the security-critical code stays small, readable and testable under plain dart test with no device or emulator involved. The Flutter layer on top is only screens, state and platform glue.

Encryption is envelope-based and uses standard primitives rather than anything home-grown. Argon2id derives a key-encryption key from the passphrase, that key wraps a random data key, and every note is sealed with XChaCha20-Poly1305 before it touches disk. Changing the passphrase re-wraps one key instead of re-encrypting the vault. A wrong passphrase fails the wrapped key’s authentication tag rather than decrypting garbage, and optional Face ID, Touch ID or Windows Hello unlock caches the data key behind the platform credential store.

Voice notes are recorded and transcribed on the device through whisper.cpp over Dart FFI, with a bundled quantised model. Shipping one native library across three platforms turned out to be the awkward part: a dylib on macOS, a shared library on Android, and a force-loaded static library on iOS, where the App Store archive strip removed the exported symbols and needed its own fix before transcription worked on a store build.

Every commit runs the security tests in CI: encryption round-trips, wrong-passphrase rejection, and checks that no plaintext or secrets ever reach disk or logs. Note writes are atomic, so a crash cannot corrupt the vault, and releases carry SLSA provenance plus a cosign signature that anyone can verify against the repository.

Rune is young and not independently audited, and its threat model says so plainly. The roadmap covers encrypted attachments, metadata hardening and native crypto acceleration on mobile.