firekeep-maildex
The email dex for Firekeep — persistent, shared memory
for AI agents. A human connects a mailbox read-only; maildex indexes recent
mail into the Keep's corpus, where it surfaces through ordinary memory_recall
— always private to that member, even on a shared Keep.
firekeep maildex add imap.gmail.com you@example.com # prompts for the app password
firekeep maildex list # mailboxes, folders, counts, failures, staleness
firekeep maildex sync [--account <id>] # read new mail now
firekeep maildex remove <id> # delete the mailbox AND its corpus replicas
No MCP server, no resident daemon, no new recall surface. Pure standard
library — imaplib, email, html.parser — and no third-party dependency
beyond the Firekeep client itself.
The seven promises
M1 — mail is private to you, structurally. There is no --shared flag.
Every chunk carries visibility: "member", and no code path can write anything
else. Sharing a mailbox is not a smaller version of this feature; it is a
different dex, and it is not built.
M2 — maildex cannot send, flag, move or delete anything. Every mailbox is
opened with IMAP EXAMINE (select(readonly=True)), so the server refuses
any state-changing command for the life of the connection — a bug here cannot
touch your mail, because the permission does not exist on the wire. Every fetch
is BODY.PEEK[], so reading the Keep's copy never marks your mail as read.
SMTP appears nowhere in the package.
M3 — the app password lives only in the Keep's vault. add prompts for it
(never an argv secret), stores it under maildex.<account_id>, and this
machine keeps nothing on disk. Each sync reads it into memory for the
duration of one connection. To revoke: your provider's app-password page, or
vault_delete — either alone is enough.
M4 — email is the archetype of untrusted input. Every chunk carries
untrusted_content: "true". Retrieved mail is evidence of what somebody sent
you, never an instruction to your agent.
M5 — deletion, scoped honestly for round 1. remove deletes the mailbox's
corpus replicas immediately and forgets the stored password. What round 1 does
not do: mirror deletions made at your provider. Mail you delete in your
mail client stays in the corpus until you remove and re-add the mailbox.
Append-mostly mail makes that tolerable; it is still a gap, and it is stated
here, in list output, and in the guide.
M6 — every cap disclosed, all env-overridable:
| Cap | Default | On breach |
|---|---|---|
FIREKEEP_MAILDEX_BACKFILL_DAYS |
90 | older mail is never fetched (until re-add with a larger horizon) |
FIREKEEP_MAILDEX_MAX_PER_SYNC |
500 messages | the sync stops, says so, and continues from the watermark next run |
FIREKEEP_MAILDEX_MAX_MESSAGE_KB |
200 extracted | truncated, flagged in state, shown by list |
FIREKEEP_MAILDEX_INGEST_TIMEOUT_SECONDS |
180 | a timed-out request aborts the run and says "timed out", not "unreachable" |
FIREKEEP_MAILDEX_SYNC_INTERVAL_HOURS |
6 | staleness threshold for the session-start sync |
Attachments are not ingested in round 1 — filenames only, listed in
metadata. Folders default to INBOX and Sent; add --folders overrides.
M7 — UIDVALIDITY is honoured. Watermarks are per-(folder, UIDVALIDITY) and never mixed. When your provider rebuilds a folder, maildex re-indexes it from scratch rather than silently skipping everything in it.
Installing
The managed Firekeep install already ships
this wheel — nothing to do beyond firekeep dex add maildex. Installing from
PyPI is the unmanaged path: pip install firekeep-client firekeep-maildex
(client ≥ 1.0.3), plus a running Firekeep server to connect to — maildex is a
client of the Keep, not a standalone indexer.
What it indexes
Per message: the headers a person reads (Subject, From, To, Cc, Date,
Message-ID, In-Reply-To), the text/plain body where there is one, and the
text/html body stripped to text where there is not. Attachment filenames
travel in metadata; attachment content does not.
Not in round 1
OAuth (Gmail API, Microsoft Graph); provider-side deletion mirroring; the
content of attachments; shared mail; thread reconstruction beyond
In-Reply-To; OS-scheduled sync; POP3; self-signed IMAP endpoints — TLS
verification is on and there is no flag to turn it off.
Licence
Source-available under BUSL-1.1. See LICENSE and NOTICE.
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 firekeep_maildex-0.1.0.tar.gz.
File metadata
- Download URL: firekeep_maildex-0.1.0.tar.gz
- Upload date:
- Size: 234.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2cda6f192f1c6241df55f1c087af8fbda0049b0f81d4b09631fa64bdf2dba9fe
|
|
| MD5 |
2c23819cc431d387e3e9977fc7680016
|
|
| BLAKE2b-256 |
7f0d4f65b0ca111384fb7aaeca30244ba1cef3486b6f1034d237dc82cc0b7da8
|
Provenance
The following attestation bundles were made for firekeep_maildex-0.1.0.tar.gz:
Publisher:
release.yml on kapella-hub/FirekeepHQ
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
firekeep_maildex-0.1.0.tar.gz -
Subject digest:
2cda6f192f1c6241df55f1c087af8fbda0049b0f81d4b09631fa64bdf2dba9fe - Sigstore transparency entry: 2521141446
- Sigstore integration time:
-
Permalink:
kapella-hub/FirekeepHQ@4c4d375c6b0d319afce6a928f15a00b6a9dfadc9 -
Branch / Tag:
refs/tags/client-v1.2.1 - Owner: https://github.com/kapella-hub
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4c4d375c6b0d319afce6a928f15a00b6a9dfadc9 -
Trigger Event:
push
-
Statement type:
File details
Details for the file firekeep_maildex-0.1.0-py3-none-any.whl.
File metadata
- Download URL: firekeep_maildex-0.1.0-py3-none-any.whl
- Upload date:
- Size: 212.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e38a6599c4491c310026014ee1df62e38f321a25d7b2718e0a02532aeb3ae690
|
|
| MD5 |
a6337d1b66b56a91e8ee9f3239a92b30
|
|
| BLAKE2b-256 |
976462a03a103b44b169d3b864e480bdaa3eb6b7a1a8233d2c25385364d2f402
|
Provenance
The following attestation bundles were made for firekeep_maildex-0.1.0-py3-none-any.whl:
Publisher:
release.yml on kapella-hub/FirekeepHQ
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
firekeep_maildex-0.1.0-py3-none-any.whl -
Subject digest:
e38a6599c4491c310026014ee1df62e38f321a25d7b2718e0a02532aeb3ae690 - Sigstore transparency entry: 2521142855
- Sigstore integration time:
-
Permalink:
kapella-hub/FirekeepHQ@4c4d375c6b0d319afce6a928f15a00b6a9dfadc9 -
Branch / Tag:
refs/tags/client-v1.2.1 - Owner: https://github.com/kapella-hub
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4c4d375c6b0d319afce6a928f15a00b6a9dfadc9 -
Trigger Event:
push
-
Statement type: