wherdr 1.3.3 → 2.0.0

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 (252) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/BDNMzG2s.js +1 -0
  3. package/.output/public/_nuxt/BETID3_E.js +1 -0
  4. package/.output/public/_nuxt/BHenDMeH.js +1 -0
  5. package/.output/public/_nuxt/BYZVrreW.js +1 -0
  6. package/.output/public/_nuxt/BhgehRdJ.js +1 -0
  7. package/.output/public/_nuxt/{yzABg5xl.js → Bpoxvzh6.js} +1 -1
  8. package/.output/public/_nuxt/BtH82ZuZ.js +9 -0
  9. package/.output/public/_nuxt/C25ROUa9.js +3 -0
  10. package/.output/public/_nuxt/C3Bkn4ac.js +62 -0
  11. package/.output/public/_nuxt/CDWjMk9C.js +2 -0
  12. package/.output/public/_nuxt/{Ci8N4mWR.js → CXJnLmWv.js} +1 -1
  13. package/.output/public/_nuxt/CuUQ4mEf.js +1 -0
  14. package/.output/public/_nuxt/DFGEl0v2.js +23 -0
  15. package/.output/public/_nuxt/{CKhgznq4.js → DFmgQVme.js} +42 -39
  16. package/.output/public/_nuxt/DZGKxROq.js +6 -0
  17. package/.output/public/_nuxt/DmkWvmnE.js +2 -0
  18. package/.output/public/_nuxt/DrKKeFFE.js +31 -0
  19. package/.output/public/_nuxt/DyfFwwGq.js +1 -0
  20. package/.output/public/_nuxt/FaNto0ga.js +105 -0
  21. package/.output/public/_nuxt/NIF0VwHk.js +25 -0
  22. package/.output/public/_nuxt/R0Y4VoeX.js +1 -0
  23. package/.output/public/_nuxt/board.CEEcFc6M.css +1 -0
  24. package/.output/public/_nuxt/builds/latest.json +1 -1
  25. package/.output/public/_nuxt/builds/meta/0b28b3e9-664e-4347-a35b-afb0a711d5c5.json +1 -0
  26. package/.output/public/_nuxt/entry.CKoXcwRa.css +2 -0
  27. package/.output/public/_nuxt/pdf.min.t82Z80JU.mjs +28 -0
  28. package/.output/public/_nuxt/pdf.worker.min.wgc6bjNh.mjs +28 -0
  29. package/.output/public/_nuxt/settings.Cdb21nNw.css +1 -0
  30. package/.output/public/sw.js +1 -1
  31. package/.output/server/chunks/_/branding.mjs +1 -1
  32. package/.output/server/chunks/_/changes.mjs +4 -4
  33. package/.output/server/chunks/_/fileDownload.mjs +278 -0
  34. package/.output/server/chunks/_/files.mjs +60 -20
  35. package/.output/server/chunks/_/machineOrder.mjs +1 -1
  36. package/.output/server/chunks/_/onboarding.mjs +1 -1
  37. package/.output/server/chunks/_/package.mjs +11 -3
  38. package/.output/server/chunks/_/plugins.mjs +92 -122
  39. package/.output/server/chunks/_/restart.mjs +1 -1
  40. package/.output/server/chunks/_/selfupdate.mjs +1 -1
  41. package/.output/server/chunks/_/settingstabs.mjs +36 -0
  42. package/.output/server/chunks/_/updates.mjs +1 -1
  43. package/.output/server/chunks/_/worktrees.mjs +1 -1
  44. package/.output/server/chunks/_/ws.mjs +43 -6
  45. package/.output/server/chunks/nitro/nitro.mjs +14126 -10238
  46. package/.output/server/chunks/raw/check-doc-links.mjs +5 -0
  47. package/.output/server/chunks/raw/check-leaks.mjs +1 -1
  48. package/.output/server/chunks/raw/check-release-notes.mjs +5 -0
  49. package/.output/server/chunks/raw/herdr-plugin.mjs +1 -1
  50. package/.output/server/chunks/raw/install-claude-statusline.mjs +1 -1
  51. package/.output/server/chunks/raw/prerelease-summary.mjs +5 -0
  52. package/.output/server/chunks/raw/prerelease.mjs +7 -0
  53. package/.output/server/chunks/raw/reveal.mjs +1 -1
  54. package/.output/server/chunks/raw/test-affected.mjs +5 -0
  55. package/.output/server/chunks/routes/api/_..._.mjs +6 -5
  56. package/.output/server/chunks/routes/api/agents.post.mjs +6 -5
  57. package/.output/server/chunks/routes/api/ask-tab.post.mjs +6 -5
  58. package/.output/server/chunks/routes/api/attach.post.mjs +6 -5
  59. package/.output/server/chunks/routes/api/auth/disable.post.mjs +6 -5
  60. package/.output/server/chunks/routes/api/auth/lock-all.post.mjs +6 -5
  61. package/.output/server/chunks/routes/api/auth/lock.post.mjs +6 -5
  62. package/.output/server/chunks/routes/api/auth/login/options.post.mjs +6 -5
  63. package/.output/server/chunks/routes/api/auth/login/verify.post.mjs +6 -5
  64. package/.output/server/chunks/routes/api/auth/max-session.post.mjs +6 -5
  65. package/.output/server/chunks/routes/api/auth/register/options.post.mjs +6 -5
  66. package/.output/server/chunks/routes/api/auth/register/verify.post.mjs +6 -5
  67. package/.output/server/chunks/routes/api/auth/status.get.mjs +6 -5
  68. package/.output/server/chunks/routes/api/changes.get.mjs +7 -6
  69. package/.output/server/chunks/routes/api/chat/image.get.mjs +7 -6
  70. package/.output/server/chunks/routes/api/chat.get.mjs +44 -11
  71. package/.output/server/chunks/routes/api/choose.post.mjs +44 -30
  72. package/.output/server/chunks/routes/api/claude-setup.post.mjs +42 -0
  73. package/.output/server/chunks/routes/api/claude-statusline.post.mjs +7 -6
  74. package/.output/server/chunks/routes/api/clear-queued-input.post.mjs +42 -0
  75. package/.output/server/chunks/routes/api/close/status.get.mjs +7 -6
  76. package/.output/server/chunks/routes/api/close.post.mjs +6 -5
  77. package/.output/server/chunks/routes/api/codex-update.post.mjs +7 -6
  78. package/.output/server/chunks/routes/api/commands.get.mjs +9 -7
  79. package/.output/server/chunks/routes/api/config.get.mjs +10 -13
  80. package/.output/server/chunks/routes/api/dirs.get.mjs +7 -6
  81. package/.output/server/chunks/routes/api/dismiss-stopped.post.mjs +7 -6
  82. package/.output/server/chunks/routes/api/dismiss.post.mjs +7 -6
  83. package/.output/server/chunks/routes/api/effort.post.mjs +7 -6
  84. package/.output/server/chunks/routes/api/efforts.get.mjs +7 -6
  85. package/.output/server/chunks/routes/api/file.post.mjs +7 -6
  86. package/.output/server/chunks/routes/api/files/download.get.mjs +12 -24
  87. package/.output/server/chunks/routes/api/files/download.head.mjs +41 -0
  88. package/.output/server/chunks/routes/api/files/read.get.mjs +8 -7
  89. package/.output/server/chunks/routes/api/files.get.mjs +7 -6
  90. package/.output/server/chunks/routes/api/health.get.mjs +6 -5
  91. package/.output/server/chunks/routes/api/input.post.mjs +33 -15
  92. package/.output/server/chunks/routes/api/interrupt.post.mjs +24 -21
  93. package/.output/server/chunks/routes/api/isgit.get.mjs +8 -8
  94. package/.output/server/chunks/routes/api/machine/awake.get.mjs +7 -6
  95. package/.output/server/chunks/routes/api/machine/awake.post.mjs +7 -6
  96. package/.output/server/chunks/routes/api/machine/order.get.mjs +6 -5
  97. package/.output/server/chunks/routes/api/machine/order.post.mjs +6 -5
  98. package/.output/server/chunks/routes/api/machine/reconnect.post.mjs +40 -0
  99. package/.output/server/chunks/routes/api/machine/rename.post.mjs +7 -6
  100. package/.output/server/chunks/routes/api/machine/status.post.mjs +39 -0
  101. package/.output/server/chunks/routes/api/menu-left.post.mjs +40 -0
  102. package/.output/server/chunks/routes/api/menu.post.mjs +10 -6
  103. package/.output/server/chunks/routes/api/model.post.mjs +7 -6
  104. package/.output/server/chunks/routes/api/models.get.mjs +7 -6
  105. package/.output/server/chunks/routes/api/nav.post.mjs +40 -26
  106. package/.output/server/chunks/routes/api/onboarding.get.mjs +6 -5
  107. package/.output/server/chunks/routes/api/onboarding.post.mjs +6 -5
  108. package/.output/server/chunks/routes/api/phone.get.mjs +8 -10
  109. package/.output/server/chunks/routes/api/phone.post.mjs +8 -10
  110. package/.output/server/chunks/routes/api/plugins/actions.get.mjs +6 -8
  111. package/.output/server/chunks/routes/api/plugins/invoke.post.mjs +6 -8
  112. package/.output/server/chunks/routes/api/plugins/projects.get.mjs +10 -8
  113. package/.output/server/chunks/routes/api/plugins/projects.post.mjs +11 -7
  114. package/.output/server/chunks/routes/api/prompt.post.mjs +22 -13
  115. package/.output/server/chunks/routes/api/push/quiet.post.mjs +7 -6
  116. package/.output/server/chunks/routes/api/push/subscribe.post.mjs +7 -7
  117. package/.output/server/chunks/routes/api/push/test.post.mjs +7 -6
  118. package/.output/server/chunks/routes/api/push/unsubscribe.post.mjs +7 -6
  119. package/.output/server/chunks/routes/api/quotas.get.mjs +7 -6
  120. package/.output/server/chunks/routes/api/rename.post.mjs +6 -5
  121. package/.output/server/chunks/routes/api/requeue.post.mjs +7 -6
  122. package/.output/server/chunks/routes/api/restart.get.mjs +6 -5
  123. package/.output/server/chunks/routes/api/restart.post.mjs +6 -5
  124. package/.output/server/chunks/routes/api/reveal.post.mjs +91 -8
  125. package/.output/server/chunks/routes/api/screen-key.post.mjs +19 -15
  126. package/.output/server/chunks/routes/api/screen.get.mjs +8 -40
  127. package/.output/server/chunks/routes/api/search.get.mjs +7 -6
  128. package/.output/server/chunks/routes/api/seen.post.mjs +7 -6
  129. package/.output/server/chunks/routes/api/sessions.get.mjs +7 -6
  130. package/.output/server/chunks/routes/api/sessions.post.mjs +7 -6
  131. package/.output/server/chunks/routes/api/settings-tab.post.mjs +90 -0
  132. package/.output/server/chunks/routes/api/{plugins/thread-limits.get.mjs → settings.get.mjs} +10 -9
  133. package/.output/server/chunks/routes/api/settings.post.mjs +40 -0
  134. package/.output/server/chunks/routes/api/space.post.mjs +34 -18
  135. package/.output/server/chunks/routes/api/state.get.mjs +7 -6
  136. package/.output/server/chunks/routes/api/tasks/action.post.mjs +39 -0
  137. package/.output/server/chunks/routes/api/{plugins/profiles.get.mjs → tasks/add.post.mjs} +12 -14
  138. package/.output/server/chunks/routes/api/tasks/after.post.mjs +39 -0
  139. package/.output/server/chunks/routes/api/tasks/approve.post.mjs +39 -0
  140. package/.output/server/chunks/routes/api/{project/report.get.mjs → tasks/archived.get.mjs} +12 -13
  141. package/.output/server/chunks/routes/api/{gitroot.get.mjs → tasks/autopilot.get.mjs} +13 -14
  142. package/.output/server/chunks/routes/api/tasks/autopilot.post.mjs +39 -0
  143. package/.output/server/chunks/routes/api/{index.get.mjs → tasks/board-settings.get.mjs} +12 -13
  144. package/.output/server/chunks/routes/api/tasks/board-settings.post.mjs +39 -0
  145. package/.output/server/chunks/routes/api/tasks/coordinator.get.mjs +40 -0
  146. package/.output/server/chunks/routes/api/tasks/coordinator.post.mjs +39 -0
  147. package/.output/server/chunks/routes/api/tasks/details.get.mjs +40 -0
  148. package/.output/server/chunks/routes/api/tasks/limit.post.mjs +39 -0
  149. package/.output/server/chunks/routes/api/tasks/links.get.mjs +39 -0
  150. package/.output/server/chunks/routes/api/tasks/models.get.mjs +40 -0
  151. package/.output/server/chunks/routes/api/tasks/pick.post.mjs +39 -0
  152. package/.output/server/chunks/routes/api/tasks/question.post.mjs +39 -0
  153. package/.output/server/chunks/routes/api/tasks/scheduled.get.mjs +40 -0
  154. package/.output/server/chunks/routes/api/{project → tasks}/settings.get.mjs +10 -11
  155. package/.output/server/chunks/routes/api/tasks/start.get.mjs +40 -0
  156. package/.output/server/chunks/routes/api/tasks/tell.post.mjs +39 -0
  157. package/.output/server/chunks/routes/api/tasks.get.mjs +39 -0
  158. package/.output/server/chunks/routes/api/unqueue.post.mjs +7 -6
  159. package/.output/server/chunks/routes/api/update/status.get.mjs +6 -5
  160. package/.output/server/chunks/routes/api/update.get.mjs +8 -10
  161. package/.output/server/chunks/routes/api/update.post.mjs +8 -10
  162. package/.output/server/chunks/routes/api/upload.post.mjs +7 -6
  163. package/.output/server/chunks/routes/api/worktrees/remove.post.mjs +6 -5
  164. package/.output/server/chunks/routes/api/worktrees.get.mjs +6 -5
  165. package/.output/server/chunks/routes/favicon.ico.get.mjs +6 -5
  166. package/.output/server/chunks/routes/icons/_name_.get.mjs +7 -6
  167. package/.output/server/chunks/routes/renderer.mjs +8 -7
  168. package/.output/server/chunks/routes/uploads/_...name_.get.mjs +7 -6
  169. package/.output/server/chunks/routes/ws/_..._.mjs +7 -6
  170. package/.output/server/chunks/routes/ws/events.mjs +9 -7
  171. package/.output/server/chunks/routes/ws/term.mjs +7 -6
  172. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  173. package/.output/server/index.mjs +7 -6
  174. package/.output/server/package.json +1 -1
  175. package/README.md +44 -1424
  176. package/bin/lib/commands.mjs +44 -9
  177. package/bin/lib/panel.mjs +3 -11
  178. package/bin/lib/service.mjs +41 -2
  179. package/bin/lib/skill.mjs +1 -1
  180. package/bin/lib/tailnet.d.mts +6 -3
  181. package/bin/lib/tailnet.mjs +70 -32
  182. package/bin/lib/userpath.d.mts +14 -0
  183. package/bin/lib/userpath.mjs +142 -0
  184. package/docs/README.md +58 -0
  185. package/docs/RELEASING.md +174 -0
  186. package/docs/board.md +164 -0
  187. package/docs/command.md +58 -0
  188. package/docs/configuration.md +39 -0
  189. package/docs/conversation.md +132 -0
  190. package/docs/development.md +38 -0
  191. package/docs/devices.md +58 -0
  192. package/docs/files.md +29 -0
  193. package/docs/herdr-projects-1x.md +278 -0
  194. package/docs/home.md +52 -0
  195. package/docs/installation.md +174 -0
  196. package/docs/machines.md +69 -0
  197. package/docs/migrate-from-1.x-docker.md +160 -0
  198. package/docs/networks.md +154 -0
  199. package/docs/notifications.md +83 -0
  200. package/docs/overview.md +71 -0
  201. package/docs/phone.md +26 -0
  202. package/docs/plugins.md +109 -0
  203. package/docs/quick-start.md +89 -0
  204. package/docs/quotas.md +65 -0
  205. package/docs/release-notes-2.0.0.md +84 -0
  206. package/docs/security.md +117 -0
  207. package/docs/terminal.md +15 -0
  208. package/docs/troubleshooting.md +45 -0
  209. package/package.json +11 -3
  210. package/skills/wherdr/SKILL.md +24 -167
  211. package/.output/public/_nuxt/B4Yk2tB1.js +0 -23
  212. package/.output/public/_nuxt/BBw_0a4M.js +0 -6
  213. package/.output/public/_nuxt/BSy6OCIY.js +0 -1
  214. package/.output/public/_nuxt/BX5PM2JQ.js +0 -1
  215. package/.output/public/_nuxt/BgPDnf2S.js +0 -1
  216. package/.output/public/_nuxt/BkOxQzbS.js +0 -2
  217. package/.output/public/_nuxt/CP8o925U.js +0 -1
  218. package/.output/public/_nuxt/CWwyK2XK.js +0 -2
  219. package/.output/public/_nuxt/CkbmecwS.js +0 -1
  220. package/.output/public/_nuxt/Cr3SrGky.js +0 -1
  221. package/.output/public/_nuxt/DAg9fiVh.js +0 -89
  222. package/.output/public/_nuxt/DT8qZ0Wv.js +0 -1
  223. package/.output/public/_nuxt/DaaJIRB3.js +0 -1
  224. package/.output/public/_nuxt/DcJi16XA.js +0 -1
  225. package/.output/public/_nuxt/SiL1FJ5s.js +0 -3
  226. package/.output/public/_nuxt/VpjCgSXu.js +0 -36
  227. package/.output/public/_nuxt/builds/meta/c735b6c0-1bd0-47d7-a208-d310f0a06287.json +0 -1
  228. package/.output/public/_nuxt/dPxB2L94.js +0 -89
  229. package/.output/public/_nuxt/entry.CGWKmYU3.css +0 -2
  230. package/.output/public/_nuxt/xYX85SPI.js +0 -1
  231. package/.output/server/chunks/_/pluginPolicy.mjs +0 -93
  232. package/.output/server/chunks/_/projectBoard.mjs +0 -366
  233. package/.output/server/chunks/_/projectDocs.mjs +0 -106
  234. package/.output/server/chunks/_/projectInbox.mjs +0 -135
  235. package/.output/server/chunks/_/projectThreads.mjs +0 -46
  236. package/.output/server/chunks/_/projectThreads2.mjs +0 -61
  237. package/.output/server/chunks/_/projectsActions.mjs +0 -143
  238. package/.output/server/chunks/_/projectsPlugin.mjs +0 -56
  239. package/.output/server/chunks/_/reveal.mjs +0 -115
  240. package/.output/server/chunks/raw/dev.wherdr.open.mjs +0 -7
  241. package/.output/server/chunks/raw/docker-entrypoint.mjs +0 -7
  242. package/.output/server/chunks/raw/install-host-open.mjs +0 -7
  243. package/.output/server/chunks/raw/wherdr-open.mjs +0 -7
  244. package/.output/server/chunks/routes/api/board.get.mjs +0 -147
  245. package/.output/server/chunks/routes/api/plugins/thread-limits.post.mjs +0 -45
  246. package/.output/server/chunks/routes/api/project/inbox.get.mjs +0 -43
  247. package/.output/server/chunks/routes/api/project/inbox.post.mjs +0 -43
  248. package/.output/server/chunks/routes/api/project/memory.get.mjs +0 -42
  249. package/.output/server/chunks/routes/api/project/routines.get.mjs +0 -43
  250. package/.output/server/chunks/routes/api/project/thread.get.mjs +0 -44
  251. package/.output/server/chunks/routes/api/project/thread.post.mjs +0 -45
  252. package/bin/install-docker-skill.sh +0 -20
