docs/changelog
Changelog
Every notable change, newest first. Generated from the repo's CHANGELOG.md — this page is a build artifact, edit the source file instead. Full diffs in releases.
0.1.6 2026-09-13
Added
- Attachment support.
readnow lists a message's attachments (name, size, type) and can save them to disk:tossinbox read <id>prints anattachmentsblock in human output and includes attachment metadata in--jsontossinbox read <id> --save [dir]downloads every attachment and writes the HTML/plain-text bodies to<dir>/<message-id>/(default dir:./tossinbox-attachments);--jsongains asavedarray with exact paths, so agents can read the files afterwards- the MCP
read_messagetool reports the same attachment metadata and accepts an optionalsave_dirinput watch --jsonevents now include attachment names when a new message has attachments- provider coverage: mailtm, mailgw and tempmailplus list and download attachments; tempmailio shows them when the upstream response includes them (download only if it exposes a URL); tempmaillol, guerrillamail and maildrop do not expose attachments upstream — TossInbox tells you that instead of guessing
tossinbox read <id> --htmlprints the raw HTML body when the message has one, with a clear warning when it does not.- Verified end to end with real mail: an email with PDF and PNG attachments was delivered to a live tempmailplus inbox, read with the CLI, saved with
--save, and the downloaded files matched the originals byte-for-byte (SHA-256 identical). The mailtm/mailgw download path is covered by tests against a stub API, including Bearer auth on every attachment request.
Fixed
- tempmailplus message ids.
listmapped the wrong field, so every id printed asundefinedandreadcould not be addressed by id; ids now come from the realmail_idfield. - tempmailplus sender addresses.
listshowedfrom: unknown; the realfrom_mailfield is now used (list and read). - tempmailplus timestamps. Detail responses carry a string date instead of an epoch; it is now surfaced as the message date.
0.1.5 2026-09-13
Added
- Provider failover.
spawnno longer gives up when the requested provider is down: a network error, a 5xx, or a 429 makes it retry the create against the remaining providers (requested first, then registration order) and report exactly what happened:- human output prints one
⚠warning per failed attempt, thenprovider : mailtm (failover from mailgw) --jsongains an optionalfailoverobject (requested/used) and awarningsarray- the MCP
create_inboxtool fails over the same way (opt out withno_failover) --no-failoverrestores strict behavior: the chosen provider or nothing- a plain 4xx on the explicitly requested provider fails without fallback — switching providers cannot fix a bad request
- human output prints one
- Verified against a real outage: with mail.gw answering 502,
spawn -p mailgwlands the inbox on a healthy provider and exits 0.
0.1.4 2026-09-13
Added
- Four new providers, all zero-config. TossInbox now speaks to seven upstreams across four independent stacks:
tempmaillol(spawn -p tempmaillol) — tempmail.lol: random inbox on rotating domains, token-based reads.tempmailio(spawn -p tempmailio) — temp-mail.io: server-generated address, full-text bodies, andtossdeletes the inbox server-side.tempmailplus(spawn -p tempmailplus) — tempmail.plus: pick-your-name inbox on 9 public domains; messages clear server-side ontoss.maildrop(spawn -p maildrop) — maildrop.cc: public inbox on one stable domain, read over their GraphQL API.
- Same guarantees everywhere: hard 20-second timeouts, readable network-error translation, friendly 5xx messages,
--jsonshapes and exit codes identical across providers.
Fixed
- temp-mail.io eventual consistency. A brand-new address can transiently answer
400 Email not foundseconds after creation; TossInbox now retries once before surfacing an error.
0.1.3 2026-09-13
Added
mail.gwprovider (spawn -p mailgw) — mail.tm-compatible API on independent infrastructure. When mail.tm is having a bad day, spawn on mail.gw instead; same CLI, same JSON, same exit codes. And when any upstream is down, a 5xx now readsHTTP 502 from api.mail.gw — provider is down or having trouble; retry, or switch with --providerinstead of a bareHTTP 502.tossinbox watch— live-polling mode that prints each new message (and its code when found) the moment it arrives, and keeps polling until Ctrl-C. Only *new* arrivals are reported: re-watching an inbox never replays old mail. With--jsonit streams one compact JSON object per message (NDJSON) on stdout and keeps stderr silent, so agents can pipe it straight into the next step of a script.- Verification-code keywords now understand twelve languages. French, Spanish, German, Portuguese, Italian, Russian, Turkish, Chinese, Japanese, and Korean join English and Arabic —
Votre code de vérification est 482913or您的验证码是662341extract just as reliably as "Your code is 123456".
0.1.2 2026-09-13
Added
- Website v2: brew/npx install tabs in the hero, a "Star on GitHub" secondary CTA, a highlighted TossInbox column in the comparison table, an EN/AR nav toggle, a full Arabic quickstart (
/ar/quickstart), and an Arabic copy polish pass (idiomatic phrasing over literal renderings).
Fixed
- Network failures now say what actually happened. A dead connection used to surface as Node's bare
fetch failed; DNS failures, refused connections, dropped sockets, TLS problems, and the 20s timeout each now produce a short, actionable message — e.g.DNS lookup failed for api.mail.tm — check connectivity and retryorno response from api.mail.tm within 20s — retry, or switch with --provider.
Changed
- State saves are atomic.
state.jsonis written to a sibling temp file, fsynced, then renamed into place — a crash mid-write can no longer truncate the file and destroy saved inboxes (0600 enforced before the rename).
0.1.1 2026-09-11
Fixed
tossinbox-mcpnow starts when launched through npm/Homebrew bin symlinks. Previously the direct-run check compared unresolved paths, so the globally installed binary exited silently without starting the MCP server.- Unknown providers and bad flags now exit with code 4 (usage error), matching the documented contract.
- Every provider HTTP call now has a hard 20s timeout, so agents can never hang forever on a stalled connection.
- A corrupt or unreadable state file is now reported loudly instead of being silently overwritten (which could destroy saved inboxes).
- Verification codes with lowercase letters (e.g.
f4x9k2) are now extracted and returned uppercased.
Changed
- Inbox credentials are generated with
node:crypto(cryptographic randomness) instead ofMath.random(). - MCP tool failures set
isError: trueso clients render them as real errors. readerrors duringwaitare retried once before giving up.--timeout/--intervalvalues are validated up front (exit 4 on garbage).
0.1.0 2026-09-10
Added
- First public release.
- CLI:
spawn,list,read,wait,inboxes,toss,clear,providers,mcp— every command supports--json; documented exit codes. - MCP server over stdio with four tools:
create_inbox,list_messages,read_message,wait_for_code. - Providers: mail.tm (default) and GuerrillaMail — no API keys.
- OTP extraction tuned for English and Arabic emails (رمز / كود / تفعيل / تحقق).
- State file
~/.tossinbox/state.jsonwritten with0600permissions. - GitHub Action (
mohamed-khairy-5i/tossinbox@v1), Homebrew tap, project website on tossinbox.pages.dev (Cloudflare Pages),llms.txtfor LLM onboarding.