WorkFlow Intelligence
It reads exported emails and rebuilds the work inside them, what I am doing, what I am waiting for, what I finished and what I may be forgetting.
- Walkthrough
- 2026
At a glance
- Why it matters
- Work that lives in email (requests, follow-ups, things waiting on someone) becomes a tracked list, and every status keeps the email that set it.
- My role
- Solo, end to end
- Stack
- React, TypeScript, Vite, Express, SQLite, Drizzle
- Demo
- Walkthrough from captures of the running app
The problem
A lot of real work arrives as email. Someone asks for an extract for an audit, I reply that I am on it, I send it three days later. The task existed only in the thread. If I forget to reply, nothing reminds me.
I wanted to see whether the mailbox already holds a good enough record of my work, if something reads it in order and pays attention to who wrote what.
What it does
You export a folder of emails from Outlook or another client and drop it on the import page. The app stores them in a local SQLite file, groups them into conversations, and reads each conversation in order.
"Pouvez-vous..." from someone else becomes a task to do. "Je m'en occupe" from me moves it to in progress. "Veuillez trouver ci-joint" with an attachment marks it completed, and a thank-you confirms it. Each change keeps the sentence and the email that caused it. A follow-up list points at promises without a reply, unanswered questions, deadlines and people chasing me.
Walkthrough
This app needs a server and reads a real mailbox, so it is not hosted. These captures come from the app running on my computer with a fictional mailbox.




How it works
Email in, evidence out
Import
- email/parsers.tsReads .eml and .msg files
- email/importService.tsStores emails and people, skips duplicates
Conversations
- threading/threadService.tsHeaders first, then subject and people within a time window
Analysis
- ai/basicAnalyzer.tsLocal rules, signals and a state machine
- ai providersOllama, OpenAI or Anthropic, off by default
- analysis/followupService.tsPromises, questions, deadlines
Storage and screens
- SQLite with DrizzleOne file in data/, full-text search
- React clientBoard, item detail, follow-ups, timeline, reports
Drawn from server/src/services. Everything runs on one computer.
Decisions
Local by default
The server listens on 127.0.0.1 only. The default analysis is a set of local rules that needs no key. Cloud models are optional and only used after the user ticks a consent box in Settings.
Every status change shows its evidence
A status the user cannot question is useless. Each transition stores the date, the signal, the quoted sentence and the effect, and the item shows them as a table.
The user wins
When I edit a field, it is locked. When I set a status, only emails newer than my change can move it again.
Threads that do not run forever
Conversations are joined by mail headers, then by subject and shared people within 30 days. A new email with a reused subject joins only within 3 days, so a weekly report does not become one endless thread.
Why it is a walkthrough
It needs a server and a database, and it is built to read a real mailbox. Hosting it would mean hosting someone's email. The captures here come from the running app with a fictional mailbox.