frizz 0.7.5 → 0.7.7

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 (93) hide show
  1. package/README.md +28 -15
  2. package/dist/dev-child.js +299 -264
  3. package/dist/frizz.js +12895 -6495
  4. package/package.json +5 -3
  5. package/runtime/cc-worker/DECISIONS.md +11 -0
  6. package/web-dist/assets/{TerminalPane-Cyao7kTi.js → TerminalPane-Cb8jOFP9.js} +1 -1
  7. package/web-dist/assets/{abnfDiagram-VRR7QNED-D1U0Q_zY.js → abnfDiagram-VRR7QNED-Dtbg2eZ0.js} +1 -1
  8. package/web-dist/assets/architecture-TIHT7OUA-CTxVpl9_.js +1 -0
  9. package/web-dist/assets/{architectureDiagram-ZJ3FMSHR-CtUBwBcU.js → architectureDiagram-ZJ3FMSHR-DzQjWW7u.js} +1 -1
  10. package/web-dist/assets/{blockDiagram-677ZJIJ3-OzqrN18g.js → blockDiagram-677ZJIJ3-BJnpkLMt.js} +1 -1
  11. package/web-dist/assets/{c4Diagram-LMCZKHZV-DgYAtD7L.js → c4Diagram-LMCZKHZV-COdatsYu.js} +1 -1
  12. package/web-dist/assets/channel-COS0Ygbp.js +1 -0
  13. package/web-dist/assets/{chunk-32BRIVSS-CKwBruPa.js → chunk-32BRIVSS-CORMw4Vm.js} +1 -1
  14. package/web-dist/assets/{chunk-52WLFC77-gvoNW_ar.js → chunk-52WLFC77-C7lEadTg.js} +1 -1
  15. package/web-dist/assets/{chunk-C7G6YPKG-EJ5BdmRQ.js → chunk-C7G6YPKG-DZy4F97l.js} +1 -1
  16. package/web-dist/assets/{chunk-EX3LRPZG-DJQF-VwN.js → chunk-EX3LRPZG-HynlfV9p.js} +1 -1
  17. package/web-dist/assets/{chunk-FWX5IMBZ-CXBLvjvR.js → chunk-FWX5IMBZ-BbwKNhKm.js} +2 -2
  18. package/web-dist/assets/{chunk-HOUHSVGY-De3ULdBq.js → chunk-HOUHSVGY-lIhOZSmL.js} +1 -1
  19. package/web-dist/assets/{chunk-ICXQ74PX-aUbMdGsl.js → chunk-ICXQ74PX-WGxaMO8c.js} +1 -1
  20. package/web-dist/assets/{chunk-MOJQB5TN-BLK44SUW.js → chunk-MOJQB5TN-B-cx0f3u.js} +1 -1
  21. package/web-dist/assets/{chunk-OGEWGWER-CQZ3zQ2q.js → chunk-OGEWGWER-DJceVwZH.js} +1 -1
  22. package/web-dist/assets/{chunk-PUDLZKDR-DcdN44K2.js → chunk-PUDLZKDR-CGwHZns8.js} +1 -1
  23. package/web-dist/assets/{chunk-Q4XR5HBZ-Db2ge7fW.js → chunk-Q4XR5HBZ-PTSWtmk1.js} +1 -1
  24. package/web-dist/assets/{chunk-V7JOEXUC-D80jxcmB.js → chunk-V7JOEXUC-VNxHZPcf.js} +1 -1
  25. package/web-dist/assets/{chunk-VAUOI2AC-nDGsXZZE.js → chunk-VAUOI2AC-ZXYCz_Aw.js} +1 -1
  26. package/web-dist/assets/{chunk-VR4S4FIN-BGXgLAsD.js → chunk-VR4S4FIN-9WCtmFJp.js} +1 -1
  27. package/web-dist/assets/{chunk-WYO6CB5R-BbGEK50o.js → chunk-WYO6CB5R-V4EBjpmt.js} +1 -1
  28. package/web-dist/assets/{chunk-ZGVPDNZ5-CjEI23Vu.js → chunk-ZGVPDNZ5-CPW0Z0ae.js} +1 -1
  29. package/web-dist/assets/classDiagram-OUVF2IWQ-Df5TLnrN.js +1 -0
  30. package/web-dist/assets/classDiagram-v2-EOCWNBFH-Df5TLnrN.js +1 -0
  31. package/web-dist/assets/{cynefin-VYW2F7L2-CR69iDgw.js → cynefin-VYW2F7L2-E7PklfJD.js} +1 -1
  32. package/web-dist/assets/{cynefinDiagram-TSTJHNR4-Le_FSC65.js → cynefinDiagram-TSTJHNR4-JIXAPjDf.js} +1 -1
  33. package/web-dist/assets/{dagre-VKFMJZFB-CxAlFDI9.js → dagre-VKFMJZFB-DjXrdcNx.js} +1 -1
  34. package/web-dist/assets/{diagram-FQU43EPY-BFMwv6Pj.js → diagram-FQU43EPY--i9i0qhm.js} +1 -1
  35. package/web-dist/assets/{diagram-G47NLZAW-mWAc5hJ0.js → diagram-G47NLZAW-DxgcENZ_.js} +1 -1
  36. package/web-dist/assets/{diagram-NH7WQ7WH-CC-QXuir.js → diagram-NH7WQ7WH-CUy9Nr90.js} +1 -1
  37. package/web-dist/assets/{diagram-OA4YK3LP-Cqs5o39q.js → diagram-OA4YK3LP-DbTbUaCb.js} +1 -1
  38. package/web-dist/assets/{diagram-WEI45ONY-B9PF6IpG.js → diagram-WEI45ONY-2gk6xhOq.js} +1 -1
  39. package/web-dist/assets/{ebnfDiagram-CCIWWBDH-C1DkTGUE.js → ebnfDiagram-CCIWWBDH-uE2iDETg.js} +1 -1
  40. package/web-dist/assets/{erDiagram-Q63AITRT-CbCG5w3K.js → erDiagram-Q63AITRT-dztd4MUw.js} +1 -1
  41. package/web-dist/assets/eventmodeling-45OFAUF4-DPVPOEaJ.js +1 -0
  42. package/web-dist/assets/flowDiagram-23GEKE2U-BMIMgVYd.js +1 -0
  43. package/web-dist/assets/{ganttDiagram-NO4QXBWP-CaywKz56.js → ganttDiagram-NO4QXBWP-DAds6Aht.js} +1 -1
  44. package/web-dist/assets/{gitGraph-TEB2WS4Q-DhbijOBs.js → gitGraph-TEB2WS4Q-Ci0XVvIa.js} +1 -1
  45. package/web-dist/assets/{gitGraphDiagram-IHSO6WYX-DHngf1QZ.js → gitGraphDiagram-IHSO6WYX-C6FULyt8.js} +1 -1
  46. package/web-dist/assets/{index-CxwWndgM.js → index-CNy5uOpI.js} +116 -111
  47. package/web-dist/assets/{index-C-3lsl4q.css → index-D6LsViUY.css} +1 -1
  48. package/web-dist/assets/{info-DKCQHKI2-D2uo8Yq_.js → info-DKCQHKI2-9N77dOiw.js} +1 -1
  49. package/web-dist/assets/{infoDiagram-FWYZ7A6U-Bixn1mvJ.js → infoDiagram-FWYZ7A6U-BymP3PgG.js} +1 -1
  50. package/web-dist/assets/{ishikawaDiagram-FXEZZL3T-DG48ASOp.js → ishikawaDiagram-FXEZZL3T-CU_kQBz1.js} +1 -1
  51. package/web-dist/assets/{journeyDiagram-5HDEW3XC-DpQOwYAS.js → journeyDiagram-5HDEW3XC-DZN15HSd.js} +1 -1
  52. package/web-dist/assets/{kanban-definition-HUTT4EX6-Dph0AMZo.js → kanban-definition-HUTT4EX6-J4wR5g_3.js} +1 -1
  53. package/web-dist/assets/{line-hnYRfUMr.js → line-SRzGpiDr.js} +1 -1
  54. package/web-dist/assets/{mermaid-parser.core-DdD3ClpS.js → mermaid-parser.core-CGBscNGo.js} +3 -3
  55. package/web-dist/assets/{mermaid.core-C2DMq9ss.js → mermaid.core-xNdwXb1r.js} +3 -3
  56. package/web-dist/assets/{mindmap-definition-LN4V7U3C-CirJBG-x.js → mindmap-definition-LN4V7U3C-gR2dbzrj.js} +1 -1
  57. package/web-dist/assets/{packet-7NZHBO7P-kD-OtFAF.js → packet-7NZHBO7P-DrR4W6I3.js} +1 -1
  58. package/web-dist/assets/{pegDiagram-2B236MQR-DGmi8fl-.js → pegDiagram-2B236MQR-DN7R-_t4.js} +1 -1
  59. package/web-dist/assets/{pie-RZYD4A2V-DpKplj-N.js → pie-RZYD4A2V-C8VjQAFZ.js} +1 -1
  60. package/web-dist/assets/{pieDiagram-ENE6RG2P-CW-zVLyR.js → pieDiagram-ENE6RG2P-5w64zdD1.js} +1 -1
  61. package/web-dist/assets/{quadrantDiagram-ABIIQ3AL-fxSaIvo2.js → quadrantDiagram-ABIIQ3AL-B4rbezq_.js} +1 -1
  62. package/web-dist/assets/{radar-I7S5WNFK-BPu7ClHP.js → radar-I7S5WNFK-CTbbPB8m.js} +1 -1
  63. package/web-dist/assets/{railroad-3IZDKUUU-CoQXFYm6.js → railroad-3IZDKUUU-CY1er15b.js} +1 -1
  64. package/web-dist/assets/railroad-abnf-AHOZXSZD-DfEpkrtJ.js +1 -0
  65. package/web-dist/assets/railroad-ebnf-EBAXGLYW-Csunejgu.js +1 -0
  66. package/web-dist/assets/railroad-peg-LSFZ7HO6-BgRslbM_.js +1 -0
  67. package/web-dist/assets/{railroadDiagram-RFXS5EU6-Bqnz_3Bc.js → railroadDiagram-RFXS5EU6-Bx2HJ3yT.js} +1 -1
  68. package/web-dist/assets/{requirementDiagram-TGXJPOKE-DJHMdBhh.js → requirementDiagram-TGXJPOKE-BLK-Y2rx.js} +1 -1
  69. package/web-dist/assets/{sankeyDiagram-HTMAVEWB-BlxzmT-W.js → sankeyDiagram-HTMAVEWB-Dk-8Miv-.js} +1 -1
  70. package/web-dist/assets/{sequenceDiagram-DBY2YBRQ-BT7Rn1Uo.js → sequenceDiagram-DBY2YBRQ-DL2alfR-.js} +1 -1
  71. package/web-dist/assets/{stateDiagram-2N3HPSRC-CDoiFcke.js → stateDiagram-2N3HPSRC-Bka44wf1.js} +1 -1
  72. package/web-dist/assets/stateDiagram-v2-6OUMAXLB-6KcScVPX.js +1 -0
  73. package/web-dist/assets/{swimlanes-5IMT3BWC-DtzTgSSP.js → swimlanes-5IMT3BWC-e0GbMwIr.js} +1 -1
  74. package/web-dist/assets/swimlanesDiagram-G3AALYLV-jaJhlDbE.js +8 -0
  75. package/web-dist/assets/{timeline-definition-FHXFAJF6-Dn63VmSO.js → timeline-definition-FHXFAJF6-CT3GFq89.js} +1 -1
  76. package/web-dist/assets/{treeView-QDETBFTQ-DIfJIc9R.js → treeView-QDETBFTQ-BJauJ0bm.js} +1 -1
  77. package/web-dist/assets/{treemap-6X3UGDF4-n9Fwqngl.js → treemap-6X3UGDF4-DCX7A-nx.js} +1 -1
  78. package/web-dist/assets/{vennDiagram-L72KCM5P-C1thEMxE.js → vennDiagram-L72KCM5P-D4dm2iTR.js} +1 -1
  79. package/web-dist/assets/{wardley-OPB4EBWU-Dl6RiScD.js → wardley-OPB4EBWU-DklTDSId.js} +1 -1
  80. package/web-dist/assets/{wardleyDiagram-EHGQE667-DBelgTwB.js → wardleyDiagram-EHGQE667-CikP5hBd.js} +1 -1
  81. package/web-dist/assets/{xychartDiagram-FW5EYKEG-DFGVnPLj.js → xychartDiagram-FW5EYKEG-FXuOAFpz.js} +1 -1
  82. package/web-dist/index.html +2 -2
  83. package/web-dist/assets/architecture-TIHT7OUA-BS8x9TQa.js +0 -1
  84. package/web-dist/assets/channel-DHZV3ADN.js +0 -1
  85. package/web-dist/assets/classDiagram-OUVF2IWQ-Dcx3TDdU.js +0 -1
  86. package/web-dist/assets/classDiagram-v2-EOCWNBFH-Dcx3TDdU.js +0 -1
  87. package/web-dist/assets/eventmodeling-45OFAUF4-DAhP7KCX.js +0 -1
  88. package/web-dist/assets/flowDiagram-23GEKE2U-Be2iuqwq.js +0 -1
  89. package/web-dist/assets/railroad-abnf-AHOZXSZD-BiqkuXNr.js +0 -1
  90. package/web-dist/assets/railroad-ebnf-EBAXGLYW-CDaukY4Z.js +0 -1
  91. package/web-dist/assets/railroad-peg-LSFZ7HO6-CsUPdvVL.js +0 -1
  92. package/web-dist/assets/stateDiagram-v2-6OUMAXLB-DiLnjG8k.js +0 -1
  93. package/web-dist/assets/swimlanesDiagram-G3AALYLV-BqvWOcR2.js +0 -8
