The project
VizMail is a desktop email client built with MAUI .NET 10. The initial goal was straightforward: a local mail client that reads the inbox, displays threads, manages labels. The goal that emerged along the way was more interesting: expose everything via an HTTP API so that AI agents can read and process emails without going through a browser.
Without an API, an agent is blind: it can't read incoming mail, archive, reply, or trigger any action. With a clean API, an agent can do all of that programmatically — and an app like Lain can orchestrate these flows without human intervention.
Stack
- UI: MAUI .NET 10 (native Windows desktop)
- Database: SQLite via EF Core (messages, threads, labels, sync state)
- Email protocols: IMAP (MailKit) + Outlook via Microsoft Graph API
- HTTP API: .NET HttpListener embedded in the MAUI process, documented via a Markdown skill served by the API itself
- Tests: xUnit, 659 tests covering services, handlers, and API endpoints
Features
38 features shipped, organized across eight domains:
Reading and navigation
- Unified inbox with pagination and sorting
- Thread view (grouped conversations) with bulk actions
- Full-text search with relevance scoring and combinable filters
- Real-time navigation context (
/api/context) - Similar email detection (recurring pattern identification)
Message management
- Mark read/unread — individual and bulk (up to 500)
- Archive and permanently delete — individual and bulk
- Custom labels: add, remove, global rename, global delete
- Attachments: list, download, automatic backfill
- Star, mark important, mark priority — individual and bulk
- Snooze with automatic wake-up — individual and bulk
- Agent tracking (processed/unprocessed) — individual and bulk
Compose and send
- Compose a new email (multi-account)
- Reply to an email (simple reply and reply-all)
- Forward an email
- Compose drafts: save and send later
- Reply drafts: save, send, AI generation (individual and bulk)
- Sent folder with search and filters
Semantic bubbles
- Bubble creation and management (CRUD)
- AI-powered automatic email classification into bubbles
- Manual bubble override — per email, per thread, bulk
- Incremental or forced reclassification with real-time progress
Unsubscribe and cleanup
- Newsletter unsubscription (follows unsubscribe link) — individual and bulk
- Exchange bogus email cleanup
Analytics and statistics
- Global statistics (total, unread, starred, top senders, by domain)
- Email activity timeline (day or week granularity)
- Contact book derived from received emails
- Sender aggregation
HTTP API for AI agents
- Full REST endpoints covering all operations
- Local token authentication (no external OAuth to configure)
- Markdown documentation auto-served by the API (
/api/skill), always in sync - Structured JSON responses designed to be consumed by an agent without fragile parsing
- Health and sync diagnostics (
/api/health,/api/imap_debug)
Synchronization
- Incremental IMAP sync (IDLE + polling fallback)
- Outlook sync via Microsoft Graph (delta queries)
- Conflict handling and offline local state
- Blocking manual sync and non-blocking trigger
- Multi-account support (filter by account, send from account)
Development method
VizMail was built entirely through agent-driven development with KittyClaw as the orchestrator. Each feature was a ticket assigned to a programmer agent. The agent wrote the code, a qa-tester agent verified it, a committer agent pushed it. No code was written by hand.
This approach delivered 38 features with 659 tests and 0 regressions — with no cascade debugging days, because every change was tested before being committed.
The full retrospective on building the HTTP API is available in How I Built the VizMail API with AI Agents.
Results
| Metric | Value |
|---|---|
| Features shipped | 38 |
| Automated tests | 659 |
| Regressions | 0 |
| Status | In active use ✓ |
What this demonstrates
VizMail isn't a "learn MAUI" project. It's proof that agent-driven development works on a complex business domain (mail, synchronization, network protocols) with strong quality constraints (0 regressions, 659 tests). The HTTP API wasn't in the original spec — it emerged because the tooling (KittyClaw + agents) made adding it frictionless. Semantic bubbles, AI-assisted drafting, and analytics followed the same path.

