Skip to content

Releases: jsnjack/mailbox

v0.248.0

Choose a tag to compare

@jsnjack jsnjack released this 02 Oct 13:33
m Prefetch Inbox message bodies in the background

v0.247.5

Choose a tag to compare

@jsnjack jsnjack released this 30 Sep 16:55
p Require received history before marking a thread replied

v0.247.4: p Fix builds with WebKitGTK 2.54 headers

Choose a tag to compare

@jsnjack jsnjack released this 30 Sep 13:12
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

Choose a tag to compare

@jsnjack jsnjack released this 23 Sep 11:15
p Fix Gmail quota pacing, resume sync batches, and expose error details

v0.247.1

Choose a tag to compare

@jsnjack jsnjack released this 21 Sep 15:04
p Simplify compose recipients and expose AI draft and refine

v0.246.1: p Offer Belarusian as an AI language

Choose a tag to compare

@jsnjack jsnjack released this 31 Aug 15:02
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

Choose a tag to compare

@jsnjack jsnjack released this 31 Aug 14:54
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

Choose a tag to compare

@jsnjack jsnjack released this 28 Aug 13:40
- 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

Choose a tag to compare

@jsnjack jsnjack released this 27 Aug 15:44
m Make email search dismissible and explicit

v0.243.0: m Scale and zoom each message body alone, never the reader's chrome

Choose a tag to compare

@jsnjack jsnjack released this 25 Aug 12:08
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>