package/README.md CHANGED
@@ -42,10 +42,10 @@ $ npx frizz
42
42
  press ctrl-c to stop · run with --debug for the full event feed
43
43
  ```
44
44
 
45
- A browser tab opens on localhost a dedicated workspace for this directory. **One tab per project!** One Frizz serves every project on the machine, each at its own `/project/<name>` URL, so running it in a second directory joins the server already running rather than starting another. Runs on macOS, Linux, and Windows.
45
+ A browser tab opens at `http://127.0.0.1:9393/project/acme/`. Frizz always listens on port 9393 (19393 if something else holds it), and one server serves every project on the machine. Each directory you run it in becomes a **project** with its own board at `/project/<name>`, so running `npx frizz` in a second repo registers that project and opens its board in the server already running rather than starting another. Runs on macOS, Linux, and Windows.
46
46
 
47
47
  <p align="center">
48
- <img src="assets/board.png" alt="Frizz running in a browser tab at 127.0.0.1:4921: a sidebar of threads on the left, and on the right a card where an agent is asking an answerable question with lettered options, above Snooze and Mark as done." width="100%">
48
+ <img src="assets/board.png" alt="The Frizz board: the project rail down the left, the composer and the queue of threads beside it, and on the right a card where an agent is asking an answerable question with lettered options, above Snooze and Mark as done." width="100%">
49
49
  </p>
