heyquilt 0.0.1 → 0.3.90

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 (204) hide show
  1. package/LICENSE +85 -0
  2. package/README.md +630 -2
  3. package/RELEASES.md +733 -0
  4. package/assets/logo.svg +1 -0
  5. package/bin/quilt.js +816 -0
  6. package/desktop/main.js +315 -0
  7. package/package.json +163 -7
  8. package/src/account.js +563 -0
  9. package/src/admit-policy.js +32 -0
  10. package/src/agent-join.js +370 -0
  11. package/src/agent-task-workflow.js +176 -0
  12. package/src/agents/actions.js +85 -0
  13. package/src/agents/claude-code.js +180 -0
  14. package/src/agents/common.js +21 -0
  15. package/src/agents/cursor-transcripts.js +170 -0
  16. package/src/agents/cursor.js +404 -0
  17. package/src/agents/index.js +69 -0
  18. package/src/ai-vm-signin.js +98 -0
  19. package/src/ai-vm.js +380 -0
  20. package/src/api/access.js +75 -0
  21. package/src/api/activity.js +181 -0
  22. package/src/api/agent-auth.js +130 -0
  23. package/src/api/agent-placement.js +157 -0
  24. package/src/api/audit.js +83 -0
  25. package/src/api/auth.js +17 -0
  26. package/src/api/domains.js +30 -0
  27. package/src/api/file-paths.js +40 -0
  28. package/src/api/file-store.js +99 -0
  29. package/src/api/fly-machines.js +76 -0
  30. package/src/api/github-app.js +172 -0
  31. package/src/api/http.js +34 -0
  32. package/src/api/invite-email.js +53 -0
  33. package/src/api/issues.js +110 -0
  34. package/src/api/join-text.js +78 -0
  35. package/src/api/mailer.js +47 -0
  36. package/src/api/memory-store.js +1083 -0
  37. package/src/api/org-access.js +54 -0
  38. package/src/api/permissions.js +71 -0
  39. package/src/api/relay-cluster.js +251 -0
  40. package/src/api/relay-machines.js +60 -0
  41. package/src/api/routes/access-types.js +54 -0
  42. package/src/api/routes/agent-invites.js +115 -0
  43. package/src/api/routes/agents.js +157 -0
  44. package/src/api/routes/ai-vm.js +369 -0
  45. package/src/api/routes/github.js +380 -0
  46. package/src/api/routes/grants.js +70 -0
  47. package/src/api/routes/invites.js +188 -0
  48. package/src/api/routes/issues.js +47 -0
  49. package/src/api/routes/join.js +167 -0
  50. package/src/api/routes/members.js +110 -0
  51. package/src/api/routes/orgs.js +177 -0
  52. package/src/api/routes/relay-cluster.js +90 -0
  53. package/src/api/routes/relay.js +76 -0
  54. package/src/api/routes/session-invites.js +119 -0
  55. package/src/api/routes/sessions.js +92 -0
  56. package/src/api/routes/teams.js +132 -0
  57. package/src/api/routes/workspace-agents.js +332 -0
  58. package/src/api/routes/workspace-files.js +277 -0
  59. package/src/api/routes/workspace-invites.js +196 -0
  60. package/src/api/routes/workspaces.js +225 -0
  61. package/src/api/server.js +623 -0
  62. package/src/api/slugs.js +20 -0
  63. package/src/api/supabase-store.js +765 -0
  64. package/src/api/team-access.js +30 -0
  65. package/src/api/tokens.js +31 -0
  66. package/src/api/workspace-access.js +62 -0
  67. package/src/api/workspace-reach.js +60 -0
  68. package/src/autowork-tools.js +166 -0
  69. package/src/autowork.js +387 -0
  70. package/src/blobstore.js +99 -0
  71. package/src/boxes.js +37 -0
  72. package/src/branchdocs.js +235 -0
  73. package/src/branches.js +194 -0
  74. package/src/catchup.js +111 -0
  75. package/src/chat-archive.js +85 -0
  76. package/src/chat-links.js +923 -0
  77. package/src/clash.js +140 -0
  78. package/src/cloud-ai.js +50 -0
  79. package/src/commit-request.js +59 -0
  80. package/src/commit.js +213 -0
  81. package/src/connection.js +569 -0
  82. package/src/control.js +245 -0
  83. package/src/conversation.js +125 -0
  84. package/src/doctor.js +156 -0
  85. package/src/duties.js +303 -0
  86. package/src/editors.js +228 -0
  87. package/src/fsutil.js +87 -0
  88. package/src/git-hook.js +48 -0
  89. package/src/git.js +147 -0
  90. package/src/github-commit.js +320 -0
  91. package/src/gitignore.js +49 -0
  92. package/src/gitstate.js +900 -0
  93. package/src/history.js +307 -0
  94. package/src/hooks.js +371 -0
  95. package/src/hosted-agents.js +24 -0
  96. package/src/hosted-client.js +112 -0
  97. package/src/identity.js +99 -0
  98. package/src/inbox.js +237 -0
  99. package/src/integrations.js +221 -0
  100. package/src/key-cli.js +115 -0
  101. package/src/largefiles.js +91 -0
  102. package/src/legacy.js +25 -0
  103. package/src/mcp-proxy.js +40 -0
  104. package/src/mcp-room.js +32 -0
  105. package/src/mcp.js +1261 -0
  106. package/src/merge3.js +158 -0
  107. package/src/merges.js +148 -0
  108. package/src/pass-source.js +176 -0
  109. package/src/passes.js +64 -0
  110. package/src/pathrules.js +127 -0
  111. package/src/persona.js +101 -0
  112. package/src/presence.js +360 -0
  113. package/src/private-file.js +41 -0
  114. package/src/procs.js +70 -0
  115. package/src/project-rules.js +178 -0
  116. package/src/protocol.js +92 -0
  117. package/src/quiet-warnings.js +9 -0
  118. package/src/relay-ai-vm.js +82 -0
  119. package/src/relay-ask.js +141 -0
  120. package/src/relay-ci.js +111 -0
  121. package/src/relay-clash.js +597 -0
  122. package/src/relay-cluster.js +454 -0
  123. package/src/relay-commit.js +887 -0
  124. package/src/relay-filekey.js +46 -0
  125. package/src/relay-git.js +274 -0
  126. package/src/relay-githttp.js +137 -0
  127. package/src/relay-github.js +109 -0
  128. package/src/relay-lease.js +137 -0
  129. package/src/relay-lfs.js +37 -0
  130. package/src/relay-mcp.js +1679 -0
  131. package/src/relay-metrics.js +75 -0
  132. package/src/relay-outbound.js +1144 -0
  133. package/src/relay-sync.js +719 -0
  134. package/src/relay-turn-sync.js +307 -0
  135. package/src/relay-upstream.js +934 -0
  136. package/src/relay-webhooks.js +111 -0
  137. package/src/releases.js +131 -0
  138. package/src/report.js +129 -0
  139. package/src/runner.js +306 -0
  140. package/src/same-edit.js +18 -0
  141. package/src/server.js +4187 -0
  142. package/src/session-access.js +170 -0
  143. package/src/session-name.js +15 -0
  144. package/src/session.js +7361 -0
  145. package/src/settings.js +46 -0
  146. package/src/setup.js +184 -0
  147. package/src/shell-path.js +46 -0
  148. package/src/status.js +199 -0
  149. package/src/summarize.js +109 -0
  150. package/src/sync-words.js +42 -0
  151. package/src/task-comments.js +92 -0
  152. package/src/tasks.js +670 -0
  153. package/src/textdiff.js +20 -0
  154. package/src/turn-sync-plan.js +142 -0
  155. package/src/turn-sync.js +191 -0
  156. package/src/ui/access-form.js +37 -0
  157. package/src/ui/agent-env-key.js +76 -0
  158. package/src/ui/agent-guide.js +127 -0
  159. package/src/ui/agent-kinds.js +175 -0
  160. package/src/ui/agent-place.js +265 -0
  161. package/src/ui/app.css +2309 -0
  162. package/src/ui/app.js +542 -0
  163. package/src/ui/board.js +465 -0
  164. package/src/ui/boxes.js +76 -0
  165. package/src/ui/branches.js +111 -0
  166. package/src/ui/catchup.js +77 -0
  167. package/src/ui/changes.js +159 -0
  168. package/src/ui/chat.js +266 -0
  169. package/src/ui/cloud-ai-model.js +107 -0
  170. package/src/ui/cloud-ai.js +221 -0
  171. package/src/ui/common.js +431 -0
  172. package/src/ui/csv.js +21 -0
  173. package/src/ui/diffview.js +74 -0
  174. package/src/ui/feed-convs.js +39 -0
  175. package/src/ui/feed.js +174 -0
  176. package/src/ui/files.js +579 -0
  177. package/src/ui/fileview.js +123 -0
  178. package/src/ui/git-rule.js +60 -0
  179. package/src/ui/home.js +1323 -0
  180. package/src/ui/index.html +16 -0
  181. package/src/ui/invite.js +97 -0
  182. package/src/ui/invites.js +79 -0
  183. package/src/ui/loom-model.js +516 -0
  184. package/src/ui/loom.css +349 -0
  185. package/src/ui/loom.js +753 -0
  186. package/src/ui/mark.js +104 -0
  187. package/src/ui/merges.js +158 -0
  188. package/src/ui/rail-model.js +78 -0
  189. package/src/ui/rail.js +173 -0
  190. package/src/ui/releases.js +182 -0
  191. package/src/ui/schedule.js +156 -0
  192. package/src/ui/session.js +3394 -0
  193. package/src/ui/signin.js +75 -0
  194. package/src/ui/sounds.js +110 -0
  195. package/src/ui/tool-logo.js +86 -0
  196. package/src/ui/tree.js +276 -0
  197. package/src/ui/workspaces.js +542 -0
  198. package/src/ui-server.js +1272 -0
  199. package/src/update-check.js +67 -0
  200. package/src/upstream.js +155 -0
  201. package/src/webhooks.js +235 -0
  202. package/src/workspace-cli.js +62 -0
  203. package/src/workspace-tools.js +340 -0
  204. package/index.js +0 -2
