Local Redaction
Qumio strips PII from email data using a local model before formatting it. One agent handles fetch, redaction, and categorization on-device.

Qumio reads your Gmail and categorizes it. That means email metadata (sender names, subject lines, snippets) goes through a language model. The whole stack runs locally on Ollama, but I still wanted PII stripped from the data before it got processed and stored anywhere.
The research phase explored a few options. Regex for structured patterns, NER libraries like GLiNER, Microsoft's Presidio framework. The recommended approach was a hybrid: regex first, then a small local model for names and organizations.
What actually got built was simpler. A single local agent (qwen3.5:27b running on Ollama) handles the entire pipeline. It fetches the emails, redacts PII with typed placeholders, categorizes everything into an executive briefing format, and returns the finished result to Telegram.
The redaction instructions in the skill prompt look like this:
Replace personal names with [PERSON]
Replace email local parts with [EMAIL] but KEEP domain
Replace phone numbers with [PHONE]
Replace addresses with [ADDRESS]
The domain stays because it helps with categorization. Is this from a bank? A newsletter? But names and addresses are gone before anything gets saved or displayed.
Why one agent
The original plan had a small model (qwen3:1.7b) doing just redaction as a separate step. In practice, it wasn't reliable enough for tool calling. Scaling up to qwen3.5:27b meant it could handle redaction and categorization in one pass. Simpler architecture, fewer handoffs.
It's not deterministic the way regex would be. An unusual name format might slip through. But for a personal tool running on my own hardware, one capable local model doing everything turned out to be the easier path.