local-kanban 1.15.0 → 2.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/CHANGELOG.md +721 -0
  2. package/README.md +219 -13
  3. package/README.ru.md +203 -13
  4. package/bin/kb +361 -67
  5. package/bin/local-kanban +167 -16
  6. package/package.json +3 -3
  7. package/public/app.js +15 -2
  8. package/public/boot-fallback.js +76 -0
  9. package/public/drawer-sync.js +15 -1
  10. package/public/index.html +44 -3
  11. package/public/js/app-install-rules.js +81 -0
  12. package/public/js/ask-rules.js +116 -0
  13. package/public/js/asks.js +256 -0
  14. package/public/js/attention.js +121 -0
  15. package/public/js/automations.js +224 -0
  16. package/public/js/board.js +399 -141
  17. package/public/js/chaos.js +30 -16
  18. package/public/js/chat-md.js +171 -0
  19. package/public/js/chat-models.js +23 -0
  20. package/public/js/chat.js +1403 -0
  21. package/public/js/claude-setup-rules.js +201 -0
  22. package/public/js/core.js +1114 -41
  23. package/public/js/dash.js +23 -7
  24. package/public/js/done.js +85 -0
  25. package/public/js/drawer.js +1833 -173
  26. package/public/js/glyphs.js +341 -0
  27. package/public/js/health-rules.js +43 -0
  28. package/public/js/health.js +138 -0
  29. package/public/js/init.js +101 -34
  30. package/public/js/launch-rules.js +58 -0
  31. package/public/js/limits-rules.js +23 -0
  32. package/public/js/limits.js +55 -0
  33. package/public/js/live-link.js +132 -0
  34. package/public/js/live-rules.js +212 -0
  35. package/public/js/lost-field.js +21 -0
  36. package/public/js/no-zoom.js +7 -0
  37. package/public/js/now-terms.js +515 -0
  38. package/public/js/now.js +265 -0
  39. package/public/js/onboarding-rules.js +95 -0
  40. package/public/js/onboarding-scenes.js +193 -0
  41. package/public/js/onboarding.js +414 -0
  42. package/public/js/order.js +5 -0
  43. package/public/js/pace-rules.js +18 -0
  44. package/public/js/phone-rules.js +14 -0
  45. package/public/js/project.js +66 -30
  46. package/public/js/review-rules.js +87 -0
  47. package/public/js/review.js +163 -0
  48. package/public/js/search.js +163 -0
  49. package/public/js/settings.js +606 -120
  50. package/public/js/share.js +106 -0
  51. package/public/js/sidebar.js +434 -166
  52. package/public/js/sse.js +486 -75
  53. package/public/js/store.js +22 -0
  54. package/public/js/term-copy.js +189 -0
  55. package/public/js/term-input-rules.js +18 -0
  56. package/public/js/term-reprint.js +29 -0
  57. package/public/js/typeset.js +11 -0
  58. package/public/js/unsaved.js +233 -0
  59. package/public/js/usage-rules.js +105 -0
  60. package/public/manifest.webmanifest +2 -2
  61. package/public/offline.html +9 -4
  62. package/public/style.css +1581 -121
  63. package/public/sw.js +5 -2
  64. package/skills/kanban/SKILL.md +53 -18
  65. package/src/api-break.js +174 -0
  66. package/src/automations.js +266 -0
  67. package/src/backup.js +26 -6
  68. package/src/chat-feed.js +588 -0
  69. package/src/chat-queue.js +123 -0
  70. package/src/claude-asks.js +290 -0
  71. package/src/claude-hooks.js +218 -0
  72. package/src/claude-limits.js +84 -0
  73. package/src/claude-live.js +297 -0
  74. package/src/claude-now.js +240 -0
  75. package/src/claude-sessions.js +190 -0
  76. package/src/claude-settings.js +88 -0
  77. package/src/claude-setup.js +148 -0
  78. package/src/claude-usage.js +541 -0
  79. package/src/compress.js +53 -0
  80. package/src/config.js +16 -1
  81. package/src/db.js +34 -11
  82. package/src/error-handler.js +2 -1
  83. package/src/file-snapshot.js +30 -11
  84. package/src/health.js +183 -0
  85. package/src/launch.js +166 -0
  86. package/src/own-wait.js +161 -0
  87. package/src/phantom.js +683 -0
  88. package/src/prompt-box.js +78 -0
  89. package/src/qr.js +223 -0
  90. package/src/question-screen.js +188 -0
  91. package/src/restore.js +40 -3
  92. package/src/review-check.js +64 -0
  93. package/src/routes/automations.js +38 -0
  94. package/src/routes/chat.js +297 -0
  95. package/src/routes/claude.js +90 -0
  96. package/src/routes/dashboard.js +66 -18
  97. package/src/routes/events.js +59 -6
  98. package/src/routes/health.js +13 -0
  99. package/src/routes/projects.js +63 -15
  100. package/src/routes/share.js +24 -0
  101. package/src/routes/skills.js +18 -13
  102. package/src/routes/system.js +385 -93
  103. package/src/routes/tasks.js +460 -122
  104. package/src/routes/terminal.js +88 -0
  105. package/src/schema.sql +82 -2
  106. package/src/server.js +38 -10
  107. package/src/share.js +249 -0
  108. package/src/skills.js +99 -6
  109. package/src/stamp.js +34 -0
  110. package/src/static-headers.js +30 -0
  111. package/src/sync/github.js +13 -4
  112. package/src/sync/worker.js +1 -0
  113. package/src/task-shape.js +17 -0
  114. package/src/terminal-say.js +38 -0
  115. package/src/tree-print.js +33 -0
  116. package/src/work-clock.js +35 -0
  117. package/src/work-feed.js +399 -0
package/CHANGELOG.md CHANGED
@@ -8,6 +8,727 @@ version it goes out as and opens an empty one again. Released sections are histo
8
8
 
9
9
  ## [Unreleased]
10
10
 
