Skip to content

Releases: hnsstrk/vergissmeinnicht-kde

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 23 Aug 17:16

Fixed

  • The sync server URL no longer disappears from the configuration (#38).
    The eater was the app's own test hooks: --test-settings-ui and
    --test-secrets blanked the URL (and the credentials) during cleanup,
    and --test-flow kept a window between blanking and restoring it —
    any such run against the live XDG_CONFIG_HOME destroyed 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 both XDG_CONFIG_HOME and XDG_DATA_HOME point away from the
    default locations. A new --test-dialog=settings-sync regression
    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 new startAiListModelsPreview invokable 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 no Authorization header). 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/models answers 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 behind aiConfigured as 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 a HoverHandler.

  • 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's LD_LIBRARY_PATH (ROCm/HIP builds keep libwhisper.so and
    libggml*.so next 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 Addons FormComboBoxDelegate sets 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, reports COMBO-FAIL if 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 — while Kirigami.PromptDialog
    anchors to applicationWindow().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,
    reports DIALOG-FAIL if 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 with qwen3.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 own saveDictationSettings invokable, 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. saveAiSettings in 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 in app/build.rs; builds from a tarball
    without a git directory fall back to the plain version. A new
    --version flag prints the same identifier without starting Qt, and
    scripts/install-local.sh now 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 in docs/building.md). The AI settings screenshot now shows
    the demo configuration instead of the mock artifact vmn-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) while aiBusy now 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-flow through a canned transcript
    (VMN_STT_MOCK, no microphone and no Whisper needed), which also...

Read more

v0.3.2

Choose a tag to compare

@github-actions github-actions released this 17 Jul 16:31

Fixed

  • The Overdue sidebar row showed a generic placeholder icon:
    appointment-missed only ships as a 16px symbolic in Breeze. It now
    uses data-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.sh

See docs/building.md for details.

v0.3.1

Choose a tag to compare

@github-actions github-actions released this 17 Jul 16:02

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 plain Window. The
    form windows are now QQC2.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.sh

See docs/building.md for details.

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 17 Jul 14:25

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 +ACTIVE search.
  • 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
    task CLI 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.sh

See docs/building.md for details.

v0.2.4

Choose a tag to compare

@github-actions github-actions released this 17 Jul 13:21

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.sh

See docs/building.md for details.

v0.2.3

Choose a tag to compare

@github-actions github-actions released this 17 Jul 12:27

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 the state-sync icon 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.sh

See docs/building.md for details.

v0.2.2

Choose a tag to compare

@github-actions github-actions released this 17 Jul 11:21

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.sh

See docs/building.md for details.

v0.2.1

Choose a tag to compare

@github-actions github-actions released this 17 Jul 10:51

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.sh

See docs/building.md for details.

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 17 Jul 09:43

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/QKeyEvent into 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 KLocalizedContext was 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.sh

See docs/building.md for details.

v0.1.1

Choose a tag to compare

@github-actions github-actions released this 17 Jul 07:09

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 to i18n(...) directly instead of
    .arg() chaining (10 call sites). Found by a fresh-context review; CI now
    greps the --test-flow log for I18N_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.sh

See docs/building.md for details.