v1.0.3
Other Changes
build(deps): Bump the frontend-dependencies group in /frontend with 2 updates -
@dependabot[bot] in #7
Bumps the frontend-dependencies group in /frontend with 2 updates: marked and vite.
Updates marked from 15.0.12 to 18.0.5
Release notes
Sourced from marked's releases.
v18.0.5
18.0.5 (2026-06-04)
Bug Fixes
v18.0.4
18.0.4 (2026-05-19)
Bug Fixes
v18.0.3
18.0.3 (2026-05-01)
Bug Fixes
v18.0.2
18.0.2 (2026-04-18)
Bug Fixes
v18.0.1
18.0.1 (2026-04-17)
Bug Fixes
v18.0.0
18.0.0 (2026-04-07)
Bug Fixes
... (truncated)
Commits
4063c63chore(release): 18.0.5 [skip ci]b55410ffix: parse empty list item with trailing space (#3984)c6e667bchore(deps-dev): bump eslint from 10.4.0 to 10.4.1 (#3986)95f98ecchore(deps-dev): bump@arethetypeswrong/clifrom 0.18.2 to 0.18.3 (#3985)c1a86f0Add Node.js usage example to README (#3983)763f729chore(deps-dev): bump marked-man from 2.1.0 to 2.1.1 (#3978)2cf1fd0chore(deps-dev): bump markdown-it from 14.1.1 to 14.2.0 (#3977)0a2cd54chore(release): 18.0.4 [skip ci]11adb69fix: fix cli not reading stdin (#3967)a37983ffix: cache list indentation regexes (#3969)- Additional commits viewable in compare view
Maintainer changes
This version was pushed to npm by GitHub Actions, a new releaser for marked since your current version.
Updates vite from 8.1.2 to 8.1.3
Commits
578ffb8release: v8.1.37103c3afix(deps): bumpes-module-lexerto 2.3.0 (#22838)1534d36fix(css): inject inlined CSS after the shebang line (#22717)c4acd69fix(ssr): correct stacktrace column position for first line (#22828)2c53054fix: preload css for nested dynamic imports (#22759)- See full diff in compare view
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore <dependency name> major versionwill close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)@dependabot ignore <dependency name> minor versionwill close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)@dependabot ignore <dependency name>will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)@dependabot unignore <dependency name>will remove all of the ignore conditions of the specified dependency@dependabot unignore <dependency name> <ignore condition>will remove the ignore condition of the specified dependency and ignore conditions
Updated frontend/package.json to bump two dependencies in the frontend-dependencies group:
markedfrom^15.0.6to^18.0.5vitefrom^8.1.2to^8.1.3
These changes bring in upstream bug fixes for parsing/CLI behavior in marked and CSS, SSR, dynamic import preload, and dependency-related fixes in vite.
AI usage: Not Likely.
fix: nil-store crash when domReady beats startup with a large mailbox -
@TRC-Loop in #10
Summary
domReadycallsstringSettingto apply the saved theme, which dereferencesa.storewithout checking it's been set yet.startup()opens the store asynchronously; with a small/empty dev database this always finishes before Wails fires the dom-ready callback, but with a large real mailbox (tens of MB, plus a configsync full-restore copy) the callback can win the race, crashing the app on launch with a nil pointer dereference.- Guards
stringSetting/boolSetting/intSettingagainst a nil store, returning the default the same way they already do for a missing setting or a read error.
Test plan
-
go build ./...,go vet ./internal/desktop/... - Reproduced the crash against a real (non-
PELTON_DEV) profile with a large mailbox, confirmed the fix resolves it - Manual smoke test of theme application on a fresh/empty profile (unaffected code path)
Fixed a Pelton startup crash by guarding preference readers against a nil/unopened store when domReady fires before startup() finishes initializing storage. stringSetting, boolSetting, and intSetting now immediately return their provided default when a.store is nil, matching the existing fallback behavior for unset/unreadable settings. Added a storeReady synchronization channel to coordinate startup and the Wails domReady hook, preventing the race entirely.
AI usage: Probably — the changes follow a clear, systematic “guard + readiness channel” pattern, but no explicit AI/CodeRabbit/agentic emoji or marker strings were found in the touched files.
feat: friendly date/time picker -
@TRC-Loop in #11
Summary
- Adds a reusable
DateTimePicker.sveltecomponent (frontend/src/components/common/): a trigger button opening a month-grid calendar, with a scrollable year view (click the month/year label), keyboard navigation, today/clear actions, and an hour/minute control for datetime mode. Built entirely from design tokens, no new dependencies. - Replaces the native
<input type="date">/<input type="datetime-local">inputs with it in:SnoozeDialog.svelte(custom snooze time)SearchBar.svelte(custom date range)SettingsPanel.svelte(download-from date)
- Adds new locale keys across all five languages (
ensource of truth).
Test plan
-
pnpm run check(svelte-check): clean -
pnpm run build: succeeds - Manually tested in the running app (calendar, year view, keyboard nav, both light/dark themes)
Summary
- Added a reusable
DateTimePicker.sveltecomponent with date/datetime modes, month grid, scrollable year view, keyboard navigation, today/clear actions, and time controls. - Replaced native date/datetime inputs in SnoozeDialog, SearchBar, and SettingsPanel with the shared picker.
- Added new date-picker locale strings across English, German, Spanish, French, and Dutch.
AI usage
Very Likely — the PR shows strong signs of AI assistance (new component naming/structure, highly consistent locale additions, and the provided review-trigger context). I’d estimate it was likely used to help, but not necessarily 100% agentic.
feat: schedule messages to send later -
@TRC-Loop in #12
Summary
- Splits the compose window's Send button into a main action plus a caret that opens a menu of friendly scheduling presets (Later today, This evening, Tomorrow morning 8AM, Monday morning) plus a custom date/time option, mirroring the existing snooze dialog's pattern.
- Adds an optional
sendAt(RFC3339) toComposeRequest; the backend validates it's a real future time and passes it through as the outbox's existingNotBefore, taking precedence over the short undo-send delay. - The outbox panel now shows "Scheduled for {time}" (instead of "Queued") for sends more than a minute out, with a cancel button reusing the existing
cancelSend. - New locale strings across all five languages; Go tests added for the scheduling/validation logic.
Test plan
-
go build ./...,go vet ./internal/desktop/...,go test ./... -
pnpm run check: clean - Manually tested scheduling a message via presets and a custom time, and cancelling a scheduled send from the outbox panel
Summary
- Added scheduled send support to compose, including preset times, custom date/time selection, and a split send button.
- Added
sendAtto compose payloads and backend request handling, with validation that scheduled times are future RFC3339 timestamps and precedence over undo-send delay. - Updated outbox rows to show scheduled send times and allow canceling scheduled sends.
- Added shared date preset helpers, localized new UI strings across all supported languages, and covered the scheduling logic with Go tests.
AI usage
Probably — the PR looks AI-assisted (consistent generated-style changes and comments), but not enough to say it was 100% agentic.
fix: detect the Linux system dark theme and match the Windows caption bar -
@TRC-Loop in #16
Two related native-theme fixes.
Linux system dark theme — WebKitGTK never maps the desktop dark preference onto CSS prefers-color-scheme, so "System" theme always resolved to light on Fedora/GNOME. A new SystemColorScheme binding queries the XDG desktop portal (org.freedesktop.appearance / color-scheme) over DBus (the same signal browsers use) and the frontend consults it before first paint, falling back to the media query where it returns "" (macOS/Windows). Build-tagged so DBus only compiles on Linux.
Windows caption bar — the native title bar stayed light under a dark UI. SetWindowTheme now calls WindowSetDarkTheme/WindowSetLightTheme to match the resolved theme (no-op on macOS/Linux).
Builds clean for host and linux/amd64. Needs verification on Fedora (dark) and Windows (dark). Note: the Linux native menu strip/decorations are GTK-drawn and not themeable through Wails; not addressed here.
🤖 Generated with Claude Code
fix: date/time picker and send-later menu positioning under ui zoom -
@TRC-Loop in #13
Summary
- The friendly date/time picker's popover and the compose window's send-later menu are
position: fixed, positioned fromgetBoundingClientRect()coordinates. The app's interface-scale feature applies csszoomon<html>(theme.ts), and underzoom, rect/pointer coordinates stay in unscaled screen pixels while aposition: fixedelement is placed in the zoomed layout space (ContextMenu.sveltealready had to work around exactly this). Raw rect values landed both popovers in the wrong place, which presented as unclickable buttons and clicks appearing to hit unrelated controls underneath. - Extracted the scale-conversion helper
ContextMenu.sveltealready had into a sharedcurrentUIScale()intheme.ts, and applied the same conversion inDateTimePicker'spositionPanel()and Compose'stoggleSendMenu(). - Also swaps the send-later "Custom time…" field from a native
<input type="datetime-local">to the sharedDateTimePickercomponent, for visual/behavioral consistency with the rest of the app (it was the last native date/time input left).
Test plan
-
pnpm run check: clean - Manual verification in the running app pending - this is a fresh fix based on root-cause analysis (matching
ContextMenu.svelte's established pattern), not yet confirmed to fully resolve the reported symptoms end-to-end
This PR fixes zoom-related positioning issues for fixed UI popovers by introducing a shared currentUIScale() helper and using it where screen coordinates need to be converted into zoomed layout space.
- Added
currentUIScale()intheme.tsto read the app’s UI scale from--ui-scale. - Updated
DateTimePickerto measure and place its panel with explicit fixed coordinates, compensating for zoom and clamping to the viewport. - Updated the compose send-later menu positioning to use the shared scale helper and viewport clamping.
- Replaced the send-later “Custom time…” native
datetime-localinput with the sharedDateTimePickercomponent for consistency.
Testing noted: pnpm run check passes; manual E2E verification is still pending.
AI usage: Very Likely. The change set and summaries show strong AI/agent involvement signals (AI-generated summaries, code-review tooling reference, polished automated-style descriptions), though there’s no direct proof it was fully agentic.
feat: guide iCloud setup to an app-specific password -
@TRC-Loop in #15
The iCloud preset in the Add Mailbox wizard now makes it explicit that a regular Apple ID password will not work.
- New
appPasswordUrlfield on provider presets. When set, a yellow warning box (no left border,--warning-bg) renders below the password field: "Don't use your normal password. Use an app-specific password instead." plus a clickable link that opens appleid.apple.com viaBrowserOpenURL. - iCloud's password field placeholder becomes "App-specific password" instead of the generic "Password or app password".
- Localized in all 5 locales.
Verified on macOS.
🤖 Generated with Claude Code
feat: split the Mailbox menu into Mailbox and Mail, move Low Power Mode -
@TRC-Loop in #17
The native "Mailbox" menu was overloaded. It is now split:
- Mailbox menu keeps mailbox-level operations (Sync Now, Add Mailbox).
- New Mail menu holds the message actions (Undo, Mark as Read/Unread, Flag, Archive, Delete). The message-level items start disabled and are only enabled while a message is open, driven by a new
SetMailActionsEnabledbinding the frontend calls as the open message changes. Undo stays enabled (it needs no open message). - Low Power Mode moves out to the View menu.
Verified on macOS.
🤖 Generated with Claude Code
feat: add a mailbox manager to edit and delete accounts -
@TRC-Loop in #18
A new Mailboxes category in Settings lists configured accounts and lets you edit or delete them, plus a "Manage Mailboxes…" item in the Mailbox menu that deep-links to it.
Backend
UpdateAccountbinding: edits display name and server host/ports (email stays immutable; loaded server-side to prevent tampering).DeleteAccountbinding: removes the keyring secret (which lets any running idle loop exit cleanly on its next reconnect via the existing no-credentials path), the cached mail (DB cascade) and the account's attachment files on disk (DeleteAttachmentFilesForAccount).AccountDTOgainsimapPort/smtpPort.
Frontend
MailboxesSection.svelte: per-account edit form (reusing the wizard field labels) and an inline delete confirmation. Refreshes the sidebar on change.- Localized in all 5 locales.
Note: server-setting edits take effect on the next connection (existing idle sessions keep their settings until they reconnect). Verified on macOS.
🤖 Generated with Claude Code
Full Changelog: v1.0.2...v1.0.3