Repository navigation
Releases: arqueon/dankmail
Release list
DankMail 0.3.12 — Drafts, rich compose with attachments/links, and reader improvements
Highlights
- Drafts section & draft editing: added a Drafts view in both the main
TriageWindowfilter bar and thedankmailUnreadDankMaterialShell companion popout, backed by local persistence (drafts.json) and Gmailusers.draftssync (drafts.list,drafts.save,drafts.delete,ui.editDraft). - Rich composer, URL links,
Cc/Bcc, and file attachments: addedCc / Bccrecipient fields, a formatting and URL link insertion toolbar, live rich-text preview,multipart/mixedbase64 attachments +multipart/alternativeHTML link/formatting generation inmailmime, and a nativeTheme.*file picker modal (FilePickerModal.qml+fs.listIPC). - Reader rendering & reliable link opening: unwrap Gmail redirect URLs (
google.com/url?q=...), merge soft-wrappedlabel <https://...>plain-text links, linkify bare domains and<email@domain>addresses, support multi-line*...*emphasis and nested sublists inBodyFormatter.js, and open links reliably viaui.openUrl(xdg-open) +TapHandler/HoverHandler. - Thread message selector & copyable addresses: added a horizontal message selector for multi-message threads, RFC 2047 header decoding, and interactive copyable address chips for sender (
From) and recipients (To,Cc) plus Copy all emails.
DankMail 0.3.11 — Resumable sync, Sent and companion fixes
DankMail 0.3.11 preserves progress when synchronization is interrupted and adds a paginated Sent view. The desktop app and DMS companion remain part of the same project.
- Resume Gmail and Microsoft synchronization from persisted checkpoints after quota limits or interruptions; commit downloaded data and continuation state together.
- Browse recent Sent conversations in pages of 25, with account filters and correct outgoing message dates and bodies.
- Recover spam from individual or multi-selection actions, and route mixed-account selections to their respective mailboxes.
- Read structured message text with paragraphs, lists, quotations, tables and code, without loading remote images or scripts.
- Clear stale DMS companion rows on disconnection, reconnect its event subscription, explain request failures, and label action buttons.
- Include Spanish companion translations in local and AUR installations, and document DMS/Expressive behavior and user-copy precedence.
Validation: full Go suite, go vet, build, 24 JavaScript tests, targeted Go race tests, Qt 6 QML parsing, and successful CI. Live Gmail validation loaded 25 Sent conversations and confirmed a healthy completed synchronization.
Microsoft OAuth setup remains a separate prerequisite; fixture tests do not establish that a personal Microsoft account is connected. Remote search and archive-history browsing remain Gmail-only.
DankMail 0.3.10 — Archived history
Fixes Archived showing only a few starred conversations when the rest of Gmail's archive was not cached.
- Opening Archived loads Gmail history, including unstarred conversations.
- Load older archived mail retrieves the next 25 conversations; labels follow the system language.
- Quota interruptions preserve downloaded results and resume from the unfinished thread.
- Recently browsed history survives retention cleanup and monitored-folder resyncs, then expires under the normal cache policy.
- Browsing does not change message state or trigger new-mail notifications. Other providers explicitly identify cached-only archive views.
Verified with unit/integration tests, build/vet/i18n, an isolated Quickshell render and two pages from a live Gmail account. The user-local installation is updated. The cache schema adds one nullable history_loaded_at timestamp.
DankMail 0.3.9 — Archived mail
- Add Archived / Archivados / Arquivados alongside the existing quick filters, with the newest message first. Labels follow the system language or
DMAIL_LANG. - Filter archived mail by account and search within it. Spam, trash, drafts and snoozed conversations are excluded; the view covers locally cached mail.
- Put quick filters in a separate wrapping row to keep the search field accessible.
- Prevent newly trashed conversations from appearing as archived before provider synchronization, and restore labels when an operation fails.
- Include the DMS companion visual and translation improvements made since 0.3.6. App and companion now share version 0.3.9.
Validation: full Go build, vet and test suite, QML request/filter tests, translation checks, isolated Quickshell render, and GitHub CI.
DankMail 0.3.6
DankMail 0.3.6 improves local search in large cached mailboxes and ships the Dankmail Unread companion as a separate AUR package.
- Index cached subjects, snippets, senders and message bodies with SQLite FTS5 trigram indexes while preserving literal search semantics.
- Discard superseded results immediately when the query or filters change, coalesce pending searches, and recover pending requests after reconnecting.
- Keep existing list rows stable and load results in pages of 200 with a Load more control.
- Add the optional
dms-shell-plugin-dankmailAUR package. The companion now follows the app release version and retains its existing widget behavior.
Install dankmail or dankmail-git for the app, and optionally dms-shell-plugin-dankmail for the DankMaterialShell companion. Enable the companion in DMS Settings → Plugins and add it to the bar. Existing user-installed copies take precedence over the system package.
After upgrading, restart the daemon with systemctl --user restart dmail (or dmail restart) and close/reopen the triage window. The first startup builds search indexes from the local cache in a transaction and needs additional time and disk space. Very short queries still use a scan. See search behavior and validation.
Validation: complete Go and JavaScript suites, translations, vet, CGO-disabled build, repository race tests, and real QML interface checks against a synthetic socket. Migration, literal search semantics, updates/deletes/rollback, stale responses, pagination and reconnect are covered. Stable, git and companion AUR packages were built and inspected locally. CI passed for the merged fix and the release commit.
Fix implemented in #8 for #7. The large-mailbox performance measurement uses synthetic data, not a production mailbox.
DankMail v0.3.5
Gmail quota cooldowns now survive account reloads. Long waits return immediately and are scheduled for later, so a throttled account does not hold up manual all-account synchronization or remote search.
- Keep the weighted quota budget and server cooldowns per account for the lifetime of the daemon.
- Bound each inline admission wait to 3 seconds and cumulative retry cooldowns to 5 seconds per operation, across all pages and threads.
- Honor longer Retry-After values when scheduling both background synchronization and queued actions.
- Record cooldowns from failed writes without replaying writes in the HTTP retry layer.
- Continue manual sync and remote search with other accounts and report failures afterwards.
Validation: full Go test suite, i18n check, go vet, build, and race tests covering Gmail, synchronization, and command handlers. Regression tests cover a one-hour Retry-After, provider reconstruction, page-wide retry budgets, independent accounts, and queued retry scheduling.
The quota state is held in memory and resets when the daemon exits. Deferred or interrupted synchronization resumes from the last completed durable cursor; incomplete full snapshots are never applied.
Restart the daemon after upgrading: systemctl --user restart dmail or dmail restart.
DankMail v0.3.4 — Gmail quota and OAuth recovery
Gmail synchronization now paces requests by quota cost and retries temporary limits at the failing read instead of restarting the whole import. Large initial or overdue syncs can take several minutes while staying within the local budget.
- Use a shared per-account budget of 2,400 quota units/minute, leaving room below Gmail's 6,000-unit limit for another desktop.
- Retry quota-specific 403/429 and selected server errors with bounded backoff, jitter, cancellation and Retry-After support. Keep fetched pages and threads in memory during retries; sends are never replayed by this layer.
- Serialize automatic and manual account syncs, including full-sync cursor resets.
- Renew a rejected OAuth access token once, preserve refresh-token updates, and keep transient token failures distinct from revoked authorization.
Existing OAuth credentials and local caches are preserved. No new consent is required unless the authorization was actually revoked. Progress is retained during retries, not across daemon restarts.
Validation: full Go suite and i18n checks, go vet, release build, and race tests for Gmail, OAuth and sync. Regression tests cover quota pacing, backoff, Retry-After, cancellation, retry bounds, failed-thread resumption, non-replayed sends and serialized cursor resets.
v0.3.3
What changed
- Show all starred threads in Dankmail, including messages outside the inbox.
- Sync Gmail's
STARREDlabel during full syncs. - Migrate existing Gmail accounts automatically with a one-time cursor-version resync.
- Add Inbox and Starred views to the DankMaterialShell popout (plugin v0.2.1).
Existing Gmail accounts require no manual database reset; the daemon imports historical archived stars on the first sync after upgrading.
v0.3.2
Fixed
dmail restartnow delegates tosystemctl --user restart dmail.servicewhile the systemd user unit is active. Previously a clean stop was final underRestart=on-failureand the self-spawned replacement escaped the unit, leaving a dead service plus an orphan daemon running the old binary — typically right after a package upgrade.
Packaging
- AUR packages (
dankmail,dankmail-git) now print apost_upgradereminder to restart the daemon after updates.
🤖 Generated with Claude Code
dankmail v0.3.1
OAuth account setup
- Adds Outlook / Microsoft 365 as a first-class Microsoft Graph OAuth provider in the graphical account wizard.
- Removes the obsolete password-based Outlook IMAP preset and its dead support link.
- Aligns the Microsoft desktop callback with
http://localhost/callbackand documents the required delegated Graph permissions. - Completes the Gmail setup guide for Gmail API, People API, and the four scopes actually requested.
Recipient autocomplete
- Quick Forward now searches Google People contacts and learned mail correspondents, including comma-separated recipients.
Validation
Go tests, vet, i18n checks, QML lint, and OAuth callback regression tests pass.