50
50
 
51
51
  <br/>
@@ -55,15 +55,26 @@ A browser tab opens on localhost — a dedicated workspace for this directory. *
55
55
  Frizz is a browser tab, a queue, and the agent CLIs you already pay for. It brings no model of its own, automates none of your workflow, and keeps every opinion it does have in a text file you can edit.
56
56
 
57
57
  - 🗂️ **A task queue, not a sidebar.** Every agent that comes to rest needing you becomes a card. Work the queue top to bottom instead of polling ten terminals.
58
+ - 📁 **Projects.** Every directory you run it in gets its own board, all on one server. The home page lists them, and the project rail switches between them with each queue's count on its icon.
58
59
  - 🔌 **Headless.** Every thread's agent runs in its own detached background process. Close the tab, quit the browser, ctrl-c the server, reboot — your threads are all still there when you come back, and Frizz reconnects to the ones still running rather than replaying them from disk.
59
60
  - 🤖 **Claude Code *and* Codex.** Pick the backend per thread and run both against the same repo at once. Frizz supports Claude Code and Codex subscriptions — the CLIs you already have installed and signed in.
60
61
  - 😴 **Snooze.** Not everything needs an answer now. Park a card for an hour, until tomorrow morning, or until a date you pick — optionally with a follow-up prompt attached, so the thread wakes up already working on what you told it to do next.
