Repository navigation
Releases
Releases · psalm2517/cindermail
0.8.0
v0.8.0
Added
/torch allends every live address you own, after you confirm with a Confirm/Cancel button. On Discord the prompt is ephemeral. It only touches your own addresses, can't be undone, and does nothing if your addresses changed since the prompt was shown.- Slack: new
/slack/interactionsroute for the buttons.
Upgrading
- Slack: add the
interactivityblock fromdocs/slack-adapter.mdto your app manifest, or the buttons fail. - Optional: re-run
npm run register-commandsso Discord's/torchhint mentionsall.
v0.7.2
v0.7.2
Upgrade note
- The every-minute mail.tm poll is no longer in the default
wrangler.jsonc. Domain deployments stop being invoked 1,440 times a day. If you run mail.tm mode, add"*/1 * * * *"back totriggers.cronsand redeploy, or you'll receive no mail. - Cloudflare preview URLs are now off by default (
preview_urls: false).
Changed
/newnow shows the address's short ID in front of the address, as/listdoes (#12345 address@yourdomain.com), on Discord, Telegram and Slack.
Fixed
/newno longer fails for everyone when create and torch churn fills the shared short-id pool. Torching an address now releases its id immediately.- Rate limits and the active-address cap now hold under concurrent commands.
- Telegram no longer redelivers and re-runs a command when the reply can't be sent, for example if the bot is blocked.
- Mail with a malformed numeric HTML entity is no longer dropped.
- Expiry reminders on Telegram and Slack now show a real UTC time and the correct opt-out command. Reminders per run are capped at 20 owners.
- Reminder bookkeeping no longer breaks for an owner with more than 99 due addresses.
- Discord: mail with more than 10 attachments is no longer rejected whole. Extras are dropped with a note.
- mail.tm: a message that can't be parsed no longer blocks its mailbox or stops other mailboxes from being polled.
- mail.tm: messages are no longer delivered twice.
- mail.tm: oversized messages are dropped.
- mail.tm: no orphaned mailbox is left when registering an address fails.
- mail.tm:
/newis faster because the domain is cached and create retries are capped at 3.
Security
- HTML-to-text conversion now runs in linear time. A crafted 256KB email used to cost about 23 seconds of CPU.
- Sender-controlled links, Slack control syntax (
<!channel>, masked links) and newline-forged Subject and From lines no longer render as live markup on Discord or Slack. - Attachment filenames are stripped of control and bidi characters and path separators. The "original HTML attached" note now warns that it is the sender's markup.
- Discord requests older than 5 minutes are rejected. Oversized unauthenticated request bodies get a 413.
/countersis cached for 5 minutes, which protects D1 read quotas.- Telegram webhook secret is compared in constant time.
- The status page now sends a CSP,
nosniffandframe-ancestors 'none'. - Rate-limit lookups ignore inherited property names such as
/constructor. - Logs show short ids instead of full addresses.
- CI uses a read-only token and no persisted checkout credentials. The mirror workflow does the same.
Known issues
- Daily cleanup can delete a row even if the mail.tm account deletion failed.
v0.7.1
v0.7.1
Fixed
- Addresses created before short ids existed (v0.7.0) had none, so
/listshowed no#idfor them and/extend,/note, and/torchcouldn't target them by id. The daily cleanup now gives every address without one a unique id, with no manual step, so existing deployments fill their own gaps.
Changed
- The repo moved to the amandoti-win organization. Every GitHub link (README badges, the Deploy button, clone instructions, the status page's Source link) now points at github.com/amandoti-win/cindermail. Old links redirect.
- LICENSE copyright holder is now amandoti.win. The license itself is still MIT.
v0.7.0
v0.7.0
Added
/listnow shows a short 5-digit id next to each address (#48213)./extend,/note, and/torchall accept that id instead of retyping the full address, just the digits, no#.- GitHub Sponsors is set up on the repo.
Changed
- Discord's address option is now
address_or_id, matching what it actually accepts. Re-runnpm run register-commandsto pick up the new label in Discord's UI; the old key still works until you do. - Bluesky link updated to amandoti.win.
Fixed
- Discord's
/torch,/note, and/extendbriefly broke for anyone on a deployment that hadn't re-registered commands yet, fixed to accept both the old and new option key.
v0.6.1
v0.6.1
Changed
npm run setupnow offers to collect Telegram's and Slack's secrets interactively, matching what the Deploy button's own form already covered since v0.6.0 -- the wizard was a step behind.- README now points to whichever of
docs/discord-adapter.md,docs/telegram-adapter.md, ordocs/slack-adapter.mdmatches what you filled in, instead of only linking Discord's after the Deploy section. - Status page title changed to "Cindermail Status" (tab and heading), and its domain moved to
cindermail.xyz. - README now leads with a banner image instead of a plain text title.
Removed
- The X link on the status page.
v0.6.0
v0.6.0
Slack delivery adapter.
Added
- Slack is now a supported delivery platform alongside Discord and Telegram. All six commands work (
/cm-new,/cm-list,/cm-note,/cm-extend,/cm-torch,/cm-remind), prefixedcm-since Slack rejects bare generic command names outright and/remindcollides with a real Slack built-in. Works on a single Worker, set up via an app manifest instead of clicking through a dozen dashboard fields one at a time, secrets prompted by the "Deploy to Cloudflare" button same as Discord's and Telegram's, see docs/slack-adapter.md.
Changed
docs/discord-adapter.md,docs/telegram-adapter.md, anddocs/slack-adapter.mdall now include inline screenshots at every setup step, not just prose.docs/telegram-adapter.mdanddocs/slack-adapter.mdno longer point todocs/discord-adapter.mdfor command semantics, rate limits, or expiry/note behavior; each is fully self-contained.- Every secret-setting step across the docs now documents the Cloudflare dashboard as an alternative to the CLI, including the
Type: SecretvsType: Textdistinction. - Discord's and Telegram's setup docs both now reuse a single shell variable for any value needed across more than one command (bot token, application ID, webhook secret), instead of separate manual entry per step where a value could drift out of sync between two systems without anything catching it.
v0.5.2
v0.5.1
v0.5.1
- Changed cindermail.vsvn.net from a status page for the private hosted instance to a landing page for Cindermail, status page was moved to status.cindermail.vsvn.net.
- Added docs to the README and landing page; available at cindermail.vsvn.net/docs.
v0.5.0
v0.5.0
Telegram delivery adapter.
Added
- Telegram is now a supported delivery platform alongside Discord. All six commands work (
/new,/list,/note,/extend,/torch,/remind), parsed from plain-text/command argsmessages. Works on a single Worker by default, see docs/telegram-adapter.md.
Changed
CommandConfig, expiry/note parsing, and HTML-to-text rendering moved out of the Discord adapter intocore/, since none of it was Discord-specific and Telegram needed the same logic. Discord's behavior is unchanged.
Fixed
- The mail.tm poller and cleanup were skipped entirely whenever the main Worker itself was in domain mode, even when a mail.tm-backed address existed from another adapter running in mail.tm mode independently. Mail sent to those addresses was silently dropped.
Under consideration (contingent on demand)
- Public hosted instance
- Slack delivery adapter
v0.4.0
v0.4.0
Quota visibility, and the project moves to the Unlicense license.
Added
/listnow shows your quota (e.g. "3/10 active addresses") alongside your addresses, so hitting the cap on/newisn't a surprise./new's refusal message at the cap now reports current/max ("10/10 active addresses") instead of just the max.
Changed
- License switched from MIT to the Unlicense (public domain). No functional change, just a licensing one.
- Added an AI disclosure to the README: this project is built with AI assistance, directed by the maintainer.
Under consideration (contingent on demand)
- Telegram delivery adapter
- Slack delivery adapter
- Publicly hosted instance