End-to-end encrypted cloud storage client for iOS, Android and macOS. Built with Flutter and Rust FFI, it connects to any self-hosted Hoodik server. Encryption and decryption happen on-device, so the server only ever stores ciphertext.
🌐 hoodik.io — Website | ☁️ Hoodik Cloud | 🖥️ Server | ⚡ Self-Hosting Guide
| Platform | Distribution |
|---|---|
| Android | Google Play or the Play-signed APK from GitHub Releases |
| iOS | App Store |
| macOS | Mac App Store |
Those listings and the Android APK attached to each GitHub release are the only places we publish builds; anything downloadable elsewhere was built by someone else and may have been modified. The release APK carries the same signature as a Play install, so either source can update the other. If you want certainty instead of trust, build from source below.
Windows and Linux are not shipped yet. The Flutter scaffolding for both is in
the tree and the app builds, but the markdown editor renders in a WebView and
webview_flutter has no Windows or Linux implementation, so notes are broken
on those platforms. Until that is solved, use the web frontend that ships with
the server.
-
Flutter >= 3.41 (stable), which provides Dart 3.11+
-
Rust >= 1.91, via rustup
-
Xcode for iOS and macOS builds
-
Android NDK + JDK 17 for Android builds, with
ANDROID_NDK_HOMEset -
The main hoodik repo cloned alongside this one, because the Rust crates are consumed through local path patches:
parent/ ├── hoodik/ # git clone https://github.com/hudikhq/hoodik.git └── hoodik-client/ # this repo
flutter pub get
flutter runThe first Rust compile takes 5-10 minutes because of transitive dependencies. After that builds are incremental.
flutter build appbundle --release # Android App Bundle (Play Store)
flutter build apk --release # Android APK
flutter build ipa --release # iOS, requires Xcode signing
flutter build macos --release # macOSDevelopment Guide covers platform-specific setup; Release Guide covers signing and store submission.
Flutter UI (Riverpod + GoRouter)
|
Core Services
(FileOperations, TransferManager, AuthService, CryptoService, OfflineManager)
|
+-----------+------------------+
| | |
Worker Rust FFI Drift
Isolates (flutter_rust_bridge) SQLite
(upload, +----------------+
download, | cryptfns crate |
decrypt) | transfer crate |
+----------------+
| Technology | Purpose |
|---|---|
| Flutter 3.41+ / Dart 3.11+ | UI framework |
| Riverpod | State management |
| GoRouter | Routing and navigation |
| flutter_rust_bridge v2.11.1 | Rust FFI bindings |
| Drift | Local SQLite database |
| Dio | HTTP client, one cookie jar per account |
The app calls the same crates the web frontend compiles to WASM, so a crypto or transfer fix lands in every client at once:
cryptfns-- Ed25519, hybrid X25519 + ML-KEM-768 wrapping, RSA-2048 (legacy), AEGIS-128L/AEGIS-256, Ascon-128a, ChaCha20-Poly1305, OPAQUE, BERT tokenizer, hashingtransfer-- chunked upload/download with concurrent I/O, encryption, checksums
Path patches in rust/.cargo/config.toml point at ../../hoodik/cryptfns and
../../hoodik/transfer.
- Multi-server and multi-account
- OPAQUE login, so the password itself never crosses the wire, plus signature login and 2FA
- PIN quick unlock and biometric unlock (Face ID / Touch ID)
- Chunked encrypted upload with CRC-16 integrity, concurrent encrypted download
- Three background isolates (upload, download, decrypt) keep crypto off the main thread
- File preview for images with gallery swipe, video, PDF and text
- Encrypted thumbnails, generated and decrypted on-device
- Markdown notes with an editor and version history
- Account-to-account sharing and share groups
- Public link management
- Search that tokenizes on-device with BERT and sends only SHA-256 hashes
- Offline caching with LRU eviction (8 GB default, pinned files exempt, not on app exit) and pin/unpin, plus a pending upload queue
- Embedded MCP server on desktop, giving local AI agents access to your storage without the server ever seeing plaintext (see MCP.md)
- Admin panel for users, invitations and server settings
- Localized in English, French, German and Croatian
- Material 3 on Android, Cupertino on iOS, dark and light themes
flutter test # host-VM suite
flutter analyze # static analysis
dart format . # formatting
just release-check # the full gate used before tagging a releaseSee the Testing Guide.
| Workflow | Trigger | What it does |
|---|---|---|
| CI | Push/PR to main |
format, analyze, invariants, unit tests, iOS build verify |
| Release Android | Tag v* |
build the App Bundle, upload to Play, attach the Play-signed APK to the release |
| Release Apple | Tag v* |
build and upload iOS and macOS to App Store Connect |
| Version verify | Push/PR | pubspec version and build number must move together |
See the CI/CD Guide.
| Document | Description |
|---|---|
| Architecture | Tech stack, state management, directory structure |
| Security | Encryption model, crypto primitives, private key handling |
| Development | Dev setup, building, linting, env config |
| Testing | Test layout and conventions |
| Release Guide | Signing, certificates, store submission |
| CI/CD | Workflows, Fastlane, required secrets |
| Compat Testing | Backwards-compat gate against older servers |
| MCP | The embedded MCP server for AI assistants |
All encryption and decryption is client-side. The server never receives plaintext file content, file names, thumbnails, search terms, or keys. If a change appears to need server-side plaintext, it is the change that is wrong.
Report vulnerabilities to security@hudik.eu rather than opening a public issue. See SECURITY.md for what is in scope and the disclosure guidelines, and docs/security.md for the full model.
Patches are welcome. Read docs/development.md to get set
up, and keep flutter analyze, dart format and flutter test clean before
opening a pull request.
First-time contributors are asked to sign the Contributor License Agreement. A bot comments on your pull request with the sentence to reply with. You sign once and it covers everything you send afterwards. You keep the copyright in your own work.
CC BY-NC 4.0 — free for personal and non-commercial use. For commercial licensing, contact hello@hudik.eu.
Third-party software included in the app is listed in THIRD-PARTY.md, and the full license text of every dependency is available in the app under Account → Open source licenses.
Created and maintained by Tibor Hudik.
Community patches are welcome and appreciated. Everyone who has sent one is listed in the contributors graph.