A private, offline-first calendar with optional end-to-end encrypted sync over Nostr.
Astraea keeps the network optional. Events, recurrences, reminders, calendar views, widgets, imports and exports work locally without an account. Users who want multi-device synchronization can connect a Nostr identity and explicitly choose the relays that will store their encrypted calendar.
Calendar contents are NIP-44 self-encrypted before publication. Relay operators can observe protocol metadata such as the public key, IP address, timestamps and event sizes, but cannot read event titles, descriptions, locations or reminder details.
- Offline-first calendar with month, week, day and upcoming-list views.
- Recurring events with daily, weekly, monthly and yearly presets.
- Local reminders scheduled by the operating system, including recurring occurrences and reboot restoration on Android.
- Optional Nostr sync using encrypted kind
30078parameterized-replaceable events and NIP-09 deletion requests. - Flexible identity through an imported key, a locally generated account or the Amber NIP-55 external signer on Android.
- Explicit relay choice during onboarding and in Settings.
nos.lolandrelay.damus.ioare suggestions, not mandatory infrastructure. - Personal relay support as an additional backup destination.
- Encrypted exports using PBKDF2-HMAC-SHA256 and AES-256-GCM, alongside
standard unencrypted iCalendar (
.ics) import/export. - Android home-screen widgets for daily, weekly and monthly agendas.
- Timezone-aware storage: instants are stored in UTC and rendered in the selected or device timezone.
- Light and dark themes, with dark mode as the privacy-oriented default.
- Every mutation is written to the local Hive store first.
- When sync is enabled, the event JSON is encrypted to the user's own Nostr identity with NIP-44.
- Astraea signs and publishes a kind
30078event under a stabledtag. - Each configured relay must acknowledge the publication before the local version is marked as synchronized.
- Pulls verify the NIP-01 event ID and Schnorr signature, decrypt valid events,
then merge them using the latest
updatedAttimestamp. - Deletions publish both an encrypted tombstone and a NIP-09 request so other devices can learn the deletion even when a relay ignores retractions.
No Astraea server, account service or analytics backend sits in this path.
| Platform | Status | Notes |
|---|---|---|
| Android | Supported | Primary audited target; Amber and home-screen widgets available. |
| Web | Experimental | Builds are scaffolded, but sensitive production use needs a browser/CSP review. |
| iOS | Not configured | Platform project and release hardening are not included yet. |
| Desktop | Not configured | No packaged desktop targets yet. |
- Flutter stable with Dart
3.12.2or newer - JDK 17
- Android SDK 36 for Android builds
- A configured device or emulator
Check the local toolchain, install locked dependencies and run Astraea:
flutter doctor
flutter pub get --enforce-lockfile
flutter rundart format --output=none --set-exit-if-changed lib test
bash tool/check_repository_hygiene.sh
flutter analyze
flutter test
flutter build apk --debugThe test suite covers NIP-44 official vectors, iCalendar round trips, recurrence expansion, relay settings and the first-launch onboarding flow.
lib/
models/ Calendar, account, profile and settings data
providers/ Riverpod state and application orchestration
screens/ Calendar, editor, onboarding and settings UI
services/ Storage, Nostr, sync, notifications, widgets and exports
utils/ NIP-44, recurrence, iCalendar, formatting and validation
android/ Android host app and native home-screen widgets
test/ Unit, crypto-vector and widget tests
web/ Experimental Flutter web shell
docs/ Architecture, release notes and security audit
Release builds intentionally fail unless a dedicated keystore is configured; the project never falls back to Android's debug signing identity. See Releasing for the complete checklist.
Never commit android/key.properties, a keystore, private Nostr keys, service
credentials or local environment files. The repository ignore rules cover the
common variants, but release operators remain responsible for reviewing every
staged change.
Bug reports and focused pull requests are welcome. Please read CONTRIBUTING.md and run the full quality checks before opening a pull request. Security vulnerabilities must follow the private process in SECURITY.md, not a public issue.
Astraea is part of the Echoes ecosystem and is built on open protocols and
open-source projects including Flutter, Nostr, Riverpod, Hive, Amber and
dart_nostr.
Copyright holders license Astraea under the GNU General Public License v3.0 or later.