Local-first email triage that turns your inbox into a daily todo list
Project description
msgsift
Local-first email triage that turns your inbox into a calendar-style todo list.
msgsift fetches your unread mail over IMAP, classifies each message with an LLM
(local Ollama by default, or Cloudflare Workers AI), and organizes
everything into a per-day todo list with a small web UI. A nightly job writes you a short
recap of the day and rolls unfinished items forward. Your own manual todos live in the same
list. Nothing leaves your machine unless you opt into the Cloudflare backend.
How it works
- Classify every unread email as
ACTION_REQUIRED,FYI,NEWSLETTER, orIGNORE, with a one-line reason and (where useful) a suggested reply. - VIP list — senders (by email or domain) are always forced to
ACTION_REQUIRED. - Forwarding hints — content rules suggest who to forward something to.
- Daily rollover — at end of day, FYIs/newsletters auto-close, unfinished action items carry to tomorrow, and finished ones stay (scratched out) as a record of what you did.
- Nightly recap — the model writes a couple of sentences summarizing the day.
Install
uv tool install msgsift
This gives you three commands: msgsift (fetch + classify), msgsift-nightly
(recap + rollover), and msgsift-web (the web UI).
Configure
Config lives in ~/.config/msgsift/ (override with MSGSIFT_CONFIG_DIR):
mkdir -p ~/.config/msgsift
cp config.example.toml ~/.config/msgsift/config.toml
cp credentials.example.toml ~/.config/msgsift/credentials.toml
# then edit both — config.toml for settings, credentials.toml for secrets
credentials.toml holds only secrets (IMAP passwords, API tokens) and should never be
committed or shared.
Run
msgsift # fetch unread mail, classify, store, print a digest
msgsift-web # serve the web UI (default http://127.0.0.1:8000)
msgsift-nightly # write the day's recap and roll items over
Typically msgsift runs on a timer through the day, msgsift-nightly once at night, and
msgsift-web as a long-running service. Example systemd user units are in systemd/.
Backends
- Ollama (default): fully local and private. Point
[classifier.ollama]at your Ollama server and pull a small model (e.g.qwen2.5:3b). - Cloudflare Workers AI: offloads inference to a larger model. Set
[classifier]backend = "cloudflare"and provide anaccount_id+api_token. Note: with this backend, message envelopes (sender, subject, snippet) leave your device.
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file msgsift-0.1.0.tar.gz.
File metadata
- Download URL: msgsift-0.1.0.tar.gz
- Upload date:
- Size: 76.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e814a98016d67272f9c854b0fb905b1cfed4b6f15ebdf4b5c3839bc44b47dad4
|
|
| MD5 |
7b76aee19e9b3a89204bdc5bac38f28e
|
|
| BLAKE2b-256 |
7b12611e62a14f4f45f1a4f961546c7fe535004b3a0b6b418beb59287250dfe5
|
Provenance
The following attestation bundles were made for msgsift-0.1.0.tar.gz:
Publisher:
release.yml on lucasgerads/msgsift
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
msgsift-0.1.0.tar.gz -
Subject digest:
e814a98016d67272f9c854b0fb905b1cfed4b6f15ebdf4b5c3839bc44b47dad4 - Sigstore transparency entry: 1625016682
- Sigstore integration time:
-
Permalink:
lucasgerads/msgsift@e7b8b18b74e56fbbc475c715f1e5b917ee7b0e6a -
Branch / Tag:
refs/heads/main - Owner: https://github.com/lucasgerads
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@e7b8b18b74e56fbbc475c715f1e5b917ee7b0e6a -
Trigger Event:
push
-
Statement type:
File details
Details for the file msgsift-0.1.0-py3-none-any.whl.
File metadata
- Download URL: msgsift-0.1.0-py3-none-any.whl
- Upload date:
- Size: 26.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
676e4320e3b1e1b621ca13a1b37dc82dfbc53a832b2ec10d2967243b2204b404
|
|
| MD5 |
9f6a36fb56937c82296063f9f7b654d9
|
|
| BLAKE2b-256 |
48a4c848797d23fd35b4e4125c825d1d1c1a378dfaf17ca6f909788fafb11c81
|
Provenance
The following attestation bundles were made for msgsift-0.1.0-py3-none-any.whl:
Publisher:
release.yml on lucasgerads/msgsift
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
msgsift-0.1.0-py3-none-any.whl -
Subject digest:
676e4320e3b1e1b621ca13a1b37dc82dfbc53a832b2ec10d2967243b2204b404 - Sigstore transparency entry: 1625016700
- Sigstore integration time:
-
Permalink:
lucasgerads/msgsift@e7b8b18b74e56fbbc475c715f1e5b917ee7b0e6a -
Branch / Tag:
refs/heads/main - Owner: https://github.com/lucasgerads
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@e7b8b18b74e56fbbc475c715f1e5b917ee7b0e6a -
Trigger Event:
push
-
Statement type: