maksit-postclient/CHANGELOG.md

20 KiB
Raw Permalink Blame History

Changelog

All notable changes to this project are documented in this file.

The format follows Keep a Changelog and Semantic Versioning.

[Unreleased]

[0.4.1] - 2026-09-27

Create bundle asks for the passphrase once, then opens Save. About lists the company contacts. A Windows upgrade keeps the desktop shortcut that is already there.

Changed

  • Help → About lists Info, Privacy, Security, and Support (info@, privacy@, security@, support@maks-it.com) instead of one personal address.
  • The English, Italian, French, German, and Spanish READMEs describe folder stores, Easy Migration, background sync, spam marks, and the current menus.

Fixed

  • File → Easy Migration → Create bundle… asks for the passphrase and the repeat in one window. The save dialog opens after that window closes.
  • Windows setup keeps an existing desktop shortcut when the checkbox is off on upgrade. Installing the shortcut removes a second desktop icon, including the "(2)" copy.

[0.4.0] - 2026-09-27

Background sync runs at boot with nobody signed in. Easy Migration packs this PC into a passphrase-locked bundle. Marked spam is remembered across mailboxes, and Gmail folder reads stay on the open mailbox.

Added

  • File → Easy Migration writes a .postbundle locked with a passphrase (mail, accounts, secrets, and the shared model folder). Open bundle… restores it into this PC’s Postclient folders and rewrites store paths. The background sync service is not reinstalled.
  • The message search box has an × that clears the text.
  • Settings → Background sync installs a boot-time service (Windows service as Local Service, Linux systemd system unit). It syncs every saved mailbox with nobody signed in. Passwords are copied into the machine store so the service can sign in to the mail servers. Share this account only lets other people on this PC open that mailbox.
  • Mark as spam remembers that message on this PC and teaches every mailbox, even after the message or mailbox is gone. Similar mail is only a hint. Not spam drops that memory and returns the message to Inbox. Moving mail into Junk does not teach the filter. Settings → Indices… → Spam marks… lists what was learned.
  • The meaning-search model lives in the same machine folder (models under ProgramData or /var/lib/maksit/postclient), so every account and the sync service share one download. An existing copy in the user profile is copied across on startup.
  • Layout upgrades live in Upgrades (folders, models, archive files, PST stores). Each one records InstallsOver, the last release that still has the old layout, so it can be removed once that version is no longer supported. SQL schema stays with the archive store.

Fixed

  • Gmail no longer fails with UNSELECT not allowed now. Reading a mailbox that is already open stays on that selection, and folder changes switch by opening another mailbox instead of sending UNSELECT.
  • Gmail OAuth no longer fails with UID FETCH not allowed now. Gmail can leave the selected state while the client still treats the folder as open, so each read selects the mailbox again and retries the fetch once if Gmail has dropped it.
  • Sorting, keyword indexing, and meaning search take turns in small slices. A folder fetch still pauses them so they do not share the mailbox connection.

[0.3.8] - 2026-09-21

HTML mail opens without a WebView2 crash dialog. The message list shows each item's size.

Added

  • Message list Size column (sortable) so heavy mail is easy to find and delete. IMAP uses RFC822.SIZE, POP3 uses LIST sizes, and downloaded .eml files fill in the rest.

Changed

  • Client, Shared, UI, and Tests types live in feature folders with matching namespaces (Mail, Auth, Archive, and the rest).

Fixed

  • Opening HTML mail no longer crashes WebView2 with NavigateToString (large inlined images, or the engine still starting). The reading pane loads from a local file, and WebView failures fall back to text without a crash window.
  • Message list paperclip shows for mail whose attachments are not Content-Disposition: attachment (Outlook inline files, named parts, nested .eml). IMAP now reads BODYSTRUCTURE, opening or indexing a message keeps the flag, and a later folder refresh no longer clears it.
  • Body indexing no longer stalls on a few messages that fail or take too long: those are skipped (or dropped if they are gone from the server) so the rest of the archive can finish. Hung IMAP/POP3 downloads are aborted after 25 seconds and the socket is dropped so the next message can start. Messages larger than 8 MB wait until you open them. When every body is done, the indexing line hides like the meaning index.
  • Search results keep Reply / Move / Delete on the context menu: right-click selects the mail under the pointer, and a folder refresh no longer treats hits from other folders as an empty selection. After delete, the next selection is tracked instead of a leftover or already-removed row.

[0.3.7] - 2026-09-20

Selected mail keeps its preview while the folder list refreshes.

Fixed

  • Selecting a message keeps that mail and its preview when the folder list refreshes; delete and move use the row's folder, and opening mail is not stuck behind a catalog scan.

