kari v0.14.0
kari v0.14.0 — built from b8ae7a0.
This release keeps your unsaved text when something other than you stops kari.
kari already asked before Cmd+Q and the tray threw unsaved input away. A signal
did not go through that path. A rebuild that replaced the app killed the window
with no word, and took the open card with it.
kari now catches SIGTERM and SIGINT. With no unsaved input it quits at once, as
before. With unsaved input the window comes to the front and asks, and kari
quits anyway after 20 seconds, so an unattended build goes through. A second
signal quits at once, because Ctrl+C twice in a terminal must always work.
The new task dialog and the card drawer also write their text to the browser
store on every keystroke. The draft goes back into the form the next time it
opens, and the form says where the text came from. A drawer draft carries the
time its card was last changed, so a newer card drops a stale draft.
No check covers a quit path, because CI has no window, no tray and no bundle.
Two unit tests hold the one rule a test can hold: every wait ends.
TL;DR
- Ask before a restart throws away unsaved input
What changed
Ask before a restart throws away unsaved input
A rebuild that replaced the app took the card that was open in the new task
dialog with it. kari already asks before Cmd+Q and the tray throw unsaved
input away. A signal was not on that path, so it killed the window with no
word.
Two layers, because no question survives every kill:
- kari catches SIGTERM and SIGINT. With no unsaved input it quits at once, as
before. With unsaved input the window comes to the front and asks, and kari
quits anyway after 20 seconds, so an unattended build goes through. A second
signal quits at once, because Ctrl+C twice in a terminal must always work. - The new task dialog and the card drawer write their input to the browser
store on every keystroke. The draft goes back into the form the next time it
opens, and the form says where it came from. The dialog drops its draft when
the card is added. The drawer saves each field on blur, so its draft holds
the text that still waits for a blur and the message that is not sent yet: a
save, a send, and a confirmed discard each drop it. A drawer draft holds the
updated_at of its card, and a newer card drops it, so a stale draft cannot
go over what the node changed.
Every quit question now ends. Cmd+Q, the tray and an AppleScript quit share
one path, and a script cannot tell them apart from a keypress, so that path
waits quietly for ten minutes before it quits. The window shows a countdown
only for a rebuild, where nobody may be there to read it. Two unit tests hold
that rule: a future edit that sets either wait to "forever" fails the build.
Install
Download the .dmg for your Mac: aarch64 for Apple silicon, x64 for Intel.
The app is not signed. After you copy it to Applications, run:
xattr -dr com.apple.quarantine /Applications/kari.app
On Windows, run kari_0.14.0_x64-setup.exe. It installs for the current user,
because kari reads the Claude Code state of whoever is logged in. That installer is
not signed either, so SmartScreen asks once: More info, then Run anyway.
An installed kari updates itself to this release: it checks on start and every six hours,
writes the new version beside the running one and offers a restart. Settings, Updates has the switch.
Every host runs the headless node, so that its sessions stay on the board while no window is open.
A Mac takes kari-node-v0.14.0-aarch64-apple-darwin (or the x86_64 one),
a Linux host kari-node-v0.14.0-x86_64-unknown-linux-gnu.tar.gz,
a Windows host kari-node-v0.14.0-x86_64-pc-windows-msvc.zip.
Run kari-node service install to keep it running at login. One engine runs on a host at a time:
open the app and the node steps down, quit the app and it takes the host back.
A node updates itself only when asked: kari-node update, or serve --auto-update.
An Android phone installs kari-latest.apk. Add this repository to Obtainium: the asset name never
carries the version and the signing key never changes, so an update installs over the previous build.
The phone reaches the nodes over a private network, such as a VPN, and pairs with the code from
Settings, Nodes on the desktop. See TOUR.md.
See the README for requirements and setup.