11
+ ## [2.0.0-beta.1]
12
+
13
+ **2.0 beta.** The board stopped being a list of tasks next to Claude and became the place you work with it: Claude starts
14
+ inside the board, you talk to it in the card, watch every session side by side, and a fresh Claude checks the work. A
15
+ beta goes to everyone, like a release: `npm install -g local-kanban` and the update button both bring it, and your
16
+ data stays. To stay on the last 1.x, run `npm install -g local-kanban@1.16.0`.
17
+
18
+ ### Changed
19
+
20
+ - **The README shows the board as it is now**, in the dark theme, with Claude moving cards in the first picture.
21
+ - **Update checks understand betas.** A board on a beta is offered the next beta and the release it leads to; before,
22
+ both looked like the version it already had.
23
+
24
+ - **The chat says what Claude is doing while nothing lands in the transcript.** A long script takes a minute or two to
25
+ write, and all that time the chat said only "Claude is working…". The light is green now and tells how long the
26
+ transcript has been silent and, for a Claude inside the board, whether it is thinking or writing and how many tokens
27
+ it wrote. A counter that stood still for a minute with nothing to wait on turns the light yellow: "no answer for 1 min".
28
+ - **Steps tell writing from running.** A step and a folded run of steps say how long Claude took to write them and how
29
+ long they ran: "wrote for 1 min 31 s · ran for 19 s". Before, only the second number was shown, and a session of
30
+ minutes looked like commands of seconds.
31
+ - **Health lists the rules with `paths:` too.** The rules of a project's `.claude/rules` that Claude Code loads only
32
+ when it works with their files are listed with the CLAUDE.md files of subfolders, with their size: past the
33
+ per-file limit Claude Code reads only the start of such a file.
34
+
35
+ ## [1.16.0]
36
+
37
+ ### Added
38
+
39
+ - **Health: how big the instructions Claude reads are.** Switch it on in Settings → Health, and the sidebar gets a
40
+ section that measures every project: its own CLAUDE.md in lines and characters, and everything a session started in
41
+ its folder reads (the CLAUDE.md of the folders above, imports, rules, auto memory), against the norms — under 200
42
+ lines per CLAUDE.md, as the Claude Code docs ask, and the 40,000 and 120,000 characters from which Claude Code itself
43
+ warns. The CLAUDE.md files of subfolders are listed apart.
44
+ - **Claude done by time.** A switch over the section shows the runs as before, or every task Claude finished in one
45
+ list, the latest on top, with its project on the row. The choice is kept in the browser.
46
+ - **Automations: a check of Review that starts by itself.** Switch them on in Settings → Claude Code, and the sidebar
47
+ gets a section where a rule reads "When [project] finishes its work, wait [3] min and start a check of the tasks in
48
+ Review". Once every task Claude took in that project has reached Review and nothing waits for you, the board counts
49
+ the pause down — beside ▶ of Review and over Claude now — and starts the check inside the board, as the button does.
50
+ A rule runs once; the page may be closed. A question of Claude, a task handed back to To do or a used-up limit holds
51
+ it, and the pause starts again after.
52
+
53
+ - **An answer cut off by a lost connection goes on by itself.** When the connection to the API breaks in the middle of
54
+ Claude's answer, Claude Code ends the turn and waits — nothing told you the work had stopped. Now the card says
55
+ "connection lost · going on", and the board tells its own Claude to go on from where it stopped (up to three times in
56
+ a row, after 15 s, 1 min and 3 min). When it cannot — a Claude started outside the board, or it broke again — the card
57
+ says "answer broke off" and the board notifies you. A second "Claude is waiting for you" (or question) of the same
58
+ task now shows its banner and sound as well — it used to replace the first one silently.
59
+ - **The board over Wi-Fi.** Settings → Wi-Fi (and the Wi-Fi button beside Settings, orange while it is on) opens the
60
+ board to people on the same network: a QR code and a link open it on their phone or laptop. The address has no
61
+ password — anyone on that network who opens it can do on the board what you can, including talking to Claude on your
62
+ computer — so keep it on only on a network of people you trust. Switching off closes the board to the network.
63
+ - **The first-run wizard says what the board is now** — the card's chat with questions as a form, Claude now with every
64
+ Claude side by side and Continue — and asks whether to show Claude as a chat or a terminal. The check of the computer no
65
+ longer reads "Claude's questions: not connected": the board gives its own Claude the hook. Every board sees the wizard
66
+ once more after the update.
67
+ - **Continue a Claude of the board that has stopped.** A Claude started inside the board and stopped from outside (or
68
+ ended by itself) keeps its terminal: the card says "Session interrupted" and opens on it, and Continue — in the card's
69
+ terminal, in its chat, and in Claude now (the list and Terminals) — starts Claude again in that terminal with its
70
+ conversation, where it waits for your word. Claude now keeps an interrupted run in sight instead of folding it among
71
+ the ones nobody leads.
72
+ - **Claude as a chat.** A card has a Chat tab in place of "Claude's work": the conversation of its Claude in turns —
73
+ your words, what Claude wrote, its steps folded under "N steps" with their time and a ✗ where one failed, and how long
74
+ each turn took. What a command returned is never shown. The Claude the board started can be answered right there:
75
+ words go at once to a Claude waiting at its prompt, and to a busy one they wait in a queue (✕ takes them back) and
76
+ go once it has been free for two seconds; a question Claude asks is answered right in the chat, with the keys of its
77
+ terminal. A Claude in Terminal or the Claude app is read, not spoken to. Whether a card and a column of Claude now →
78
+ Terminals show Claude as its chat or its terminal is one choice in Settings → Claude Code. The tasks over a column
79
+ open and close like a shutter, and opened steps fold back. A picture pasted, dropped or picked with the clip goes
80
+ with the message as a picture — a thumbnail over the field, ✕ takes it out — and Claude gets it as an image, not
81
+ as the path of a file in your words. Claude's answers read as Markdown: headings, lists, tables, quotes and code.
82
+ A message reaches Claude for certain: words left in its input field are cleared first, the board sees the message
83
+ arrive before it presses Enter and leave after it, and when it does not, the chat says why instead of looking sent.
84
+ A Claude at work can be stopped from the chat (■ next to Send) — as Esc in its terminal, never twice at once.
85
+ ⌘↵ (Ctrl+↵ off a Mac) sends at once even while Claude works — it takes the words into the turn going on — and a
86
+ waiting message has its own Now; words sent mid-turn show in that turn.
87
+ A block of code in Claude's answer has a copy button, and a command (a block of a shell) runs in a new Terminal
88
+ window in the project's folder once you have seen it whole and said yes — only a command Claude wrote in that chat.
89
+ ⛶ in a chat of Claude now → Terminals spreads that column over the window, smoothly, and takes it back the same way
90
+ (Esc too) — the same chat, what you typed and the place you read kept.
91
+ - **⌘F opens the search over projects and tasks** (Ctrl+F off a Mac) — from any screen, from a field too. Pressed
92
+ again while the search (or any other window) is open, it is the browser's own find. The shortcut can be changed in
93
+ Settings → Hotkeys.
94
+ - **A task moves to another project.** "Move to project…" in the card's ⋯ menu and in the right-click menu of a card:
95
+ the task keeps its comments, attachments, checklist, links and issue, takes the next number of that project, and
96
+ its old key still leads to it (the card's timeline and `kb show` say where it came from). A task Claude is working
97
+ on is not moved until it is handed in.
98
+ - **A screenshot reaches Claude from its terminal.** Paste a picture (or drop one) into the answer field of the card's
99
+ Terminal tab or of a column in Claude now → Terminals: it is kept as an attachment of the task, and its path goes
100
+ into the field, so Claude opens the picture when the answer is sent.
101
+ - **The answer field suggests handing the task in.** While Claude waits for a word on a task in Doing or Deploy, the
102
+ empty field shows a grey hint — "Move KEY to Review, so I can check it later"; Tab puts it in, typing hides it.
103
+ - **A check of Review can think at its own level.** Settings → Claude Code has a second "How hard Claude thinks", for
104
+ checks: a check started from Claude review or the Review column takes it, every other task the level of all starts.
105
+ Left as it is, a check thinks as every task does.
106
+ - **Claude now → Terminals: every run of Claude side by side, each with its terminal.** A switch at the top of the
107
+ section lays the live runs out as columns, like an agents window: the tasks of the batch above, and — for a Claude
108
+ the board started — its screen, its keys and a field to answer it, without opening a card. A Claude in the Terminal
109
+ app or the Claude app has no screen here; its column says where it is.
110
+ A ✕ beside "Open in the card" closes a column's terminal: a Claude that is done and has nothing to ask goes off
111
+ the section at once (a Claude still running is asked about first).
112
+ - **Settings → As an app: how to make the board an app of its own.** The steps for the browser the page is open in
113
+ (Chrome and other Chromium browsers, Edge, Safari on a Mac, iPhone and iPad, Android; Firefox on a computer is told
114
+ to use another browser), the others folded below, and an *Install* button where the browser offers it. A board
115
+ opened over plain http at a LAN address is told why Chrome greys the menu item out. The installed app opens light.
116
+ - **The terminal of a card shrinks and grows.** Drag the short bar over its keys (or press ↑/↓ on it) to make the
117
+ screen lower or taller; a double click gives back the usual height. The height is remembered on this computer.
118
+ - **A new look, in the spirit of the new Claude app.** Near-black (or, with the light theme, cream) monochrome, a
119
+ white main button, neutral highlights instead of orange, serif titles, icons in the sidebar, thin borders and
120
+ rounder cards, a *New task* row at the top of the sidebar and soft transitions for screens, the task card, windows
121
+ and lists. Behind the board, clouds and waves made of grey symbols drift from right to left in three layers of
122
+ depth — the far ones smaller, dimmer and slower, the near ones hiding them — and a click on empty space (not on a
123
+ button, card or field) sends a sonar pulse that lights them up in blue as it spreads, the lit side of every form
124
+ brighter than its shadow. It moves at the display's frame rate, can be turned off in *Settings → Appearance →
125
+ Symbols in the background*, and stops with reduced motion and on a hidden tab. The theme still picks light or dark.
126
+ - **A welcome wizard that asks how you want to use the board — and it comes back once after an update.** Besides the
127
+ language, it now asks how ▶ should start Claude (inside the board, in Terminal, in the Claude app or only copy the
128
+ prompt — the ways this computer lacks are greyed with the reason), what the board shows (Claude's usage, limits,
129
+ work feed, compact cards) and the GitHub sync, which it shows as it is when it is already on. A board that was in
130
+ use before goes through it once after updating, without the demo step; its projects, tasks and settings stay as
131
+ they are, and only what you change is written. *Settings → About* can open it again, and has a line with a
132
+ Telegram contact for questions.
133
+ - **A card knows which Claude sessions worked on it.** Claude Code gives every command it runs a
134
+ session id, and `kb` now sends it along. When a session moves a task into work, leaves a note on
135
+ it or ticks its checklist, the board ties the two together: the card shows how many sessions
136
+ worked on the task and when the latest one did, and `kb show` prints the same, plus the transcript
137
+ of an earlier session — so a task sent back for rework can be picked up knowing what was already
138
+ tried. Grooming a backlog card does not count as work on it. Nothing of this leaves your machine.
139
+ - **Claude's work, live, in the card.** A task some Claude session worked on gets a switch next to
140
+ its comments: *Claude's work* lists what the session did on this task — the person's request, what
141
+ Claude wrote, every step (commands, files read and edited, searches, helper agents and how long
142
+ they ran), which steps failed and what the person answered to its questions. It updates by itself
143
+ while Claude works. A session that works through several tasks is cut by task, so each card shows
144
+ only its own part. Read from Claude Code's own transcripts on this machine; nothing is sent anywhere.
145
+ - **A card in work says whether Claude is working on it, waiting for you, or gone.** The badge follows
146
+ the Claude session live: *working*, *waiting for you* (a question, a permission, or it simply stopped
147
+ with the task still in work) and *session closed* when nobody is working on it anymore. The
148
+ dashboard's *Waiting for you* lists these tasks with how long they have waited, and when Claude
149
+ stops to wait for you the board plays the same sound and shows the same notification as for a task
150
+ ready for review, under the same settings.
151
+ - **▶ starts the tasks in Claude.** The *To do* column has ▶ next to its copy button, and a card that
152
+ Claude has not taken yet has ▶ in its header (a manual task, labelled `noclaude`, has none — and loses it
153
+ the moment it is labelled so): the board opens Claude in the project's folder with the
154
+ job already written — a new session in the Claude app, or a terminal running `claude`. A card some
155
+ session already worked on gets ↗, which opens that very session (or resumes it in a terminal) — the
156
+ quick way to answer a Claude that is *waiting for you*. **Settings → Claude Code → Start tasks** chooses
157
+ the app, the terminal, or copying the prompt only; *Automatically* takes the app when it is there.
158
+ - **Claude works right inside the board.** With `tmux` on the machine, ▶ opens nothing at all: Claude
159
+ starts at once in the background, in the project's folder, and the card opens on its new *Terminal*
160
+ tab — Claude's screen as it is, a field to answer it, the keys its questions need (a digit to pick an
161
+ option, the arrows, Esc, Shift+Tab) and a button to stop it. Claude keeps working when the board
162
+ restarts, and a Claude that has finished leaves its last screen. A second ▶ on a task that Claude is
163
+ already working on shows that Claude rather than starting another one. **Settings → Claude Code** has
164
+ *Inside the board* as a way to start tasks (and *Automatically* takes it first), and what Claude may
165
+ do there without asking: decide by itself what is safe (the default), edit files, ask about
166
+ everything, or only make a plan — skipping the checks altogether is not offered. A project without a
167
+ folder on this computer gets a one-click way out right there: create a new empty folder for it, or
168
+ choose the one with its code — and Claude starts as soon as it is set. The `claude` command keeps its
169
+ own sign-in, apart from the Claude app: when it is not signed in, the tab says so and signs it in
170
+ with one button, and the web addresses on its screen (the sign-in one included) are links. Claude
171
+ started there runs the board's own commands (`kb take`, `note`, `review`…) without asking, whatever
172
+ its mode — but not `kb done`, `cancel` or `rm`, and `kb mv` only to the working columns; and when it asks about every command in the manual
173
+ mode while the board is set to auto, the tab offers to switch it to auto in one click. It runs the
174
+ board's own `kb`, whatever version is on your PATH, and its card shows *Claude's work* even when the
175
+ `kb` it used did not say which session it was. Claude does not quit after handing a task in — it waits
176
+ for your answer — so the board closes its terminal by itself once every task it worked on is accepted,
177
+ cancelled or deleted; a task in *Review* keeps it, and a Claude in the middle of a reply finishes first.
178
+ The tab keeps the card as wide as the other tabs do: Claude's screen is laid out for the card, rather
179
+ than the card growing for the screen. A comment can go to that Claude too: the **>_** button next to the
180
+ send arrow hands it to Claude in the terminal and saves it, so Claude carries on with the task or the
181
+ talk without you switching tabs. It does that only while Claude waits for you at its prompt; while it
182
+ works or asks a question there, nothing is typed and the comment stays in the field.
183
+
184
+ - **Claude now: what Claude is working on, top to bottom.** A new item under *Dashboard* in the sidebar
185
+ lists every task in work across the projects, grouped by the run of Claude that holds it. A run says
186
+ how much of it is handed in (*handed in 1 of 3*, with a ring); each task shows its step and how far it
187
+ is — by its checklist when it has one, by its stage otherwise (Prep 25%, Doing 50%, Deploying 75%,
188
+ Review 100%). The task Claude is on right now is marked, the ones waiting their turn follow it, and
189
+ runs nobody leads any more — the session closed, or nothing moved for two hours — are folded at the
190
+ bottom, so stuck work is easy to find. The sidebar item counts the tasks in work and shows a dot while
191
+ some Claude is working; it all updates live, checklist ticks included.
192
+ - **Claude review: hand the acceptance of a project to Claude with one button.** A new sidebar item
193
+ under *Claude now* lists the tasks in Review by project, in the order of the sidebar. *Check in Claude* makes a check task in that
194
+ project — the tasks in Review at that moment are listed in it — and starts a fresh Claude on it: it
195
+ checks every task with tests of its own, simulates failures, moves what passes to Done and leaves the
196
+ report on the card of the check. While a check is open the button shows it instead — including when its Claude waits for an answer in the terminal, which opens right there — so the same tasks
197
+ are never checked twice at once — even two tabs pressing at once make one check. A check carries the
198
+ `check` label, so it is recognised on a board in any language, and the Claude started on it inside the
199
+ board moves exactly the tasks it lists to Done without asking; once that Claude has exited, the check
200
+ says its session is closed rather than that Claude is checking. The `kanban` skill says how such a
201
+ check is done.
202
+ - **The sidebar shows how much of your Claude limits is used.** The 5-hour and weekly windows of a Pro or
203
+ Max subscription sit at the foot of the sidebar, with the time the board heard of them. Claude Code hands
204
+ these figures only to its status line, so `kb statusline` forwards them: put it in front of your own
205
+ status line (`kb statusline | your-command`) or use `kb statusline --line` on its own. A window whose
206
+ reset time has passed is not shown, and with nothing current the footer says why: *not connected · connect* when
207
+ the status line does not go through the board (*not connected · how* when your own status line has to take
208
+ `kb statusline` by hand), *go to another board* when another board holds it, and *no data*
209
+ otherwise — which is what a board used only from the Claude desktop app gets, since the app runs no status line.
210
+ A click on it opens **Settings → Claude Code**. A board that hangs does
211
+ not slow your status line down: kb sends the figures and hangs up without waiting for an answer. Switch to
212
+ another Claude account (`/login`) and the footer shows that account's figures from its first reading on.
213
+ - **Answer Claude from the card.** When Claude Code is about to ask you something — a permission, a
214
+ question, a plan to approve — the PermissionRequest hook `kb hook permission` puts the request on top of
215
+ the card of the task the session works on, and the card's badge says *needs your answer*. Allow or deny it
216
+ with a reason, pick the answers (or write your own), approve or reject the plan with what to change.
217
+ Claude's own dialog stays usable all along, and whichever side answers first wins; a request answered in
218
+ Claude leaves the card by itself. An answer given the moment Claude has already taken one in its own window
219
+ does not pass for a given one: the card says it did not reach Claude. A tab whose answer lost to another tab's
220
+ says so, and a request the board lost when it was restarted is named on the card instead of vanishing. The whole command is shown, never cut short, and every answer is written
221
+ into the task's history — never sent to GitHub. Answers are taken from the board's page, which keeps other
222
+ web sites out but not programs on your computer — Claude included, if it may run `curl` without asking.
223
+ - **Connect the board to Claude Code in one command.** `local-kanban hooks install` adds the two entries
224
+ above to Claude Code's settings.json — the status line through `kb statusline`, in front of your own, and
225
+ the PermissionRequest hook — after showing what it will change and asking. Your other hooks and settings
226
+ stay, the previous file is kept in the board's backups, and `local-kanban hooks uninstall` takes off
227
+ exactly what it added. A settings.json made read-only, or a folder it cannot write, is reported and left as
228
+ it was. Your status line keeps getting all of its input whatever shape its command has,
229
+ and keeps working even if kb cannot start; a settings.json that is a link stays a link with the same
230
+ permissions, a file Claude Code changed while you read the change is not written over, and running the
231
+ command again after a Node upgrade brings the board's entries up to date. Your settings.json keeps its own
232
+ indentation and line ends, and the copy of the previous one is a `.json` file in the board's data folder —
233
+ in the setup wizard, the folder you chose there. A board removed without disconnecting it leaves Claude Code
234
+ quiet: the hook checks that the board is still there before it runs, and the README says how to take the
235
+ entries out by hand. The setup wizard offers the same step.
236
+ - **Settings → Claude Code.** One place to see whether the board's work with Claude Code can work on this computer:
237
+ the `claude` program, `tmux`, the Claude app and a terminal — the ways ▶ starts a task; the Claude folder, the
238
+ board's skill in it, the sessions and transcripts the cards read; whether the status line and Claude's questions
239
+ go through the board, and when the limits came last. Every missing piece says what does not work without it and how
240
+ to fix it, and a piece only one way of working needs — tmux, the Claude app, the connection — is marked as optional
241
+ (–), not as missing (✕). A copy of the board's skill that is not the version this board ships — one left from an
242
+ earlier version, or changed by hand — is said to be so, and **Settings → Skills** takes the board's version in one
243
+ click, keeping the old file among the backups. **Connect** writes the board's two entries into Claude Code's settings.json — the same as `local-kanban
244
+ hooks install`, after showing exactly what it will write — and **Disconnect** takes them off again. How tasks start
245
+ and what Claude inside the board may do moved here from General. The two switches at its top, **Show on the
246
+ board**, hide Claude's usage (the dashboard block and the card's line) and the limits footer — for anyone who
247
+ would rather not see them, or whose footer only ever says "no data" because they work in the Claude app. With two
248
+ boards on one computer only one can be connected: the section names the board that holds the connection, and
249
+ connecting this one asks before it takes the connection over.
250
+ - **What a task cost.** A card some Claude session worked on shows a usage line under its sessions: the
251
+ tokens first, then roughly what they would cost on the API (≈, at the prices of the date shown — with a
252
+ subscription the money is notional), and how full the conversation memory was on the last answer; hover it
253
+ for the breakdown (input, output, cache reads and writes). Helper agents started for the task count as its
254
+ usage. `kb show` and `kb take` print the same line. The dashboard shows Claude's usage for the chosen
255
+ period and the tasks that cost the most — click one to open it. It is counted from Claude Code's
256
+ transcripts on this machine, once and then only what is added; nothing is sent anywhere. Claude Code often
257
+ leaves out the final count of a helper's answers, so their output is under-recorded — the card says so
258
+ instead of pretending the number is exact.
259
+ - **Claude done.** A section under *Claude review* lists what Claude has finished in the last seven days: every
260
+ run — a batch started with ▶ or a single task — once none of its tasks is left in work, the most recently
261
+ finished on top, with how many of its tasks wait in Review and how many are accepted. Hand-ins made without a
262
+ session the board knows are put together by project and time and say so.
263
+ - **Check the Review column from the board.** The Review column of a project has the same button as *Claude
264
+ review*: it makes a check task for the tasks in the column and starts Claude on it; while a check is open, the
265
+ button opens its card instead.
266
+
267
+ ### Changed
268
+
269
+ - **A phone opens the board its own way.** Until you pick otherwise, a phone gets the dark theme, Claude as a chat, and
270
+ Claude now on the chats of its runs (Terminals); the language follows the phone's, as on a computer. A computer —
271
+ and a tablet — keeps the light theme, the terminal and the list.
272
+ - **Claude reads a whole batch of tasks before starting the first.** Given several keys at once (▶ or 📋 on To do), the
273
+ board's skill had Claude read and do them one by one — what a later task said (a key, a decision, the same place)
274
+ reached it only after the first was done. Now it reads them all first and plans the order.
275
+ - **The first run is a whole screen.** The welcome wizard no longer sits in a small window: the words and the
276
+ choice are on the left, and on the right a live picture of the step — a card going to Claude and back for your
277
+ check, Claude's terminal on a card, what this computer has for Claude Code (the same check as Settings → Claude
278
+ Code), the board as the switches leave it, the task and its GitHub issue. Pointing at a way of starting Claude shows
279
+ what ▶ does that way. Under "reduce motion" the pictures stand still; on a narrow screen the words come alone.
280
+ A board that went through the earlier wizard shows the new one once after the update; projects, tasks and settings
281
+ stay as they are.
282
+ - **The project of a run opens its board.** In Claude now, Claude review and Claude done the project name at the top of
283
+ a run or a group is a link to that project's board.
284
+ - **The terminals of Claude now → Terminals are as wide as their columns.** A column lays its terminal out to its own
285
+ width again (the card's narrower width left the right part of it empty), and keeps showing the old screen while
286
+ Claude reprints the conversation for the new width, so the start of the session no longer scrolls by — the card's
287
+ Terminal tab does the same. When a card and a column (or two tabs) show one terminal, its window takes the narrower
288
+ width instead of changing back and forth. A screen scrolled up has a ↓ in its lower right corner that takes it back to the end.
289
+ - Enter in the title of a card moves on to its description instead of leaving the field.
290
+ - **The light theme is crisper.** Text is near-black instead of grey, borders and the selected item stand out from the
291
+ cream, the sidebar has a tone of its own, and the symbols in the background are a quieter haze.
292
+ - **The board opens in the light theme until you pick one.** It used to follow the system, so a computer in dark
293
+ mode got a dark board without anyone choosing it. *System* is still there in *Settings → Appearance*, and a theme
294
+ you already picked stays.
295
+ - **Two themes: light and dark.** The theme *Claude* looked the same as *Dark* in the new look, so it is gone; a board
296
+ set to it opens dark, and the theme cards show the real colours of each theme. *System* still follows the computer.
297
+ - **No note pops up at the bottom right when Claude starts to wait for you.** The board still rings, the system
298
+ notification still goes out when it is on, and the block on top of the sidebar lists what waits.
299
+ - **A long list inside a window shows its scrollbar** — the skills in *Settings → Skills* and an open dropdown such
300
+ as the deploy skill of a project — narrow and grey, so it is clear there is more below.
301
+ - **The sections of the sidebar start with a small grey icon** — the first letter of the name ("Pinned", "Other",
302
+ your own sections) — in line with the icons of Dashboard and Settings above them; the projects carry none.
303
+ - **The title of a screen stands alone.** The line of description right of it (counts, the key and domain of a
304
+ project, "quick task capture") is gone.
305
+ - **The header of the Terminal tab fits one line**: a few words ("Working", "Waits for you", "Waits for your
306
+ answer", "Finished · code 3") and a short "Stop" or "Close" button next to them, instead of a sentence that
307
+ wrapped to two lines and pushed the button down.
308
+ - **"Claude now" puts no dot in front of its tasks** — the run's badge already says what its Claude is doing — only
309
+ ✓ in front of one handed in, and the task Claude is on is not highlighted — the line under its title says it.
310
+ - **The board no longer zooms by accident.** A pinch on a trackpad or a phone screen, Ctrl with the mouse wheel
311
+ and a double tap used to zoom the whole page, and the board slid past the edges of the window. These gestures
312
+ do nothing now; ⌘/Ctrl with + and − and the browser's View menu still zoom for whoever needs larger text.
313
+ - **Claude's work is a tab you switch on.** It is off by default now: *Settings → Claude Code → Show on the
314
+ board → Claude's work*. Off, the card does not show the tab or read the transcript for it, and a card with no
315
+ terminal shows no tabs at all — switched off while a card stands on that tab, the card goes back to its comments.
316
+ - **A card in work opens on its Terminal.** A task in Preparation, Doing or Deploy whose Claude runs inside the
317
+ board opens on the *Terminal* tab — there are no comments yet, and the terminal is what is going on.
318
+ - **The terminal of a card scrolls back.** Claude inside the board starts with Claude Code's classic renderer
319
+ (`CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN=1`): the fullscreen one draws on the terminal's alternate screen, which keeps
320
+ no history, so the card showed the 40 rows in sight and nothing above them. The card's screen now reaches 1000
321
+ lines back, and what you read up there stays put while Claude goes on printing. Terminals started before this keep
322
+ no history.
323
+ - **Words typed to the terminal of a task back in To do move it to Preparation**, and of a task in Review — back to
324
+ *Doing*, as the move of that Claude: it keeps the task when it takes it itself. Keys alone (Esc, the arrows, a bare Enter), a digit answering a question of
325
+ Claude's and a manual task move nothing.
326
+ - **"Claude now" shows a Claude of the board that is still at work** with none of its tasks in work — busy, or
327
+ with commands running in the background after handing its task in (*working in the background*). Such a run is
328
+ not in *Claude done* meanwhile.
329
+ - **A project Claude is at work in has a green pulsing dot** in the sidebar, in place of the orange one — also while
330
+ Claude works with commands in the background, or goes on after handing its tasks in; and a Claude that comes back
331
+ from the background to its prompt rings *waiting for you*.
332
+ - **A Claude of the board stopped at the usage limit says so.** Its tasks say *limit reached · until 12:50am* (the
333
+ reset as Claude Code gives it), the outline of a card in work stops turning, *Claude now* and *Waiting for you* say
334
+ the same, and the board rings and notifies once when Claude stops — before, the cards went on saying *working*. A
335
+ look at the terminals that tmux did not answer keeps the stop rather than ringing it again, and a dialog that only
336
+ quotes the limit's line is no stop.
337
+ - **Check in Claude waits for the work of its project.** While Claude is still at work on a task of the project
338
+ (Preparation, Doing or Deploy), the button in *Claude review* and the ▶ of the Review column are off, and a press
339
+ on them names those tasks. A blocked task, a task whose Claude session has closed, and one stuck for two hours with
340
+ no Claude on it do not hold the check. The press reads the project's tasks afresh, so a search narrowing the board
341
+ neither lets a check past work nor leaves tasks out of it.
342
+ - **The Terminal tab of a card says what its Claude is doing** — working, at its prompt with commands running in
343
+ the background, waiting for an answer, stopped at the usage limit, or done with its turn and waiting for a word —
344
+ instead of *Claude works in the background* over every live terminal, also of a Claude that handed its task in
345
+ hours ago.
346
+ - **"Claude review" no longer lists the report of a check**; a project with only reports in Review has no group, and
347
+ the count of the section in the sidebar leaves them out too.
348
+ - **The lists of "Waiting for you" on the dashboard fold** by their heading and stay folded on this computer.
349
+ - **The folders not on the board fold** under one row of the sidebar, folded by default.
350
+ - **No footer of Claude's limits while the status line does not go through the board** — it said *not
351
+ connected · connect* to everyone who works without it. Connecting stays in *Settings → Claude Code*.
352
+ - **Settings → Claude Code says why macOS keeps asking "node would like to access data from other apps".** Claude
353
+ inside the board runs under the board's `node` when pm2 runs the board (else under the app the board was started
354
+ from), macOS asks in its name and keeps no answer for a program without an app bundle. The row names which one to
355
+ give *Full Disk Access* — the path of that `node`, or the app — and opens that list.
356
+
357
+ - **The board finds Claude Code where it is, not only on its PATH.** Besides the PATH it looks where the installers put
358
+ `claude` and, on a Mac, at the copy of Claude Code the Claude app keeps for itself — so ▶ keeps starting Claude
359
+ inside the board when the command-line install is gone. Settings → Claude Code says where it was found; when it is
360
+ nowhere, the section shows the install command itself.
361
+ - **▶ in the Claude app no longer moves the tasks to Preparation.** The app only gets the prompt — you send it — and the
362
+ task waited in Preparation, a column only Claude moves, even when nothing was sent. Claude moves its tasks itself.
363
+ - **`kb take` names the cards left for you.** When To do holds only tasks you do by hand, `kb take`
364
+ and `kb next` answer `empty (2 by hand: CK-12 CK-14)` instead of a bare `empty`, so Claude tells you
365
+ there is nothing for it rather than that the column is empty.
366
+ - **`kb take` takes the task in one step on the board, a pinned card first.** Two sessions that took a
367
+ task at the same moment could both get the same one; now the board picks and moves it at once. A card
368
+ the person pinned (📌) in To do is taken first, and `kb` prints the pin in its lists. `kb lbl` adds and
369
+ removes labels instead of writing the whole set back, so calls side by side keep each other's labels.
370
+ - **The server runs on Fastify 5.** Fastify 4 went out of support on June 30, 2025, and was never
371
+ meant for Node 24 and 26, which the board supports. Nothing changes in how the board looks or
372
+ behaves; the same security headers are sent with every page.
373
+ - **A task you start goes to *Prep* at once.** ▶ on *To do* or on a card used to leave the tasks in *To do* until
374
+ Claude came up and took them — a good ten seconds, and in the Claude app until you pressed Enter there. Now they
375
+ move to *Prep* the moment Claude starts, whichever way it is started, and the card says *starting* until Claude
376
+ is up. The Claude that was started holds them, so another session cannot take them meanwhile — a second ▶ while the
377
+ first one is still starting Claude is refused, and a second Claude is not given a task another one works on. A start that is
378
+ refused or fails leaves the tasks where they were.
379
+ - **Claude started inside the board shows no next-prompt suggestions.** In the card's terminal the dim
380
+ suggestion Claude Code puts in its empty prompt looked like text typed and not sent, and the card's ↵ on an
381
+ empty field sends a bare Enter. The board now starts its Claude with suggestions off — the variable Claude
382
+ Code documents for it, `CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION=false`. Claude you start yourself keeps them.
383
+ - **Updating from Settings → About brings the Claude Code skills along.** The skills the setup copied into the Claude
384
+ folder were left as they were, so Claude kept reading the rules of the version it was installed with until you ran
385
+ `local-kanban skills`. Now a copy that matches the board's version is brought up to date with the board, and one
386
+ that already differs from it stays as it is — for the board's own skill **Settings → Claude Code** says so and leads
387
+ to the button that takes the board's version. `local-kanban skills` and that button never write through a link —
388
+ a skill file linked to a file of your own is left alone. The README's steps for updating by hand say to restart
389
+ the board too.
390
+ - **`kb mv` no longer closes a task.** Done and Cancelled are your word, so they are `kb done` and `kb cancel`
391
+ only: `kb mv <key> done` (or `cancelled`) is refused with exit code 2 and names the command to use. Claude started
392
+ inside the board runs `kb mv` without asking, and through it could move any task to Done without the question
393
+ `kb done` gets.
394
+ - **A card in work is easier to see and to read.** Its moving contour is twice as thick and visible all the way
395
+ round, and the card has a warm tint under its text; the middle is drawn on a layer of its own, so a browser that
396
+ composites with the graphics card does not let the moving colour through under the text.
397
+ - **The icon left of a section's title** is as tall as the title's capitals and centred on them.
398
+
399
+ ### Fixed
400
+
401
+ - **Typing the title of a new task on an iPhone no longer throws the card down.** Once the task was created, the board
402
+ scrolled its new card into sight, and with the keyboard up that moved the whole page: the title went off the top and
403
+ the comment field took its place. On a narrow screen the board now scrolls only its own columns.
404
+ - **A picture can be added to a task from a phone.** A phone can neither paste nor drop a picture, and a new task had no
405
+ way to add one at all. The card now has a "picture" chip beside "+ label": it picks pictures from the device, and a new
406
+ task is created by them as by a pasted one.
407
+ - **No scroll bar in a column on an iPhone.** iOS drew its own bar at the edge of a column scrolled with a finger,
408
+ whatever the page asked; the column now cuts that strip off.
409
+ - **`kb review` leaves no note when the move is refused.** It wrote the note first and moved the task after, so a task
410
+ that could not go to review (straight from To do) still got the note, and the retry added a second one. Now the task
411
+ moves first and the note follows; if the note does not save, kb says the task is in review and how to add it.
412
+ - **Words sent to a Claude at work no longer vanish from the chat.** Claude Code holds what you send while Claude is in
413
+ the middle of a step (a command of several minutes, say) and takes it only when the step ends; the chat said
414
+ "sending…" for a minute and then dropped the words, as if they were lost. Now the chat shows them as "Claude reads it
415
+ when the step it is on ends" for as long as Claude Code holds them — after a reload and on another device too.
416
+ - **A note from another Claude no longer takes the task away from the Claude working on it.** A Claude of one session
417
+ that left a note (or ticked a checklist item) on a task another Claude was working on became that task's latest
418
+ session — the card lost "session interrupted" and Continue of the real one. Now a note or a tick ties a new session to
419
+ a task only when no other session works on it; moving its status still does.
420
+ - **Claude sessions go on after the computer restarts.** When the Mac froze or restarted, every terminal of the board
421
+ went with it, and its sessions read "session closed" with no way back — the chat even said the Claude was not started
422
+ inside the board. Now such a session reads "session interrupted" with **Continue** in the card's chat, in Claude now
423
+ and in its column of Terminals, as long as its conversation is on disk: Claude comes back to the same conversation.
424
+ Such sessions have their own view, **Broken terminals**, beside Terminals in Claude now (with how many there are), so
425
+ Terminals keeps only the Claudes that are running.
426
+ - **The board on a phone.** The sidebar stood beside everything and left the board, a card and the columns of Claude
427
+ now 170 points of 390 — the page ran off the side. On a narrow screen the sidebar now hides: ☰ in the top bar opens
428
+ it over the page, and a pick in it, a tap beside it or Esc closes it; a card opens over the board, the whole width.
429
+ Closed, the panel is out of the way of Tab too — the focus no longer goes into it unseen.
430
+ - **A long link or line in a comment wraps** instead of running past the edge of the card, where it was cut off unread.
431
+ - **The session of a chat is chosen in the chat's own style** — a quiet chip with a chevron, like the model in the
432
+ field, and its list the chat's menu with a check by the session shown.
433
+ - **A session picked in a chat that does not load says so.** The chip named the session picked while the chat, and its
434
+ field, stayed on the other one, with no word; the list now goes back to the session shown and the chat says why.
435
+ - **A command of the chat runs as its block says.** Typed into the zsh of a Mac's Terminal, a block was read by zsh: a
436
+ `# comment` ran as a command or became the arguments of the one before it (`rm -f x # old log` removed `old` and
437
+ `log`), a `!` in a string failed, and a ```bash block split its words the zsh way. The block now goes whole to the
438
+ shell it names (bash, or zsh for a ```zsh block). A block longer than the board runs has no Run button.
439
+ - **Continue, once.** A Claude of the board killed outright (SIGKILL) read "Finished" and folded away instead of
440
+ "Session interrupted" with Continue; two Continues of one session from two of its cards at once started it twice
441
+ (the second failed, or stopped the first); and Continue took a task the session never held along with its own.
442
+ - **The pictures of a message do not weigh on the board.** The ten pictures of one message, asked for together, each
443
+ read and parsed the whole message — 400 MB of memory for 30 MB of pictures; the message is read once for them now.
444
+ A WebP or JPEG thumbnail keeps its place before it decodes, as a PNG did (the next words no longer jump), and a wide
445
+ thumbnail beside a tall one keeps its shape.
446
+ - **A question read off the screen keeps an option's description apart from its label** — at a narrow width a label
447
+ that ended near the edge took the description in, and the "recommended" mark was lost — and keeps the lines of its
448
+ text.
449
+ - **A chat spread over the window leaves the chats beside it where they were read.** In Safari the columns beside it
450
+ jumped by a few lines as it went over the window.
451
+ - **Opened steps come into view.** "N steps" right over the chat's field opened under the edge, and the steps had to be
452
+ scrolled to; the chat now scrolls along as the steps open, until the last of them is over the field (or the head of a
453
+ long list is at the top).
454
+ - **Every question of Claude in the chat is a form.** A question whose request never reached the board (the board was
455
+ restarted while it waited, or it waited past half an hour), and a permission Claude asks in its terminal, were the last
456
+ rows of its screen — cut off at the top — with the keys 1 2 3. The chat now reads it off the screen and shows the same
457
+ form as any question: the whole text, a row per option with its description, an answer of your own; a long one fades
458
+ at its edge while there is more below.
459
+ - **The board away for a moment.** A refresh of the board while it did not answer left "Failed to fetch" uncaught —
460
+ in the browser's console and, once the board was back, in Settings → Errors — and the list unread. The board now
461
+ says "tasks did not load" by the title and reads them again once it answers, and a card the board reopens after a
462
+ move no longer stacks "The board is not responding" over the window: it follows the move when the board is back.
463
+ - **A cleanup of leftover hooks no longer stops Claude's sessions of the board.** The board's hook for Claude's questions
464
+ went on the command line of every Claude it started, so `pkill -f "kb hook permission"` (meant for leftover hooks)
465
+ stopped all of them at once. The hook now goes to Claude as a file in the board's data folder. Other words of the
466
+ command line (the task's key, the allowed `kb` commands) are still there — never stop processes by a pattern.
467
+ - **A command Claude Code moved to the background is background work.** A command that outruns its two minutes goes on
468
+ in the background by itself, and a skill can run as a helper there; the chat now names such work over its field with
469
+ the time it started, and a Claude done with its turn while only such commands run is said to wait for you — not
470
+ «Claude works in the background…» over nothing.
471
+ - **The chat holds up under odd answers and a busy hand.** A long run of spaces in a heading, deep quotes or a line of
472
+ brackets in Claude's answer no longer hangs the tab or blanks the chat, and a wide table scrolls instead of squeezing
473
+ its words to a letter a line. Words the board could not deliver come back to the field of their own task, before
474
+ anything typed since, even after you went to another task; a picture put to a message and sent at once goes with it;
475
+ the light of a stopped Claude goes out after a failed look too, and a closed card stops asking the board. Words sent
476
+ "Now" from the queue stay in the chat until Claude takes them, and the queue waits its two seconds after them.
477
+ - **The chat says why a message was not sent.** With too many messages already waiting for a busy Claude, the refusal
478
+ flashed and went; it now stays under the chat, in words that say what is wrong, until the words are edited. A chat
479
+ that could not load says so and tries again instead of "Loading…" for good, and background work Claude stopped
480
+ itself no longer runs in the chat forever.
481
+ - **A chat column on a phone has a height of its own**, as the terminal has: it no longer grew to the whole
482
+ conversation and opened at its first words.
483
+ - **⌘F in fields.** The search shortcut rebound to a bare letter no longer swallows that letter while typing in a
484
+ field, and ⌘F opens the search from the chat's field too.
485
+ - **The first-run wizard.** A change of language no longer leaves the page one solid colour when the board does not
486
+ answer; Back stands with its arrow on the edge of the words above it; and a failed check of the computer in the step
487
+ Permissions says so with a button to check again, instead of the macOS row silently going.
488
+ - **A check of Review moves what passes to Done without asking again.** Its Claude moved the tasks with a loop, which
489
+ the permission check of Claude Code sometimes refused, and the person had to say "move them yourself". The check now
490
+ tells it to move each task with a command of its own — the one the board allows it.
491
+ - **A card left open while its task moves to another project follows it.** Moved from another tab or by `kb`, the
492
+ task's open card went on showing its old key and no "Moved from"; it now opens again under the new key, with an edit
493
+ in progress saved and a half-typed comment kept.
494
+ - **The answer field of Claude now → Terminals no longer lags.** With a few columns open, every letter typed laid out
495
+ their screens of a thousand rows again; a key now costs what it costs with no screens at all.
496
+ - **Words typed to a task in Review that are not about it no longer leave it in Doing.** Typing into the terminal of a
497
+ handed-in task sends it back to Doing, as before; once Claude's turn is over, a task it did not touch — no move, no
498
+ note, no commit and no changed file in the project, an edited file git does not track yet included — goes back to
499
+ Review by itself, with the time it had. So does one whose Claude moved on another of its tasks in that turn: the
500
+ words were about that one. The card's timeline says which moves were made by typed words and which the board undid.
501
+ - **`kb` stops quietly when the reader of its output goes away** (`kb show KEY | head -1`), instead of printing a
502
+ stack and exiting with the code that means "the board is not responding".
503
+ - **Claude now shows a Claude that put its task back to To do and waits for your answer.** An `ask` task goes back
504
+ to To do with Claude's questions; its terminal waited at the prompt, and the section was empty. A task the person
505
+ moved to To do afterwards does not count.
506
+ - **A terminal in Claude now → Terminals opens at its end, not at the start of the session.** A column widened its
507
+ terminal's window on every opening of the section, and Claude Code then printed the whole conversation again from
508
+ its first line. A column now only narrows a window its lines do not fit.
509
+ - **The background of symbols no longer fades out and back when the window is hidden.** The last frame stays, and
510
+ the clouds go on from where they were once the window is back.
511
+ - The ✕ of a column in Claude now → Terminals is as tall as "Open in the card" beside it.
512
+ - **A task handed in stays in Review when you go on to the next one in the same terminal.** Words typed to a card's
513
+ terminal send its task from Review back to Doing — and after a hand-in, words like "now take the next one" did that
514
+ too: the finished task sat in Doing and kept its run in Claude now. When the same Claude takes another task into work
515
+ without having touched this one since, it goes back to Review with the time it had — and the task Claude went on to
516
+ is the one its card and Claude now say it works on.
517
+ - **Copying from a short terminal screen keeps the lines Claude ended apart.** On a fresh screen, where no text had
518
+ reached the edge yet, the longest line was taken for the width of the window, and `git push` under
519
+ `git commit -m "…"` was copied as part of it.
520
+ - **New task shows every task added last.** A task added from outside right after another (`kb add` in a batch) did not
521
+ show under the form until something else happened on the board.
522
+ - **Handing in one of two tasks in work leaves Claude on the other.** A Claude with two tasks in Doing that handed one
523
+ in was on no task at all: the card of the other did not say "working", and Claude now marked none of its tasks.
524
+ - **Text copied from a terminal is the text Claude wrote.** A selection on the screen of a card's Terminal tab or of
525
+ a Terminals column used to copy the screen's rows: a command Claude laid out over three rows of a narrow window came
526
+ with line breaks and indents inside it and broke in the shell. Now the rows the width broke go back together, the
527
+ indent the whole selection shares goes, and lines Claude ended stay ended.
528
+ - **A Claude that waits for a command of its own no longer calls you.** When the turn that just ended started work in
529
+ the background (a measurement, a build, a background agent) that is still running, the card and Claude now say
530
+ "working in the background" and nothing rings: the end of that work wakes Claude by itself. A tunnel or a dev server
531
+ left running does not count — Claude does not wait for those — and after two hours it calls you again.
532
+ - **Claude now no longer says "working" over runs whose tasks are all done.** Newer Claude Code marks a Claude at
533
+ its prompt with commands still running in the background as `shell`, and the board took the unknown word for a
534
+ turn in progress. Such a Claude now reads "working in the background" — on cards, in *Claude now* and in the
535
+ card's *Terminal* tab — and a terminal whose tasks were all accepted closes again. A Claude with no task in work
536
+ that has sat at its prompt for over two hours, a background command still running, leaves *Claude now* for
537
+ *Claude done*: a command that long with no turn of Claude is a leftover, not work.
538
+ - **Terminals of the board that only wait no longer pile up.** A terminal whose tasks are all in Review (or put
539
+ back), with its Claude idle at the prompt for six hours, now closes by itself, as one whose tasks were accepted
540
+ does; a question on its screen or a command still running in the background keeps it. Forty such terminals,
541
+ some ten days old, held 12 GB of a 16 GB Mac. The conversation stays: ↗ on the card picks it up again.
542
+ - **The tabs of a card stay on one line.** In a card 360 pixels wide *Claude's work* and its count, and
543
+ *Terminal* and its dot, broke onto a second line. A count over 999 is written short (*1k*), and only the
544
+ words of a tab give way, so the count and the dot always show.
545
+ - **A clicked card keeps its ring while it opens.** A board event arriving meanwhile (Claude moving cards) put the
546
+ ring back on the card open before; and the answer to an earlier, slower click no longer replaces the last one.
547
+ - **Claude's screen on the Terminal tab follows its answer.** Pressing a key or sending an answer lets go of a
548
+ selection on the screen, which used to hold the screen still; a mouse button pressed on the screen holds the
549
+ redraw too, so a slow drag selects.
550
+ - **A question of a board's Claude always rings.** One that the page first heard of from its own refresh used to
551
+ be taken as known and never rang; a line of Claude quoting a question's footer no longer reads as a question.
552
+ - **One run is never in *Claude now* and *Claude done* at once.** A manual task in work stands on its own in
553
+ *Claude now* and no longer holds Claude's run there.
554
+ - **The Review column's ▶ wakes up after another tab made the check,** instead of staying dead until a refresh.
555
+ - **Settings:** the install command of Claude Code (and every command shown to be run) can be selected and
556
+ copied; the effort list stays inside the Settings window; a stored effort level the board does not know is not
557
+ sent; the advice for an API key names both places it comes from; *GitHub sync* says above its fields that the
558
+ repository is made by you and that `gh` needs the `project` scope.
559
+ - **Settings → Claude Code tells the truth in more corners.** "The status line runs" is shown only for a recent
560
+ reading while the status line goes through this board; a `KB_CLAUDE_DIR` pointing at a missing folder disables
561
+ Connect instead of creating it; a `KB_CLAUDE_BIN` pointing nowhere is blamed on the variable; a Claude folder that is
562
+ not writable no longer offers Connect or keeps a copy of settings.json on every try; a refusal is said once; losing
563
+ the connection keeps the list on screen; and a double click on Connect no longer closes the confirmation. Installing or refreshing a skill — from Settings → Skills, by an update, by `local-kanban skills` or the setup — no
564
+ longer creates a missing `KB_CLAUDE_DIR` folder either. An update of a clone no longer logs that its own skill "did
565
+ not come along".
566
+ - **Smaller fixes found while accepting this release.** A hook written by an earlier version of the board reads as
567
+ "written by an earlier version — Connect brings it up to date", not as a board that moved. Duplicate on one of two
568
+ open checks opens the other one instead of advising ▶, which that check would refuse. A tmux that does not answer in
569
+ time no longer turns a fresh start of Claude into "session closed". An open card's status log keeps two moves made
570
+ outside that end where they began. Answering the refusal of Send back keeps the reason you typed. Settings → Skills
571
+ says a refusal in the board's words, not the server's.
572
+ - **Settings → Skills names the right folder.** It used to say the skills live in `~/.claude/skills` even when the
573
+ board reads them from `KB_CLAUDE_DIR` or `CLAUDE_CONFIG_DIR`; it now shows the folder it really uses and where that
574
+ comes from, as Settings → Claude Code does.
575
+ - **`local-kanban hooks` and `local-kanban skills` keep their copies with the right board.** Run from a terminal,
576
+ they kept the copy of the file they replaced in the data folder of their own process, so a board with its data
577
+ elsewhere never showed it under Backups. They now ask the running board where its data is; when it does not
578
+ answer, they write nothing unless you name the folder with `--data <dir>`.
579
+ - **A refusal of the board is said in its words, everywhere.** On a task deleted in another tab, removing a
580
+ link, adding a checklist item, deleting a comment, Send back, Accept and ▶ now say the task is gone and close
581
+ its card, instead of failing without a word. An edit of an open task the board fails or refuses is said in the
582
+ card — a failure waits behind "not saved" and is sent again — instead of being lost. Settings, the project
583
+ wizard, the project's page and Chaos say why something was refused in the board's language.
584
+ - **An image too large for the board is said to be too large in Safari too.** Pasting an image over 6 MB
585
+ into a card, a comment or Chaos said "no connection to the board" in Safari about half the time; the board
586
+ now checks the size before sending and says the image is larger than it takes.
587
+ - **An open card's status log follows a move made elsewhere.** When a task is moved by `kb mv`, in another
588
+ tab or by starting Claude, the open card's status log now shows the new line at once, not only after the card
589
+ is opened again.
590
+ - **Uploading a backup can no longer delete files.** A JSON request to the upload route could name any
591
+ file — the board's own database included — and the board deleted it; the route now takes only the uploaded
592
+ file itself, and a broken upload no longer blocks every later one. A board opened from a backup no longer
593
+ writes to the live board's files, takes no snapshots of itself and cannot update the code it shares with
594
+ the live board, and copying its attachments no longer freezes the live board for half a second.
595
+ - **A snapshot is never rotated away right after it is taken.** From schema version 10 on, the snapshot
596
+ taken before a migration would have been deleted at once; west of Greenwich, *Back up now* right after the
597
+ update deleted the snapshot it had just taken; saving the `deploy` skill removed the snapshots
598
+ of `deploy-tickets` and its own; two saves within a second lost the previous text. Unfinished snapshot
599
+ files left by a crash are cleaned up at start, and snapshot names and the times under Backups follow the
600
+ local clock instead of UTC — the snapshot taken before a migration, the one made with *Back up now* and the
601
+ copies kept when a skill or a project's CLAUDE.md is saved included, with the UTC offset in their names so that older names still sort
602
+ in their true order.
603
+ - **The card keeps your edits, and only yours.** An edit made elsewhere while the cursor sat in a field is
604
+ no longer undone by the next click in the card; a card left open on the dashboard or in Chaos follows the
605
+ task; a closed card is never saved again as a copy (Cmd+Enter with the sidebar pinned, or a retry after
606
+ the server came back), and an edit made while the server was down reaches it even after the card is
607
+ closed. Project settings and the CLAUDE.md and skill editors ask before dropping typed text, Save sends
608
+ only what changed, the board's keys stay out of open windows, and an open tab picks up a new version of
609
+ the page's markup or styles.
610
+ - **A big board stays light.** The card loads Claude's work only on its tab, and a session with dozens of
611
+ helper agents no longer re-reads all their transcripts on every update (with 30 helpers that kept the
612
+ board above its memory limit). A note, a link or an attachment changes one card instead of reloading the
613
+ whole list in every tab, a burst of events is drawn once, the dashboard stops recounting on events that
614
+ change none of its numbers, and the endless pulses no longer redraw the page every frame (reduced motion
615
+ stops them). The list of all projects no longer comes back empty from 16,384 tasks on.
616
+ - **Search shows the answer to what you typed.** A slow answer to an earlier, shorter query could stay on
617
+ the board as the result; now only the latest request counts, typing waits a little longer before asking,
618
+ and a task that arrives while a search is on is filtered like the rest.
619
+ - **`kb` and the API refuse malformed input instead of acting on it.** A task key went into the address
620
+ as is (`kb note '../backups?' …` took a database snapshot), `kb constructor` crashed, a foreign service on
621
+ `KB_URL` passed for the board, `prefix: null` renamed every task to `NULL-N`, and a slug with `../` wrote
622
+ outside the data folder. Errors now name the field. The error log no longer loses its history to one
623
+ failure repeated on many tasks; `local-kanban skills` refreshes the skills in place and keeps a copy of
624
+ what it replaces; `--data=~/x` lands in the home folder; deleting the demo closes its GitHub issues.
625
+ - **Claude's exit code shows on Linux too.** tmux there sometimes missed the signal of Claude's exit, and
626
+ the card said only "Claude has finished"; the board now reminds tmux once.
627
+ - **A task you have just made is a whole card at once.** A task made with **+** had no ▶ in its card, no
628
+ *+ link*, no status log and no *Cancelled* among its statuses until the card was closed and opened again —
629
+ so it could not be started in Claude right away. Now they are there as soon as the task is made.
630
+ - **Smaller interface fixes.** A right-click change or a comment made while the server is down waits for it
631
+ instead of failing silently; the Russian board writes sizes and hours with a decimal comma, names the
632
+ Local and Other sections in Russian and puts the word for "subfolders" in the right form for the number.
633
+ - **Claude inside the board: a language, long replies, an honest start.** A board run by pm2 has no
634
+ `LANG`, so its Claude worked in the C locale — `grep -i` missed capital Cyrillic, `wc -m` counted bytes;
635
+ it now gets the person's language or a UTF-8 one. A reply or a comment longer than about 8 000 Cyrillic
636
+ letters failed with "command too long"; text now reaches Claude whole up to the promised 14 336
637
+ characters, and a key name in a reply (`C-c`) is typed, not pressed. A prompt longer than tmux takes is
638
+ refused before anything starts, and *auto* takes it to the app or the Terminal instead. A project whose
639
+ folder is not on this computer no longer starts Claude in the home folder from the Terminal or the app —
640
+ the board offers to make the folder, as it already did inside the board. The *working* badge no longer
641
+ trusts a process id that another program got later. The Terminal tab looks at the screen only after the
642
+ last look came back, with one call to tmux, and is sent the screen only when it changed.
643
+ - **A retried GitHub issue no longer comes twice.** When the answer to creating an issue was lost, the
644
+ retry looked for the issue through GitHub's search, which indexes minutes late — exactly when the retry
645
+ comes — and made a second one. It now looks among the newest issues first, and searches only after that.
646
+ - **▶ right after the last Claude of the board was stopped no longer fails.** tmux was still shutting down
647
+ its server, and the start got "server exited unexpectedly"; the board now tries such a start once more.
648
+ - **The board always starts on matching page and code.** Safari, and the board installed from it as an app,
649
+ reopens a window and goes back and forward from its cache without asking the board — telling it to check
650
+ first does not stop that. After an update this could pair the new code with the old page: the board stayed
651
+ on its loading placeholder and then came up empty, and *New task* did nothing. The page, its code and its
652
+ styles are no longer kept in the browser cache, the installed app takes the page from the board every time,
653
+ and should a script of the board still fail while the board loads, the page reloads once by itself.
654
+ - **Found while these fixes were accepted.** One helper transcript the board cannot read no longer turns the
655
+ whole *Claude's work* tab into an error; a board whose first load failed (the server answered 500 for a
656
+ moment) tries again instead of staying empty until the page is reloaded; `kb lbl` against a board that was
657
+ updated but not restarted says to restart it instead of printing labels it did not set; and `local-kanban
658
+ skills` names a skill it could not refresh and exits with code 1. Twenty requests for *What's new* or the
659
+ update check that arrive together share one trip to GitHub instead of twenty (and one run of `gh` when the
660
+ anonymous request is refused); a `kb take` of an older version can no longer take a task another session
661
+ already has in *Prep* — it is told the task is taken, and the kanban skill tells Claude to leave such a task
662
+ and say so; and a page whose code failed to download at start
663
+ reloads once instead of staying empty.
664
+ - **The Update button on a clone installs the dependencies too.** It ran `git pull` and nothing else, so
665
+ a release that changed the dependencies restarted the board on new code with the old packages. It
666
+ now runs `npm install` after the pull, the way `npm run update` always has. A clone that picks up
667
+ this release with a plain `git pull` (which is all the button did until now) keeps working on its old
668
+ packages until `npm install` runs.
669
+ - **Claude's work keeps the step that handed a task in.** Status changes are stored to the second, so a `kb
670
+ review` run within the same second as the move fell out of the task's feed, or showed up in the next
671
+ task's. That second now belongs to the task handed in, and a step whose answer came after the move shows
672
+ how long it took and whether it failed.
673
+ - A card that Claude takes while it is open now locks right away (also in Preparation) and hides “+ label”,
674
+ “ask?”, “+ link” and the link and checklist delete buttons; when the task leaves work the card unlocks
675
+ with those buttons back and shows what Claude changed meanwhile — no need to reopen it. Before, a label
676
+ picked on such a card showed up but was never saved, and taking `noclaude` off a task in work was lost. The card's ⋯ menu and the link picker, if open at that moment, close too.
677
+ - When the server does not answer while you switch projects or search, the board keeps the project and the
678
+ tasks you had, tells you so (“project did not open”, “search did not reach the server” next to the title),
679
+ and finishes the switch or the search by itself once the connection is back — a click on the notice
680
+ retries at once. When the server answers with an error instead, the board says so and tries again by itself in a few seconds; the first load of a board that fails shows its columns with a note and a “Try now” button, and a switch that takes a moment shows the loading skeleton instead of the previous project's cards under the new title. Before, the board went blank and lost the selected project without a word.
681
+ - A change made with the right click on a task that was deleted elsewhere now says “This task no longer
682
+ exists” in the board's language and takes the leftover card off the board, instead of “Not saved: task not
683
+ found”.
684
+ - The rest of the task card speaks the board's language too. The link picker, typing into Claude's
685
+ terminal, starting Claude and pasting an image say why the server refused in the board's words instead
686
+ of its English (“the task to link to was not found”, “limit of attachments per task: 30”); pinning,
687
+ cancelling or deleting a task that was deleted elsewhere says so and clears the leftover card instead
688
+ of doing nothing. A server error now says the board answered with an error and that the details are
689
+ under Settings → Errors, rather than that the board is not responding.
690
+ - A comment sent while the server is down now stays in the card's comments as “not sent — goes out once the
691
+ connection is back” (with × to drop it) and is sent once when the connection returns; sending the same
692
+ text again while it waits no longer makes a duplicate.
693
+ - The “working” dot of the card's Terminal tab goes out when Claude exits — no need to reopen the card, and also when the task was still in To do or Backlog.
694
+ - A new task the server does not create says why at the top of its form — no connection, a server error
695
+ (it is retried from the “not saved” badge or with your next change) or a refusal in the board's words —
696
+ instead of failing silently, and typing on no longer sends a request for every letter.
697
+ - **Claude is never started on a task you do by hand.** ▶ and the copy button on *To do* put every task of the
698
+ column into Claude's job, the ones labelled `noclaude` too, and `kb take` could pick such a task. Now both buttons
699
+ leave manual tasks out (a column of manual tasks only has neither), the board refuses to start Claude on one —
700
+ also from a tab that has not heard of the label yet, which then says why and loses its ▶ — and `kb take` passes
701
+ manual tasks by.
702
+ - **The button that archives a project says so on the Russian board.** It read as the name of the settings
703
+ section: the Russian dictionary held the word twice and the second translation won without a word. Each
704
+ word is in the dictionary once now (the English name of that settings section is *Archived*), and a test
705
+ keeps it that way.
706
+ - **The status line's limits reach a board that reads the request a moment late.** `kb statusline` hung up the
707
+ moment its request was out, and a board with an asynchronous step before reading it lost the reading. kb now
708
+ waits up to 300 ms for the board's answer — a board that never answers still costs the status line a moment,
709
+ not a second.
710
+ - **A second open check is no longer made silently.** Putting the check label on a task, or sending the report of
711
+ an earlier check back to To do, while the project has an open check goes through and says so — on the page and in
712
+ `kb`. *Duplicate* on the open check itself says it is still open and how to start it again, instead of opening the
713
+ same card, and no longer lands in Settings → Errors; a check in Backlog can be copied.
714
+ - **A Claude that exited at once, or a start nobody sent in the Claude app, no longer reads as starting or
715
+ checking.** A Claude started inside the board that exited right away (not signed in, crashed) showed *starting*
716
+ for two minutes; now its card says *session closed* at once. A task or a check started in the Claude app says
717
+ *waiting to start in the app* until someone presses Enter there, and *session closed* after two hours — the
718
+ Claude review section used to say *Claude is checking* for good.
719
+ - **Claude started in the Terminal or the Claude app works with the board that started it.** Its `kb` went to
720
+ the board on the default port (3100), so on a board on another port Claude moved tasks on a different board.
721
+ The Terminal command now carries the board's address, and for the Claude app (and a copied prompt) the prompt
722
+ ends with a line naming it — only when the board is not on the default port.
723
+
724
+ ### Security
725
+
726
+ - **`@fastify/static` 10.1.3 closes two advisories** — a path-traversal bypass of route guards
727
+ (GHSA-83w8-p2f5-377r) and a bypass of `allowedPath` (GHSA-8pvw-jcv7-9cmj). The board was not
728
+ exposed to either, because it protects every request the same way rather than individual static
729
+ files, but `npm audit` reported them to everyone who installed the package. The version is pinned
730
+ on purpose: later releases need Node 22.12 or newer, and the board still supports all of Node 22.
731
+
11
732
  ## [1.15.0]
12
733
 
13
734
  ### Added