- compose_screen: show From dropdown when >1 account, auto-select first account when none pre-selected (fixes silent failure on new mail) - email_detail_screen: add flag/unflag star button with amber highlight - PLAN.md: collapse completed phases, list remaining UI gaps - README: fix stale "vendored" package reference, update platform table, add Working Features section Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1.5 KiB
1.5 KiB
SharedInbox Flutter — Plan
Architecture
IMAP/SMTP server
↓
AccountSyncManager (IMAP IDLE per account)
↓ writes
Drift (SQLite, local DB)
↓ reads
UI (Riverpod + go_router)
UI never touches the network. The sync layer runs independently.
Phases
| Phase | Scope | Status |
|---|---|---|
| 0 — Scaffold | pubspec, Drift schema, DI, router, enough_mail from pub.dev | Done |
| 1 — Core models | Account, Mailbox, Email, EmailBody, repository interfaces |
Done |
| 2 — DB layer | Drift tables, AccountRepositoryImpl, MailboxRepositoryImpl, EmailRepositoryImpl |
Done |
| 3 — IMAP sync | connectImap, MailboxRepositoryImpl.syncMailboxes, EmailRepositoryImpl.syncEmails |
Done |
| 4 — IMAP IDLE | AccountSyncManager with exponential-backoff reconnect |
Done |
| 5 — SMTP send | connectSmtp, EmailRepositoryImpl.sendEmail |
Done |
| 6 — UI | AccountList, AddAccount, MailboxList, EmailList, EmailDetail, Compose, Settings | Done |
| 7 — Dev tooling | Nix flake, Taskfile, Stalwart dev server, unit + integration tests, CI, pre-commit | Done |
| 8 — UI gaps | Account picker in compose, flag button, move-to-trash | In progress |
Next candidates
- Account picker in compose screen (currently broken for new mail with >1 account)
- Flag / star button in email detail
- Move to trash from email detail
- Search (IMAP
SEARCHcommand) - Thread view (group by
References/In-Reply-To) - Attachment download + open
- Draft auto-save