Personal archive · Outlook + Teams

Your mail. Your chats. On this disk.

Extractor is a signed-in Microsoft session on your Mac — not a Graph app, not an admin-consent portal. It harvests Inbox and Sent, then Teams 1:1 and group chats, into local SQLite you can search and export.

Download Extractor 0.1.0 See the commands free · notarized · brew or zip · nothing uploaded
live demo · local CLI login

      
      
sign in once harvest to Application Support search + markdown/JSONL export

What it does

A session you already have. An archive you keep.

Same family as CalSync’s Outlook web session — persistent WebKit store, MFA number-match, then REST against the page you just signed into.

01 · Mail

Inbox + Sent, last 30 days

Walks well-known folders, pages messages, stores body text, skips attachment binaries. Re-runs are incremental on ChangeKey.

./extractor mail --days 7
listed 86 · upserted 86 · skipped 0
02 · Teams

1:1 and group chats

Loads Teams in the same cookie jar, harvests a skype/teams token, lists conversations, pages messages. Channels skipped in v1.

./extractor teams --days 7
verbose redacted log if CA blocks
03 · Search

FTS over what you pulled

SQLite FTS5 on subject, body, sender, chat title. No cloud index. Hits stay on the machine that harvested them.

./extractor search "quarterly"
[mail] 2026-08-12 Ada Q3 plan
04 · Export

JSONL + thread markdown

RAG-ready files rewritten from SQLite after harvest — one object per message, one transcript per conversation.

export/mail/messages.jsonl
export/teams/<chat>.md
05 · Sign-in

A real window, paste included

MFA number-match overlay. Edit menu so ⌘V works. Headless commands refuse to pop UI if the session is dead.

./extractor login
then whoami · mail · teams
06 · Trace

Teams logs you can send

Conditional Access pages, DeviceAuth loops, HTTP status, header names — JWTs stripped. Bundle the logs folder, not the database.

~/Library/Application Support/
MSExtractor/logs/teams-*.log

The contract

No tenant-wide Graph app. Your browser session.

Most “export my Outlook” tools want an Entra app registration and an admin who will bless Mail.Read. Extractor uses the web session you can already open.

THE GRAPH WAY admin consent app in the tenant

Register an app. Beg for Mail.Read / Chat.Read. Wait for Conditional Access to allow that client. Bodies leave on whatever token the app was issued.

Azure portal app registration
admin consent or no data
token lives in someone else’s cloud
THE EXTRACTOR WAY local session personal · read-only
  • You sign in. Same MFA you already do for Outlook on the web. Cookie jar is this app’s, not Safari’s, not CalSync’s.
  • Files stay here. SQLite under Application Support. No server that receives message bodies.
  • Read-only. No send, no reply, no calendar writes. Harvest, search, export.
  • Honest about Teams CA. Some tenants block embedded WebKit. The CLI prints the Entra page and a redacted log instead of pretending.
login window + MFA
mail Inbox + Sent on disk
search FTS, this Mac only

Your org’s policies still apply. Extractor is a personal local tool — if Conditional Access forbids the client, nothing here clicks through it.

Requirements

What it needs.

System

macOS 13+

WebKit identifier-keyed cookie jar on 14+. 13 runs a degraded shared store.

Hardware

Apple Silicon

arm64 release. Intel is a later rebuild, not this zip.

Account

Microsoft work login

Outlook on the web must already work for you. No extra tenant admin step.

Price

Free

Personal use. Signed and notarized. Install with Homebrew or the zip. No subscription.

Download

Get Extractor.

  1. Install with Homebrew

    brew install --cask sooth/tap/extractor puts Extractor.app in Applications and extractor on your PATH. Zip download still works if you do not use brew.

  2. Sign in

    extractor login — complete MFA. Paste works. Then extractor whoami.

  3. Harvest mail

    extractor mail --days 7 writes Inbox + Sent into Application Support and refreshes markdown/JSONL export.

  4. Try Teams

    extractor teams --days 7. If Entra blocks the embedded browser, send back the redacted log from bundle-logs — not the sqlite file.

  5. Search what you have

    extractor search "a phrase you know" then status for counts and the latest Teams log path.

brew or Extractor.zip

brew install --cask sooth/tap/extractor
free · macOS 13+ · Apple Silicon · notarized
changelog