- EmailRepository: add searchEmails(accountId, mailboxPath, query)
- EmailRepositoryImpl: UID SEARCH with OR SUBJECT/TEXT criteria,
fetch ENVELOPE+FLAGS for matching UIDs
- EmailListScreen: toggle search bar in AppBar; submit triggers server
search; results replace the stream list; ESC/back closes search
- Refactored list into _buildList() shared by stream and search views
- README/PLAN.md updated
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- email_detail: add Move-to-folder button (bottom-sheet mailbox picker,
excludes current folder, calls moveEmail on server)
- email_list: show amber star for flagged, paperclip for attachments
in trailing area alongside date
- PLAN.md: mark phase 8 done
- README: add flag/move/attachment to working features
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 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>
- flake.nix: Flutter 3.41.6, Android SDK, Stalwart, GTK3/build
tools for Linux desktop, go-task
- .envrc: copied from sharedinbox — use flake + dotenv_if_exists
- Taskfile.yml: analyze, test, integration, codegen, run tasks
- stalwart-dev/: IMAP+SMTP dev server reused from sharedinbox
- test/integration/imap_sync_test.dart: login, list mailboxes,
send via SMTP and receive via IMAP
- pubspec.yaml: add flutter_secure_storage
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
IMAP/SMTP email client with offline-first architecture:
sync engine writes to Drift (SQLite), UI reads reactively
from the local DB. enough_mail vendored under packages/.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>