61
- - 🔄 **Heartbeats.** Give a thread a prompt that repeats — every time it comes to rest, on a clock you set in minutes, or both. Good for "keep going until CI is green" without you re-asking. A scheduled one reaches the agent even mid-turn, so it can nudge a thread that never stops. Switch it off whenever, or let the agent say it's finished.
62
+ - 🎯 **Goals.** Give a thread a standing goal that Frizz re-sends as a prompt — every time it comes to rest, on a clock you set in minutes, or both. Good for "keep going until CI is green" without you re-asking. A scheduled one reaches the agent even mid-turn, so it can nudge a thread that never stops. Switch it off whenever, or let the agent say it's finished.
62
63
  - 🐙 **GitHub integration.** Browse your repo's issues and pull requests without leaving the composer, and turn a selection of them into threads. Workers can read issues, diffs, and CI on their own.
63
64
  - 👀 **Built-in CI and PR watchers.** A worker waiting on a build or a review doesn't hand the thread back to you to be told "keep going." It watches, and picks the work back up when the run goes green or a review lands.
64
65
  - 📝 **No magic.** A thread behaves like a Claude Code session you started yourself. Frizz adds no worktrees, no branches, no dev server, no build integration, no workflow engine to fight with.
65
66
  - 🔒 **Local only.** No cloud, no account, no telemetry. The server binds `127.0.0.1` by default and its state lives in your user directory, never in your checkout. To reach a board from a phone, put your own tunnel or proxy in front of it — see [Remote access](docs/remote-access.md).