@@ -0,0 +1,58 @@
1
+ # Computer, phone and iPad
2
+
3
+ [Documentation](README.md) · [Project](../README.md)
4
+
5
+ ### On a computer
6
+
7
+ - **Split panes, live**: a tab with several panes is drawn with Herdr's real layout; every pane
8
+ shows its conversation or terminal live. Every visible terminal fills its cell and follows
9
+ window and divider resizing, keeping its instance and connection when focus changes.
10
+ Click a cell to give it the keyboard. Leaving the tab restores each terminal's original size,
11
+ unless a Herdr client has resized it meanwhile.
12
+ - **Rearrange the layout**: drag a pane onto another to move it, drag a divider to resize
13
+ (arrow keys work on a focused divider); changes go to Herdr itself.
14
+ - **Spaces and tabs**: sidebar with every space, tabs at the top, active tab remembered per space.
15
+ The sidebar can be resized, or collapsed to a narrow rail (search, new agent, settings and
16
+ state counters) with the button next to Settings; the choice is kept on the device.
17
+ - **Keyboard shortcuts** (`Mod` is ⌘ on macOS, Ctrl elsewhere; `Mod+/` or `?` lists them all,
18
+ also in Settings › Computer):
19
+ - `Ctrl/⌘+K` global search across agents and conversations, `Alt+↑/↓` previous / next agent
20
+ in the list, `Mod+,` settings, `H` the [Board](board.md#works-great-with-herdr-projects) (outside a
21
+ text field and the terminal).
22
+ - `Mod+Alt+N` new agent in a new space, `Mod+Alt+T` new tab in the current space,
23
+ `Mod+Alt+W` close the current pane (after confirmation). They work from the terminal too.
24
+ - In an agent: `Mod+F` searches the conversation, ``Ctrl+` `` switches between conversation
25
+ and terminal, and `Esc` stops a working agent when the message field is empty.
26
+ - `Alt+Shift+arrows` swaps the current pane with its neighbour, `Ctrl/⌘+Alt+arrows` moves
27
+ focus to the neighbouring pane in a side-by-side tab, `Esc` closes dialogs, `Enter` sends
28
+ and `Shift+Enter` adds a new line. On a "Your turn" card, `1`–`9` pick an option (on AZERTY
29
+ without Shift too, outside the message field); on the `/resume` card, `Ctrl+A` switches
30
+ between every project and the current one (`⌘A` still selects all on macOS).
31
+ - In the message field, `↑` on the first line recalls previous messages and slash commands;
32
+ `↓` on the last line returns to newer entries, then restores your draft. History keeps the
33
+ last 100 texts sent from this device per agent, without attachments or quoted references.
34
+ - **Board** for [herdr-projects](board.md#works-great-with-herdr-projects) 1.2.1 or later: every machine's
35
+ tasks in four columns (needs you, ready to approve, working, to do), done one tap away, each
36
+ task with its pull request, review, reply and approval.
37
+ - **Settings** in a sidebar, with desktop-only options such as the content width.
38
+
39
+ ### On a phone
40
+
41
+ - **Installable app (PWA)** on iPhone and Android, with safe-area and keyboard handling.
42
+ - **Web Push notifications** when an agent finishes or needs you (with its question), and for
43
+ `herdr notification show` (plugins, scripts).
44
+ - **Quick replies**: answer permissions and questions in one tap from the agent list.
45
+ - **Split tabs on a small screen**: a plan of the tab's panes in Herdr's proportions, then each
46
+ pane full screen with a mini-map and swipe to its neighbours.
47
+ - **Terminal key bar** (Esc, Enter, arrows, Shift+Tab, Ctrl+C…) and touch scrolling.
48
+ - **Offline reading** of the last known state and of recently opened conversations.
49
+
50
+ ### On an iPad
51
+
52
+ - **Computer layout in both orientations**: in portrait the agent list folds to a narrow column
53
+ and slides over the conversation; in landscape it stays docked. Buttons are 44 px, and the
54
+ layout does not change when the on-screen keyboard opens.
55
+ - **Side by side by touch**: finger-sized pane buttons, grip and dividers; the active terminal
56
+ pane has the key bar; with the keyboard open the tab fits the visible area above it.
57
+ - **Hardware keyboard**: Enter sends (Shift+Enter adds a line) once a key only a hardware
58
+ keyboard sends (arrows, Esc, a ⌘ chord) has been typed.
package/docs/files.md ADDED
@@ -0,0 +1,29 @@
1
+ # Files and changes
2
+
3
+ [Documentation](README.md) · [Project](../README.md)
4
+
5
+ - **Changes view**: Git status and diff of an agent's working folder; worktree management.
6
+ Review the diff like a pull request: comment on one line or on a **block of lines**. The code
7
+ itself is plain text — a click on it does nothing, so it can be selected and copied.
8
+ - **Mouse**: a **+** appears in the gutter of the hovered line; click it to comment that line,
9
+ or press it and drag over other lines to comment the block. With an editor open, Shift+click
10
+ another line to change its block.
11
+ - **Touch**: tap a line number to choose the line, tap another line to extend the block, then
12
+ **Comment** in the bar pinned at the bottom. Nothing is written by the first tap.
13
+ - **Keyboard**: one tab stop per file; arrow keys move between lines, Shift+arrows choose a
14
+ block, Enter opens the editor. In the editor, ⌘/Ctrl+Enter saves and Escape cancels (a second
15
+ Escape if text would be lost); the window stays open.
16
+
17
+ A block stays within one hunk (the other hunks dim while it is chosen) and may mix deleted and
18
+ new lines. Each comment is a thread under the last line of its block, headed by its lines
19
+ ("Lines 12–18"), with **Edit** and a two-step **Delete**; the lines it covers are marked in
20
+ the gutter. Comments, including the text of an editor left open, are saved on this device for
21
+ that agent, across refreshes and reloads. A block that leaves the diff, or whose code changed
22
+ between its first and last lines, is flagged above the diff and keeps the excerpt that was
23
+ commented.
24
+ **Send review** stays pinned with the number of comments; it groups them by file as
25
+ `file:12-18 — remark` (`file:12` for one line) followed by a short excerpt of the block, and
26
+ appends them to the conversation's message draft, preserving existing text; it never sends a
27
+ message. Deleted lines use the old file's numbers, explicitly labelled. **Discard** clears the
28
+ local review. Works on remote agents and in the demo too, with no writes to the agent's
29
+ machine. Browser storage must be available to retain comments after closing the view.
@@ -0,0 +1,278 @@
1
+ # Moving from herdr-projects 0.2 to 1.x
2
+
3
+ wherdr **2.0.0** reads herdr-projects **1.2.1 or later** only. wherdr 1.3.4 is the last version
4
+ that reads herdr-projects 0.2 (its Project panel, `TASKS.md`, threads). This page moves one
5
+ machine from 0.2 to 1.x, keeps a backup, and says how to go back. Do it on each machine that
6
+ runs herdr-projects.
7
+
8
+ wherdr 2.0 runs only **natively**, as a service of your user. A wherdr 1.x running in Docker
9
+ moves first: [Migrate a 1.x Docker install](migrate-from-1.x-docker.md).
10
+
11
+ herdr-projects 1.x is a different program, not a newer 0.2: one work board of tasks, each
12
+ handed to an agent in its own space, reviewed when it finishes and merged on your yes. Your
13
+ 0.2 projects are **not converted**. 1.x sets them aside, whole, in `~/.herdr-projects-legacy`
14
+ and never deletes them. Upstream describes what it does in
15
+ [older installs](https://github.com/eliasstravik/herdr-projects/blob/main/docs/old-installs.md).
16
+
17
+ ## Before you start
18
+
19
+ - Herdr 0.9.3 or later (`herdr --version`): the oldest Herdr herdr-projects 1.2.1 was checked on.
20
+ - No 0.2 thread you still need running: finish or stop them first. 1.x asks the 0.2 ticker to
21
+ stop, and moves nothing while it still runs.
22
+ - Note what each 0.2 project still had to do (its `TASKS.md`): you will tell the 1.x
23
+ Coordinator about it after the move.
24
+
25
+ ## 1. Back up
26
+
27
+ 1.x moves folders and edits a few files outside them (it backs those up itself, beside them,
28
+ as `<file>.bak-herdr-projects`). Keep your own copy too:
29
+
30
+ ```sh
31
+ cd ~ && if [ -s ~/herdr-projects-0.2-backup.path ]; then
32
+ echo "backup already made, kept: $(cat ~/herdr-projects-0.2-backup.path)"
33
+ else
34
+ backup="$HOME/herdr-projects-0.2-backup-$(date +%Y%m%d-%H%M%S).tgz"
35
+ files=$(for p in .herdr-projects .config/herdr-projects .local/state/herdr/plugins/herdr-projects \
36
+ .config/herdr/config.toml .config/herdr/plugins.json; do [ -e "$p" ] && echo "$p"; done)
37
+ if ! printf '%s\n' "$files" | grep -q herdr-projects; then
38
+ echo "NO 0.2 FILES FOUND in $HOME: nothing backed up, check you are the user who runs Herdr"
39
+ elif [ ! -e "$backup" ] && printf '%s\n' "$files" | tar czf "$backup" -T - \
40
+ && tar tzf "$backup" > /dev/null; then
41
+ echo "$backup" > ~/herdr-projects-0.2-backup.path && echo "backup ok: $backup"
42
+ printf '%s\n' "$files" | grep -qx .config/herdr/config.toml \
43
+ || echo "no Herdr config.toml to keep: step 5 of Going back has nothing to restore"
44
+ else
45
+ echo "BACKUP FAILED: do not go on"
46
+ fi
47
+ fi
48
+ ```
49
+
50
+ Go on only after `backup ok` (or `backup already made`). The archive has a new name each time
51
+ and is never overwritten. `~/herdr-projects-0.2-backup.path` keeps the path of the **first**
52
+ one: running this again, for example after an install that stopped halfway, keeps that first
53
+ backup instead of saving files 1.x has already changed. The steps of
54
+ [Going back](#going-back-to-02) read the path from that file.
55
+
56
+ The archive holds your whole projects (their libraries, uploads and thread records): expect
57
+ hundreds of megabytes. Keep it, and its `.path` file, until you are sure you will not go back:
58
+ it is the only full copy of Herdr's `config.toml` as it was (see
59
+ [Going back](#going-back-to-02), step 5).
60
+
61
+ ## 2. Install herdr-projects 1.2.21
62
+
63
+ ```sh
64
+ herdr plugin uninstall herdr-projects && herdr plugin install eliasstravik/herdr-projects --ref v1.2.21 --yes
65
+ ```
66
+
67
+ Uninstalling removes only Herdr's copy of the plugin; your projects stay where they are.
68
+
69
+ Then, in the Herdr terminal client, reload its config (`prefix` + `Shift` + `R`) and open the
70
+ work board once (the plugin action **Open the work board**). Its first run sets the 0.2 files
71
+ aside and says so in one line. Without an attached client, the same from a shell:
72
+
73
+ ```sh
74
+ herdr server reload-config && herdr plugin action invoke open --plugin herdr-projects
75
+ ```
76
+
77
+ Check where things stand:
78
+
79
+ ```sh
80
+ ~/.herdr-projects/data/bin/herdr-projects doctor
81
+ ```
82
+
83
+ `doctor` lists what it took over and anything left to do (it exits with 1 when something needs
84
+ you). Running it again changes nothing.
85
+
86
+ What the first run changes, besides moving the 0.2 folders:
87
+
88
+ - **`herdr-projects` leaves your PATH.** The link 0.2 had put there (`~/.local/bin/herdr-projects`)
89
+ is removed, and `doctor` reports it until you add 1.x's launcher folder to your PATH (in
90
+ `~/.profile` or your shell's start-up file):
91
+ `export PATH="$HOME/.herdr-projects/data/bin:$PATH"`.
92
+ - **Herdr's config** loses 0.2's tab bar line, its key (`herdr-projects.open-popup`) and **both**
93
+ custom sidebar rows (agents and spaces): Herdr's own sidebar comes back. A
94
+ `[safety."~/.herdr-projects/<project>"]` section is left as it was, though that folder is now in
95
+ `~/.herdr-projects-legacy`: remove it or point it there.
96
+ - **Agents' settings** (Claude, Codex…) lose only 0.2's `herdr-projects … hook --agent …` hooks.
97
+
98
+ Do not run `herdr-projects update` on a machine that still had 0.2 before this step: install
99
+ 1.2.1 as above.
100
+
101
+ ## 3. Update wherdr
102
+
103
+ Installing a new version does not change a wherdr that is already running: restart it too.
104
+
105
+ - The installer (Herdr plugin, the recommended setup): `curl -fsSL https://wherdr.dev/install | sh`
106
+ again, or **U** in the **wherdr** panel. It fetches the GitHub release package directly, and
107
+ wherdr restarts on the new version.
108
+ - npm: `npm install -g wherdr@latest && wherdr restart` (npm may hold a new release for up to two
109
+ days).
110
+ - Homebrew: `brew upgrade wherdr && brew services restart wherdr`
111
+ - A 1.x Docker install: there is no 2.0 image; move to the native service first
112
+ ([Migrate a 1.x Docker install](migrate-from-1.x-docker.md)).
113
+
114
+ Check the version wherdr now serves in **Settings › About**: 2.0 or later. Still 1.3.4 means the
115
+ old process is still running: restart it.
116
+
117
+ Open **Settings › Plugins › herdr-projects**: each machine says **Installed · v1.2.21**. The
118
+ **Board** (next to Settings) shows the tasks; write to the Coordinator in its box to add the
119
+ work your 0.2 projects still had.
120
+
121
+ ## Push when a task needs you
122
+
123
+ herdr-projects tells you when a task needs you, is ready to approve, or failed, through its
124
+ `board.notify` setting: it can run a command for each event. Point it at Herdr's own
125
+ notifications, which wherdr already sends to your phone. Run once on each machine with
126
+ herdr-projects:
127
+
128
+ ```sh
129
+ ~/.herdr-projects/data/bin/herdr-projects set board.notify 'herdr notification show --body="$HERDR_PROJECTS_TITLE" --sound request -- "$HERDR_PROJECTS_ID · $HERDR_PROJECTS_EVENT"'
130
+ ```
131
+
132
+ The push names the task and the event, and a tap opens the task on wherdr's Board. Back to
133
+ none: `herdr-projects set board.notify none`. Settings › Plugins › herdr-projects shows the
134
+ same command.
135
+
136
+ ## Going back to 0.2
137
+
138
+ 1. **Bring 1.x's agents to rest first**, so none keeps changing a repo while folders move.
139
+ Stopping the Coordinator is not enough: each task has its own agent (and its reviewer), and
140
+ machine and project coordinators are stopped apart. A Coordinator belongs to one Herdr
141
+ session while the plugin and its files are shared, so do this in each Herdr session where you
142
+ used 1.x's board.
143
+
144
+ ```sh
145
+ hp=~/.herdr-projects/data/bin/herdr-projects
146
+ $hp list --all --json # every task, with its id and state
147
+ ```
148
+
149
+ Let each task that is working finish, or stop it with `$hp stop <id>`. Then stop the
150
+ coordinators you used:
151
+
152
+ ```sh
153
+ $hp coordinator stop # the Coordinator of this session
154
+ $hp coordinator --machine stop # the machine coordinator
155
+ $hp coordinator --project <repo> stop # each project coordinator (one per repo)
156
+ herdr agent list # every agent of this Herdr session and its status
157
+ ```
158
+
159
+ Go on when none of the agents 1.x started (its tasks' agents and reviewers, its coordinators)
160
+ is still working. Leave the agents you started yourself alone.
161
+
162
+ 2. **Take out 1.x's extras, then stop what still runs.** Herdr has no uninstall hook, so 1.x
163
+ cleans up outside its folders only when asked: its how-to files for agents, its blocks in
164
+ Herdr's config, and the herdr web UI's shared link if you pointed it at the board. Run this
165
+ while 1.x is still installed:
166
+
167
+ ```sh
168
+ ~/.herdr-projects/data/bin/herdr-projects remove-extras && echo "extras removed"
169
+ herdr plugin disable herdr-projects # its hooks and its board key
170
+ ```
171
+
172
+ Go on only after `extras removed`. `disable` does not stop what already runs. Close the work
173
+ board's tab in Herdr: that ends the board, but its `keeper` and `keeper-work` keep running. List
174
+ your processes that name herdr-projects:
175
+
176
+ ```sh
177
+ ps -U "$(id -u)" -o pid=,args= | grep '[h]erdr-projects'
178
+ ```
179
+
180
+ This is a list to read, not a list to stop. Stop with `kill <pid>` only a line whose program
181
+ is 1.x's in **your** HOME: `~/.config/herdr/plugins/…/herdr-projects-…/bin/herdr-projects-<system>`
182
+ or `~/.herdr-projects/data/bin/herdr-projects`, such as its `keeper`, `keeper-work`, `board`
183
+ and page server. Leave any other line: another HOME or install, a 0.2 program
184
+ (`…/target/release/herdr-projects`), or a command that only mentions the name. Run the list
185
+ again: none of the processes you stopped may still be there.
186
+
187
+ 3. **Uninstall 1.x**: `herdr plugin uninstall herdr-projects`
188
+
189
+ 4. **Put the 0.2 folders back.** 1.x wrote down where it put each one in
190
+ `~/.herdr-projects/moved.json`: `~/.herdr-projects-legacy`, or `-legacy-2`, `-legacy-3`… when an
191
+ older one was already there. Do not guess the names: this lists them, then puts each folder back.
192
+ A folder already at the old place (1.x's own board, or a folder created since) is set aside
193
+ first, as `<name>.from-1x-1` (or the next free number), never moved inside it. Running it a
194
+ second time changes nothing.
195
+
196
+ ```sh
197
+ if [ ! -s ~/herdr-projects-restore.tsv ]; then
198
+ python3 - <<'PY' > ~/herdr-projects-restore.tsv.new && mv ~/herdr-projects-restore.tsv.new ~/herdr-projects-restore.tsv
199
+ import json, os
200
+ moved = json.load(open(os.path.expanduser('~/.herdr-projects/moved.json')))
201
+ for v in moved.get('legacy', {}).values():
202
+ print(v['from'] + '\t' + v['to'])
203
+ PY
204
+ fi
205
+ cat ~/herdr-projects-restore.tsv # each line: old place <tab> where 1.x put it
206
+
207
+ restore() {
208
+ dest=$1 src=$2
209
+ [ -e "$src" ] || { echo "not found, skipped: $src"; return 0; }
210
+ if [ -e "$dest" ] || [ -L "$dest" ]; then
211
+ n=1; while [ -e "$dest.from-1x-$n" ] || [ -L "$dest.from-1x-$n" ]; do n=$((n + 1)); done
212
+ mv "$dest" "$dest.from-1x-$n" && echo "set aside: $dest -> $dest.from-1x-$n" || return 1
213
+ fi
214
+ mv "$src" "$dest" && echo "restored: $src -> $dest"
215
+ }
216
+ tab=$(printf '\t')
217
+ while IFS="$tab" read -r from to; do restore "$from" "$to" || break; done < ~/herdr-projects-restore.tsv
218
+ ```
219
+
220
+ 1.x's own board is now in `~/.herdr-projects.from-1x-<n>`: keep it if you may come back to 1.x.
221
+
222
+ 5. Put back the files 1.x changed.
223
+ - **Herdr's config: restore it from your own backup** (step 1 of the move), not from
224
+ `config.toml.bak-herdr-projects`. 1.x rewrites that one file at each change it makes to
225
+ Herdr's config (adding its own key, then taking it out again on uninstall), so it only holds the
226
+ state before its last change, without 0.2's lines. If step 1 said there was no `config.toml`
227
+ to keep, skip this: 0.2 had none.
228
+
229
+ First take the file out of the archive, into a new private folder, and have Herdr check it.
230
+ Nothing is replaced yet:
231
+
232
+ ```sh
233
+ ok= && backup=$(cat ~/herdr-projects-0.2-backup.path) && tmp=$(mktemp -d) \
234
+ && tar xzf "$backup" -C "$tmp" .config/herdr/config.toml \
235
+ && [ -s "$tmp/.config/herdr/config.toml" ] \
236
+ && XDG_CONFIG_HOME="$tmp/.config" herdr config check \
237
+ && ok=1 && echo "checked: $tmp/.config/herdr/config.toml" || echo "STOP: nothing restored"
238
+ diff ~/.config/herdr/config.toml "$tmp/.config/herdr/config.toml" # what the restore changes
239
+ ```
240
+
241
+ Only after `checked`, in the same shell, keep the current file beside it and restore:
242
+
243
+ ```sh
244
+ [ "$ok" = 1 ] && cp ~/.config/herdr/config.toml ~/.config/herdr/config.toml.before-0.2-restore \
245
+ && cp "$tmp/.config/herdr/config.toml" ~/.config/herdr/config.toml && herdr server reload-config
246
+ ```
247
+
248
+ - **Agents' settings** (Claude, Codex…): 1.x changes them once, so their
249
+ `<file>.bak-herdr-projects` is the file as it was before the move. Compare before restoring,
250
+ since the file may have changed since:
251
+ `diff ~/.claude/settings.json ~/.claude/settings.json.bak-herdr-projects`, then
252
+ `cp ~/.claude/settings.json.bak-herdr-projects ~/.claude/settings.json` (same for
253
+ `~/.codex/hooks.json` and the others `doctor` named).
254
+ 6. Reinstall 0.2 from the fork wherdr 1.3.4 installs, pinned to `v0.2.36`: the command is in
255
+ wherdr 1.3.4's README and in its **Settings › Plugins › herdr-projects**. `v0.2.36` exists only on
256
+ that fork: upstream's last 0.2 tag is `v0.2.35`, whose `herdr-projects update` would offer 1.x
257
+ again. The install puts the `herdr-projects` link back on your PATH.
258
+ 7. Go back to wherdr 1.3.4, and restart it:
259
+ - The installer (Herdr plugin): `curl -fsSL https://wherdr.dev/install | WHERDR_REF=v1.3.4 sh`
260
+ (wherdr restarts on that version).
261
+ - npm: `npm install -g wherdr@1.3.4 && wherdr restart`
262
+ - Homebrew installs only the newest version: for 1.3.4, `brew services stop wherdr && brew uninstall wherdr`,
263
+ then use npm as above.
264
+
265
+ **Settings › About** must say 1.3.4: 2.0 there means the old process still runs.
266
+
267
+ If anything is missing, the backup from step 1 of the move has everything as it was:
268
+ `cd ~ && tar xzf "$(cat ~/herdr-projects-0.2-backup.path)"` (with herdr-projects stopped).
269
+
270
+ ## Moving from Docker to the native service
271
+
272
+ wherdr 2.0 has no Docker image: it runs only natively, as your user, where the Board can act.
273
+ Published 1.x images stay on GHCR as they are, for those who stay on 1.x. The native service
274
+ keeps the same port and the same data folder, so passkeys, notifications and the address your
275
+ devices open keep working.
276
+
277
+ Follow [Migrate a 1.x Docker install](migrate-from-1.x-docker.md): back up, stop the container,
278
+ install the native service, check, and go back if needed. It is written so an AI agent can run it.
package/docs/home.md ADDED
@@ -0,0 +1,52 @@
1
+ # Home and agent list
2
+
3
+ [Documentation](README.md) · [Project](../README.md)
4
+
5
+ ## Features
6
+
7
+ ### Everywhere
8
+
9
+ - **Home grouping**: Settings › Appearance › Home screen › **Group by** chooses **Machine**
10
+ (default, projects under their coordinator) or **State** (Needs you, Working, Ready merged
11
+ across online machines). State mode adds machine and project badges to flat cards; the
12
+ machine bar and its groups filter both modes. Compact/normal applies to both. In State mode,
13
+ a row of machine chips at the top opens each machine's menu (sessions, keep awake, board,
14
+ Claude quota setup), and offline or reconnecting machines stay on one line at the bottom.
15
+ - **Live agent list**, one line per Herdr space, grouped by state (your turn, working, ready).
16
+ The list is normal by default; turn on Settings › Appearance › Home screen › **Compact list**
17
+ for one line per card (agent, title, project badge and state). When an agent asks for
18
+ permission or asks a question, its card opens on the question and its options: **answer in one
19
+ tap** without opening it; the card is one line again once answered. Board tasks use one line in
20
+ compact mode (agent, key, title, progress, duration, state and Your turn when needed); normal
21
+ mode adds the current activity and relevant limit or review labels on a second line. Task
22
+ details stay in the task sheet. A compact list turned on in 1.x goes back to normal once, on
23
+ the first 2.0 load; turning it on again is kept. Other agents
24
+ also use dense rows, with a last-answer preview in normal mode; waiting agents keep their
25
+ questions and one-tap answers in both modes.
26
+ With [herdr-projects](board.md#works-great-with-herdr-projects), the board's spaces follow Herdr's sidebar:
27
+ the Coordinators on top, then one group per repo, headed by its project coordinator (the repo's
28
+ name, the wherdr mark, **Coordinator** and its state), a bar that folds the group and sums up its
29
+ tasks (`4 TASKS · 1 YOUR TURN · 1 LIMIT`, the branch and `↓` commits behind its upstream, the
30
+ repo space's menu), then its tasks, indented (key, title, progress, time on it, the board's
31
+ current line). A remote coordinator link replaces the local coordinator above the bar.
32
+ Without a coordinator, the group starts with the bar; the repo terminal opens from its **…**
33
+ menu. Closing a space that holds task agents names the tasks it stops.
34
+ - **New agent**: pick an installed agent (or a plain terminal), a folder, optionally a separate
35
+ Git **worktree** and branch, resume the last conversation, and queue a first message.
36
+ - **Machine bar**: at the top of the list, “All”, then each machine with its state and count; a
37
+ tap shows one machine alone, without its header: its Claude and Codex quotas sit together at
38
+ the top, and an offline or reconnecting machine says so there. Right click (long press on a
39
+ phone) a machine's tab for its actions, those of its **…** menu; on a group's tab, for **Group
40
+ settings**. Settings › Appearance › Home screen › **Machine bar** orders its
41
+ items, takes some off it or hides it (saved on the server). A machine's **…** menu opens the
42
+ Board filtered on it (**Open the board**). In **Groups**, create a named selection of machines,
43
+ check its members and drag their handles to set their order. Groups appear after All by default,
44
+ with their combined task count and a group icon; order or hide them alongside the machines.
45
+ Choosing a group shows its members in the group's order. Groups follow you across devices.
46
+ Switching selections keeps the current conversation if it belongs there; otherwise the desktop
47
+ restores that selection's last conversation on this device, then its machine coordinator (a group's
48
+ first online machine), or the empty view. All always keeps the current conversation. Phones keep
49
+ the list first and check the same rule when reopening a conversation through browser history.
50
+ Explicit choices from search, cards or links open the chosen conversation. Unsent drafts stay saved.
51
+ - **Named Herdr sessions**, **quotas** (remaining Claude and Codex usage limits), **Herdr plugin
52
+ actions** in the menus, **passkey lock** (Face ID, Touch ID, Windows Hello, Android…).
@@ -0,0 +1,174 @@
1
+ # Installation and updates
2
+
3
+ **Upgrading to 2.0.0?** Read the [release notes](release-notes-2.0.0.md) for breaking changes and the 1.x migration checklist.
4
+
5
+ [Documentation](README.md) · [Project](../README.md)
6
+
7
+ ## Requirements
8
+
9
+ - **Herdr ≥ 0.9.1** running on the server (`herdr` or `herdr server`), with its Claude Code /
10
+ Codex / omp integrations installed if you use them (`herdr integration install claude|codex|omp`).
11
+ omp's conversation is only found through its integration, which reports the session file.
12
+ - **Linux or macOS** server with **Node.js 22** or newer (the installer offers to install it).
13
+ wherdr runs natively, as the user who runs Herdr.
14
+ - **HTTPS** to use passkeys, push notifications and the installable app from another device.
15
+ Browsers only allow them on `https://` or `http://localhost`. The easiest way is
16
+ [`tailscale serve`](https://tailscale.com/kb/1312/serve); a reverse proxy **reachable only
17
+ from your private network** with a valid certificate also works (see
18
+ [Other private networks](networks.md#other-private-networks)).
19
+
20
+ ## Installation
21
+
22
+ ### Ask your AI agent
23
+
24
+ **Recommended.** Paste this into Claude Code, Codex or any coding agent: it installs and sets up wherdr for you.
25
+
26
+ ```text
27
+ Read https://wherdr.dev/agent.md and help me set up wherdr. Check what is already installed first, and ask me before installing anything.
28
+ ```
29
+
30
+ It follows [our setup guide for agents](https://wherdr.dev/agent.md): checks what you already have,
31
+ asks before installing anything, sets up your phone over Tailscale, never exposes wherdr to the Internet.
32
+
33
+ <a id="the-one-command"></a>
34
+
35
+ ### Or run the installer yourself
36
+
37
+ On the computer that runs Herdr, as your user, on macOS or Linux:
38
+
39
+ ```sh
40
+ curl -fsSL https://wherdr.dev/install | sh
41
+ ```
42
+
43
+ The script ([read it first](https://wherdr.dev/install), source in
44
+ [`website/public/install`](../website/public/install)) never uses sudo. It:
45
+
46
+ 1. checks **Herdr ≥ 0.9.1**; without it, it stops with the link to [herdr.dev](https://herdr.dev);
47
+ 2. leaves alone a wherdr that **already answers** on the port: a Herdr plugin install is offered
48
+ its update, anything else is left as it is;
49
+ 3. checks **Node.js 22** or newer (or Bun), in your `PATH` and in the folders of n, nvm, fnm,
50
+ Volta, asdf and Homebrew. Without it, it asks before installing it: `brew install node` on a
51
+ Mac with Homebrew, otherwise the official Node.js 22 build from nodejs.org, its checksum
52
+ checked, unpacked in `~/wherdr/node` (used by wherdr only: your `PATH` is not changed). With
53
+ musl libc (Alpine) it gives the install links instead;
54
+ 4. runs `herdr plugin install afloury/wherdr --yes`: the [Herdr plugin](plugins.md#install-as-a-herdr-plugin)
55
+ downloads the GitHub release package of its version (checksum checked, no wait for npm),
56
+ installs it in `~/wherdr/app`, starts it on `http://localhost:7683`, opens the setup guide in
57
+ your browser (first install) and binds **prefix+i** to its panel;
58
+ 5. configures automatic startup with `wherdr service install`: **at login on macOS** with a
59
+ LaunchAgent; **at boot on Linux when lingering is enabled**, otherwise **at login**, with a
60
+ `systemd --user` unit. It tries to enable lingering (`loginctl enable-linger`, allowed for
61
+ your own user without sudo on most systems), which also keeps wherdr running after logout.
62
+ Without lingering, wherdr stops after logout. The installer checks lingering after installation
63
+ and reports which case applies, or says when it cannot verify it. The service gets
64
+ your login shell's `PATH`, so the agents you installed in `~/.local/bin`, `~/.bun/bin`,
65
+ `~/.cargo/bin`, `~/.npm-global/bin` or Homebrew are found (see [Agent PATH](installation.md#agent-path)). Each
66
+ run installs it again, with the `PATH` of now. If this step fails (no systemd), nothing of it
67
+ is left, wherdr is started again and keeps starting with Herdr, and the script says how to
68
+ retry;
69
+ 6. on a computer **without a screen** (no `DISPLAY` on Linux, or an SSH session): opens nothing,
70
+ prints the local address, an `ssh -L` tunnel to reach it from your computer, and the phone
71
+ steps (`wherdr phone`: Tailscale state, the address, the QR code once it answers). Run the
72
+ command again at any time to check the phone address.
73
+
74
+ Settings, as environment variables (`curl -fsSL https://wherdr.dev/install | WHERDR_PORT=7684 sh`):
75
+
76
+ | Variable | Default | Meaning |
77
+ | --- | --- | --- |
78
+ | `WHERDR_DIR` | `~/wherdr` | Install folder (plugin settings, data, log). |
79
+ | `WHERDR_PORT` | `7683` | Local port. |
80
+ | `WHERDR_SERVICE` | — | `off`: no login service; wherdr then starts with Herdr only (the plugin's startup hook). |
81
+ | `WHERDR_YES` | — | `1` answers yes to every question (non-interactive use), installing Node.js included. |
82
+ | `WHERDR_NO_BROWSER` | — | `1` never opens a browser. |
83
+ | `WHERDR_REF` | main | Git tag or branch of the plugin. |
84
+ | `WHERDR_PLUGIN` | `afloury/wherdr` | A local checkout to link and build instead (development, tests). |
85
+
86
+ Update: run the command again (it offers the update), **U** in the wherdr panel, or **Update** in
87
+ the app: all three fetch the GitHub release package directly.
88
+
89
+ #### Agent PATH
90
+
91
+ systemd and launchd start services with a short system `PATH`, and herdr-projects, run by
92
+ wherdr for the Board, then reports `claude is not installed here` for an agent installed in a
93
+ user folder. wherdr gives it the `PATH` an interactive login shell would have, on the host and
94
+ over SSH, in this order: the `PATH` your login shell gives (asked once by `wherdr service
95
+ install`), the one herdr-projects records in `~/.herdr-projects/data/env.json`
96
+ (`$HERDR_PROJECTS_DATA_DIR`, or `$HERDR_PROJECTS_HOME/data`), then `~/.local/bin`, `~/.bun/bin`,
97
+ `~/.cargo/bin`, `~/.npm-global/bin`, `~/.deno/bin`, `~/.volta/bin`, `~/bin`, Homebrew's folders and
98
+ `/usr/local/bin` when they exist, then the `PATH` it was started with and the system folders. Your
99
+ own folders come before the system ones, as in your shell: an old system-wide copy of an agent
100
+ never wins over yours. After installing
101
+ an agent somewhere else, run `wherdr service install` again (or the one command).
102
+
103
+ ### Which setup?
104
+
105
+ | | **Always-on server + Tailscale** (recommended) | **One computer** |
106
+ | --- | --- | --- |
107
+ | Runs on | A machine that never sleeps: Raspberry Pi, mini-PC, home server, private VPS (Linux) | The computer you work on (macOS or Linux) |
108
+ | Reach it from | Your phone and every computer on your tailnet | That computer only (`http://localhost:7683`) |
109
+ | Installable app, push notifications, passkeys | Yes (private HTTPS from `tailscale serve`) | Desktop browser only; no phone access |
110
+ | Other machines (a Mac, a laptop…) | Added in Herdr over SSH, shown in wherdr | Also possible, but they are only reachable while this computer is awake |
111
+
112
+ Both use [the one command](installation.md#the-one-command) and the same app. You can start with the second one
113
+ and move to the first later.
114
+
115
+ ### Moving from Docker to the native service
116
+
117
+ wherdr 2.0 runs only natively as your user. Published 1.x images remain on GHCR for users
118
+ staying on 1.x. To keep your port, passkeys and settings when moving, follow the
119
+ [Docker migration guide](migrate-from-1.x-docker.md): verifiable steps, with a way back,
120
+ that you can also hand to an AI agent ("read this file and migrate me").
121
+
122
+ ## Updating
123
+
124
+ wherdr checks the latest GitHub release at most once a day (an anonymous request to
125
+ `api.github.com`, nothing is sent) and shows a small **“wherdr X.Y.Z is available”** banner on the
126
+ home screen and in Settings › About, with the release notes and the exact command for your setup.
127
+ Hide it until the next version with ×. Set `WHERDR_UPDATE_CHECK=off` to disable the check. The
128
+ installed version is shown in Settings › About.
129
+
130
+ GitHub release packages (including the bundled agent skill) and Homebrew
131
+ updates are published without waiting for npm moderation. Native plugin installs and updates
132
+ use the GitHub `.tgz` and verify its SHA-256 checksum before extraction. A failed one-tap
133
+ download or checksum check leaves the running version in place. Plugin installation tries
134
+ GitHub first, then the prebuilt npm package of the exact same version (with its registry integrity hash), and only builds from source when neither works.
135
+ This also keeps older 1.3.x releases without GitHub archives installable with Node.js or Bun.
136
+ Packages predating the bundled skill retain the plugin checkout's commands and skill, so
137
+ skill refresh, installation and uninstallation remain available.
138
+ The installer fetches `main` explicitly unless you set `WHERDR_REF`.
139
+
140
+ The SHA-256 checksum detects damaged downloads. It is served beside the archive, so someone
141
+ who can replace both files can make them match; it does not prove the publisher’s identity
142
+ or protect against replacement of the archive and checksum together.
143
+
144
+ `npm install -g`, `npx`, `bunx` and `pnpm dlx` still need npm to serve the wherdr package.
145
+ Their banner waits for registry availability; Homebrew's banner waits for its formula.
146
+ Versions through 1.3.2 use GitHub's `latest` marker and an npm-based updater. That marker only
147
+ advances once npm **and** Homebrew are ready, so their existing Update button continues to work.
148
+ To update an older native plugin earlier, rerun the installer or press **U** in its Herdr panel.
149
+ See [Releasing](RELEASING.md) for the publication order and recovery steps.
150
+
151
+ **Update in one tap.** When wherdr runs from the Herdr plugin (Node.js mode), a global npm install
152
+ or Homebrew, the banner has an **Update** button instead of the command, on every device that can
153
+ open wherdr (this computer and your tailnet; unlocked, when a passkey is set). wherdr installs the new version in a
154
+ process of its own, restarts, and checks that `/api/health` reports the new version within 60
155
+ seconds; the app shows the progress and reloads on the new version. If the new version does not
156
+ answer, wherdr goes back to the previous one by itself (the plugin keeps the previous copy in
157
+ `~/wherdr/app.prev`, npm reinstalls the previous version, Homebrew points back to the previous keg)
158
+ and the app says so. Every step is logged in `~/wherdr/update.log`.
159
+
160
+ | Setup | What Update does |
161
+ | --- | --- |
162
+ | The one command / Herdr plugin, Node.js | Verifies and unpacks the GitHub release package of the new version into `~/wherdr/app`, keeps the old copy, restarts (the login service included) |
163
+ | `npm install -g wherdr` | `npm install -g wherdr@X.Y.Z`, then restarts (login service included) |
164
+ | Homebrew | `brew upgrade wherdr`, then `brew services restart wherdr` |
165
+
166
+ `npx wherdr` runs from a temporary folder: run `npx wherdr@latest` again.
167
+
168
+ | Setup | Update command (in the wherdr folder) |
169
+ | --- | --- |
170
+ | The one command | Run `curl -fsSL https://wherdr.dev/install \| sh` again: it offers the update (GitHub release package) |
171
+ | Herdr plugin, Node.js | **U** in the **wherdr** panel, or `herdr plugin install afloury/wherdr --yes` (wherdr restarts on the new version) |
172
+ | `wherdr` command (npm) | `npm install -g wherdr@latest && wherdr restart` (npx: stop it, then `npx wherdr@latest`) |
173
+ | `wherdr` command (Homebrew) | `brew upgrade wherdr`, then `brew services restart wherdr` |
174
+ | From source | `git pull && npm ci && npm run build`, then restart wherdr |