QuickMail v0.8.0
QuickMail v0.8.0 Release Notes
Download
Two options are available for v0.8.0:
| Download | When to use |
|---|---|
QuickMail-win.msi — Windows installer |
Recommended for most users. A standard setup wizard with license agreement; installs per-user with no elevation required, adds the WebView2 Runtime if missing, and enables automatic updates. |
QuickMail.exe — standalone portable executable |
No installation required. Copy it anywhere and run. |
Both downloads include the .NET 8 runtime — you do not need to install .NET separately.
This release introduces theming and a visual design system: light and dark themes, app-wide text scaling and font choice, and a Theme Manager for creating, sharing, and hand-editing themes. See the Themes section of the User Guide for the full walkthrough. It also introduces automatic updates — installed copies of QuickMail now keep themselves current, with you in control throughout. And it adds an always-available Tools menu and in-app bug reporting that doesn't require a GitHub account.
New: Automatic updates
Starting with this release, QuickMail keeps itself up to date. When a newer version is
available, the installed app downloads it quietly in the background and installs it the next
time you exit and reopen QuickMail — no download page, no installer to run, no security
warnings. The Help menu continues to show whether you are current, offers a Restart to
Update option when a new version is waiting, and the first start after an update confirms
what was installed. You stay in control throughout: automatic updating and its notifications
can each be turned off in Settings → Advanced, with manual updating always available. See
the Installing and Updating section of the User Guide
for the full walkthrough.
One-time step for existing installed users
This release uses a new installer, so getting onto the automatic-update track requires one
manual reinstall:
- Uninstall your current QuickMail from Settings → Apps. When the uninstaller offers to
delete user data, choose No. - Download and run QuickMail-win.msi from this release page. A standard setup wizard
walks through the license and installation. - Start QuickMail. All your accounts, settings, contacts, rules, templates, saved views, and
cached mail are exactly as you left them.
Your data is safe throughout: settings and mail live in a separate location the installer
never touches, and passwords stay in Windows Credential Manager. After this one reinstall,
all future updates are automatic.
Notes on the new install:
- QuickMail now installs per-user (no administrator prompt). The previous option to install
for all users is gone. - A Start Menu entry is created. The first time QuickMail starts, it asks whether to add a
desktop shortcut; the choice can be changed anytime in Settings → General. - Uninstalling now asks whether to also remove your data — and unlike before, choosing Yes
also clears QuickMail's saved passwords from Windows Credential Manager.
Portable exe users
Nothing changes. QuickMail.exe remains a single-file download that you update manually;
the Help menu still tells you when a new version is available.
New: Themes
QuickMail now has a color theme, chosen in Settings → Appearance. Six themes ship built in:
- System — follows the Windows light or dark setting.
- Parchment (the new default light look) — warm off-whites with a muted steel-blue accent.
- Parchment Dark — the dark counterpart.
- Ember (warm), Fjord (cool), and Heather (muted) — light variants with different accent and selection colors.
Theme changes apply immediately — no restart. An open message re-renders in the new colors without moving focus.
Understanding a theme without seeing it
Every theme carries a plain-language Theme description — a written account of its overall look, its fonts, and each individual color together with exactly where that color is used (message list, links, selection, focus outline, error and status text, and so on). Color values are translated into words like "dark muted blue" or "warm off-white," with the nearest well-known color name for reference. The Theme Manager shows this description for whichever theme is selected, in a read-only text box you can read or hear at your own pace, so themes can be understood and compared without seeing the colors.
New: Text size, font, and vision settings
The Appearance tab also gives you:
- Text size — scale all app text using fixed stops at 100%, 110%, 125%, 150%, 175%, and 200%, independent of Windows display scaling. The chosen size flows through every window.
- Font — override the app font, or keep the theme's own font.
- Always underline links — underline links everywhere, not just by color.
- Thicker keyboard focus indicators — widen the focus outline for easier tracking.
- Apply theme colors to message content — override a sender's hard-to-read colors and fonts in the reading pane with your theme's colors. Off by default, so messages render as their sender intended unless you turn it on.
New: the Theme Manager
Choose Manage Themes… from the new Tools menu, or Manage Themes from the Command Palette (Ctrl+Shift+P), to open the Theme Manager. It is a separate, non-blocking window, so you can leave it open and try themes against real messages. From the theme list, press Tab to reach the actions:
- Apply — switch to the selected theme immediately.
- Duplicate — copy a theme as a starting point for your own.
- Rename / Delete — for your own themes.
- Export… — save a theme as a shareable
.quickmailthemefile. - Import… — load a
.quickmailthemefile. If a file has a problem, QuickMail tells you exactly what is wrong (for example, which color value is not a valid hex color). - Open themes folder — open the folder where your themes are stored, for hand-editing.
A theme is a plain, documented JSON text file: duplicate a built-in theme, open the themes folder, and edit the copy in any text editor. Any color you leave out is filled in from the built-in Light or Dark theme.
The Command Palette also offers Next Theme and Previous Theme, and a Theme: [name] command for each theme. None of these carry a default shortcut — assign one in Settings → Keyboard if you want direct access.
New: the Tools menu
The main window now has an always-available Tools menu, grouping the commands used less often than day-to-day mail actions: Manage Themes…, Next Theme, Previous Theme, Address Book… (Ctrl+Shift+B), Rules… (Ctrl+Shift+L), and Command Palette… (Ctrl+Shift+P). Address Book, Rules, and Command Palette moved here from their previous menus, so each command now lives in exactly one place; their keyboard shortcuts are unchanged.
Windows High Contrast
When Windows High Contrast is on, QuickMail steps aside entirely — every color comes from your Windows High Contrast palette, QuickMail's own control styling is withdrawn so the system's High Contrast controls take over, and the reading pane defers to the browser's forced-colors handling. Your theme choice is remembered and returns automatically when High Contrast is turned off. Font and text-size settings continue to apply.
New: Report a Bug
Help → Report a Bug opens a report window without requiring a GitHub account. Fill in a summary and, optionally, what happened, what you expected, and steps to reproduce — a Preview area always shows exactly what will be sent. QuickMail submits the report directly to GitHub Issues using its own narrowly-scoped, app-owned credential, and shows a link to the created issue on success. If sending isn't possible (no credential available, or the request fails), Copy report and open GitHub copies your report to the clipboard and opens a pre-filled issue page in your browser instead. By deliberate design, the only things sent are what you type plus a short Environment section of non-sensitive details — currently the QuickMail version, your Windows version, the .NET runtime version, the active theme, the current view (message grouping, plus the saved view name if one is applied), and the message sort order. No message content, email addresses, account settings, credentials, or log file content is ever collected — and the Preview shows the whole report so you can confirm before sending.
Accessibility
- The update dialogs are small native dialogs: focus lands on the primary action, Escape always dismisses, and closing them returns focus to the message list. A found update is announced once; the background check itself is silent when you are already current.
- Theme switching never moves focus, collapses trees, or clears selection; the only thing that re-renders is the open message.
- Every custom announcement continues to respect your Screen Reader Announcements settings; theme and High Contrast changes are announced as status, and Theme Manager outcomes as results.
- Every built-in theme meets the WCAG contrast policy (4.5:1 for text, 3:1 for indicators and status colors) — enforced automatically by a unit test, so a theme that would fail contrast cannot ship.
- The Report a Bug preview is a genuine editable
TextBox(edits blocked in code, not by making it read-only), so arrow-key navigation through the preview behaves the same as any other text field instead of losing character-by-character review. Its window title reads and announces as "Report a Bug - QuickMail".
Thank You to Contributors
Thank you, as always, to everyone who contributes to QuickMail through code, bug reports, feature suggestions, and other feedback.
Internal
Automatic updates (issue #156, PR #200)
- Velopack 1.2.0 replaces the Inno Setup installer.
App.xaml.csdeclares an explicitMainthat runsVelopackApp.Build().Run()before WPF initializes —vpk packverifies this via IL inspection and refuses to pack without it (App.xamlcompiles asPage). UpdateCheckServicebranches by runtime: installed copies useUpdateManager+GithubSource(silent background download; applied on exit, or immediately via the Restart to Update dialog, which is cancellable — dismissing the dialog retracts a restart waiting on a slow download); the portable exe keeps the original GitHub API notification-only check. TheAutoUpdatesetting switches installed copies to notification-only.- The shipped installer is the WiX 5 MSI (
vpk --msi) with welcome/license/conclusion pages; Velopack's one-clickSetup.exeand-Portable.zipare deliberately not published.--framework webview2preserves WebView2 install-on-demand;--instLocation PerUserkeeps updates elevation-free (per-machine installs are deliberately unsupported). - Desktop shortcut is owned by the app (first-run offer + Settings → General checkbox, targeting the update-stable
current\QuickMail.exepath); uninstall offers data removal via a detached prompt fromOnBeforeUninstallFastCallback(hook processes are killed after 30 seconds), including Credential Manager cleanup, with diagnostics in%TEMP%\quickmail-uninstall.log. - Release workflow: the tag must equal the csproj
Version,AssemblyVersion, andFileVersion;vpk download githubenables delta packages from the second release onward;fail_on_unmatched_filesfails the release if expected assets are missing. A--updateFeed <path>startup flag allows full offline update-cycle testing against localvpk packoutput (seedocs/INSTALLER.md). - An independent multi-angle review of the PR confirmed 10 findings, all fixed before merge — including a cancellable restart path, accurate failure messaging when a download fails, and elimination of a phantom "update installed" notice when portable and installed copies share a profile. Full test suite passing; complete update cycles verified live against a local feed.
Theming system (issue #177, PR #179)
- Twenty-six semantic color tokens plus typography and focus-thickness are published as
Theme.*DynamicResources;Theming/ThemeKeys.csis the single source of truth for their names. ThemeServicepublishes tokens by atomically replacing one merged dictionary rather than mutating in place, so DynamicResource listeners never see a transient missing-resource state. Under High Contrast every token is rebuilt from liveSystemColorsandStyles/ThemedControls.xamlis withdrawn so WPF's built-in High-Contrast templates return. The service isIDisposable;App.OnExitdisposes it and detaches the static OS-change handlers.ThemeStorekeeps built-ins as embedded resources and user themes as one JSON file each under{profile}\themes\; corrupt files are skipped with a log line and never block startup. Parsed user themes are cached and invalidated on save/delete.- The reading pane and compose preview consume theme colors through a
--qm-*CSS-variable bridge; with no theme CSS the documents fall back to CSS system colors, so no-theme rendering is unchanged. Helpers/ThemeDescriber.csgenerates the plain-language Theme description: it converts each hex color to a spoken descriptor (lightness, chroma-gated saturation, hue) plus the nearest documented CSS/X11 color name, and lays out where each token is used.- The
ThemeRegressionGuardtest rejects new hardcoded colors or numeric font sizes inViews/,Controls/, andStyles/XAML outside a reviewed allowlist, so future work keeps everything token-driven. - Two independent code reviews (logic and UI/accessibility) were run against the branch; findings were fixed, including a case where applying a theme from the Theme Manager could be silent when the selection resolved to the palette already showing. Full test suite: 1017/1017 passing.
- Post-merge screenshot review of the dark theme found three controls with a local
StylelackingBasedOn, which silently discarded the themed background/foreground and reverted to WPF's default light chrome: the message list and the Conversation/Sender/Recipient tree views (severe — white background made dark-theme Conversation view unreadable), Rules Manager text boxes and dropdowns (moderate), and the compose formatting toolbar (minor). All now chainBasedOnto the themed implicit or keyed styles. - Theme files are a shareable, attacker-influenced artifact (Export/Import, dropped into
{profile}\themes\), so their parse path was hardened per issue #183:fontFamily/monoFontFamilyare validated to plain family names (a raw WPFFontFamilystring allows#to meanbaseUri#familyName, which could otherwise point the font loader at an attacker-controlled file/UNC/pack URI); theme files over 256 KB are rejected before being read; andPathForIdasserts the resolved path stays a direct child of the themes folder as defense-in-depth against path traversal.
Bug reporting (issue #186)
IBugReportServicesubmits directly to the GitHub Issues API using an app-owned, repo-scoped (Issues:Writeonly) token stored through the existingICredentialService— no user GitHub sign-in.BuildFallbackUrlusesUri.EscapeDataString(correct percent-encoding) and truncates the body so the pre-filled fallback URL can't exceed whatShellExecutewill open; the full report is always available via the clipboard regardless.ReportBugViewModelcollects only what the user types plus a fixed Environment block (QuickMail version, Windows version, .NET runtime version, active theme, current view/grouping, and message sort — captured as aBugReportContextsnapshot when the window opens). It never readsquickmail.log, an explicit product decision recorded indocs/planning/bug-reporting-pm-dev-spec.md, not an oversight.ReportBugWindowis opened modeless (.Show(), not.ShowDialog()) per this codebase's modal-dialog rules, since it has editable text fields and can be opened over a window with a live WebView2 reading pane. Its event subscriptions use named handlers soOnClosedcan unsubscribe all of them, preventing a Send still in flight from touching the window after it closes and is disposed.
Version
- Bumped to
0.8.0(Version,AssemblyVersion,FileVersion).