Releases: hnsstrk/vergissmeinnicht-kde
Release list
v0.4.0
Fixed
-
The sync server URL no longer disappears from the configuration (#38).
The eater was the app's own test hooks:--test-settings-uiand
--test-secretsblanked the URL (and the credentials) during cleanup,
and--test-flowkept a window between blanking and restoring it —
any such run against the liveXDG_CONFIG_HOMEdestroyed the real
configuration, while the credentials often survived because the Secret
Service was unreachable in headless runs. All three hooks now restore
the previous values, the flow's blank/restore window is closed, and
every--test-*run refuses to start (TESTGUARD-FAIL, exit 2)
unless bothXDG_CONFIG_HOMEandXDG_DATA_HOMEpoint away from the
default locations. A new--test-dialog=settings-syncregression
guard proves the sync page shows the stored URL and that saving keeps
it; config round-trip tests cover the real load path for every
settings field. -
The model list no longer survives a provider switch, and the AI
settings page no longer reports success for a configuration that
cannot work (#42). Switching the provider or editing the base URL now
invalidates the fetched model list together with the reachability
line (previously both kept showing the old endpoint's models and a
green "backend reachable", and saving in that state produced a
provider/model pair that failed only at the first real request). A
provider switch also clears the selected model — provider model names
never overlap — while a URL edit keeps it, since e.g. a port change
under "custom" usually leaves the model valid. The page then quietly
refetches the list from the new endpoint without persisting anything
(a newstartAiListModelsPreviewinvokable builds a throwaway client
from the unsaved field value); failures appear only in the
reachability line. The preview never reads the stored API key — the
saved key belongs to the saved endpoint and must not travel as a
Bearer token to a freshly typed foreign address (verified down to the
wire: the preview request carries noAuthorizationheader). A
backend that requires the key even for its model list answers 401/403;
the reachability line then explains that the preview deliberately
sends no key and that "Load models" after saving fetches the list with
it. OpenRouter's/v1/modelsanswers without an API key (measured:
HTTP 200, 410 models), so the correct list appears right after the
switch, before a key is entered. -
Dictation is no longer hidden when no AI model is configured (#41): the
Quick Capture button row no longer sits behindaiConfiguredas a
whole. The microphone follows the dictation probe, the AI button the
model configuration, and whichever strand is not set up shows as a
disabled button instead of disappearing — the microphone's tooltip
carries the probe's precise reason (new bridge property
dictationUnavailableReason, previously those messages were computed
but unreachable), the AI button's tooltip a fixed sentence. Disabled
controls receive no hover events in Qt Quick, so the tooltips hang on a
wrapping item with aHoverHandler. -
AI interpretation no longer overwrites fields the user filled in (#43):
applyDraft()now applies the rule the title always had to all six
fields — draft fields the model leaves empty keep their current values,
fields the model fills still replace them. A model that says nothing
about a field has not decided anything about it. An explicitly emptied
field is deliberately not distinguishable from an absent one: the JSON
draft schema cannot express "deliberately none", and no use case asks
for it. -
The whisper.cpp dictation backend now works with a GPU build's plain
binary path (#37): the binary's directory is prepended to the child
process'sLD_LIBRARY_PATH(ROCm/HIP builds keeplibwhisper.soand
libggml*.sonext to the binary; the app's own environment is left
untouched), and the availability probe launches the binary once with
--help, so a binary that cannot resolve its libraries reports the
dictation chain as unavailable instead of failing after the user has
already spoken. The probe run is bounded by a two-second deadline — a
binary that hangs (stuck GPU initialization, dead network mount) is
terminated and counts as unavailable instead of freezing the app. -
Combo box popups on the settings pages could cover the whole settings
window (UI-7, #34, customer report with 15 installed models): the
Kirigami AddonsFormComboBoxDelegatesets no height limit on its
internal combo box popup, and once the list grew taller than the space
below the field, Qt's popup positioner shifted it over the entire
window. All settings combos now share a delegate that caps the popup
at roughly ten entries (never taller than the window) and makes the
list scroll beyond that; the popup stays anchored to its field and no
longer overlaps the category sidebar. Clicking anywhere on the row
(label area included) opens the list — for the editable model combo
the text area keeps the cursor for manual entry, which the "Load
models" description already points out; manual entry and offline
behavior from AI-A4 are unchanged. A regression guard
(--test-dialog=settings-ai-combo) opens the model popup with 15
sample entries headlessly, reportsCOMBO-FAILif it is missing or
unbounded, and grabs a screenshot. -
The delete confirmation on the maintenance settings page opened behind
the settings window (UI-8, #35, customer report): since the categorized
settings (UI-4, #30) the pages live in the Kirigami Addons
ConfigWindow— a separate window — whileKirigami.PromptDialog
anchors toapplicationWindow().overlay, which resolves through the
page's creation context to the main window. The purge and restore
confirmations are now parented to the overlay of the window the page
actually lives in, appearing in front of and modal to the settings
window. Same root-cause family as the 0.3.1 FormCard popup fix. The
export file dialog is a native window-modal dialog attached to the
settings window and was not affected. A regression guard
(--test-dialog=settings-purge) opens the confirmation headlessly,
reportsDIALOG-FAILif it is not anchored to the settings window,
and grabs a screenshot with the open dialog. -
The AI request timeout was 120 s, which a local reasoning model exceeds:
measured against Ollama withqwen3.6:27b, a single interpretation took
90-163 s, so requests aborted while the backend was still working. The
timeout is now 300 s — a safety net against stuck connections, not a
patience limit (the request can always be cancelled).
Added
-
Dictation got its own settings category (#47): the speech-input section
(speech recognition backend, whisper model or the two whisper.cpp
paths) moved unchanged from the AI assistant page to a new "Dictation"
page, so dictation is configurable without scrolling past an API key —
the two strands were already independent in the backend (the dictation
probe never reads base URL or model). The sidebar order is General ·
Synchronization · Dictation · AI Assistant · Maintenance. The new page
saves through its ownsaveDictationSettingsinvokable, which reruns
only the dictation probe and leaves the AI access (aiConfigured,
cached LLM client) untouched; its status line reports the probe result
after saving.saveAiSettingsin turn dropped the four dictation
parameters. The flow proves that neither save path disturbs the other
strand's state. -
The version is now 0.4.0, and every build identifies itself (#54).
The About dialog shows the short git commit and its commit date next
to the version (e.g.0.4.0 (54d2572, 2026-08-12)), so development
installs made on the same day are distinguishable. The identifier is
generated at compile time inapp/build.rs; builds from a tarball
without a git directory fall back to the plain version. A new
--versionflag prints the same identifier without starting Qt, and
scripts/install-local.shnow reports what it just installed by
asking the installed binary. -
Stage 1 release package (AI-B4, #16): the screenshot demo dataset
(core/examples/seed_demo.rs) can now also write a demo AI
configuration (--ai-config <config-home>) — English UI, Ollama base
URL, and the recommended model — so screenshot runs show the AI
controls (aiConfigured) without a running server, an API key, or a
hand-built throwaway config. Later stage release packages reuse this
(recipe indocs/building.md). The AI settings screenshot now shows
the demo configuration instead of the mock artifactvmn-mock. -
Dictation flow in Quick Capture (AI-B2, #14): a microphone button —
visible only when the dictation chain is available and the AI is
configured — starts recording on the first click (the button pulses)
and stops and transcribes on the second (spinner); the transcript
lands in the title field and automatically continues into the AI
interpretation from AI-B1. Recording and transcription can be
discarded at any point; errors appear in the dialog's own status area.
Dictation and LLM requests no longer share the busy flag: the
dictation strand got its own state machine (dictationState:
idle/recording/transcribing) whileaiBusynow belongs to LLM
requests alone, so canceling a dictation no longer clears the display
of a running LLM request and a finishing LLM result no longer ends the
transcription spinner (A5 review finding). Starting a new dictation
while a transcription is still running invalidates the old worker's
result, so it can neither reset the state nor publish a stale
transcript into the new recording. The dictation→draft path is
verified end-to-end in--test-flowthrough a canned transcript
(VMN_STT_MOCK, no microphone and no Whisper needed), which also...
v0.3.2
Fixed
- The Overdue sidebar row showed a generic placeholder icon:
appointment-missedonly ships as a 16px symbolic in Breeze. It now
usesdata-warning(user report).
Installation
The tarball contains a dynamically linked x86_64 binary built on Arch Linux.
It requires Qt 6, Kirigami 6, Kirigami Addons, ki18n, and qqc2-desktop-style
at runtime. On other distributions, building from source is recommended:
git clone https://github.com/hnsstrk/vergissmeinnicht-kde
cd vergissmeinnicht-kde
scripts/install-local.shSee docs/building.md for details.
v0.3.1
Fixed
- Date fields in the form windows could not open their calendar popup
(user report): FormCard's FormDateTimeDelegate anchors its popups via
ApplicationWindow.window, which is null inside a plainWindow. The
form windows are nowQQC2.ApplicationWindows; the interaction test
clicks the due-date row and asserts the popup opens.
Installation
The tarball contains a dynamically linked x86_64 binary built on Arch Linux.
It requires Qt 6, Kirigami 6, Kirigami Addons, ki18n, and qqc2-desktop-style
at runtime. On other distributions, building from source is recommended:
git clone https://github.com/hnsstrk/vergissmeinnicht-kde
cd vergissmeinnicht-kde
scripts/install-local.shSee docs/building.md for details.
v0.3.0
Team-built release ("full Taskwarrior manager"): a CLI capability
inventory, a taskchampion gap analysis and a UI/UX expert review were
produced by dedicated agents, then implemented in three waves.
Added
- Urgency — the exact CLI formula (3.4.2 defaults) as sort order and
in the detail window. - Start/stop (active task) with context-menu action, "Active" chip,
sidebar filter and+ACTIVEsearch. - Undo (Ctrl+Z) — every mutation batch is one undoable step; like
the CLI, undo cannot cross a sync. - until expiry date in the detail window (CLI auto-delete semantics).
- duplicate context-menu action; "last modified" display; read-only
UDA/foreign-attribute section in the detail window. - Search: virtual tags (
+OVERDUE,+ACTIVE,+BLOCKED,+DUE,
+TODAY,+WEEK,+TAGGED,+INSTANCE, …),due.before:/
due.after:,project.not:. - Date synonyms:
sod/eod/sow/eow/soww/eoww/som/eom/
soq/eoq/soy/eoy, English weekday names, ordinals (23rd),
yesterday,now,later/someday. - recur synonyms:
weekdays,biweekly/fortnight,quarterly,
semiannual,annual/biannual,Nwks/Nmo/Nqtr/Nyrs. - JSON export (task-export format incl. UDAs) from settings.
- CLI coexistence guarantees, verified end-to-end against the real
taskCLI on a shared sync server (core/tests/cli_coexistence.rs):
UDAs survive app edits, CLI recurrence templates/instances are
respected (no duplicate follow-ups), app-owned recur tasks are
harmless for the CLI. See docs/architecture.md.
Changed
- Priority chips use the accent color and localized labels — red is now
reserved for overdue. Tags collapse to "+n" beyond two. Form windows
gained breathing room; quick-capture moves notes below the structured
fields. Arrow keys move the list selection (Shift extends).
Known gaps (tracked as issues)
- CLI hooks never fire for app edits (library-level mutation).
- Month calendar/forecast (#1), detail column (#2), JSON import,
contexts, further UI polish — see the issue tracker.
Installation
The tarball contains a dynamically linked x86_64 binary built on Arch Linux.
It requires Qt 6, Kirigami 6, Kirigami Addons, ki18n, and qqc2-desktop-style
at runtime. On other distributions, building from source is recommended:
git clone https://github.com/hnsstrk/vergissmeinnicht-kde
cd vergissmeinnicht-kde
scripts/install-local.shSee docs/building.md for details.
v0.2.4
Fixed
- The sidebar scrollbar overlaid the count numbers: the sidebar content
claimed the full drawer width instead of the scroll view's available
width (user report with screenshot).
Added
- The sidebar sections (Saved searches, Projects, Tags) collapse and
expand by clicking their headers; the state is persisted. Project
subtrees were already collapsible via their arrows.
Installation
The tarball contains a dynamically linked x86_64 binary built on Arch Linux.
It requires Qt 6, Kirigami 6, Kirigami Addons, ki18n, and qqc2-desktop-style
at runtime. On other distributions, building from source is recommended:
git clone https://github.com/hnsstrk/vergissmeinnicht-kde
cd vergissmeinnicht-kde
scripts/install-local.shSee docs/building.md for details.
v0.2.3
Changed
- Edit, quick-capture and settings are real dialog windows now instead
of modals overlaying the main window — movable, resizable, with a proper
title bar (user feedback). The edit and quick-capture windows gained an
inline error banner; settings keeps its existing sync status line, and
the repair action now reports its error inline instead of pointing at
the (hidden) main-view banner. - The sync toolbar button only shows the blue activity dot when there
actually are unsynchronized local changes; otherwise it shows a plain
cloud. The dot was baked into thestate-syncicon and appeared
permanently before.
Added
- The sidebar is resizable via a drag handle on its edge; the width is
persisted across restarts (user report: counts were cut off).
Installation
The tarball contains a dynamically linked x86_64 binary built on Arch Linux.
It requires Qt 6, Kirigami 6, Kirigami Addons, ki18n, and qqc2-desktop-style
at runtime. On other distributions, building from source is recommended:
git clone https://github.com/hnsstrk/vergissmeinnicht-kde
cd vergissmeinnicht-kde
scripts/install-local.shSee docs/building.md for details.
v0.2.2
Fixed
- The settings, detail, and quick-capture dialogs did not scroll: with
more content than window height, the lower sections (sync fields,
maintenance, dependencies, notes) were simply unreachable — user
report with screenshot. The dialogs now use Kirigami.Dialog, which
caps its height at the window and shows a scrollbar. - Section headers in the rebuilt dialogs are left-aligned headings.
Installation
The tarball contains a dynamically linked x86_64 binary built on Arch Linux.
It requires Qt 6, Kirigami 6, Kirigami Addons, ki18n, and qqc2-desktop-style
at runtime. On other distributions, building from source is recommended:
git clone https://github.com/hnsstrk/vergissmeinnicht-kde
cd vergissmeinnicht-kde
scripts/install-local.shSee docs/building.md for details.
v0.2.1
Fixed
- Saving sync settings gave no feedback inside the settings dialog: results
and errors were reported via the main view's banner, which is hidden
behind the modal dialog. The sync section now shows an inline status line
("Saved — last synchronized: …", "Synchronizing …", or the concrete error
in red). - Duplicate-binding warning for the search shortcut (StandardKey.Find).
Added
--test-secrets(bridge-level) and--test-settings-ui(real synthetic
clicks + typing into the settings dialog, save button, persistence and
reopen checks) — both verified against a live local sync server.
Installation
The tarball contains a dynamically linked x86_64 binary built on Arch Linux.
It requires Qt 6, Kirigami 6, Kirigami Addons, ki18n, and qqc2-desktop-style
at runtime. On other distributions, building from source is recommended:
git clone https://github.com/hnsstrk/vergissmeinnicht-kde
cd vergissmeinnicht-kde
scripts/install-local.shSee docs/building.md for details.
v0.2.0
Added
- Dependency editor in the detail dialog: list existing
depends
relations with title lookup, remove them, add new ones from a picker of
pending tasks (blocked/blocking flags update immediately). - Project hierarchy in the sidebar: dotted projects (
Work.Sub) render
as a collapsible tree with implicit parents; counts use Taskwarrior
prefix semantics (parent includes subprojects). - Legacy repair maintenance action (Settings → Maintenance): converts
token syntax left in task titles (+tag project:x due:… priority:…)
into real properties; existing properties win, tokens fill gaps. - Synthetic interaction test (
--test-input): injects real
QMouseEvent/QKeyEventinto the window (C++ shim with QTest-style fake
timestamps) and verifies click selection, Ctrl/Shift multi-selection,
checkbox toggle, double click → detail, right click → context menu, and
real typing in quick capture. Runs in CI (offscreen). - Live Secret Service roundtrip test (
cargo test -- --ignored secrets). - The demo dataset now contains a dotted subproject for hierarchy
screenshots.
Fixed
- Left-click handling on task rows was owned by the delegate button, so
modifier clicks (Ctrl/Shift) never reached the selection logic — found by
the new interaction test. Selection now uses a mouse overlay with
explicit modifier handling; the done-checkbox stays natively clickable. - The deprecated
KLocalizedContextwas replaced by
KLocalizedQmlContext(KF ≥ 6.8). - "MIT-Lizenz" in the About dialog is now translatable.
Changed
- CI:
actions/checkout@v5, new interaction-test step.
Installation
The tarball contains a dynamically linked x86_64 binary built on Arch Linux.
It requires Qt 6, Kirigami 6, Kirigami Addons, ki18n, and qqc2-desktop-style
at runtime. On other distributions, building from source is recommended:
git clone https://github.com/hnsstrk/vergissmeinnicht-kde
cd vergissmeinnicht-kde
scripts/install-local.shSee docs/building.md for details.
v0.1.1
Fixed
- Placeholder arguments in localized strings rendered as
(I18N_ARGUMENT_MISSING)(e.g. "Version %1" in the About dialog, date
chips, bulk-delete confirmation, sync footer). ki18n substitutes%1
itself — arguments are now passed toi18n(...)directly instead of
.arg()chaining (10 call sites). Found by a fresh-context review; CI now
greps the--test-flowlog forI18N_ARGUMENT_MISSING. - AppStream validation in CI no longer masked by
|| true.
Changed
- Settings note that standard dialog buttons (OK/Cancel) follow the system
language, not the in-app language override.
Installation
The tarball contains a dynamically linked x86_64 binary built on Arch Linux.
It requires Qt 6, Kirigami 6, Kirigami Addons, ki18n, and qqc2-desktop-style
at runtime. On other distributions, building from source is recommended:
git clone https://github.com/hnsstrk/vergissmeinnicht-kde
cd vergissmeinnicht-kde
scripts/install-local.shSee docs/building.md for details.