A minimalist task management app built on the Nostr protocol.
Meiso (瞑想) is a simple, privacy-focused task management app inspired by TeuxDeux's clean design. Built on the Nostr protocol with end-to-end NIP-44 encryption, your tasks are synced across devices without any central server.
- Three-Column Layout: Today / Tomorrow / Someday organization
- Subtasks: Parent-child task relationships with inline editing
- Recurring Tasks: Daily, weekly, monthly, yearly patterns with flexible intervals
- Personal Lists: Create custom lists to organize tasks by category
- Image Attachments: Blossom / NIP-96 image upload with server picker
- Hide Completed Tasks: Declutter your view with a single toggle
- Nostr Sync: Multi-device synchronization via Nostr relays
- Privacy First: NIP-44 end-to-end encryption for all tasks
- Amber Integration: Secure key management with Amber signer support
- NIP-89 Client Tag: Identify events published by Meiso (opt-out in Settings)
- Relay User-Agent: WebSocket handshake includes
meiso/<version>for relay analytics - Dark Mode: Easy on the eyes day and night
- Multi-Language: English, Japanese, Spanish support
- Drag & Drop: Intuitive task reordering with drag handle
- Pull to Refresh: Quick sync with a simple gesture
- Go CUI: Terminal-based task management with bidirectional Nostr sync
Download Meiso from Zapstore - the Nostr-native app store.
# Clone the repository
git clone https://github.com/higedamc/meiso.git
cd meiso
# Install dependencies
fvm flutter pub get
# Build for Android (production flavor)
./generate.sh
fvm flutter build apk --flavor production --release- Frontend: Flutter 3.x with Riverpod state management
- Backend Logic: Rust with flutter_rust_bridge
- Protocol: Nostr (NIP-44 encryption, Kind 30001 for tasks, Kind 30078 for settings)
- Storage: Local-first with Hive, synced via Nostr relays
- Architecture: Feature-based Clean Architecture
- CUI: Go (terminal companion app with Nostr sync)
Shared lists use the shared-v1 scheme: each list gets its own Nostr keypair
G, shared out-of-band with every member. Tasks are addressable Nostr
events signed by G, with content self-encrypted to G via NIP-44 v2.
Adding a member just means handing them nsec_G. Removing a member does
not currently revoke access — there is no key rotation on removal, so a
removed member who already has nsec_G keeps the ability to decrypt the
list. Event authenticity is guaranteed by Nostr's Schnorr signatures, but
only proves "signed by someone holding nsec_G," not a specific member.
→ Full design doc: docs/COLLABORATIVE_LISTS_ENCRYPTION.md
- Development Roadmap - Upcoming features and MLS group lists
- Clean Architecture Guide - Architecture details
- Release Guide - How to publish to Zapstore (Japanese)
- Go CUI MVP Spec - macOS supplemental CUI scope and auth model
- Go CUI Operation Guide - build, E2E flow, and future TUI reuse strategy
Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the MIT License.
Kohei Otani
Nostr: npub16lrdq99ng2q4hg5ufre5f8j0qpealp8544vq4ctn2wqyrf4tk6uqn8mfeq
Powered by Nostr


