| Age | Commit message (Expand) | Author | Files | Lines |
| 2026-08-10 | feat(ui): let the user choose newest or oldest first | Danilo M. | 2 | -0/+112 |
| 2026-08-10 | feat(ui): step by index, and give thread stepping a second binding | Danilo M. | 1 | -0/+130 |
| 2026-08-10 | refactor(view): stop the view painting, and hit-test the reply count | Danilo M. | 2 | -445/+243 |
| 2026-08-10 | refactor(model): collapse the thread list to a single column | Danilo M. | 1 | -0/+28 |
| 2026-08-10 | feat(view): compute a card's geometry with no painting | Danilo M. | 2 | -0/+236 |
| 2026-08-10 | feat(worker): let a query choose newest or oldest first | Danilo M. | 1 | -3/+25 |
| 2026-08-10 | feat(model): expose the tags a reply has and its thread does not | Danilo M. | 1 | -0/+69 |
| 2026-08-10 | test(mainwindow): select the flagged-tag row through the tree helper | Danilo M. | 1 | -2/+2 |
| 2026-08-10 | feat(ui): scope actions to the selected row kind and name it | Danilo M. | 1 | -0/+210 |
| 2026-08-10 | feat(ui): render a single message when its row is selected | Danilo M. | 2 | -0/+110 |
| 2026-08-10 | feat(ui): mark replies with a thread line, a tint and dimmer text | Danilo M. | 1 | -0/+123 |
| 2026-08-10 | fix(ui): make the expander visible and the reply indent readable | Danilo M. | 1 | -1/+129 |
| 2026-08-10 | feat(ui): load a thread's replies when its row is expanded | Danilo M. | 1 | -0/+41 |
| 2026-08-10 | refactor(view): make ThreadListView a QTreeView for message rows | Danilo M. | 1 | -50/+243 |
| 2026-08-10 | feat(model): resolve action scope from the selected row kind | Danilo M. | 1 | -0/+83 |
| 2026-08-10 | feat(model): expose a thread's replies as child rows | Danilo M. | 1 | -0/+115 |
| 2026-08-10 | refactor(model): convert ThreadListModel to QAbstractItemModel | Danilo M. | 1 | -0/+34 |
| 2026-08-10 | feat(worker): load a thread as a reply tree with per-message depth | Danilo M. | 1 | -0/+52 |
| 2026-08-10 | feat(types): add MessageNode for message rows in the thread list | Danilo M. | 1 | -0/+26 |
| 2026-08-09 | fix(ui): stop a restored splitter position collapsing the message pane | Danilo M. | 1 | -0/+121 |
| 2026-08-09 | fix(config): report an out-of-range message_zoom | Danilo M. | 1 | -0/+29 |
| 2026-08-09 | fix(ui): give Archive its own icon | Danilo M. | 1 | -0/+53 |
| 2026-08-09 | feat(ui): make the toolbar icon size configurable | Danilo M. | 2 | -0/+112 |
| 2026-08-09 | feat(ui): icons on every action, and rename Flag to Important | Danilo M. | 1 | -0/+135 |
| 2026-08-09 | fix(sync): clear the pending-edit count on a cron sync | Danilo M. | 3 | -1/+490 |
| 2026-08-07 | feat(sync): sync only the accounts with unsynced edits | Danilo M. | 3 | -0/+128 |
| 2026-08-07 | feat(ui): add a Maildir overview under Help | Danilo M. | 2 | -0/+141 |
| 2026-08-07 | feat(ui): make Escape deselect the row as well as blank the pane | Danilo M. | 1 | -1/+89 |
| 2026-08-07 | test: pin the offscreen platform, and let the popup test check its own geometry | Danilo M. | 2 | -0/+44 |
| 2026-08-07 | feat(ui): fill the blank message pane with a branded placeholder | Danilo M. | 4 | -1/+303 |
| 2026-08-07 | feat(ui): show each thread's tags under its row | Danilo M. | 2 | -27/+244 |
| 2026-08-07 | fix(ui): tell read threads from unread without relying on bold | Danilo M. | 2 | -1/+140 |
| 2026-08-07 | fix(ui): the message pane follows the desktop theme | Danilo M. | 1 | -0/+121 |
| 2026-08-07 | feat(tags): mark every thread in the view read, in one undoable step | Danilo M. | 1 | -0/+143 |
| 2026-08-07 | feat(sync): the status bar says which account is syncing | Danilo M. | 2 | -0/+264 |
| 2026-08-07 | fix(mime): a body part carrying a Content-Id no longer renders blank | Danilo M. | 2 | -0/+51 |
| 2026-08-07 | fix(tags): the Remove field suggests only tags the selection has | Danilo M. | 1 | -0/+62 |
| 2026-08-06 | fix(ui): one Sync control, and a query bar that looks finished | Danilo M. | 1 | -24/+19 |
| 2026-08-06 | test: stop two tests depending on the machine they run on | Danilo M. | 1 | -1/+21 |
| 2026-08-06 | fix(sync): hold tag edits made during a background sync | Danilo M. | 1 | -0/+199 |
| 2026-08-04 | fix(sync): count unsynced edits as net state, not as writes | Danilo M. | 1 | -0/+93 |
| 2026-08-04 | feat(ui): make Delete a toggle, and expire transient status messages | Danilo M. | 1 | -0/+110 |
| 2026-08-04 | feat(ui): disable Sync during a background sync, and blank the pane on Esc | Danilo M. | 1 | -0/+105 |
| 2026-08-04 | fix(sync): stop a local sync reporting itself as a background one | Danilo M. | 1 | -0/+119 |
| 2026-08-04 | feat(sync): notice syncs this window did not start | Danilo M. | 2 | -0/+181 |
| 2026-08-04 | feat(ui): make multi-select discoverable and stop it opening threads | Danilo M. | 1 | -0/+255 |
| 2026-08-04 | docs: scrub account names from comments, tests and fixtures | Danilo M. | 2 | -7/+7 |
| 2026-08-04 | fix(tags): complete every tag in the list, not only the first | Danilo M. | 1 | -0/+80 |
| 2026-08-04 | feat(tags): add an Edit tags dialog on Ctrl+T | Danilo M. | 2 | -0/+244 |
| 2026-08-04 | feat(sync): show unsynced edits and offer to sync on exit | Danilo M. | 2 | -0/+210 |