66
67
 
68
+ ### Projects
69
+
70
+ Every directory you run `npx frizz` in becomes a project with its own board, all served by the one Frizz on your machine. The home page at `http://127.0.0.1:9393/` lists them.
71
+
72
+ <p align="center">
73
+ <img src="assets/projects.png" alt="The Frizz home page: a rail of project icons down the left, and four project cards — design-system, acme-web, acme-api, frizz — each with its home-relative path and when it was last opened, plus an Add a project card." width="100%">
74
+ </p>
75
+
76
+ The project rail keeps every project one click away, with each queue's count on its icon. It is off by default; switch it on under **Settings → Project sidebar**.
77
+
67
78
  ### The queue
68
79
 
69
80
  A sidebar of sessions makes every agent something you have to remember to go check. Frizz gives you one queue instead.
@@ -104,12 +115,12 @@ Park a card for an hour, until tomorrow morning, or until a date you pick. Attac
104
115
  <img src="assets/snooze.png" alt="The snooze menu open on a queue card, offering 1 hour, tomorrow at 9am, 1 day, 3 days, 1 week, and a custom time and prompt." width="100%">
105
116
  </p>
106
117
 
107
- ### Heartbeats
118
+ ### Goal
108
119
 
109
- Give a thread a prompt that repeats. Send it every time the agent comes to rest, on a clock you set in minutes, or both — a scheduled send reaches the agent even mid-turn, without cutting off work in progress.
120
+ Give a thread a standing goal. Frizz sends it as a prompt every time the agent comes to rest, on a clock you set in minutes, or both — a scheduled send reaches the agent even mid-turn, without cutting off work in progress.
110
121
 
