Skip to content

Active development — do not use in production yet. Build-in-public project. First stable release: v1.0.0. Expect breaking changes, missing features and rough edges before then.

kandown
116 releases

Changelog

2026-08-11

v0.49.1· Tracer Bullet

Added

  • Desktop slice 2: the Tauri app at apps/desktop/ now picks a project folder, spawns or joins the system kandown daemon (join-before-spawn: a daemon started from a terminal wins, the app does not start a second one), and navigates the webview to http://127.0.0.1:<port>/. The first-launch experience is a native folder picker; on subsequent launches with a remembered project, the app auto-resolves and a "Reopen last" button is offered. Slice 2 brings the Tauri bundle to its first useful end-to-end flow; slices 3 onward add multi-window, recents, and native chrome.

  • Bundled picker page in apps/desktop/src/index.html plus its apps/desktop/src/main.ts driver. Talks to the Rust side through six commands (cmd_kandown_installed, cmd_min_version_check, cmd_pick_project, cmd_get_last_project, cmd_resolve_daemon, cmd_open_window_with_url, cmd_stop_daemon). When the CLI is absent from PATH the page renders a copy-pasteable install hint with a Retry button; when it is present but below the documented minimum, a non-blocking yellow banner appears.

  • apps/desktop/src-tauri/src/daemon.rs mirrors the CLI's daemon lifecycle (src/cli/lib/daemon.ts) rather than re-implementing it: which::which for the locate step, a direct TCP probe and a small inline HTTP/1.1 GET for the /api/daemon ownership check, and a daemon start spawn via Command that writes stderr to the daily rolling log file. A daemon owned by the app is stopped on window close; a daemon joined from a terminal is left alone.

  • KANDOWN_DAEMON_UPGRADED_TO=off is now set on every daemon the app spawns (Decision 8 in [[t280]]), disabling the CLI's self-upgrade timer so the Tauri updater is the single owner of the update surface.

Changed

  • apps/desktop/src-tauri/Cargo.toml now declares the slice 2 deps (tauri-plugin-dialog, serde, serde_json, which, semver, url); slice 1's empty-features pin is gone.

  • apps/desktop/src-tauri/tauri.conf.json now sets app.withGlobalTauri = true (so the bundled picker talks to the Rust side through window.__TAURI__ without dragging the @tauri-apps/api package into the bundle) and a CSP that allows connect-src to http://127.0.0.1:*, http://localhost:*, and the Tauri IPC protocols. Slice 1's csp: null is gone.

  • apps/desktop/src-tauri/capabilities/default.json grants dialog:default so the native folder picker works under Tauri 2's capabilities model.

  • apps/desktop/src-tauri/src/logging.rs switches the panic-hook file computation from local time to UTC, matching tracing_appender::rolling::daily's internal date. Slice 1's log filename agreed with the panic hook only during the day in CEST; at UTC midnight the two would have drifted apart and a panic and a normal error! would have landed in different files.

  • apps/desktop/package.json dev/build scripts now transpile main.ts to main.js via tsc before tauri build / tauri dev so the bundled HTML can <script type="module" src="./main.js"> without a Vite pipeline. The compiled JS is registered as a generated file in scripts/build-codemap.js.

  • scripts/build-codemap.js now treats apps/desktop/src/main.js as generated output (sourced from apps/desktop/src/main.ts), so the codemap index does not double- report the file.

Fixed

  • The slice 1 daemon.rs was a placeholder. Slice 2's daemon.rs closes that gap, so the Tauri window no longer renders a blank page: the picker renders when there is no project, the daemon URL renders once the daemon is up, and the install screen renders when the CLI is missing.