Skip to content

Triage

The Triage page is the "things to look at" hub — it has two tabs:

  • Gmail — pending findings from a Gmail inbox scan. You accept or dismiss each one.
  • Email-in — documents that arrived by forwarding to your private Maud address (forward+<token>@inbound.heymaud.com). These are already auto-filed in the topic and house the AI picked — the tab is a Review surface where you spot-check and confirm.

A red badge next to Triage in the nav sums both tabs; whichever tab has work shows its own count chip on the tab header.

The rest of this page explains the Gmail tab in detail (the older, larger workflow). The Email-in tab works by the same "one click per item" rhythm: each row has a Confirm ✓ button (saves it as reviewed and drops it off the tab) and an Edit link (opens the standard per-document edit screen if the AI got the topic or house wrong). There's no time-out — items sit there indefinitely until you act.

Gmail Triage

Most UK property documents arrive by email. Connecting Gmail lets Maud find what's already there and surface it for review — without you having to forward, save, or re-upload anything.

What we read, and what we don't

The OAuth scope is read-only access to messages with attachments. We never:

  • Send mail from your account.
  • Modify, label, archive, or delete anything in your inbox.
  • Read messages that have no attachments.
  • Look at messages older than the scan window — the first scan covers the last ~180 days (capped at 100 messages); ongoing scans only look at mail since the previous scan ran.

When you connect Gmail, what we keep server-side is your OAuth refresh token (encrypted at rest with Fernet AES-128 + HMAC) and the metadata of the candidate documents we surface — sender, subject, date, attachment filename. The original PDF/image bytes stay in Gmail until you accept a finding; at that point we download the attachment onto your filed Document so you can view and re-download it from Maud without going back to Gmail. Findings you dismiss are never downloaded.

You can disconnect at any time from the dashboard's Get documents in panel. Existing triage items stay; new scans stop.

Multiple members, multiple inboxes

A household can have several members, and each member's Gmail connection is independent. When a partner is invited to a household, the dashboard shows the Connect Gmail tile to them even if you (the owner) have already connected — clicking it links their inbox to the same shared triage queue.

Findings from every connected inbox land in the same household triage page. Either of you can accept or dismiss anything in there. Disconnecting only removes your own Gmail link; your partner's stays connected and continues to surface findings.

How a scan works

Once connected, Maud runs a background scan immediately. The pipeline is:

  1. Fetch the most recent ~100 messages with attachments.
  2. Heuristic pre-filter — score each attachment against the fingerprint of every document type Maud knows (~100 types: council tax bills, P60s, MOT certificates, NHS letters…) plus your household's own context tokens. The context is derived automatically from what you've registered — house names and postcodes, vehicle names and registration plates, family names — so adding a vehicle makes the very next scan recognise emails about its plate. Inline images are skipped; duplicates are collapsed (same Gmail thread, same file bytes, same recurring sender + subject); and anything you've dismissed twice before is dropped silently (see Learned suppression below).
  3. Classify the survivors with Claude — the same model that processes uploads. Claude sees the email subject + sender + body snippet, your registered houses/vehicles/people, and text read out of the attachment itself. It assigns one of the nine Maud topics — so medical letters, payslips and passports surface alongside property docs — or decides the email isn't a personal record at all, in which case it never reaches your queue.
  4. Bucket by lifecycle state and confidence.

Which attachments Maud looks at

PDFs, images, Word documents and Excel spreadsheets. Word and Excel matter more than you'd think: solicitors send engagement letters as .docx, schools send reports as Word, accountants send fee schedules as spreadsheets. Maud reads the text out of them the same way it reads a PDF — locally, before anything is sent to the AI.

Older .doc and .xls files (the pre-2007 formats) still surface as candidates, but Maud can't read their contents; it classifies them from the filename and the email around them instead.

You'll usually see 10–40 candidates from a year of typical UK family email. Some will be obvious wins (signed insurance schedules, council letters, HMRC). Some will be in-progress drafts that aren't ready to file. Some will be noise.

The four buckets

The Triage page groups findings by lifecycle state:

  • Signed and final — DocuSigned contracts, completed letters, any document where the prompt is sure it's the final version. Sweepable in one click via Accept all.
  • Needs your eye — anything ambiguous. Click each row to review the email + attachment side by side, then accept or dismiss.
  • Drafts — interim or unsigned versions, often superseded by something later in the same thread.
  • Low signal — auto-flagged junk (image001 inline images that slipped through, marketing newsletters, irrelevant attachments). Hidden by default; expand if you want to verify nothing important is in there. A Dismiss all button at the top of the bucket clears the whole pile in one click once you've sanity-checked the contents.

The scan-time heuristic also rejects phone-camera attachments outright — IMG_NNNN.* filenames and oversized bare image/heic / image/jpeg files never become candidates, so they don't even reach the low-signal bucket.

Accepting

Each accept files the document — the same flow as if you'd uploaded it directly.