[0.3.6] - 2026-09-20

Folder unread and retention days sit in separate columns. Sign-in and Gmail trash retention survive a rebuild.

Changed

  • Folder tree keeps unread count and retention days in two fixed columns on the right, instead of collapsing them next to the folder name.

Fixed

  • Empty folder stays enabled on folders that have mail, including while Get Messages is still running.
  • Installing a new build keeps Gmail and Outlook sign-in: leftover secrets and the Identity Hub profile are merged from the previous data folder, and a still-valid mailbox token is used if Hub refresh fails.
  • Gmail [Gmail]/Trash retention days show on the nested folder and permanently delete mail by received date after Get Messages or Run now.

[0.3.5] - 2026-09-20

Index status covers every mailbox, not one folder or one account.

Changed

  • Status bar keyword and meaning index lines show one done / total across all mailboxes, not the folder or mailbox currently being scanned.

[0.3.4] - 2026-09-20

Status bar index lines no longer flash between batches.

Fixed

  • Status bar Indexing / Indexing meaning lines stay put between batches instead of collapsing and flashing.

[0.3.3] - 2026-09-20

First sync paints mail as it arrives, meaning search can use a discrete GPU, and trash, retention, and logs follow typical desktop mail apps.

Added

  • Help → Logs opens a copyable window over the app log folder.

Changed

  • First mailbox sync paints the message list as header batches arrive (newest first). Keyword and meaning indexes wait until the first full folder catalog finishes.
  • Default user data is %LocalAppData%\MaksIT\Postclient. Existing %AppData%\Postclient / %LocalAppData%\Postclient trees are moved on first launch.
  • Status bar index lines show scanned / total and hide when idle. GPU init failures open the copyable error window and fall back to CPU in Auto.
  • Meaning search DirectML prefers a discrete GPU (NVIDIA GTX 1660 Ti and similar) instead of always DXGI adapter 0, and uses sequential DirectML session options.
  • Trash retention counts from the move-to-trash time. Folder tree shows retention days next to unread when days are greater than zero.
  • Window titles drop menu mnemonics and trailing ellipses.

Fixed

  • Select-all delete in Trash, folder context commands while a huge first sync is painting, and Empty on Trash labeled Delete all items.
  • Retention list no longer keeps Gmail labels that were deleted on the server.
  • FatturaPA toolbar kind button matches the View menu. Source view selection no longer wraps the full raw EML.

[0.3.2] - 2026-09-19

Expired folder mail goes to Trash; Trash can be kept forever or purged after a number of days.

Changed

  • Settings → Retention…: folder days (0 = keep forever) now move older messages to Trash after Get Messages, instead of deleting them permanently. The Trash row uses the same days field: 0 keeps Trash forever, a number of days permanently deletes old Trash. The grid shows the action per row.
  • Delete (toolbar, Del, empty folder, delete rules) moves messages to Trash. If Trash is missing, it is created. Deleting from Trash is still permanent. Local stores honor Trash when emptying a folder.

Fixed

  • Local folder stores no longer skip Trash when emptying a folder (messages go to Deleted Items).

[0.3.1] - 2026-09-19

Fixed

  • Reinstalling 0.3.0 over 0.3.0 left the old exe in C:\Program Files\MaksIT\Postclient (Windows setup skips same-version files). This build is 0.3.1 so the installer replaces it. Uninstall 0.3.0 first if a same-version repair still leaves the 16:08 exe.
  • The main window opens from the desktop shortcut. Closing it exits the app. The tray icon no longer hides the window on close. A worker process is not started until import or retention needs it.

[0.3.0] - 2026-09-19

Folder stores replace attached Outlook data files, Gmail/Microsoft sign-in goes through Identity Hub, and folders can expire mail on a schedule.