111
122
  <p align="center">
112
- <img src="assets/recurring.png" alt="The recurring prompt panel: one prompt saying to keep going until the test suite is green, with both triggers switched on — every time it stops, and every 30 minutes." width="100%">
123
+ <img src="assets/goal.png" alt="The goal panel open on a thread card: a goal saying to keep going until the test suite is green, sent at every rest and every 30 minutes." width="100%">
113
124
  </p>
114
125
 
115
126
  <br/>
@@ -121,7 +132,11 @@ $ npx frizz --help
121
132
 
122
133
  Frizz production launcher
123
134
 
124
- Usage: npx frizz [options]
135
+ Usage: npx frizz [up] [options]
136
+
137
+ Commands:
138
+ up serve at the saved public hostname and run its tunnel; asked once,
139
+ then remembered
125
140
 
126
141
  Run it in the directory you want to work in. One server serves EVERY project on this machine,
127
142
  each at its own /project/<name> URL, so a second run joins the one already going. Runs the
@@ -129,14 +144,12 @@ npm-resolved immutable Frizz package, then opens it in your default browser. Use
129
144
  for a source checkout.
130
145
 
131
146
  Options:
132
- --app use the legacy dedicated app window instead of a browser tab
133
147
  --no-app print the URL without opening a browser
134
148
  --port <port> request a fixed port for a new workspace server
135
149
  --host [address] serve on a network address instead of loopback (bare --host means 0.0.0.0)
136
150
  --allowed-host <name> with --host, also accept this DNS name as the board's address (repeatable)
137
151
  --public-origin <url> serve behind a proxy/tunnel reachable at this exact origin
138
- --cloud serve at the saved hostname and run its Cloudflare tunnel as a child
139
- process; asked once, then remembered
152
+ --cloud alias of up, for saved commands
140
153
  --link print a fresh single-use access link for the running board
141
154
  --debug stream the full event feed to the terminal instead of the compact readout
142
155
  -h, --help show this help
@@ -145,7 +158,6 @@ Environment:
145
158
  FRIZZ_HOST same as --host
146
159
  FRIZZ_ALLOWED_HOSTS same as --allowed-host, comma separated
147
160
  FRIZZ_PUBLIC_ORIGIN same as --public-origin
148
- FRIZZ_PUBLIC_TOKEN standing secret for HEADLESS boxes that cannot show a QR
149
161
 
150
162
  --host puts a board that can run shell commands as you on the network, and Frizz has no login: anyone
151
163
  who reaches the port controls it. Only do this on a network you trust. An IP address and this
@@ -200,7 +212,7 @@ trades the code for a session cookie, so the link itself stops working the momen
200
212
  <details>
201
213
  <summary><b>Can I run it on several repos at once?</b></summary>
202
214
 
203
- > Yes. One Frizz server serves every project on your machine — you don't start one per repo. Run `frizz` in any of them and switch projects from the board; each project's threads, settings and state stay separate.
215
+ > Yes. One Frizz server serves every project on your machine — you don't start one per repo. Run `npx frizz` in any of them and switch projects from the board; each project's threads, settings and state stay separate.
204
216
 
205
217
  </details>
206
218
 
@@ -216,7 +228,7 @@ trades the code for a session cookie, so the link itself stops working the momen
216
228
  >