The review screen shows a "Filed under" person chip — whose records this document lands in, switchable to any household member from its dropdown. When the AI's guess matches someone you've registered (a school report mentioning Marcus), the chip pre-selects them with a ✨ so you notice the steer before accepting. If the AI names someone you haven't registered, the hint is actionable in place: one click adds them as a person (pick child / partner / parent / other relative) and the chip selects them — then accept as normal. The one-click accept button never guesses — without an explicit choice, documents file under you. The classifier's proposed metadata becomes the default; click into the row to edit before confirming if anything looks off.

The review screen also has a tag picker with the same suggestions you'd see on the confirm form — ✨ chips for the AI's per-document proposals only; your existing tags stay in the input's autocomplete rather than appearing as chips just because they exist. Pick or type tags before clicking Save and keep — they're applied to the resulting Document on creation, no follow-up step.

If a document has a proposed_named_item (e.g. "16 High Street"), it auto-files against that property when you accept. Otherwise it lands in the Home topic's Unassigned block and the dashboard prompts you to auto-file or move manually.

Dismissing

Dismissed items stay marked dismissed forever — re-running the scan won't re-surface them. The Gmail message itself is untouched.

Learned suppression

Dismissing also teaches the scan. Each dismissal records a fingerprint of the email (sender domain, subject, attachment). Dismiss the same kind of email twice and future scans drop it silently — it never appears in your queue again, and we never pay the AI to look at it again. One accidental dismissal never blacklists a sender; it takes two.

Everything being auto-suppressed is listed at Triage → Auto-suppressed senders (/triage/suppression/), each rule with a Revoke button. Revoke a rule and matching emails surface again on the next scan.

Re-running

Maud re-scans your inbox automatically once a week. You don't have to do anything — when there's something new, the Triage badge in the nav bumps up and you'll find it next time you open the app.

If you can't wait for the weekly run, hit the Scan inbox now link on the right of the Triage page's banner. The banner flips to "Scanning your inbox…" with a small "(N s elapsed)" counter so you can see it's working — most scans finish in well under a minute. When it's done, the banner shows what came back: "Just scanned. Found 3 new findings." or "Just scanned. No new emails to triage." for about half a minute, and the button hides itself in the meantime so you can't accidentally fire a second scan while reading the result. After that the button comes back.

Each ongoing scan only looks at mail that arrived since the last scan ran (with three days of overlap to be safe). The first scan after you connect Gmail is still the full sweep (up to 2,000 attachment-bearing emails from the last 180 days — and the activity log says so explicitly in the unlikely event your inbox exceeds even that) — that one's the project-mode "let's sort everything out" run and can take several minutes, which the scanning banner now says; the weekly ones are the "anything new?" check-ins.

"Why didn't my email show up?" The triage page links to the scan trace — a per-email decision log for recent scans. Every message a scan examined gets a row: its relevance score with the reasons, then which gate decided its fate (no PDF/image attachment — link-only emails are invisible to the scan by design — junk attachment, scored below threshold, already seen, suppressed, AI judged not-keepable, or became a finding). Search by subject, sender, or filename. Rows are kept for 30 days.

If a scan connection breaks, Maud now says so. Google expires connections for apps in test mode after about 7 days. When that happens, the triage page replaces the scan button with an amber "Gmail connection expired — Reconnect" banner naming whose connection (and which inbox) died. Reconnecting is one click, and the next scan automatically sweeps the full 6 months again so nothing from the broken period is missed.

Which inbox is being scanned? The triage page shows the Gmail address each scan reads — captured the moment you connect (older connections pick it up on their next scan). Account settings lists every member's connected scan inbox too, plus which Google account your sign-in is linked to. If it's the wrong inbox, reconnect Gmail from the dashboard and pick the right Google account in the popup.

How something earns the "Signed and final" bucket. The AI marking a document as a confident final isn't enough on its own — Maud also wants a reason to trust it: either you've accepted documents from that sender before, or the document clearly belongs to a house or vehicle you've registered. Without either signal it goes to "Needs your eye" instead — the AI may well be right, but nothing corroborates it yet. Accepting a sender's first document is what builds that trust for their next one.

Drafts step aside for their finals. When a scan finds both the "please sign" version of a document and the signed "completed" version, Maud now spots that they're the same document and quietly moves the draft to low-signal with a note saying which version replaced it — you review the signed one, not both. The draft isn't deleted; it's in the low-signal list if you ever want it.

Dismissed items never re-surface — the dedup tracks every message we've seen, and the learned-suppression rules ensure repeat senders you've dismissed twice don't reach the classifier again. Cost-wise: each weekly scan is a couple of pence at most after suppression kicks in.

If you want a clean slate — say you've changed property names or want to test the pipeline — your developer can reset the whole household to an empty sandbox via:

fly ssh console -a maud -C 'python manage.py wipe_household --user <username>'

This wipes documents, findings, named items, profiles, and activity history. The Gmail OAuth connection is kept so the next scan starts immediately.