Added

  • Folder stores replace Outlook data files as mailboxes: File → New store…, Attach store…, Move store…, and Detach store. Import PST copies into a store under %LocalAppData%\Postclient\stores\ (or portable data/stores/). Each IMAP/POP3 account and each store has its own mail.db (FTS + meaning index). Search and move merge or copy across those databases without rebuilding embeddings.
  • Settings → Retention…: per-folder days (0 = keep forever). Older mail is deleted permanently (not Trash) after Get Messages.
  • IMAP/POP3 usage on the account node in the folder tree. Gmail and Microsoft sign-in go through Identity Hub (https://identity.maks-it.com/desktop-login?provider=). Hub JWT is stored in secrets.bin; IMAP uses a short-lived mailbox token (XOAUTH2). Override the Hub origin with POSTCLIENT_IDENTITY_HUB.
  • Folder tree expand/collapse for accounts and nested folders is stored in settings.json.
  • Shift+click and Ctrl+click select several messages or folders. Delete (including the Del key) and drag-move apply to the whole selection.
  • Unexpected errors open a dialog with the full stack trace and a Copy details button. The same report is written under the app log folder.

Changed

  • Folder tree representation is per provider. Gmail keeps [Gmail] labels (P.IVA is one folder), infers the [Gmail] mailbox, and hides All Mail / Starred / Important. PEC and classic IMAP lift INBOX.Drafts / Sent / Trash next to Inbox and do not use Gmail label rules.
  • Status bar Index and Meaning lines are empty when idle (progress and errors only). Quota left the status bar. Help holds Check for updates and About; File keeps Exit.
  • Attached .pst accounts migrate once to folder stores (same mailbox id).
  • Windows setup default install path is C:\Program Files\MaksIT\Postclient (manufacturer MaksIT, product folder Postclient).

Fixed

  • PEC/IMAP Drafts, Sent, Trash, and other standard folders named INBOX.Drafts (and similar) show next to Inbox, not nested under it. User folders such as INBOX.Clients stay under Inbox.
  • Gmail labels with a dot in the name (for example P.IVA) stay a single folder. Hierarchy follows the IMAP delimiter (/ on Gmail, . only under INBOX. on classic servers).
  • Hotmail / Outlook.com IMAP inboxes list messages again: FLAGS-only FETCH rows no longer replace envelopes, Outlook skips PEC extra-header FETCH, and Inbox opens via the special INBOX mailbox.
  • Gmail and Hotmail/Outlook OAuth stay signed in after restart: Hub login waits for the refresh token (not a JWT-only snapshot), expiry is stored as UTC, connect refreshes the Hub session before requesting a mailbox token, and saving a Gmail/Outlook account no longer rewrites auth to password.
  • Identity Hub Google/Microsoft sign-in now picks up the Hub session after the callback page finishes (the WebView no longer waits for you to close a tab). Save Account then stores the Hub tokens.
  • Microsoft Identity Hub sign-in in the embedded WebView: Entra popups no longer replace the Hub page, script polling stays on identity.maks-it.com, and login uses a separate WebView2 profile from HTML mail. Sign-in now checks that Hub can issue a mailbox token.
  • Identity Hub sign-in opens identity.maks-it.com after the WebView adapter is ready (the popup no longer stays on about:blank). Google/Microsoft redirects stay in that view; Hub login uses its own WebView2 data folder so it does not clash with HTML mail. The sign-in dialog is owned by Account Settings when that window is open.
  • Connecting a large Outlook data file no longer freezes the UI: PST open/list/index work runs off the UI thread, catalog walks the store in short chunks, and folder switches show the local archive without waiting on indexing.
  • Large Outlook data files keep readable subjects (MS-PST prefix bytes are stripped) and open by the store item id instead of a subject hash. ANSI .pst files are copied once to a Unicode .postclient.pst beside the original so encoding stays intact.

[0.2.0] - 2026-09-14

On-device meaning search, Outlook data files as mailboxes, rules, extra UI languages, and country packs.

Added

  • Settings → Indices…: keyword index (FTS) and optional meaning index (RAG) with EmbeddingGemma 300M. The ~300 MB ONNX package downloads from Hugging Face (onnx-community/embeddinggemma-300m-ONNX: graph, weights sidecar, tokenizer). GitHub releases do not carry those files. Vectors stay in mail.db on this PC. Device Auto / CPU / GPU (Windows DirectML). Rebuild keyword, rebuild meaning, or repair leftover rows.
  • File → Check for updates… asks GitHub for the latest release and can download the matching package. File → About Postclient matches the WVC210 About card (brand, version, credits, email, license, copyright, maks-it.com).
  • Attach a .pst / .ost as its own mailbox (File menu or account type data file). Unicode .pst is writable (folders, flags, move, delete). An .ost or ANSI .pst is copied to a Unicode .pst on first write. New data file creates an empty Unicode .pst. Right-click an attached store to Detach data file; the file stays on disk. File → Import still copies mail into another account.
  • Settings → Rules: import Outlook .rwz (Rules Wizard) or JSON, export JSON, and edit rules (enable, conditions, move/delete/flag/label). Each rule belongs to an account; a move can target a folder on another mailbox, including an attached data file. A move folder name stays red until it matches that mailbox (name, full path, or last path segment). Run all rules applies them to existing mail. Saved in settings.json. They also run on Get Messages and on import.
  • Compose: Send attachments as ZIP packs dropped files into one archive before SMTP. A prompt asks for the ZIP name (from the subject) and an optional password. Attach files by dragging them onto the compose window.
  • View → Language: Français, Deutsch, and Español (English and Italian were already there).
  • Settings → Features: country packs for certified-mail UI (Italy PEC/FatturaPA/fascicolo, Europe eIDAS REM, France/Germany/Spain/Switzerland evidence labels). Ordinary IMAP stays on. Header checkboxes turn a whole pack on or off.

Fixed

  • PEC/REM delivery marks (✓ / ✓✓) on the list after Get Messages. The archive reload dropped DeliveryStatus; ricevute and Sent now restore it from daticert tipo and the sent-receipt store.
  • Search box stays responsive: typing no longer waits for FTS or EmbeddingGemma. Results refresh after a short pause, on a background thread.
  • Selecting one or more messages enables Delete, Move, Flag, and mark read/unread again after drag-and-drop or a list refresh. Opening a message no longer locks the toolbar.
  • Move and delete drop keyword and meaning rows for those messages; the meaning indexer wakes so destination mail is re-indexed.
  • Indices window stays usable while the meaning model downloads; Download model is disabled when the files are already in the models folder.
  • Settings → Rules: Import rules… is the same button for this app’s JSON export and for Outlook .rwz.

Changed

  • Keyword/body indexing processes all messages in one queue (like the meaning index), not folder by folder. The status bar shows Indexing N left instead of a folder name.
  • Toolbar layout control is one toggle: list above reading vs three columns.
  • Settings menu: Indices… (was Semantic search) manages the keyword index and the meaning index together.
  • Meaning-model download is Hugging Face only (public onnx-community repo). GitHub is not a source for the weights.
  • After SMTP send, Sent reconciles gestore ricevute only for PEC/REM accounts (presets, or IMAP/POP3 with mailbox kind PEC/REM). Ordinary IMAP/Gmail/Outlook just reports sent. Leftover “Waiting for ricevuta” marks from ordinary mailboxes are dropped.
  • Account Settings: IMAP/POP3 accounts set mailbox kind (ordinary, Italian PEC, EU REM) so a custom-domain gestore still waits for ricevute. Presets keep their kind; Gmail, Outlook, and PST stay ordinary.

[0.1.0] - 2026-09-13

First release of Postclient: a desktop mail client for Windows, Linux, and macOS (Apple Silicon and Intel).

Added

  • Avalonia / .NET 10 client with English and Italian UI, list-above-reading or three-column layout, HTML (OS web engine), plain text, raw source, and FatturaPA views.
  • IMAP (full folder tree), POP3 (Inbox only), and SMTP; encryption Auto, SSL/TLS, or STARTTLS; several mailboxes at once.
  • Provider presets: Gmail and Microsoft 365 (OAuth2 / XOAUTH2), Italian PEC (Aruba, InfoCert Legalmail, Namirial, Poste Italiane, Register.it, Libero), Intesi Group, and generic IMAP/POP3.
  • Passwords and OAuth refresh tokens stored next to settings (DPAPI on Windows, file mode 600 on Linux/macOS), never in settings.json.
  • Italian PEC: unwrap postacert.eml / daticert.xml; Type column PEC/RIC; delivery from gestore ricevute (accettazione, avvenuta-consegna, failures). Avvenuta consegna is deposit in the certified mailbox, not a read receipt.
  • eIDAS REM: ETSI evidence mapped onto the same delivery column (accepted, delivered, retrieved, failed). S/MIME is shown as digitally signed, not as PEC or REM.
  • After SMTP send, Sent reconciles gestore ricevute by Message-Id, daticert.xml, and subject prefixes. Desktop notices for new PEC, ricevute, and REM.
  • Local SQLite archive of the whole IMAP folder (not a last-N window), FTS of subject, body, attachment text, and practice labels; export copies mail.db and .eml on this PC only.
  • Practice labels on this machine; IMAP QUOTA from the gestore in the status bar; From picker bound to a connected mailbox.
  • Conversation grouping in the folder list (Message-ID / In-Reply-To / References, indent, no conversation pane). Date column shows local date and time.
  • Print / PDF / selected .eml fascicolo; save all attachments as ZIP; FatturaPA XML preview (parser, not AI).
  • Import EML, Thunderbird mbox, and Outlook PST/OST (no Outlook install).
  • Self-contained win-x64 portable zip and Windows setup exe, Linux Flatpak via WSL Debian (no .NET SDK on the user PC).
  • Apple-style squircle product icon (envelope glyph, MAKS.IT cyan→navy) for the exe, window chrome, tray, WiX setup, and Flatpak. Not the brand origami M.
  • Unsigned osx-arm64 and osx-x64 DMGs attached when a GitHub Release is published (first launch: Open from the context menu).