Skip to content

kari v0.10.0

Choose a tag to compare

@github-actions github-actions released this 09 Sep 08:37
· 34 commits to main since this release
v0.10.0
975c218

kari v0.10.0 — built from 975c218.

The card drawer is now the place to talk to a session. A prompt typed there
goes into the running session, so the terminal you look at answers it, and
a session that is not running resumes as a background job. The summary says
how far the work travelled: committed, pushed, PR open, merged, released,
deployed, CI passed or failed. The whole conversation is one click away,
with a search. On the phone, a swipe moves between columns and the app
opens on the Working column.

TL;DR

  • Swipe between columns on the phone, and open on the Working column
  • Rebuild the card drawer around the conversation
  • Say how far the work travelled in every summary
  • Hand a prompt to the running session instead of starting a copy
  • Line up the quota bars, and keep the answer to "May run unattended"

What changed

Swipe between columns on the phone, and open on the Working column

The phone board shows one column at a time, and the code comment promised
that a swipe moves between them. Only the arrows and the dots did, so
every swipe went nowhere and the thumb had to find the small arrow at the
top. A horizontal swipe over the column now turns the page. A scroll of
the list still scrolls: a move that goes more up than sideways is not a
swipe.

The app also opened on the inbox. A phone is taken out to see what runs,
so it opens on the board, on the column that holds the Working cards. The
inbox badge still says when something needs an answer. The column on
screen is remembered by id, so a reordered board keeps the page.

Rebuild the card drawer around the conversation

The drawer had grown by accretion. The project and the node appeared twice,
once as a fact and once as a field. The title sat in an input at the foot
of a long form, under a Save button that was easy to forget. Two empty
text areas took a screen each. And the way to talk to the session, the
one-off prompt, was the last box on the page and started a background job.

The drawer is now one page with the conversation at its heart:

  • Click the title to rename the card. The edit happens in place.
  • "Where it stands" opens the drawer: the summary, its delivery line, the
    next step, and the state of the background job with the reply it
    suggests. One click puts that reply in the prompt box.
  • "Card" lists facts and fields in one grid. Project, node, priority,
    model, permission mode, the scheduler prompt, notes: each saves when you
    leave it. There is no Save button and nothing to lose on a close.
  • Empty text areas are one line high and grow with the text.
  • "Conversation" shows the last prompt and reply, and "Show all" lists
    every prompt and reply of the session, oldest first, with a search.
    A long transcript loads its last 300 turns first.
  • The prompt box sits at the foot. Its button says what a send does: into
    the running session, a background job that resumes the session, or a
    background job that starts the task. Cmd+Enter sends.

Every toast about a card carries an Open button, so a "Done" or "Started"
notice is one click from the card it names. The phone uses the same drawer
and the same prompt box.

Say how far the work travelled in every summary

A summary said what a session was about and where it stood, but not
whether the result had left the machine. "The change is on the branch" and
"merged and released" read the same on the card, and the question that
matters most after a background run is exactly that one: committed, pushed,
a PR open, merged, released, deployed, and did CI pass.

The summary now carries a delivery line built from those words, and the
narrative ends with the latest state of the work. The excerpt that Haiku
reads gains a TOOL line for every git and gh command the session ran, so
the judgment rests on what happened and not only on what the reply said.
Those lines ride along with the last 30 messages and do not use up their
budget.

A background job also writes its own account of where it stands into its
state file: a detail line, what it waits for, and the reply it suggests.
kari reads the three, shows them on the card, and offers the suggested
reply as one click into the prompt box.

Hand a prompt to the running session instead of starting a copy

"Continue in bg" on a session that was open in a terminal did nothing that
the terminal could see. Claude Code refuses to run one session twice, so
claude --bg --resume started a copy of it, and the prompt landed in a
second transcript that nobody was looking at. The card then showed a
blocked job, and the only way to give the session its next step was to
type it in the terminal by hand. A reply from the phone took the same
path and failed the same way.

Every running Claude Code process opens a message socket for its peers,
and kari now uses it. The card drawer has a prompt box at its foot, and
the phone card keeps its reply box. A prompt goes into the running
session's own queue: an idle session answers at once, a busy one takes it
after the current turn, and the terminal shows both. A session that is
not running resumes as a background job with the prompt, as before, and a
task starts one. start_card refuses a running session outright, so the
scheduler and an older client cannot start a copy either.

The run log gets one line per prompt sent from kari, and a prompt that a
peer handed in counts as a turn of the session, so the card moves to
Working when kari speaks to it.

The transcript reader can now return the whole conversation of a session,
oldest first, with a limit and the total, for the conversation view in the
drawer. The node API, the hub and the server carry both calls, so a phone
that talks to a server reaches a session on any node.

Line up the quota bars, and keep the answer to "May run unattended"

The stats strip put each account on a row of its own, and each row set its
own widths. An account on two machines pushed its meters further right than
an account on one, so no bar started where the bar above it started. A window
with no reset time dropped the reset text, and moved the meter beside it.

Each line of rows is now one grid, and the rows share its tracks. The widest
name sets the name column for every row, and each part of a meter keeps its
box while it has nothing to show. So the bars stand in a column whatever the
text beside them says.

The New task dialog also forgot the "May run unattended" box between tasks.
It now opens with the answer you gave last, held on this device. A column
that takes Ready cards and no Backlog card still decides for itself, because
a card added at the foot of a column has to land in that column.

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.10.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.10.0-aarch64-apple-darwin (or the x86_64 one),
a Linux host kari-node-v0.10.0-x86_64-unknown-linux-gnu.tar.gz,
a Windows host kari-node-v0.10.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.