---
title: "VizMail"
description: "Desktop MAUI .NET email client with HTTP API for AI agents — 34 features, 131 tests."
created: 2026-05-05T10:00:00+02:00
updated: 2026-05-13T18:46:00+02:00
tags: ["MAUI", ".NET", "Email", "API", "AI"]
url: ""
icon: "/images/icons/icon-envelope.svg"
image: "/images/projects/vizmail-cover.webp"
card: "/images/projects/vizmail-card.webp"
---

## 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](/projects/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, 131 tests covering services, handlers, and API endpoints

## Features

34 features shipped, organized across four domains:

**Reading and navigation**
- Unified inbox with pagination
- Thread view (grouped conversations)
- Full-text search across messages
- Filters by label, read/unread status, sender

**Message management**
- Mark read/unread (individual and bulk)
- Archive, delete, move
- Custom labels + system labels (inbox, sent, archive, trash)
- Attachment handling (list + download)

**HTTP API for AI agents**
- Full REST endpoints covering all operations above
- Local token authentication (no external OAuth to configure)
- Markdown documentation auto-served by the API (`/api/skill`), always in sync with the server
- Structured JSON responses designed to be consumed by an agent without fragile parsing

**Synchronization**
- Incremental IMAP sync (IDLE + polling fallback)
- Outlook sync via Microsoft Graph (delta queries)
- Conflict handling and offline local state

## Development method

VizMail was built entirely through **agent-driven development** with [KittyClaw](/projects/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 34 features with 131 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](/blog/vizmail-api-retex).

## Results

| Metric | Value |
|---|---|
| Features shipped | 34 |
| Automated tests | 131 |
| Regressions | 0 |
| Status | Shipped ✓ |

## 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, 131 tests). The HTTP API wasn't in the original spec — it emerged because the tooling (KittyClaw + agents) made adding it frictionless.
