Repository navigation
TideMail v1.0.28
TideMail v1.0.28
TideMail is a keyboard-first terminal email client with multi-account mail, a unified inbox, drafts, contacts, search, bulk actions, and optional AI tools.
Added
-
Receipt tables retain item/price columns and merged-cell totals, including
simple receipts without semantic headers. Amounts align on the right; narrow
panes switch automatically to labelled records or label/value pairs. -
Newsletter cards stay together. Each card's image, heading, description, and
button render as one block, and a thin rule separates neighbouring cards.
Side-by-side cards stack left to right, then top to bottom. Quoted and
forwarded mail is left as is. -
Add an Auto/Off image selector under Settings → Display → Reading, with
terminal capability information. Saving applies the preference immediately. -
Real inline images in the reading pane. On terminals with Kitty graphics
support (Ghostty, Kitty, foot), images embedded in HTML mail — CID
parts, inlinedata:URIs, and content-location references — are now decoded
and drawn as raster images inside the reading pane, scaled to the pane width,
aspect-ratio preserved, and scrolling/clipping/reflowing with the document.
Remote images stay blocked until the reader pressesiin the content pane,
which loads them for the current message (or the whole conversation in
threaded view).[display] images = "off"forces text placeholders
everywhere.Architecture: a new
internal/richmailpackage owns image parsing,
resolution (CID/data/remote), decode limits, layout, and the URL/SSRF policy;
internal/termimageowns terminal capability detection and the Kitty Unicode
placeholder backend;internal/ui/rich_images.gowires them into the existing
HTML pipeline. Images render by emitting Kitty Unicode placeholder cells into
the text, so the viewport moves them like ordinary document text rather than
fighting Bubble Tea for cursor control. The historic[image: alt]
placeholders remain the fallback and are unchanged on unsupported terminals.
MIME parsing now preservesContent-ID,Content-Disposition,
Content-Location, and inline status (attachmentsgains four
backwards-compatible columns). Remote fetches have a timeout, redirect cap,
byte cap, content-type validation, and reject loopback/private/link-local
hosts at both URL-parse and dial time. Decoded images are bounded by bytes,
dimensions, and pixel count, and are cached per message. An image-heavy
message is no longer mistaken for an empty HTML body.Known limitations: animated GIFs show only the first frame; side-by-side
table-cell image rows stack vertically rather than forming a two-column grid;
WezTerm is unsupported and uses text placeholders.
Fixed
- Inline images honour the sender's height as well as width, fitting inside
both without distortion, and are re-laid out when the terminal font size
changes instead of keeping placements sized for the old cells. - Moving through the message list no longer stalls on messages with loaded
images. Images upload in the background once the cursor settles, and
recently shown images stay in the terminal (up to 48 images or 64 MiB of
pixels), so returning to a message is instant. TideMail removes its images
from the terminal on exit. - MIME image parts now have a byte and entry cache budget, and clearing a
terminal image also releases its stored pixel data. - Remote images reuse decoded pixels after download-cache eviction. If both
copies have been evicted, the reader offersito reload instead of staying
on a loading placeholder without an active fetch. - Absolute Content-Location references resolve from embedded MIME parts before
considering a remote download, including wheniis pressed. - WezTerm inline images are currently unsupported. Use text placeholders
automatically: basic Kitty graphics support does not provide the Unicode
placeholders and virtual placements TideMail requires. Email text and
attachment saving still work. - A malformed private-use marker sequence (adjacent
U+E000/U+E001) in a
message body can no longer panic the renderer. - Pressing
iin a threaded conversation now loads remote images for every
message in the thread, not just the representative one, so each reply's
images appear. - Inline images that cannot be drawn — no graphics terminal,
images = "off",
plain UI, or a decode failure — stay in the attachment list and remain
saveable. Images that are drawn inline are hidden from the displayed list
but still included when saving attachments. - Remote image data is now evicted under a bounded byte/entry budget instead of
being retained for the life of the process.