package/README.md CHANGED
@@ -1,3 +1,631 @@
1
- # Quilt
1
+ <p align="center"><img src="assets/logo.svg" width="96" alt="Quilt logo"></p>
2
2
 
3
- Real-time pair coding that works with any AI tool. Coming soon at [heyquilt.com](https://heyquilt.com).
3
+ <h1 align="center">Quilt</h1>
4
+
5
+ <p align="center">Real-time pair vibe coding that doesn't care which AI tool you use.</p>
6
+
7
+ You use Claude Code, your friend uses Cursor, someone else uses Codex or plain
8
+ vim. Everyone works in their own copy of the project, on their own machine,
9
+ anywhere in the world, and every change shows up on everyone else's disk
10
+ within milliseconds. Your agents can also see what the other agents are doing.
11
+
12
+ ```
13
+ you + Claude Code friend + Cursor
14
+ ~/my-app <--> quilt join quilt join <--> ~/my-app
15
+ \ /
16
+ +--> Quilt relay <-----+
17
+ (WebSocket)
18
+
19
+ each agent --MCP--> quilt_status / quilt_claim / quilt_message
20
+ ```
21
+
22
+ ## How it works
23
+
24
+ - **Tool-agnostic by design.** Every AI coding tool eventually reads and writes
25
+ files, so Quilt syncs files and nothing else. It watches your project folder and
26
+ mirrors changes into a shared [Yjs](https://yjs.dev) CRDT document. Remote
27
+ changes are written back to disk. Your editor or agent just sees files change.
28
+ - **Real merges, not overwrites.** Text files are synced character by character.
29
+ If your agent edits the top of `app.ts` while theirs edits the bottom, both
30
+ edits land. Binary files (images, etc.) sync as whole files.
31
+ - **Works apart.** Quilt's relay at `relay.heyquilt.com` connects everyone over
32
+ WebSockets, and only lets in people signed in to heyquilt.com. If your
33
+ connection drops, keep working: Quilt keeps a local copy of the shared state
34
+ and merges your offline edits line by line when you reconnect, like git.
35
+ Edits to the same lines land in the **Merges** bar for the people involved
36
+ to settle.
37
+ - **Watch each other's AI, live.** The app shows your partner's AI conversation
38
+ as it happens: their prompts, the AI's replies, and one-line actions like
39
+ "Edited src/app.ts" or "Ran npm test". Quilt reads Claude Code's and Cursor's
40
+ chats by itself; any other MCP agent shares the same feed with `quilt_share`.
41
+ Next to it are a live file tree (who's editing what, what's claimed) and
42
+ read-only file tabs where changed lines light up.
43
+ - **Agents coordinate, and can join by themselves.** An MCP server gives each
44
+ agent tools to see who's online, read a partner's AI feed, see where people
45
+ are working, *claim* files and message each other. With an invite link, an
46
+ agent can even join (or start) a session on its own. Tools without MCP can
47
+ use the `quilt` CLI or read `.quilt/STATUS.md`.
48
+ - **Cloud AIs too.** An AI with no computer of its own that can use an MCP
49
+ server over HTTP (a bot, a cloud routine, your own agent) joins through Quilt's hosted
50
+ MCP at `api.heyquilt.com/mcp` with the access key it got from an agent
51
+ invite. It joins a session from the invite link, you let it in, and it reads
52
+ and writes the shared files like everyone else.
53
+ - **Workspaces (behind a flag while they settle).** They gather your
54
+ sessions, the people and agents in them, and files, in one place. Agents
55
+ can work in them too: invite one as a global, workspace or session agent,
56
+ and a workspace's agents are invited to its new sessions for you to let in.
57
+ - **AIs in a chat window, with nothing to set up.** ChatGPT, claude.ai, Grok and
58
+ other AIs you only talk to in a chat can join through a *chat link*: the session
59
+ owner (or whoever may let people in) makes one in **Invite → A chat AI** (or
60
+ `quilt chat-link`), pastes it into
61
+ the chat, and the AI works by opening links. It can read and send messages, read
62
+ and add tasks, read files, and add pictures, PDFs, office documents and notes as
63
+ new files. It can't change existing files. It shows in the session as its own
64
+ member and works for 10 minutes: the owner, or whoever may let people in, extends
65
+ it from the people menu (or
66
+ `quilt chat-link extend <name> <minutes>`) while it still works. Once it runs
67
+ out, or the owner removes it, a new link is needed.
68
+
69
+ ## Quick start
70
+
71
+ ### Download the app
72
+
73
+ Get Quilt for [Mac (Apple silicon)](https://github.com/DanielCarmichaelGit/heyquilt/releases/latest/download/quilt-mac-arm64.dmg),
74
+ [Mac (Intel)](https://github.com/DanielCarmichaelGit/heyquilt/releases/latest/download/quilt-mac-x64.dmg),
75
+ [Windows](https://github.com/DanielCarmichaelGit/heyquilt/releases/latest/download/quilt-windows-x64.exe) or
76
+ Linux ([x86_64](https://github.com/DanielCarmichaelGit/heyquilt/releases/latest/download/quilt-linux-x86_64.AppImage),
77
+ [ARM](https://github.com/DanielCarmichaelGit/heyquilt/releases/latest/download/quilt-linux-arm64.AppImage): an
78
+ AppImage, `chmod +x` it), and open it.
79
+ Everything happens in the app: start a session, send the invite link, and
80
+ partners click it to join. Closing the window keeps your sessions syncing from
81
+ the menu bar; quit from there when you're done.
82
+
83
+ The first time you open it, sign in: Quilt opens heyquilt.com, where you
84
+ approve this computer. New to Quilt? [Create an account](https://heyquilt.com/signup).
85
+
86
+ The app isn't signed by Apple yet, so the first time you open it macOS may say
87
+ it can't check it. Open **System Settings → Privacy & Security** and click
88
+ **Open Anyway**.
89
+
90
+ Your AI tools can use Quilt as soon as the app opens: it connects every one it
91
+ finds (see [Your AI tools are connected already](#the-terminal-way)). To type
92
+ `quilt` in a terminal yourself, choose **Quilt → Install the Quilt Command…**.
93
+
94
+ ### On a server or cloud machine
95
+
96
+ A Linux machine with no desktop (a server, a cloud VM, a container, an agent's sandbox)
97
+ gets the command line with its own Node.js, so nothing else needs installing:
98
+
99
+ ```bash
100
+ curl -fsSL https://github.com/DanielCarmichaelGit/heyquilt/releases/latest/download/install.sh | sh
101
+ quilt login
102
+ ```
103
+
104
+ Run the same line again to update. Agents on that machine find Quilt's MCP server by
105
+ themselves (see below), and `quilt join <invite>` syncs a project there.
106
+
107
+ ### From source
108
+
109
+ Requires Node.js 20+.
110
+
111
+ ```bash
112
+ git clone <this repo> && cd quilt && npm install && npm link # puts `quilt` on your PATH
113
+ npm run app # run the desktop app from source
114
+ npm run dist:mac # build the Mac app into dist/
115
+ ```
116
+
117
+ ### The easy way: the app
118
+
119
+ ```bash
120
+ quilt ui
121
+ ```
122
+
123
+ This opens Quilt in your browser, where you can:
124
+
125
+ - **Sign in** with your heyquilt.com account (once per computer).
126
+ - **Start a session:** pick your project folder. You get an invite link to send.
127
+ - **Join a session:** paste an invite link and pick where the project should go.
128
+ - **Work together:** see who's online, what they're working on and which files
129
+ they just changed. Chat, send direct messages, and drag and drop files to share
130
+ them. You can also claim files, and rejoin recent sessions later.
131
+
132
+ The app only listens on `127.0.0.1` and needs the secret link `quilt ui` prints.
133
+
134
+ ### The terminal way
135
+
136
+ **1. Sign in** once on each computer:
137
+
138
+ ```bash
139
+ quilt login # opens heyquilt.com, where you approve this computer
140
+ ```
141
+
142
+ **2. Start a session** in your project folder:
143
+
144
+ ```bash
145
+ cd ~/code/my-app
146
+ quilt join --tool claude
147
+ ```
148
+
149
+ It prints an invite link like `https://join.heyquilt.com/room-1a2b#…`.
150
+ Send it to your friend. Opening it in a browser shows them how to join.
151
+
152
+ **3. Your friend joins** from an empty folder (or their own clone of the same
153
+ repo), signed in to their own account:
154
+
155
+ ```bash
156
+ mkdir my-app && cd my-app
157
+ quilt login
158
+ quilt join <invite-link> --tool cursor
159
+ ```
160
+
161
+ Keep `quilt join` running in a terminal while you work. It logs who joined,
162
+ what they're touching, claims, and messages.
163
+
164
+ **Your AI tools are connected already.** Whenever the app, `quilt login`,
165
+ `quilt ui` or a session starts, Quilt adds its MCP server to every AI tool it
166
+ finds on the computer: Claude Code, Claude Desktop, Cursor, Windsurf, Codex,
167
+ VS Code (GitHub Copilot, Cline, Roo Code), Gemini CLI, GitHub Copilot CLI, Zed,
168
+ opencode, Kiro, Amp, Junie and Continue. It writes each tool's own settings with
169
+ this install's full path, so nothing depends on your PATH or on files in the
170
+ project, and it keeps them current when the app moves or updates. A tool that
171
+ was already open picks Quilt up when it restarts. A settings file Quilt can't
172
+ edit safely (JSON with comments, say) is left alone and named in the log.
173
+ `quilt setup` does the same on demand, and adds pairing etiquette to `CLAUDE.md`
174
+ and `AGENTS.md`.
175
+
176
+ **Quilt's rules are enforced, in every tool.** They aren't instructions an agent
177
+ may skip:
178
+
179
+ - An edit to a file someone else holds (claims it) is undone (Quilt watches the
180
+ disk). Only claims block files; chat never does.
181
+ - Before an agent changes a file, it is shown what people said about that file in
182
+ chat, so it works with what was asked or planned in mind.
183
+ - While someone who messaged or mentioned the agent is waiting for an answer, every
184
+ tool that moves work on (claims, tasks, focus, merges, commits, `quilt_set_work`)
185
+ refuses with who is waiting, until the agent answers with `quilt_message`.
186
+ - Hosted agents write through Quilt's tools, so their writes are refused outright.
187
+
188
+ Claude Code and Cursor also get Quilt's hooks (in your own `.claude/settings.local.json`,
189
+ which Cursor reads too), and Gemini CLI gets them in its user settings: they refuse such
190
+ an edit before it happens instead of undoing it after.
191
+ See [Claims](#claims).
192
+
193
+ ## Commands
194
+
195
+ | Command | What it does |
196
+ |---|---|
197
+ | `quilt ui` | Open the app (start, join, chat, files) |
198
+ | `quilt serve [--port 4321] [--data ./quilt-data]` | Run a relay (how Quilt's relay runs; see docs/hosting.md) |
199
+ | `quilt login` / `quilt logout` / `quilt whoami` | Sign this computer in to your heyquilt.com account, sign it out, or see which account it uses |
200
+ | `quilt join` | Start a new session for this folder |
201
+ | `quilt join --agent <name>` | Join as a Quilt agent saved with `quilt agent join` |
202
+ | `quilt join <invite>` | Join a session |
203
+ | `quilt join` | Rejoin this folder's last session (merges offline edits) |
204
+ | `quilt invite` | Print the invite link again |
205
+ | `quilt status` | Who's online, focus, recent edits, claims, messages |
206
+ | `quilt focus "adding auth"` | Tell others what you're working on |
207
+ | `quilt claim 'src/auth/**' "rewriting login"` | Lock files/folders/globs so only you can change them |
208
+ | `quilt release <pattern>` / `quilt release` | Release one claim / all of yours |
209
+ | `quilt chat` | Interactive chat in your terminal (live messages, DMs, files) |
210
+ | `quilt say "pushing a schema change"` / `quilt say @bob "got a sec?"` | Message everyone / one person |
211
+ | `quilt send design.png @bob "new mockup"` | Send a file (to everyone, or one person) |
212
+ | `quilt messages` / `quilt messages --all` / `--with bob` | Unread messages / history / one conversation |
213
+ | `quilt history [path] [--by name] [--since 2h] [--diff]` | Who changed what, when, and for which task |
214
+ | `quilt get <message-id> [dest]` | Download a shared file again |
215
+ | `quilt setup` | Connect every AI tool on this computer now, and add agent instructions to the project |
216
+ | `quilt mcp` | The MCP server itself (your AI tool launches this) |
217
+ | `quilt doctor [--watch 30]` | Check what Quilt can see of your Claude Code / Cursor chats (safe to share: no chat text) |
218
+
219
+ ### MCP tools for agents
220
+
221
+ | Tool | Purpose |
222
+ |---|---|
223
+ | `quilt_join_session` | Join a session from an invite link, as a Quilt agent saved with `quilt agent join` |
224
+ | `quilt_start_session` | Start a new session for a folder, as that agent, and get an invite link |
225
+ | `quilt_leave_session` / `quilt_session_info` | Leave; or see the folder, your name, who's online, and the invite |
226
+ | `quilt_status` | Collaborators, their focus, recently edited files, what each person has changed, claims, messages |
227
+ | `quilt_partner_feed` | Read what a collaborator's AI is doing (prompts, replies, actions) |
228
+ | `quilt_history` | The chronology: who changed which file, when, the diff, and for which task; filter by path, person, task or time |
229
+ | `quilt_list_files` | Shared files with recent editors and claims |
230
+ | `quilt_set_focus` | Announce the current task |
231
+ | `quilt_share` | Share what you're working on (the request, your plan, what you did, files changed): it reaches partners' feeds and the task board, and holds off commits while you work |
232
+ | `quilt_before_edit` | Before changing files: whether each one is yours to edit (free ones are claimed for you; held ones are refused, with who to ask), and what people said about them in chat lately |
233
+ | `quilt_set_work` | Say you're working or done; "done" releases the files claimed for you, and is refused until you've answered everyone who wrote to you |
234
+ | `quilt_claim` / `quilt_release` | Claim or release files by hand (Quilt claims files for you as your AI edits them) |
235
+ | `quilt_message` | Message everyone, or one person with `to` |
236
+ | `quilt_read_messages` | Read unread (or recent) messages, including received files |
237
+ | `quilt_project_rules` | The project's rules for AI, the same for every tool: AGENTS.md (root and folders, else CLAUDE.md), Cursor rules that always apply, and the design system (DESIGN.md, or the file AGENTS.md names with `Design system: <path>`) |
238
+ | `quilt_inbox` | What is waiting for you: mentions (`@yourname`), direct messages and tasks handed to you since you last looked |
239
+ | `quilt_webhook_subscribe` / `quilt_webhook_unsubscribe` | Have each mention, direct message and handed-over task POSTed to a URL of yours as it happens, signed; or stop that |
240
+ | `quilt_check_update` | Whether the Quilt you run (your image) is current; an old one is told to update the app |
241
+ | `quilt_send_file` | Send a project file through chat (secrets and paths outside the project are refused) |
242
+ | `quilt_get_file` | Download a shared file (again) |
243
+ | `quilt_workspaces` | The workspaces you can reach, with your access, open sessions, files and storage used (only when the server has workspaces on, as are the tools below) |
244
+ | `quilt_workspace_files` | A workspace library's files, by folder or glob |
245
+ | `quilt_workspace_read_file` / `quilt_workspace_write_file` | Read a file from the library (text comes back inline; anything else as a link, saved to `~/.quilt/workspaces/` on a computer); put a file there with a short note |
246
+ | `quilt_workspace_move_file` / `quilt_workspace_delete_file` | Move or rename a library file; delete one |
247
+ | `quilt_workspace_webhook` / `quilt_workspace_webhook_off` | Be told when a session starts in one of your workspaces, with its link; or stop that |
248
+
249
+ Any MCP-capable tool works: Claude Code, Cursor, Windsurf, Codex, Zed, and so on.
250
+ Quilt registers the server with each of them by itself (see above).
251
+
252
+ Mentions, direct messages and handed-over tasks reach any agent without polling:
253
+ subscribe to the `quilt://inbox` resource (standard MCP; you're notified when it
254
+ changes), or have them POSTed to a webhook. Claude Code started with the quilt
255
+ channel gets each one as a turn.
256
+ Point its MCP config at the command `quilt` with args `["mcp"]`.
257
+
258
+ ## Watching each other's AI
259
+
260
+ In a session, the app's main area has two modes:
261
+
262
+ - **AI:** one tab per person, showing their AI conversation live. You see
263
+ prompts and replies in full, plus one-line actions ("Edited src/app.ts",
264
+ "Ran npm test"). Command output, file contents and the AI's hidden reasoning
265
+ are never shared. Commands are cut down to the program and one plain word,
266
+ so flags, paths, URLs and tokens stay private.
267
+ - **Files:** read-only tabs for shared files, with who edited each one and
268
+ whether it's claimed. Lines light up as your partner's AI changes them.
269
+
270
+ ### Claims
271
+
272
+ The file tree on the left shows orange badges on files edited in the last two
273
+ minutes and purple badges on claims. Use a file's or folder's ⋯ menu to claim
274
+ or release it.
275
+
276
+ **No AI edits a file without claiming it first, whatever tool it runs in.** Claims
277
+ follow edits, so nobody has to remember:
278
+
279
+ - **Every tool.** The moment your AI changes a file nobody holds, Quilt claims it for
280
+ you (note: `editing`, or your current focus). Quilt watches the disk, so this covers
281
+ Cursor, Codex, Windsurf, a terminal agent, anything. The claim ends when your AI
282
+ goes idle (Quilt reads Claude Code and Cursor), when the file has been quiet for
283
+ five minutes (for tools it can't read), and when the session stops. When Quilt can
284
+ see your AI is idle, your own hand edits are not claimed, so two people can still
285
+ type in one file together.
286
+ - **A partner's edit to your file is undone** and put back the way you have it. Their
287
+ AI hears about it with its next Quilt tool call: who holds the file and why, and to
288
+ send you a direct message saying what it wanted to change rather than retry.
289
+ - **Every MCP agent is checked before it edits, too.** `quilt_before_edit` refuses
290
+ a file someone else holds, claims a free one, and shows what people said about
291
+ those files in chat lately (marking any it hasn't replied to). Every
292
+ Quilt answer starts with the direct messages, mentions and tasks that arrived
293
+ since the last one. `quilt_set_work` "done" and moving a task to Done are refused
294
+ while someone who wrote to the agent is still waiting for a reply. An agent that
295
+ never says it's done stops counting as working once its files have been quiet
296
+ for five minutes, so commits aren't held up.
297
+ - **Claude Code, Cursor and Gemini CLI get the same rules automatically** through
298
+ their own hooks (`quilt hook`, set up by Quilt: `.claude/settings.local.json` in the
299
+ session folder, which Cursor reads too, and `~/.gemini/settings.json`): an edit to a
300
+ file someone else holds is refused before it happens, chat about the file is shown
301
+ before the edit, the AI sees new messages after its next edit, and if it tries to
302
+ finish with an unanswered one, or a file someone is queued for, it is asked to deal
303
+ with that first. Hook claims end when the AI finishes its turn; a crashed one's
304
+ leftovers are released by the next session.
305
+ - **The file queue moves without the AI.** A file Quilt claimed for your AI that
306
+ someone waits for is handed on by Quilt, with what your AI was doing as context,
307
+ two minutes after your AI stops (or after five quiet minutes when Quilt can't see
308
+ it working), if your AI didn't hand it on itself.
309
+ - **Picking up tasks.** In Settings, "Let my AI pick up tasks by itself" (off, tasks
310
+ assigned to it, or those then unassigned ones): as your AI finishes (`quilt_set_work`
311
+ done, a task to QA or Done, or the end of its turn in a tool with hooks), it is handed
312
+ the next To do task and starts it.
313
+ - **Hosted agents** (on `api.heyquilt.com/mcp`) are told what people said about a
314
+ file in chat when they write it.
315
+ - **Hosted agents** (on `api.heyquilt.com/mcp`) are claimed for when they write a
316
+ file and let go after ten quiet minutes; a write to someone else's file is refused
317
+ with the same advice.
318
+ - Claims you made yourself (`quilt claim`, the ⋯ menu, `quilt_claim`) are never
319
+ touched by any of this.
320
+
321
+ The enforcement below is what makes the claim count:
322
+
323
+ Claims are enforced in code, not just by asking agents nicely:
324
+
325
+ - **Your side:** if you change a file someone else has claimed (including
326
+ creating or deleting files in a claimed folder), Quilt puts the shared version
327
+ back on your disk, never sends the change, and keeps your version in
328
+ `.quilt/rejected/`.
329
+ - **Their side:** if a change to your claimed files still arrives (say, from a
330
+ partner running an older Quilt), your Quilt reverts it in the shared session
331
+ and keeps their version in your `.quilt/rejected/`.
332
+ - **The relay:** claims live on the relay, not in the shared files. It checks
333
+ who is asking (see [Security](#security)), refuses a claim that overlaps
334
+ someone else's, and only lets the person who made a claim release it. So a
335
+ claim can't be faked, stolen or released by anyone else. Claiming needs a
336
+ connection to the relay; claims you already know about stay enforced offline.
337
+ - A folder can be claimed before it exists; anything created in it later is
338
+ covered. If two glob claims start overlapping because a new file matches
339
+ both, everyone treats the earliest claim as the owner.
340
+
341
+ Sharing is on when you join. Pause or resume it from the people menu (the
342
+ avatars at the top); a pause is remembered for that folder. Quilt reads Claude
343
+ Code transcripts from `~/.claude/projects` and Cursor's local chat database
344
+ (read-only, needs Node.js 22.13+). Both are best-effort: if a tool's format
345
+ changes, its feed shows as unavailable and syncing carries on.
346
+
347
+ ## Agents as participants
348
+
349
+ An AI agent can be a full member of a session, with no human running Quilt for
350
+ it. Give the agent an invite link and it calls `quilt_join_session`. The project
351
+ syncs into its folder, and everyone sees it in the session with an agent badge.
352
+ It can then read partners' AI feeds, claim files, chat, and edit files that
353
+ sync to everyone. It can also start a session with `quilt_start_session` and
354
+ hand out the invite. The session lasts as long as the agent's MCP server runs.
355
+
356
+ Agents that prefer the shell can run `quilt join <invite> --agent <name>` instead.
357
+
358
+ ### Agents wake up when they are needed
359
+
360
+ Mention an agent in chat (`@Larry can you take the login bug?`), send it a
361
+ direct message, or hand it a task on the board, and the agent is told. Every
362
+ tool can read what is waiting with `quilt_inbox`; Claude Code's hooks show it
363
+ while Claude works and before it finishes. Claude Code can also be woken by it:
364
+ start it with Quilt as a channel and each mention, message or task arrives as a
365
+ turn on its own, with nobody typing a prompt:
366
+
367
+ ```bash
368
+ claude --dangerously-load-development-channels server:quilt
369
+ ```
370
+
371
+ (Channels are a Claude Code research preview; the flag is theirs. Without it,
372
+ Claude Code still sees the inbox through the hooks and `quilt_inbox`.) An agent
373
+ that is woken answers with `quilt_message` and takes a task with `quilt_move_task`.
374
+
375
+ Typing `@` in the app's chat offers the session's members, so a name is spelled
376
+ the way the agent listens for it, and mentions are marked in every message.
377
+
378
+ ### Your AI on its own cloud machine
379
+
380
+ Quilt runs a person's AI only when they turn "Work on its own" on in Settings → Your AI, and
381
+ then only their own AI tool with their own account: on their own computer, or on their own
382
+ cloud VM they connected. **Connect Claude**, **Connect Codex** or **Connect Cursor** there
383
+ starts a small machine for that person alone (never the relay) and signs the tool in with its
384
+ own login: the app shows the link and code, and Quilt never asks for, keeps or passes on the
385
+ tool's token, or pays for its use. From then on it is one of the person's AI sessions,
386
+ "Daniel · cloud" under "Daniel's AI": it joins the sessions they join and, while none of
387
+ their AI sessions on a computer is live, takes tasks for their AI and answers what is written
388
+ to it, with its own model, instructions and daily cap. It sleeps when idle and wakes when it
389
+ is needed. Disconnect deletes the machine and its disk.
390
+
391
+ ### Webhooks: an agent sets up its own push
392
+
393
+ An agent that runs on a trigger (a cloud routine, a bot behind a webhook URL)
394
+ need not poll. It calls `quilt_webhook_subscribe` with its URL once, and from
395
+ then on Quilt POSTs each event to it as it happens:
396
+
397
+ | Event | When |
398
+ | --- | --- |
399
+ | `chat.mention` | Someone wrote `@its-name` in the session chat |
400
+ | `chat.dm` | Someone sent it a direct message |
401
+ | `task.assigned` | A task on the board was handed to it |
402
+
403
+ Each POST is JSON, `{ event, id, room, to, by, text, ts, task?, context? }`
404
+ (`context`: the messages before this one between the agent and its sender,
405
+ oldest first, so an agent woken fresh knows what "that" refers to), with the
406
+ headers `x-quilt-event`, `x-quilt-delivery` (the same id on every try),
407
+ `x-quilt-timestamp` and `x-quilt-signature: sha256=<HMAC-SHA256(secret,
408
+ "<timestamp>.<body>")>`. The agent gives a secret or gets one back, shown once.
409
+ A receiver that wants a key of its own on every call (a Grok Bot routine's
410
+ webhook trigger, say) gets it as `Authorization: Bearer <key>`: pass it as
411
+ `bearer`.
412
+ A receiver that is down or answers 5xx is tried again a few times; whatever was
413
+ POSTed is still in `quilt_inbox`. `events` narrows the subscription; calling
414
+ again replaces it; `quilt_webhook_unsubscribe` ends it.
415
+
416
+ For a hosted agent the relay delivers, so the webhook works even when the agent
417
+ itself is asleep, and the subscription carries over when it joins another
418
+ session. For an agent joined from a computer, its Quilt delivers and keeps the
419
+ subscription in that folder's `.quilt/webhook.json`. URLs must be `https` and
420
+ public (an agent on a computer may also use `http` on that computer).
421
+
422
+ ### Agents in workspaces
423
+
424
+ With workspaces on, **Invite an agent** (in Settings › Agents, a workspace's Add
425
+ dialog, or a session's Invite dialog) asks what kind of agent to invite:
426
+
427
+ - **Global agent:** in all your workspaces, invited to their sessions.
428
+ - **Workspace agent:** in one workspace (your own, or an org's you manage),
429
+ invited to its sessions.
430
+ - **Session agent:** invited to one session; the text you paste into the AI
431
+ carries that session's link.
432
+
433
+ Under the hood an agent works in a workspace in one of two ways:
434
+
435
+ - **Added to it.** Someone who manages the workspace adds the agent on the
436
+ workspace's page, with edit or view access, or makes a one-time invite link
437
+ for a new agent there (a workspace agent).
438
+ - **Placed there by its owner.** In **Settings › Agents** in the app, or on the
439
+ Agents page of heyquilt.com (an org's agents: on the org's People page, with
440
+ Agents: Update and Workspaces: Update), **Works in** says where the agent works: all your
441
+ workspaces (a **Global** agent; for an org, all the org's), the ones you pick, or only where it is added. A
442
+ workspace's admins can still change whether a placed agent is invited to its
443
+ sessions, or keep it out of that workspace.
444
+
445
+ Inheritance is an invitation, not admission. **Invited to new sessions** says
446
+ whether each new session in the workspace sends the agent its link (Every
447
+ session) or not (Not automatically). The agent then waits like anyone else
448
+ with the link, and the session's owner lets it in; being in the workspace never
449
+ lets an agent into a session by itself (people in a workspace still get into
450
+ its sessions at their workspace access). Only an agent's owner can have it
451
+ invited to every session: someone else's agent added to your workspace is
452
+ invited by hand. A session's owner sees the agents its workspace invited in the
453
+ session's People (waiting, in, or invited), and can say **Don't invite** for that
454
+ one session or **Invite** it again, which sends it the link at once.
455
+
456
+ An agent invited to every session needs to hear when one starts: it calls
457
+ `quilt_workspace_webhook` with a public `https` URL, and when someone starts a
458
+ session in one of its workspaces, Quilt POSTs `session.started` there with
459
+ the session's invite link, signed like the session webhooks above. Quilt never
460
+ keeps the link: it is passed on in the same moment. Receivers whose address
461
+ resolves to a private network are skipped.
462
+
463
+ The library tools read and write the workspace's files (images, video,
464
+ documents, data), so agents put what they make there with a note instead of
465
+ in chat. A hosted agent can write up to 2 MB per call (text or base64); an
466
+ agent on a computer can also send a project file of up to 500 MB.
467
+ ### Apps: Pipedream, Zapier, Make, n8n
468
+
469
+ An automation app joins as an agent of yours, with an **app key** (`qk_`) instead
470
+ of an invite. On heyquilt.com, open **Agents**, then **Connect an app**: Quilt
471
+ adds an agent named for the app and shows its key once. The key signs that agent
472
+ in like an access key but never runs out; it works until you revoke it there
473
+ (each agent can have up to 10, each revoked on its own, and revoking the agent
474
+ revokes them all).
475
+
476
+ The app sends the key as `Authorization: Bearer <key>` to the hosted MCP at
477
+ `https://api.heyquilt.com/mcp`, one JSON-RPC request per tool call, no session
478
+ set up first:
479
+
480
+ ```bash
481
+ curl -s https://api.heyquilt.com/mcp \
482
+ -H "Authorization: Bearer $QUILT_APP_KEY" \
483
+ -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
484
+ -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"quilt_join_session","arguments":{"invite":"https://join.heyquilt.com/<room>#<secret>"}}}'
485
+ ```
486
+
487
+ Every hosted agent tool works this way (`quilt_message`, `quilt_tasks`,
488
+ `quilt_add_task`, `quilt_move_task`, `quilt_read_file`, `quilt_write_file`,
489
+ `quilt_history`, `quilt_claim` and the rest; `tools/list` names them all), and
490
+ `quilt_webhook_subscribe` turns mentions, direct messages and tasks into POSTs
491
+ to the app (see [Webhooks](#webhooks-an-agent-sets-up-its-own-push)). The agent
492
+ can be in several sessions at once: each `quilt_join_session` adds one. While it
493
+ is in more than one, every tool call names the session in `session` (the IDs come
494
+ from `quilt_session_info`, and each webhook event names its own).
495
+
496
+ The **Quilt app for Pipedream** wraps this: paste the key when you connect
497
+ Quilt, then use its actions (Join Session, Send Message, Read Messages, Get
498
+ Inbox, List/Add/Move/Assign Task, Read/Write File, Share Update, Get Session
499
+ Status, Call Tool for any other tool, each with an optional **Session**) and its
500
+ instant trigger, **New Mention, Message or Task**, which covers every session the
501
+ agent is in. Quilt keeps one webhook per agent, so give each trigger its own agent.
502
+
503
+ ### Agents are told to update
504
+
505
+ Every Quilt MCP knows the newest Quilt release. An agent whose Quilt (its image)
506
+ is behind sees "You must update your app" in every answer, and
507
+ `quilt_check_update` answers for any version it names. A hosted agent sends its
508
+ version as the `x-quilt-image` header.
509
+
510
+ ## Messaging and file sharing
511
+
512
+ Chat lives alongside the code. Messages go to everyone by default, or to one
513
+ person with `@name`. Messages are kept in the room, so anyone offline sees
514
+ them when they reconnect, and `quilt status` shows your unread count.
515
+
516
+ Files you **send** (screenshots, logs, exports, a PDF spec) go through the relay
517
+ as attachments. They are *not* added to the shared project folder. Recipients
518
+ get them automatically in `.quilt/inbox/`, including files sent while they
519
+ were offline. The limit is 100 MB per file.
520
+
521
+ Direct messages and files are only shown to the sender and recipient, but they
522
+ travel through the shared room, so they're private from other collaborators'
523
+ screens, not from the relay operator.
524
+
525
+ ## The relay
526
+
527
+ Everyone connects through Quilt's relay at `relay.heyquilt.com`. It passes
528
+ changes between computers, keeps each session's shared state and the files
529
+ people share in chat, and only lets in people and agents signed in to
530
+ heyquilt.com: the app and the `quilt` command get a pass from the accounts API
531
+ that lasts 10 minutes, and the relay checks it on every connection.
532
+
533
+ The relay is one small Node process (`quilt serve`); [docs/hosting.md](docs/hosting.md)
534
+ describes how it's deployed and its settings. The app only connects to Quilt's
535
+ relay for now.
536
+
537
+ - Each session has its own secret, and the owner approves who gets in.
538
+ - Sessions have size quotas and shared-file quotas, and each account can start
539
+ 30 sessions an hour.
540
+ - Idle sessions are unloaded from memory, and sessions nobody opens for 30
541
+ days are deleted.
542
+
543
+ ## What syncs (and what doesn't)
544
+
545
+ - Everything in the folder **except**: `.git/`, `node_modules/`, `.quilt/`,
546
+ `.env` / `.env.*` (secrets stay local), build caches (`.next/`, `.turbo/`,
547
+ `.nuxt/`, `.svelte-kit/`, `.parcel-cache/`, `.vercel/`), editor swap files,
548
+ anything in a `.gitignore`, and anything in a `.quiltignore`.
549
+ - **To keep something out of the session**, list it in a `.quiltignore`
550
+ (same syntax as `.gitignore`). Use it for files git tracks but you don't
551
+ want to share, e.g. `design/*.psd` or `private-notes.md`. Like `.gitignore`,
552
+ a `.quiltignore` or `.gitignore` in a subfolder applies to that subfolder.
553
+ - Text files up to 2 MB and binary files up to 8 MB.
554
+ - Symlinks are not synced.
555
+ - On first join, if a file differs between your folder and the session, the
556
+ session's version wins and yours is copied to `.quilt/conflicts/<time>/`.
557
+ Use `--prefer local` to push your versions instead.
558
+
559
+ **Git:** the working tree is shared, but `.git` isn't, and Quilt never commits,
560
+ pulls, pushes or opens a PR for you — that's still yours to run, on your own
561
+ machine. A `git stash`, `reset --hard` or `checkout -- .` reverts your files
562
+ as git does, and the session's work comes back onto them a moment later
563
+ (your stash keeps your copy); commits you pull are merged into the session's
564
+ work line by line. Checking out another branch pauses that folder until
565
+ you're back on the one the session syncs.
566
+
567
+ ## Security
568
+
569
+ - You sign in to heyquilt.com on each computer. The computer's token is kept in
570
+ `~/.quilt/account.json`, readable only by you. The relay never sees it: it
571
+ sees a pass that lasts 10 minutes and names your account and this computer's
572
+ key. Signing a computer out (in the app, with `quilt logout`, or on the
573
+ website) cuts it off within 10 minutes.
574
+ - Each room has a secret. It sits after the `#` in the invite link, so a
575
+ browser opening the link never sends it to the relay. The first client to
576
+ open a room sets it, and everyone else must match. Treat invite links like
577
+ passwords.
578
+ - Each person has a signing key in `~/.quilt/identity.json`, made on first use.
579
+ The first time a name joins a room, the relay ties that name to the key. After
580
+ that, only that key can use the name: the relay checks a signature on every
581
+ connect, and drops presence updates that use anyone else's name. Copy the file
582
+ to use your name from another computer. If you lose it, the relay's host can
583
+ free the name by removing it from `identities` in the room's `.json` file in
584
+ the relay's data folder.
585
+ - Paths from peers are validated. Nothing can be written outside the project
586
+ folder, into `.git/` (no sneaky hooks), or into files you ignore locally.
587
+ - Whoever runs the relay can read project contents.
588
+ - Remember that you're syncing code your partner's agent wrote, and your tools
589
+ may run it. Only pair with people you trust.
590
+
591
+ ## Development
592
+
593
+ ```bash
594
+ npm test # end-to-end tests: real relay, two clients, temp folders
595
+ ```
596
+
597
+ ### Releasing
598
+
599
+ Every release ships with notes, and the app tells people when it's out of date.
600
+
601
+ 1. Bump the version: `npm version patch --no-git-tag-version` (or `minor`).
602
+ 2. Add a `## <version> — <date>` section at the top of `RELEASES.md` saying what
603
+ changed, one bold-led bullet per change. `npm test` fails if the top section
604
+ doesn't match package.json, so a release can't go out without notes.
605
+ 3. Commit on `main`, then `npm run release`. It runs the tests, tags `v<version>` and
606
+ pushes. GitHub then builds every platform on its own machines
607
+ (`.github/workflows/release.yml`): the Mac DMGs, the Windows installer, the Linux
608
+ AppImages and the Linux command-line bundles with `install.sh`. It publishes the
609
+ release with the notes from `RELEASES.md` as its body, about 15 minutes later. So
610
+ any machine can release, a cloud one included. (`--dry-run` shows the steps first,
611
+ `--notes` prints the body, `--notes-only` fixes the notes of a published release,
612
+ and `--local` builds Mac and Windows on this Mac and publishes with `gh`, as before.)
613
+
614
+ The app checks GitHub's latest release every ten minutes. Older versions show a bar
615
+ across the top with an **Update Quilt** button (a Download link in a browser), and
616
+ **What's new** (also under Settings and in the app menu) opens the release notes. Each
617
+ newer release opens the notes by itself once, even while the app is open, and the notes
618
+ for a new version open the first time it runs. Update Quilt downloads the build for this
619
+ computer and installs it: on a Mac it mounts the DMG and swaps the app in place (asking
620
+ for an administrator only if the Applications folder needs one), on Windows it runs the
621
+ installer, and on Linux it swaps the AppImage file in place; then Quilt restarts. The builds are unsigned, so this is done by hand in
622
+ `desktop/updater.js` rather than with Electron's updater.
623
+
624
+ Layout: `src/ui/` + `src/ui-server.js` (the app), `src/runner.js` (start/stop a session), `src/server.js` (relay), `src/connection.js` (client protocol +
625
+ reconnect), `src/session.js` (folder ⇄ CRDT sync, presence, claims, chat),
626
+ `src/control.js` (local API for CLI/MCP), `src/mcp.js`, `src/setup.js`,
627
+ `bin/quilt.js` (CLI).
628
+
629
+ ## License
630
+
631
+ Quilt is proprietary, paid software. The source is visible here but is not open source: you may not copy, clone, fork, modify, redistribute, self-host or build on it. See [LICENSE](LICENSE).