All work

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
running locally

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.

What I would build next

  • A direct connection to Microsoft 365 or IMAP, read only, instead of exported files.
  • A weekly summary of what changed, ready to paste into a status report.
  • One import for the whole mailbox. Today the inbox and the sent folder are imported separately.