Repository navigation
Releases: jsnjack/mailbox
Releases · jsnjack/mailbox
Release list
v0.248.0
v0.247.5
v0.247.4: p Fix builds with WebKitGTK 2.54 headers
Export the pointer-lock feature macro through CGO_CPPFLAGS so the pinned WebKit bindings can see the declarations hidden by the umbrella header. Document the flag for direct Go commands. Validation: make build and make check pass. The account-switch GTK regression passes with software rendering and fails against the original code.
v0.247.2
v0.247.1
v0.246.1: p Offer Belarusian as an AI language
It was missing while Russian, Ukrainian and Polish were on the list. Verified in the sandbox: gists come back in Belarusian. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
v0.246.0: m One AI language for everything the AI says about your mail
Widens yesterday's summary-language setting to every surface that talks to
the reader about their mail, since a setting that covers two of them is the
same problem in a smaller box:
- the conversation summary and the per-message gist (as before)
- the phishing verdict and its reasons
- the reason on an AI-suggested snooze time
- what Translate translates into (and the key its cache is stored under)
So Prefs.SummaryLanguage becomes Prefs.AILanguage, Assistant.SetLanguage
replaces SetSummaryLanguage, the prompts share languageClause (a sentence)
and languagePhrase (a parenthetical, where a strict output format leaves no
room for one), and the Preferences row is now AI Features → Language
("Summaries, translation, AI notes"). Translate cannot honour "Same as the
email" — a mail translated into its own language is a no-op — so it falls
back to the default there, and its button tooltip names the language it
will produce.
Nothing that writes mail *as* the user follows the setting: a draft, a
refined reply, a proofread, a subject or a quick reply stays in the
correspondent's language, which is the only right answer there.
The phishing verdict needed one extra step. Naming its three judgements as
English literals ('Verdict: Looks legitimate', …) does not survive a
language change — the model copies them, and a Russian analysis came back
headed by an English verdict above four Russian reasons (measured twice,
including with "translated in full" bolted onto the literals). Off English
the literals are gone and the judgements are described as meanings instead.
store.ClearSummaries becomes ClearAINotes and takes message_analyses with
it: an analysis is cached forever like a summary, so the language change has
to drop it too. Translations stay — they are keyed by target language
already, so a change simply misses and translates afresh.
Verified in the sandbox against the local model: the row saves ai_language,
clears 7281 cached rows, and Russian then comes out of the gist, the
translation, the verdict and its reasons, and a snooze reason (whose
machine-readable timestamp still parses).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
v0.244.1: p Harden email CSS parsing to prevent infinite loops
- Scope email `<style>` blocks individually to isolate malformed CSS - Add `stripPreludeSemicolons` to remove semicolons in selector positions that cause douceur parser hangs - Implement `parseStylesheet` as a single hardened entry point for CSS parsing - Add `cssParseTimeout` as a backstop for unknown parser pathologies - Add `FuzzScopeEmailCSS` to catch future parser issues
v0.244.0
v0.243.0: m Scale and zoom each message body alone, never the reader's chrome
One fixed-width signature table (997px in the wild) made the fit-to-width pass scale the whole conversation — header bands, gist cards, and the thread's other messages shrank with it. Each body now lives in its own .mbfit unit the shell scales independently, so the app's chrome always renders at full size. Reader zoom moves into the same pass: __mbZoom lays each body out at avail/zoom and scales it by exactly zoom× its fit size, replacing WebView.SetZoomLevel, whose page zoom scaled the chrome too — the original complaint. Reflowing mail re-wraps and never overflows; a width-locked body grows past the pane and the page pans horizontally (the html clip flips to auto) with a styled, always-visible scrollbar pinned to the reader viewport's bottom edge — WebKit's hover-only overlay on a per-body scroller sat at the bottom of the message, screens away on a tall email, which read as "no horizontal scrolling". The persisted zoom applies when the shell reports ready, and setZoom snaps float drift back to exactly 1 so reset returns to the no-transform path. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>