Skip to content

Releases: arqueon/dankmail

DankMail 0.3.12 — Drafts, rich compose with attachments/links, and reader improvements

Choose a tag to compare

@arqueon arqueon released this 16 Oct 04:04
ef77f9b

Highlights

  • Drafts section & draft editing: added a Drafts view in both the main TriageWindow filter bar and the dankmailUnread DankMaterialShell companion popout, backed by local persistence (drafts.json) and Gmail users.drafts sync (drafts.list, drafts.save, drafts.delete, ui.editDraft).
  • Rich composer, URL links, Cc/Bcc, and file attachments: added Cc / Bcc recipient fields, a formatting and URL link insertion toolbar, live rich-text preview, multipart/mixed base64 attachments + multipart/alternative HTML link/formatting generation in mailmime, and a native Theme.* file picker modal (FilePickerModal.qml + fs.list IPC).
  • Reader rendering & reliable link opening: unwrap Gmail redirect URLs (google.com/url?q=...), merge soft-wrapped label <https://...> plain-text links, linkify bare domains and <email@domain> addresses, support multi-line *...* emphasis and nested sublists in BodyFormatter.js, and open links reliably via ui.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

Choose a tag to compare

@arqueon arqueon released this 03 Oct 01:16

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

Choose a tag to compare

@arqueon arqueon released this 30 Sep 07:55
0467f16

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

Choose a tag to compare

@arqueon arqueon released this 30 Sep 04:46
  • 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

Choose a tag to compare

@arqueon arqueon released this 28 Sep 01:49

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-dankmail AUR 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

Choose a tag to compare

@arqueon arqueon released this 17 Sep 21:07

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

Choose a tag to compare

@arqueon arqueon released this 17 Sep 20:11

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

Choose a tag to compare

@arqueon arqueon released this 02 Sep 20:09

What changed

  • Show all starred threads in Dankmail, including messages outside the inbox.
  • Sync Gmail's STARRED label 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

Choose a tag to compare

@arqueon arqueon released this 18 Aug 20:58
5ea342c

Fixed

  • dmail restart now delegates to systemctl --user restart dmail.service while the systemd user unit is active. Previously a clean stop was final under Restart=on-failure and 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 a post_upgrade reminder to restart the daemon after updates.

🤖 Generated with Claude Code

dankmail v0.3.1

Choose a tag to compare

@arqueon arqueon released this 17 Aug 23:34
c116466

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/callback and 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.