-
-
A Gmail-style inbox of fictional emails, each tagged with the commitments Threadline found in it.
-
Scanning 13 conversations with qwen2.5:7b running locally through Ollama, so no email leaves the machine.
-
Every AI-found commitment waits for review, with its quote checked word-for-word against the original email.
-
An overdue promise next to the highlighted sentence in the original email where it was made.
-
Threadline reads the whole thread: a later "please disregard" marks the promise as cancelled.
-
A polite AI-written follow-up for an overdue promise, which you can edit and copy but Threadline never sends.
-
Today's Briefing: overdue, due today and coming up, sorted by code and summarised by the local AI.
-
A built-in status panel for the backend, Ollama and model, with a one-click switch to Demo Mode.
Inspiration
Gmail never forgets a message, but it has no idea what I promised in one.
Promises like "I'll send it tomorrow" or "We'll ship by Monday" decide whether people trust us, yet they're buried in threads with no owner or deadline. Threadline is an upgrade for Gmail that tracks them.
Your inbox remembers every message. Threadline remembers what matters.
What it does
A local AI model reads a Gmail-style inbox (18 fictional emails, 13 conversations) and finds every commitment:
- You Owe / They Owe, with real deadlines ("by Friday" becomes a date; guesses are labelled as guesses)
- Proof: every item links to the exact sentence it came from, highlighted in the original email
- Thread awareness: a later "done" or "cancelled" email closes the promise
- Review before trust: you confirm, edit or reject each finding
- Follow-up drafts for overdue items (never sent automatically) and a daily Briefing
Everything runs on your machine through Ollama: no cloud, no API keys.
How I built it
React + TypeScript, Vite and Tailwind on the front end; Node and Express on the back end; Ollama running qwen2.5:7b; Zod for schemas; 77 tests in Vitest and Supertest.
Core idea: the model proposes, code decides. The model must return JSON that matches a schema, and plain TypeScript checks each claim: the quote must exist in the email, the people must be in the conversation, the deadline phrase must appear in the email, and "completed" needs proof from a later email.
Challenges
- A 7B model invents details: wrong names, misspelled email addresses, deadlines that aren't in the email. Every failure became a check in code.
- Working out what "Friday" means depends on when the email was sent and in which timezone.
- One sample email contains a prompt-injection attack, so email text is treated as untrusted data.
Accomplishments
Every commitment can be traced back to its source, the full flow runs 100% locally, and failures come with clear messages instead of crashes.
What I learned
LLMs are great at reading but unreliable at bookkeeping. Let the model interpret the language, and let code handle dates, people and proof. Trust comes from showing evidence and uncertainty, not from hiding them.
What's next
A real Gmail add-on through Google's official APIs, calendar export, a team view, and fine-tuned small models.
Independent project, not affiliated with Google. All demo emails are fictional. Built with help from Claude Code.
Built With
- css3
- express.js
- gmail
- html5
- javascript
- llm
- local-ai
- localstorage
- lucide
- node.js
- ollama
- qwen
- radix-ui
- react
- react-testing-library
- rest-api
- supertest
- tailwindcss
- typescript
- vite
- vitest
- zod
Log in or sign up for Devpost to join the conversation.