217
229
  > Frizz prints the addresses to use and warns you as it starts. Reaching it by IP or by the machine's own hostname (`http://pupper:9393/`, `http://pupper.local:9393/`) works as-is; any other name you have to say so — `--host --allowed-host frizz.home.arpa` — because an unlisted name is how DNS rebinding gets a browser to treat an attacker's page as same-origin with your board, and the machine's own name is the one nobody off your network can point elsewhere. `FRIZZ_HOST` and `FRIZZ_ALLOWED_HOSTS` do the same thing when the launch command lives in an image or a unit file.
218
230
  >
219
- > Understand what you're turning on. Frizz has no login: reaching the port *is* the authorization, and the board runs shell commands as you. Only do this on a network you trust, and prefer a tunnel (`ssh -L 9393:127.0.0.1:9393 you@box`, using the port Frizz printed, the same on both ends) if you just want your own board from your own laptop — that needs no flag at all.
231
+ > Understand what you're turning on. Frizz has no login: reaching the port *is* the authorization, and the board runs shell commands as you. Only do this on a network you trust, and prefer a tunnel (`ssh -L 9393:127.0.0.1:9393 you@box`, Frizz's port, the same on both ends) if you just want your own board from your own laptop — that needs no flag at all.
220
232
 
221
233
  </details>
222
234
 
@@ -227,7 +239,7 @@ trades the code for a session cookie, so the link itself stops working the momen
227
239
  >
228
240
  > ```sh
229
241
  > npx frizz --public-origin https://frizz.example.com
230
- > cloudflared tunnel --url http://127.0.0.1:9393 # the port Frizz printed
242
+ > cloudflared tunnel --url http://127.0.0.1:9393 # Frizz's port
231
243
  > ```
232
244
  >
233
245
  > Frizz stays bound to `127.0.0.1` — `--public-origin` is not `--host` and does not put anything on your LAN. The tunnel runs on the same machine and dials the loopback port, so the only way in is through the tunnel. That is also what makes this the *good* remote option rather than merely a working one: the tunnel terminates TLS, so the board is a real `https://` origin and therefore a secure context, which plain `--host` over a LAN IP is not. Copy buttons and desktop notifications work again, and it works on a phone.
@@ -262,13 +274,14 @@ Frizz has its own small vocabulary. Most of it names a feature, so this doubles
262
274
 
263
275
  | Term | What it means |
264
276
  | --- | --- |
277
+ | **Project** | A directory you ran Frizz in. Each has its own board at `/project/<name>`; one server holds all of them. |
265
278
  | **Thread** | One effort, start to finish. Not a chat tab and not a branch. The session *is* the thread — there's no sidecar document to keep in sync, and dispatching doesn't write a file into your repo. |
266
279
  | **Worker** | The agent driving a thread: a real Claude Code or Codex process, running as *you*, with your credentials and your CLI config. |
267
280
  | **Sub-agent** | A helper a worker dispatches for an independent prong of its own task. Frizz binds each one back to its parent, so the fan-out is visible under the parent's card. |
268
281
  | **Rested** | An agent that has ended its turn and is waiting on a human. A rested thread isn't idle, it's *your move*. |
269
282
  | **The queue** | The single list of threads that need you. A thread only earns a card when it genuinely wants a human. |
270
283
  | **Snooze** | Hide a card until later — an hour, tomorrow morning, or a date you pick — optionally with a follow-up prompt attached. |
271
- | **Heartbeat** | A prompt that repeats on its own — every time a thread rests, on a clock, or both — until you switch it off or the agent says it's done. |
284
+ | **Goal** | A standing prompt a thread receives on its own — every time it rests, on a clock, or both — until you switch it off or the agent says it's done. |
272
285
  | **Scratchpad** | A thread's durable working memory, readable under its **Doc** tab. Where a worker keeps what a summary would otherwise lose: the approach, the alternatives it rejected, the decisions you made and reversed. |
273
286
  | **`FRIZZ.md`** | An optional file at your repo root whose contents are injected into every thread, for when you want agents to follow your repo's own norms. |
274
287