Every change to spool, newest first, read from its CHANGELOG.md each time a release goes out.
89releasesin16weeks550changes·0.52.2on9Nov
Each mark is one release.
A frame that fails to compile or throws on boot now shows one small pin at its centre instead of a panel whose words reflowed and got cut off as you zoomed. The pin keeps its size on screen, says less as the frame gets smaller, down to a dot, and opens the full error with Ask agent to fix when you press it.
An exported HTML file now plays live when its frames use a package from the web, such as motion. Before, the page stopped at the frame's still picture because that package could not find React.
An exported HTML file now shows a frame the way the canvas does. A frame that scrolls inside itself scrolls under the mouse again, and a frame keeps its own light or dark look instead of turning light.
The export menu no longer lists frames that need the internet under the html choice. It showed for nearly every frame, and there was nothing to do about it from the menu.
The frame finder's search field no longer sits on top of the page path when you open it with ⌘K or /, and going to a page by its name on the path now closes the finder.
A reference now shows the site's own fonts where the site lets a late font be skipped (it came out in a fallback font before). Its videos play from the site instead of being copied into the project, and its note says how many, rather than counting them as files the site would not give.
A reference sent from the Chrome extension now does more of what the site did: videos that were playing keep playing, what the site's script changed as you hovered a part (a card lighting up, its video starting) happens again under the pointer, and clicking a link leaves the reference as it is instead of turning it white. A part picked from a page no longer comes out blank when the site hid it by what stood beside it, and what it drew behind itself stays in sight. A page with a large WebGL hero sends far less.
The dots on a tab for teammates in that project no longer pop open into name tags when you point at them. A teammate coming in now grows in as a dot with a soft ring, and one leaving shrinks away.
While your agent works, the canvas's top right names the frame it is writing, with an arrow that points the way to it.
Press it to follow along: the canvas goes to each frame as it is written, and a pan or Esc lets go. When the turn ends it says how many frames it made for ten minutes, and a press lists them so you can jump to each.
Send a piece of any website, or the whole page, to the canvas you have open, where it lands as a reference with the site's own styles, images and fonts.
Your agent reads it for ideas, and Open in spool takes you to it.
Drop a .fig on Home (Figma's File → Save local copy, on every plan) and it becomes a new project named after the file, with your agent already rebuilding its frames, prototype links as walks.
spool reads the file on your Mac with no Figma account or token: every page and frame, with its layout, text, colours, fonts, images and icons, lands in imports/ beside design/, and spool skill import tells any agent how to read it.
The frame finder has a door at the end of the page path: move toward the top of the canvas and a magnifier with ⌘K comes up beside the names.
It, ⌘K or / opens the finder right there, with a picture of every frame, the one you picked shown large, and a small map of its page. It also finds a frame by its page, and from three letters by the words on it.
Pages no longer stand on the canvas as pictures of the pages under them, and the shelf is gone.
A page that holds only pages, the root too when it has no frames, now shows them as a list: each row has the page's still, its name and what it holds, and a click or ⏎ goes in. The path at the top left shows where you are and, fainter, where ⌘↓ goes; it wakes as the pointer nears the top, and holding ⌘ shows the keys. ⌘↑ goes up with the page you left picked, ⌘↓ goes into the picked page, and ⌘[ and ⌘] go back and forward through the pages you visited when no frame is held. A places key left in canvas.json is ignored and kept as it is. Space over a page in the Pages tree, a list row or a path name peeks at its frames as stills without going in; ↑↓ walk to the next page and Esc closes it. A frame dragged onto a page there moves it, a frame held over one opens its peek to be let go at a spot, rows dragged between others in the tree make room under one insertion line, Esc puts a drag back, and every move says so with an Undo.
A frame can declare values with ui.knobs({...}), such as a radius, an easing, a colour or a spring, and they show in the properties rail under the frame's size. Drag one and the frame moves live; let go and the new value is written into the frame's file, one undo step. A knob in a shared file is one value for every frame that reads it, and Save as variant copies the frame beside itself as name--b. Agents learn it from spool skill knobs.
New project asks nothing. Home's button, ⌘N, the menu's New Project and New on a team's page each make the project at once, as the next untitled folder in your projects location (a team's under a folder named for the team), and open it with the Agent pane ready on the right. Your first message names the project, so a tide planner becomes tide-planner before the agent writes anything. Close an untitled project with no frames and it goes to the Trash, with Undo to bring it back. The New project dialog, with its name and location steps, is gone.
Open… takes a folder, a .spool file or a link, and does the one thing that fits. A folder that already has designs, or a folder inside one, opens at once. A folder without designs, a .spool file or a git link asks first in a small sheet: Design in this folder, Import, or Clone, which shows its progress and then opens the repo, or offers Design in this folder when it has no designs yet. A spool.page link to your team's project gets it onto this Mac and opens it. When nothing answers, spool says so and keeps what you gave it, so you can fix it and try again. You can also drop a folder or a .spool file on Home, or paste a path or a link there. In the Mac app, Open… is the system's own open panel, and a .spool file opened from Finder asks the same way before it imports. Import… is gone as its own button, since Open… does its job.
Also new
Export frames as HTML
Export a frame as one HTML file.
Export a frame as one HTML file.Right-click a frame and pick Export…: the menu turns into the export choice right where you clicked, with png, pdf and html, and Enter exports. An HTML file opens in any browser, offline and with nothing installed, as the bare frame with every frame its links reach, so you can walk the flow by clicking. Pick Only this frame to leave the rest out. The choice names any frame that needs the internet to work. With several frames selected you get one file each, as with PNG. The menu then shows the file being built and where it landed; in the Mac app the file goes straight to Downloads and Show in Finder reveals it. Exported files are now named after the project and the frame, like kaffe-checkout.png, and the menu remembers the format you used last.
A frame whose whole source is one line, export { default } from "../../app/checkout/frame", shows that frame at its own size, for a client's folder or another width.
A frame whose whole source is one line, export { default } from "../../app/checkout/frame", shows that frame at its own size, for a client's folder or another width.The Pages list marks it "mirror of app/checkout", and renaming or moving the original on the canvas re-aims every mirror of it, so none of them break.
A teammate now reads as active, unfocused, away or gone.
A teammate now reads as active, unfocused, away or gone.Active means their spool window has focus and they changed something in the last 2 minutes. Unfocused means spool is open behind another window, or 2 minutes went by without a change. Away means their canvas is hidden, or 5 minutes went by. After 30 minutes away they are gone. Someone with spool open in the background no longer shows as here for hours.Everyone on your page stays on your canvas. An unfocused pointer rests where they left it, faint. An away one folds into a small dot that says how long. A pointer off your screen shows as their face at the nearest edge, and pressing it follows them. The faces of who's here now sit right after the page path at the top left, and pressing them opens the list of who is on this page, who is elsewhere, who is away, and you. The same goes for the canvas on spool.page.
A folder you share now takes in the pages added under it later, so the client sees them once they settle.
A folder you share now takes in the pages added under it later, so the client sees them once they settle.The person you share with opens straight on what you shared: one folder is their top, called by its name, and several items sit side by side by their own names, with the parent's name in grey when two share a name. They never see the project's name, the folders above what you shared, or full paths in the player's bar.
On spool.page, a canvas's path now starts with where it lives: your team's name takes you back to its projects, and a client's shared takes them to Shared with you.
On spool.page, a canvas's path now starts with where it lives: your team's name takes you back to its projects, and a client's shared takes them to Shared with you.⌘↑ climbs one step at a time, and going between Home and a canvas is instant, with no page load. Shared with you is a new place in Home that lists every canvas shared with you from outside your teams, grouped by who shared it, with a dot on what changed since you last looked. Signing in with no team lands there. Home's teams now sit in one box that opens a menu of your teams, on the Mac too.
Added Settings › Experimental: one switch per feature still being tried, each with what it does and its trade-off, and a search over them.
Added Settings › Experimental: one switch per feature still being tried, each with what it does and its trade-off, and a search over them.Fast refresh, Frame resolution and Element tree are off until you turn them on; Knobs is in beta and on, with a switch to turn it off. A change shows after a reload, which the section offers. spool experiments lists them and spool experiments on <id> or off <id> switches one. The switches live under experimental in ~/.spool/config.json; an experiments list written by hand before still turns its features on.
Added Record, an experiment you turn on in Settings › Experimental.
Added Record, an experiment you turn on in Settings › Experimental.Right-click a frame and pick Record, or press the dot in the player's bar, and pick 16:9, 1:1 or the frame's own shape: the frame plays at that shape while you record, so what you see is what the clip holds. Press the time or Escape to stop, and an MP4 downloads once it has rendered, ready to post. The clip is rendered at 60 fps, so it plays smoothly whatever your machine was doing, with the frame's own sound and a Mac cursor that glides and hides when the pointer rests. It follows you when you walk to another frame, and recording stops by itself at a minute. spool record <frame> makes a clip of a frame that plays by itself, with --seconds, --aspect and --out.
Team projects can be renamed now, from the tab or from Rename on their card, by the team's editors and admins.
Team projects can be renamed now, from the tab or from Rename on their card, by the team's editors and admins.The team renames it for everyone, and teammates' copies follow by themselves. New project in a team opens with its name ready to type, as it does on your own Mac. An admin can delete a team project from its card with Delete from the team. It waits in the team's trash for 30 days. On a team project, Move to Trash is now Remove from this Mac, which says the team keeps it. An untitled team project you close without using is deleted by itself, as your own untitled projects are.
A frame that fails to compile or throws as it starts now says so on the canvas.
A frame that fails to compile or throws as it starts now says so on the canvas.Its last good picture stays, dimmed, with a red edge and a red name. Near enough to read, it shows the error and an Ask agent to fix button, which hands the error to a new thread in the Agent pane, or copies the prompt when no agent is set up. The Pages list marks the frame with a red dot, and a shut folder holding one gets the dot too. It all clears as soon as the frame works again.
spool check with no arguments now checks the whole canvas, however large.
spool check with no arguments now checks the whole canvas, however large.A canvas whose frames import more than one check can hold is checked in batches, with one combined answer. Only a frame that imports too much on its own is left out, and it is named. The check also names every frame the canvas shows as broken, with the first line of why, including frames that throw as they start, which a typecheck can't see.
Imported images now load by URL instead of riding inside the frame's document, so the 512 KB image budget is gone.
Imported images now load by URL instead of riding inside the frame's document, so the 512 KB image budget is gone.A frame can import photos up to 25 MB, and spool shot warns when one is bigger than a frame should load. Imported images still draw into a canvas or WebGL, and still show up in exports and covers.
A deleted team in the team menu shows its name again, marked Deleted, instead of a long note that hid the name and ran past the menu's edge. The day it goes for good is on hover and on its page.
When the Mac app cannot check for updates, it now says why in one plain line, such as the update server not answering, instead of showing the raw request with its headers and stack.
The Mac app now updates from updates.spool.page instead of GitHub, so an outage on GitHub's release pages no longer stops updates or downloads. The download links point there too.
Frame covers on Linux and Windows are drawn on the machine's GPU instead of the CPU, so they come faster, cost the machine far less, and show WebGL and blurred backdrops as a browser window does. Where no GPU can draw, spool check no longer calls a frame slow from a timing taken in software. Set SPOOL_BOOTH_GPU=0 to keep covers on the CPU.
Designers the agent brings in work at medium effort unless it asks for more on a hard direction, instead of copying the thread's effort, so a thread set to xhigh or max no longer runs every designer that high and burns through your usage. They still run on the thread's own model.
Export project… no longer opens a dialog and a toast. From a tab's menu or a cover's menu on Home, the menu itself shows the .spool file being built, then where it landed, the same way a frame's export does. In the Mac app the file goes to Downloads and Show in Finder reveals it. If the export fails, the menu says why and Try again builds it again.
spool skill is half the size where it counts: the overview every agent reads at the start of a turn now holds what each turn needs, and the rest moved into topics. Setting up, worktree lanes, the daemon and moving a project are under spool skill projects, and the browser driver is under spool skill verbs. A topic about an experiment that is off on your machine, such as knobs, drops out of the index.
A page of pages scrolls with the wheel or trackpad when its list runs past the window, its rows fading out under the path. A peek opened with Space moves to the folder the pointer rests on, and keeps beside its row as the list scrolls.
A page of pages on spool.page, the project's top level too, now lists its pages as the Mac does, each with its still, its name and what it holds, instead of saying there is nothing on it. A click goes in.
Recording at the frame's own shape plays the frame at its size on the canvas, so the clip looks like the canvas. It used to stretch the frame to the window's height.
Clips are sharper. A clip used to top out at 1080p, softer than the frame looked on a Mac's screen. It now grows, up to 4K, until the frame is drawn as sharp as the screen showed it.
Record works on a Mac. Every recording there failed, and took spool down with it, because the browser that renders the clip can't be told when to draw on macOS. On a Mac it now takes a picture of each frame instead, so clips come out just as smooth. A second recording in a row no longer fails to read the frame's clock, and a failed recording no longer stops spool.
After an update, Home and the Cloud Account menu no longer show you signed out until you reload. When spool.page doesn't answer right after Spool starts, Spool asks again by itself and shows your account once it does.
A daemon too busy to answer in time no longer loses its saved credential. Before, a slow daemon looked dead to the CLI, which deleted its record and left every command refusing until the process was killed by hand.
In a team project, spool check now fails on every file in design/ that stays on your Mac, such as a screenshot left at its top, and says how to fix each one, so an agent cleans them up. Closing the "files didn't travel" notice on the canvas now keeps it closed after a reload, until another file stays behind, and the notice no longer offers Match the team, which never changed those files.
New project in a team opens in about a third of a second instead of two or more. Spool now picks a free name in one try and lets the project upload in the background. A name held by a project in the team's trash no longer stops New project; it moves on to the next free name.
A new project's tab opens with its name ready to type, so you can name it straight away or leave it untitled for the agent to name. Any project on this Mac can be renamed from its tab: double-click the name, or choose Rename… from the tab's menu, and its folder is renamed with it. Open…'s dialog now sits in the middle of the window like the others instead of hanging from the top. A chat opens on the model it last reported instead of "Loading…", and opening the model menu while it loads no longer starts the wait over.
A frame on screen no longer blinks when it reloads. Whether an agent wrote to it, a shared file it uses changed, a teammate's save arrived, you chose Reload (from the menu or with R), or the canvas reconnected, the frame keeps showing what it last drew until the new version is ready. Your own edits already worked this way. If the new version fails to build, the error shows right away.
Entering or selecting a frame on a page with hundreds of frames hitches less: frame names far off screen and pages-list rows scrolled out of view no longer get laid out again every time the camera stops or the selection changes.
Tabs move more smoothly in a full strip. Opening, closing and switching tabs now glide the whole way instead of jumping at the start, and letting go of the strip after closing tabs no longer snaps them wider. Closing the focused tab with the pointer now puts the next tab's close button under it, so you can close several tabs in a row by clicking in one place, as in a browser.
Escape closes the agent rail's chat list even when pressed the moment it opens. Before, on a busy machine, the press could go unheard and leave the list open.
A change of yours that lost a clash in a team project is set aside once and no longer goes up again a moment later. On a busy machine it could be set aside twice, or replace your teammate's version on the team and drop the clash notice.
A comment placed on a frame keeps the element under its pin when the frame is slow to answer, as it can be on a busy machine. Before, it could go without one.
A quick tap of C keeps the Comment tool on a team canvas even when the canvas is slow to answer it. Before, a busy page could read the tap as a hold and hand the pointer straight back.
Exporting a frame with a lot of text no longer freezes that frame for a moment on a busy machine. The text is now read in short steps while the export runs.
Opening a team project from its link at spool.page now leaves its own address in the bar. It could show the team's Home address instead, so a reload went back to Home.
A team started after your free trial is used now says how long it's held for you to pay: an hour, after which spool.page removes it and its name is free again. Billing for a team that stopped paying says the day its cloud copy is deleted.
A sign-in from the app that does not finish now says why under Sign in, and writes what failed to daemon.log, instead of quietly going back to Sign in.
A closed tab now leaves the strip only once it has shrunk away. Before, on a busy machine, it could vanish while still part wide, and the tabs after it jumped.
A tab opened in a full tab strip on a busy Mac could stop scrolling a couple of pixels short, leaving its edge cut off. The strip now scrolls until the new tab is wholly in view.
On a busy computer, a quick press of C in a shared canvas at spool.page could count as holding it, and the Comment tool went away when the key came up. A tap now always keeps the Comment tool.
The History pane on a team project lists versions.
Current version is the top row, and each row below is the moment someone's saves ended. Pick a row and the canvas shows the page as it stood then: what that version changed is marked and ringed, the rest steps back, and a frame it deleted stands dashed where it was, with Bring back. ↑ ↓ step through versions and Esc goes back to now. Restore this version… lists each frame that differs from now, all ticked, so restoring part of it is unticking; a shared file that changed since is offered, off. It reads Same as now when nothing differs, so a restore always changes something. A version with a save the team set aside says whose save arrived first under its bar, with Put back. This replaces Compare with now, the Restore… menu, and Restore on a file's line.
You can share a whole team project, not just chosen pages: pick Whole project in the share popover and everyone you share with sees every page, including pages added later.
Added a History pane to team projects' canvases, beside Properties, Agent and Comments, opened and closed with ⇧⌘H.
Right-click a frame and pick History… for that frame's saves, including those that reached it through the shared files it imports; pick History… on a project's tab for the whole project's. Saves are grouped by day and by stretch of one person's work, spaced by the quiet between them, and can be narrowed to one person. Picking a stretch shows the files it touched and whose save stood over any that were set aside. A project moved in from git ends its history with when, by whom and in which commit it moved.
Press C for the Comment tool, or hold C to borrow it, and click a frame or the empty field to put a pin there. Type and press Enter, and everyone on the team sees it on their canvas right away. Click any pin to read the comment and its replies and to reply. Pins show the author's initial in their colour. The canvas keeps the last comments it heard so they still show offline, but a new comment waits until the project is connected again.
Also new
Spool Cloud is for business use
Spool Cloud is sold for business use only.
Spool Cloud is sold for business use only.The New team dialog and Billing's payment choice ask you to tick "I'm buying for my business or work" before a team starts or Checkout opens, and spool.page needs that tick.
The account page at spool.page ends with Delete account, which says what happens to your teams and Macs and asks you to type your email before it deletes anything.
The account page at spool.page ends with Delete account, which says what happens to your teams and Macs and asks you to type your email before it deletes anything.
Get it now works in a checkout whose design/ spool never synced.
Get it now works in a checkout whose design/ spool never synced.Files older than the team's take the team's version, a frame the team deleted stays deleted, your new files go up, and only a file you changed where the team has its own version is set aside on the canvas for you to look at. The sheet says how many files go up and how many are set aside before you press Get it.
Get it now finds your clone of a team project's repo in your usual code folders (~/code, ~/dev, ~/Developer, ~/Projects, ~/src, ~/repos, ~/GitHub) even if spool never opened it, and remembers a folder you pick with "In a checkout…".
Get it now finds your clone of a team project's repo in your usual code folders (~/code, ~/dev, ~/Developer, ~/Projects, ~/src, ~/repos, ~/GitHub) even if spool never opened it, and remembers a folder you pick with "In a checkout…".Each place in the sheet says what spool found there before anything happens. A design/ that is already the team's is taken as it is, another project's design/ is dimmed, and on a branch from before the move the sheet names the move commit and the command that brings it in, then carries on by itself once you run it.
Home lists every team you're in down its sidebar, in name order, with no menu to open: the team you're in slides open to show Projects, People and Settings, and its page is titled with its name.
Home lists every team you're in down its sidebar, in name order, with no menu to open: the team you're in slides open to show Projects, People and Settings, and its page is titled with its name.Your projects sits below a rule, with Open… beside New project. On the Mac each place has its own address (/recent, /<team>, /<team>/people, /<team>/settings/billing), so a reload keeps you there, back and forward move between places, and the next launch opens where you last were. The list of the app's own path segments ships as APP_PATH_SEGMENTS from spool.page/sync-protocol.
A team you only watch is a place on Home in the Mac app too, marked with an eye (and at spool.page): it shows its projects as the covers spool.page draws, each opening live in your browser, and its people, with no New project or Settings, and choosing it no longer opens a browser tab.
A team you only watch is a place on Home in the Mac app too, marked with an eye (and at spool.page): it shows its projects as the covers spool.page draws, each opening live in your browser, and its people, with no New project or Settings, and choosing it no longer opens a browser tab.Below 720 px Home's sidebar is a column of marks with nothing hidden: the team you're in shows its pages as icons under its mark, every icon says its name when you point at it, and the search is an icon that opens the field over the page.
When you pull a commit that moved a project's design/ into a Spool Cloud team you aren't an editor of, its cover on Home now says where design/ went and who moved it, instead of going empty.
When you pull a commit that moved a project's design/ into a Spool Cloud team you aren't an editor of, its cover on Home now says where design/ went and who moved it, instead of going empty.Opening it shows who moved it in which commit and what you can do: ask them to invite you, open it in the browser as a viewer, or sign in. Frames you never committed are listed and go up by themselves once you're made an editor. Remove from Home hides the project. The same sheet appears over the project's canvas if it was open when the pull landed.
A team project's copy that stopped syncing, because the project was removed, you were removed or made a viewer, or the team went local, can now go back into git in one step.
A team project's copy that stopped syncing, because the project was removed, you were removed or made a viewer, or the team went local, can now go back into git in one step.Choose Put design/ back in git on the copy's notice or its cover menu. It makes one commit on your current branch that adds design/ and takes spool.json out, and never pushes. A copy whose team went local stops following the team for good.
Moving a project out of its team no longer deletes it there.
Moving a project out of its team no longer deletes it there.The team keeps it in its trash for 30 days with its files, comments and shares, and its shares pause. Admins see it under Removed on the team's Projects page, where they can restore it or delete it now. Teammates' copies say who removed the project, and Get it picks a restored project up again.
A share can end on its own.Pick Ends in the share popover, in 30 days or in 7 days, and the share stops on that date. Every share with an end says "ends" and the date in its row.
Share a solo project whole from the share popover, like a team project.
Share a solo project whole from the share popover, like a team project.Spool uploads every page, keeps pages you add later in the share, and says so when the project is too large to share.
The bar above a played frame is slimmer and always there.
The bar above a played frame is slimmer and always there.It shows the frame's name, copy link and close, and the window's size only while you resize it. The eye that hid the bar and the frame switcher are gone, so walk to another frame through the prototype or go back to the canvas.
A team project's local copy now checks itself against the team's copy each time it connects, and quietly puts right any file that went missing on the way.
A team project's local copy now checks itself against the team's copy each time it connects, and quietly puts right any file that went missing on the way.A copy whose sync record was lost takes the team's version and keeps each of your differences as a set-aside mark, so Put mine back brings any of it back.
Admins can export a team from the Mac app: Export all in a team's Settings, or Export… on a team project's cover, writes each project into a folder you pick as a git repository with the team's history as commits, authored by whoever saved them, beside a team.json of the team's people and shares.
Admins can export a team from the Mac app: Export all in a team's Settings, or Export… on a team project's cover, writes each project into a folder you pick as a git repository with the team's history as commits, authored by whoever saved them, beside a team.json of the team's people and shares.On spool.page, Export opens the Mac app on the export, or offers the download. A deleted team stays in its admins' switcher until it is gone for good, with Export all on its page.
Compare a frame with how it stood in a team project's history.
Compare a frame with how it stood in a team project's history.Open a stretch in the History pane and press Compare with now: the frame as it was at the end of that stretch stands where it was, labelled with its time, and today's slides aside, labelled now. It shows the frame's own files and the shared files they imported back then. A frame deleted since comes back dashed in its old place. A save that was set aside compares from under it with its own file. Hovering a stretch outlines the frames it touched in that person's colour. What is read is kept in a bounded cache on this Mac, never in design/.
Added Restore to the History pane of team projects.
Added Restore to the History pane of team projects.Under an open stretch, Restore… puts a frame, a page or the whole project back to how it stood when that stretch ended, each choice showing how many files go back; a file restores from its line, and a save the team set aside is put back from under it. One question asks first, offering any shared file the frame imports that changed since, unticked, and naming the other frames that use it. A restore reaches the team as new saves, so nothing is lost: the toast that confirms it has Undo (and ⌘Z while it stands), and the restore's own row in the history has Undo this restore.
Added spool history <path> for team projects.It lists every save to a file for the 90 days spool.page keeps them, with who saved it, from which Mac, when, and which were set aside. With --at <time> it prints the file as it stood then. It only reads.
A team project's canvas now says "Offline.Your changes go up when you're back." after 30 seconds without spool.page, and the line goes as soon as it is back. Match the team, in the project tab's menu and beside the sync notices, makes your local copy the team's and keeps each of your differences as a set-aside mark. Files that didn't travel stay as they are.
A team project's local copy on a Spool too old for its team now pauses instead of retrying in silence: the Sync box says "Update Spool to keep syncing with <team>", with the Mac app's update or the npm command, your files stay editable, and what you change goes up once Spool is updated.
A team project's local copy on a Spool too old for its team now pauses instead of retrying in silence: the Sync box says "Update Spool to keep syncing with <team>", with the Mac app's update or the npm command, your files stay editable, and what you change goes up once Spool is updated.The next spool command in that project says the same. Spool now accepts teammates one sync protocol behind, and a team project's local copy moves to a newer design/ format only after it has caught up with the team, sending the result to teammates as ordinary saves.
The player in a browser has a copy link button that copies the link to the screen on show, ready to send.
The player in a browser has a copy link button that copies the link to the screen on show, ready to send.Its bar now says esc exits, where it said a shortcut that closes the whole tab.
A people share emails the people it names a link to open it.
A people share emails the people it names a link to open it.The first click signs them in, with no code to type, and it works once, for a week. Untick "Email them a link to it" to tell them yourself. Someone you add to a share later gets the email too.
A new share opens on the frame you have selected.Its link plays that frame straight away, for whoever opens it, and a people share keeps it through signing in. Untick "Start on" to open on the canvas instead.
People in a team show by their name instead of their email: on People, in the note that someone's save didn't apply, on shares, when setting up a team project and when moving one to another team.
People in a team show by their name instead of their email: on People, in the note that someone's save didn't apply, on shares, when setting up a team project and when moving one to another team.Someone who hasn't given a name shows as the part of their address before the @, the same everywhere. You can set or change your own name on the Account page, and everyone sees the new one at once. Your email still shows on People, on your Account page and in your sidebar menu.
Agents can read and answer a team project's comments.
Agents can read and answer a team project's comments.spool comments lists the open comments, filtered by page, frame or share, and spool comments show prints one with its replies. Each comes as one block saying who wrote it, where it points in the source, and whether the frame changed since. It works offline from the last comments spool heard and says how old they are. Your agent can also reply, resolve, reopen and add comments, which go out as yours and show as "Ana's agent". On a comment's card, Send to agent puts the comment in the agent box. Nothing runs until you send, and Enter alone means deal with it. If the frame changed since, the agent also gets the picture of the frame from when the comment was made.
Members of a team can now comment on its projects in the browser at spool.page.
Members of a team can now comment on its projects in the browser at spool.page.Press C or pick the Comment tool, click a frame or the canvas, and write; hold C to place one pin and go back to the Pointer. The pointer becomes a pin, and the element under it is outlined as on the Mac. The pins, cards, replies, @mentions and the ⋯ menu work as they do on the Mac, and new comments from teammates show up live. A card says when its frame was edited since, and Compare shows the frame as it was then beside how it is now. A Comments button beside Shared counts the whole project's open comments and opens the list in a panel on the right; clicking a comment flies to its pin, on its own page. A Copy link opens spool.page right on that comment. Once a team has gone local, the browser drops its Comment tool and its cards drop their reply field.
A team project now sends changes made together as one bundle instead of one file at a time.
A team project now sends changes made together as one bundle instead of one file at a time.A cleanup that deletes thousands of files reaches your team in seconds instead of half an hour, and your teammates see it land all at once. A bundle counts as one save toward the team's per-minute and monthly limits. This needs the spool.page that takes bundles; against an older one, spool sends one file at a time as before.
The Account page has a Comment emails setting, For you or Off.
The Account page has a Comment emails setting, For you or Off.On For you, spool.page emails you a few minutes after a comment is meant for you, unless you read it first, with everything still unread in one email per project. Every email has a link to turn them off.
Comments on team projects can now be resolved, reopened, edited and deleted.
Comments on team projects can now be resolved, reopened, edited and deleted.Each message has a ⋯ menu with Edit, Copy link, Mark as unread and Delete. Type @ to mention a teammate. A new Comments tab beside Properties and Agent lists every comment on the page or the whole project, filtered to unread or to the ones for you, and clicking one flies to its pin. ⌘⇧U opens it. What you have read follows you to your other Macs. Pins that crowd together merge into a count you can click open, and Shift+C hides or shows every pin. A page on the canvas shows how many comments are open inside it.
Comments follow their frames.Renaming or moving a frame or a page keeps its comments on it. If a frame's source is edited after a comment was made, the comment's card and its row in the Comments tab say so (a rename, a move or a spool update doesn't count), and Compare shows the frame as it was then beside how it is now. Deleting a frame leaves its comments where their pins stood, with dashed pins and a note in the card; bringing the frame back puts them back on it. When a team goes local, its comments can still be read but not written: cards drop their reply field, resolve and edit.
Comments reach the people you share with.A new comment is for your team by default; pick one of the page's shares in the composer and the people on that share read it and its replies too. Members still see every comment. A share's comment is marked with who reads it, says who outside the team reads a reply, and says "share ended" once the share stops. On a share, people sign in to read and write that share's comments: anyone holding a link signs in with Google or an email code on the link itself, with no pins until they do, and signs out again from the foot of the pages list. Their pins are hollow, their composer just says who reads it, and they never see your element's code or mention anyone. Your agent's reply to a share's comment waits as a draft only you see, for you to send or edit. Share settings list who has commented through a share, and admins and editors can block someone there, which removes what they wrote. "For you" now includes outside comments on shares you made.
Breaking: team projects sync with spool.page in a new way that carries their comments.
Breaking: team projects sync with spool.page in a new way that carries their comments.Older versions of spool can no longer sync with spool.page and need to update.
0.47.0 was tagged but never published, so this is the first release with its changes: versions in the History pane, commenting on a whole frame, and the fixes listed under 0.47.0.
Selecting several frames no longer makes them all live at once, which made large selections lag. A single selected frame still stays live at every zoom.
spool check reads React's style types again when spool is installed with pnpm, so a frame that reads a style object's fields, like style.transform, no longer fails the check.
The Comment tool can comment on a whole frame. Point at a frame's name and its whole frame is outlined; click to pin the comment there. Over a frame, ↑ moves the outline out to the element around the one under the pointer, as far as the whole frame, and ↓ moves it back in, so a click pins the level you chose rather than always the deepest element.
When a newer Spool comes out while the Mac app already has an update waiting, the app now downloads the newer one in its place. Restarting lands you on the newest version in one go, instead of updating once and then again.
A team admin can now take a project out of the team from its "…" menu on Home even when it isn't on their Mac. It goes to the team's trash, where an admin can restore it for 30 days, and it shows under Removed right away.
When spool.page restores a team project from a backup, each Mac's copy settles with it on reconnect: work saved since the backup goes back up, and everything else takes the restored version.
A team project's frames now get their pictures on spool.page. A Mac on another version of spool than spool.page had every picture it sent turned away, and pictures taken before a project joined its team never went up at all. Now each frame's picture is named by its files alone, so any version can send it, and when spool starts watching a team project it asks spool.page which pictures it has and sends the ones it is missing, or takes the ones nobody has taken yet. A shared page of a project of your own sends the pictures this Mac already has too, rather than waiting for the next change.
The team canvas in the browser stays smooth on big projects. Frames are drawn from their covers on the GPU, as on the Mac, and a frame's live screen is only loaded once it is large enough to read near where you're looking, a couple at a time, showing its cover or its name until it has arrived. Moving the canvas pauses the live screens. A frame a teammate saved shows live until its new cover lands. It works on a share's own address too, and in a browser that can't draw on the GPU.
Opening a comment from the Comments panel while the canvas flew to it could slide the whole canvas sideways in the browser, leaving the toolbar and frames cut off until the page was reloaded. The canvas now stays where it is, and the card's reply box takes the keys without moving anything.
A theme that draws grain or texture with an SVG data URI keeps its filters now. Spool used to rewrite the url(#…) inside the data URI as a file path, which broke the filter.
The canvas in a browser is lighter and clearer. A page opens fitted between the buttons at the top and the tools at the bottom, so neither covers a frame. A frame too small to read shows its picture instead of loading, as on the Mac. Pointing at a frame lights its name and offers play beside it, and the play button in the pages list no longer sits on a long name.
The agent pane no longer freezes in long chats: a save writes only what changed since the last one, not the whole conversation and every screenshot in it. A turn's line now says what is true. It reads Stopped when the turn was cut off, Waiting on you while a designer's question is open, and Stopping after Stop is pressed. A retry gets its own steps instead of sharing the failed turn's. A stop the agent never answers ends the turn after ten seconds. A turn that ends with the pane closed keeps its receipt and frames.
Presence stays light in a crowded team project. Pointers now go only to people on the same page, a tick at a time, and at most 50 are shown on a page, editors first. Someone you follow is always shown. Past the 50, your canvas says your pointer is hidden and stops sending it until a place frees up; your page still shows. Older and newer Spools and spool.page keep working together.
Holding ⌥ no longer zooms out. The overview opens where the camera already stands, and the arrows move its target at that zoom, panning only when the frame you move to is off screen. The keys on the neighbours, and the tags at the edge for ones off screen, still show which arrow goes where.
Pointing at a frame shows play beside its name, so playing it is one click, and a live frame keeps its play button beside the live chip. Play no longer sits at the far end of the label, where teammates inside the frame docked over it. Panels that scroll up and down never scroll sideways: an agent turn's open steps lost the bar that stood under them.
The canvas stays smooth while an agent works. Only the chat redraws as a turn streams in, where the whole canvas used to redraw ten times a second, and an agent writing a big file no longer slows the whole window down.
When a team project has a lot of changes waiting to send, like after a big cleanup, the "Sending changes" notice on the canvas stays still and counts down in place. It no longer flashes on and off several times a second. Closing it now keeps it closed until that batch has gone.
The canvas reads a team project's sync state again when its connection to spool comes back, such as after your Mac wakes, so a "Sending changes" notice no longer stays up after the sending finished.
Your agent now hears when a file in a team project didn't reach the team.
The next spool command it runs there, shot, logs, check and the rest, names each file that stayed on your Mac and why, such as a video over 25 MB. spool skill names the 25 MB limit and how to shrink video and images before they go in design/.
The next spool command it runs there, shot, logs, check and the rest, names each file that stayed on your Mac and why, such as a video over 25 MB. spool skill names the 25 MB limit and how to shrink video and images before they go in design/.
Sharing now lives in a Share button at the top right, next to help and settings.
It shares the page you're on with a link by default, lets you pick more pages from a searchable list that stays one size however big the project is, and shows a QR code of the link so you can open the prototype on your phone straight away. The project's shares are listed in the same place, so the Shared button no longer comes and goes beside your tabs. Right-clicking a page and choosing Share… opens it on that page.
It shares the page you're on with a link by default, lets you pick more pages from a searchable list that stays one size however big the project is, and shows a QR code of the link so you can open the prototype on your phone straight away. The project's shares are listed in the same place, so the Shared button no longer comes and goes beside your tabs. Right-clicking a page and choosing Share… opens it on that page.
When you and a teammate change the same file in a team project at once, Spool now merges the two line by line, the way git does, so both changes stand and nobody is asked anything.
Only when you both changed the same lines are you told, in one notice at the foot of the canvas instead of a mark on every frame: Use theirs, Use mine, or Ask agent to fix, which opens a new agent thread with every clashed file (or copies the prompt when there's no agent on this Mac). Sync messages such as "Sync paused" moved to the same place and can be closed.
Only when you both changed the same lines are you told, in one notice at the foot of the canvas instead of a mark on every frame: Use theirs, Use mine, or Ask agent to fix, which opens a new agent thread with every clashed file (or copies the prompt when there's no agent on this Mac). Sync messages such as "Sync paused" moved to the same place and can be closed.
Stepping between frames with ⌥ and the arrow keys is more reliable.
The opposite arrow takes you back to the frame you came from, the keys reach the nearest frame even when it sits far away, and the view keeps its zoom and only moves when the next frame is off screen.
The opposite arrow takes you back to the frame you came from, the keys reach the nearest frame even when it sits far away, and the view keeps its zoom and only moves when the next frame is off screen.
Home has one search for all your projects once you are in a team.
It sits at the top of the sidebar and finds projects in your own list and in every team, including team projects that aren't on this Mac yet. Tabs narrow the results to one place. Under it, Recent lists every project you opened, whichever team it is in, and Home opens there. A team's Projects page now shows how many projects the team has and sorts them like your own. On spool.page, the same search finds projects in every team you're in.
It sits at the top of the sidebar and finds projects in your own list and in every team, including team projects that aren't on this Mac yet. Tabs narrow the results to one place. Under it, Recent lists every project you opened, whichever team it is in, and Home opens there. A team's Projects page now shows how many projects the team has and sorts them like your own. On spool.page, the same search finds projects in every team you're in.
The keys that still work inside an entered frame, the player's leave key and the Mac app's menu keys all read from it, so they can no longer disagree with the shortcut sheet. Bracket keys are matched by where they sit on the keyboard, and the sheet shows them as your layout prints them.
The keys that still work inside an entered frame, the player's leave key and the Mac app's menu keys all read from it, so they can no longer disagree with the shortcut sheet. Bracket keys are matched by where they sit on the keyboard, and the sheet shows them as your layout prints them.
Inside a live frame, ⌥ arrows (or ⌥ H J K L) open an overview of the frames around it, and letting go of ⌥ enters the one you picked; holding ⌥ alone shows the same overview. ⌘⌥ arrows step straight to the neighbour, even from a text field. ⌘] and ⌘[ walk along the threads and back, with ] again choosing the next branch at a fork, and one click on another frame enters it. A frame that handles ⌥ itself keeps the key by calling preventDefault, and spool check notes frames that read it.
Inside a live frame, ⌥ arrows (or ⌥ H J K L) open an overview of the frames around it, and letting go of ⌥ enters the one you picked; holding ⌥ alone shows the same overview. ⌘⌥ arrows step straight to the neighbour, even from a text field. ⌘] and ⌘[ walk along the threads and back, with ] again choosing the next branch at a fork, and one click on another frame enters it. A frame that handles ⌥ itself keeps the key by calling preventDefault, and spool check notes frames that read it.
Select a page on the canvas and press Return or ⌘↓ to go inside it. Press Esc with nothing selected, or ⌘↑, to go back up to the page holding it, with the page you left selected.
Select a page on the canvas and press Return or ⌘↓ to go inside it. Press Esc with nothing selected, or ⌘↑, to go back up to the page holding it, with the page you left selected.
⌘W closes whatever is open on top, then the tab, and on Home the window. ⌘⇧W always closes the window, and ⌘⇧T brings back the tabs you closed, each in its old place and on the page and view you left. ⌘1 is Home, ⌘2 to ⌘8 the tabs after it and ⌘9 the last one. Ctrl+Tab and ⌘⇧] go to the next tab, Ctrl+⇧Tab and ⌘⇧[ to the one before, and ⌘T goes to Home. They work inside an entered frame too, and the File menu and a new Tab menu show them. In a browser tab the browser keeps these keys for its own tabs.
⌘W closes whatever is open on top, then the tab, and on Home the window. ⌘⇧W always closes the window, and ⌘⇧T brings back the tabs you closed, each in its old place and on the page and view you left. ⌘1 is Home, ⌘2 to ⌘8 the tabs after it and ⌘9 the last one. Ctrl+Tab and ⌘⇧] go to the next tab, Ctrl+⇧Tab and ⌘⇧[ to the one before, and ⌘T goes to Home. They work inside an entered frame too, and the File menu and a new Tab menu show them. In a browser tab the browser keeps these keys for its own tabs.
A frame can now import a theme of its own, so two looks can live side by side in one project.
A theme is a stylesheet that imports tailwindcss. A frame that imports one compiles against it instead of shared/tokens.css, and gets the theme's fonts instead of shared/fonts.css, on the canvas and in the player. Frames without a theme work exactly as before. See spool skill styling.
A theme is a stylesheet that imports tailwindcss. A frame that imports one compiles against it instead of shared/tokens.css, and gets the theme's fonts instead of shared/fonts.css, on the canvas and in the player. Frames without a theme work exactly as before. See spool skill styling.
spool is now under the Functional Source License (FSL-1.1-MIT) instead of MIT.
You can still use it for your own work, at a company too, and read, change and share the code. The one new limit is selling a product that competes with spool. Each release becomes MIT two years after it comes out, and versions up to 0.40.0 stay MIT.
You can still use it for your own work, at a company too, and read, change and share the code. The one new limit is selling a product that competes with spool. Each release becomes MIT two years after it comes out, and versions up to 0.40.0 stay MIT.
spool cloud publish, stop, list, status, invite and revoke are removed, and so are spool build, spool check --entry and spool flows --entry. Frames no longer have share links on the canvas or in the player. To share, right-click a page in the Pages panel and choose Share…. No page is refused for navigation spool can't read. An exported links object is no longer required for anything. Spool still updates the frame names in it when frames move.
spool cloud publish, stop, list, status, invite and revoke are removed, and so are spool build, spool check --entry and spool flows --entry. Frames no longer have share links on the canvas or in the player. To share, right-click a page in the Pages panel and choose Share…. No page is refused for navigation spool can't read. An exported links object is no longer required for anything. Spool still updates the frame names in it when frames move.
Who's here on a team canvas now sits at the canvas's top right instead of in the tab bar, so switching tabs no longer shifts the tabs.
Press the faces to open the list of who's here, where each person is and how long they've been idle, then press a row to follow them. A team project's tab shows a dot for each person in it while you're on another tab, up to three.
Press the faces to open the list of who's here, where each person is and how long they've been idle, then press a row to follow them. A team project's tab shows a dot for each person in it while you're on another tab, up to three.
Move a team project to another team (the same project, its history, shares and old address kept), out of its team (design/ committed back into git), or from no repo into a checkout: from a cover's menu on Home, from a dimmed cover for a project not on this Mac, or with spool move, which says what the move does and asks first.
Teammates' copies follow the move and keep syncing until they pull, and whenever spool puts spool.json in a repo it also adds "design/ is a spool canvas: run spool skill before working there." to the checkout's AGENTS.md, else CLAUDE.md, else a new AGENTS.md.
Teammates' copies follow the move and keep syncing until they pull, and whenever spool puts spool.json in a repo it also adds "design/ is a spool canvas: run spool skill before working there." to the checkout's AGENTS.md, else CLAUDE.md, else a new AGENTS.md.
Your account at spool.page/account now opens inside Home, beside your team, from your email at the foot of the sidebar.
It lists your Macs and passkeys the way Settings lists things, and you can revoke a Mac, add or remove a passkey and sign out there. Someone in no team yet lands there too, with a way to start one. On a Mac, the menu item is now called Account.
It lists your Macs and passkeys the way Settings lists things, and you can revoke a Mac, add or remove a passkey and sign out there. Someone in no team yet lands there too, with a way to start one. On a Mac, the menu item is now called Account.
spool skill takes several topics at once (spool skill frames styling verbs), and its overview is shorter: history and team projects moved into their own topics, and it now carries a short Playwright driver for clicking or typing in a frame before a screenshot, on spool's own browser.
spool url --raw points at that driver. spool status and the project verbs warn when the daemon runs from a checkout that was deleted, a long team fetch in spool open says how far it got, and the advice about spool stop --force now says to retry first. The daemon no longer logs a cover spool.page already has a newer one of, and a reader that stops early, like | head, no longer makes the CLI print a stack.
spool url --raw points at that driver. spool status and the project verbs warn when the daemon runs from a checkout that was deleted, a long team fetch in spool open says how far it got, and the advice about spool stop --force now says to retry first. The daemon no longer logs a cover spool.page already has a newer one of, and a reader that stops early, like | head, no longer makes the CLI print a stack.
spool check takes the frames to check: name a frame, its folder, its frame.tsx or a page folder, and it type-checks just those and what they import, so one frame on a large canvas can be checked.
With no names it checks every frame, as before. It ends with a line saying how many frames and files it checked and how many errors it found.
With no names it checks every frame, as before. It ends with a line saying how many frames and files it checked and how many errors it found.When the sources are over the offline limit, spool check now says so plainly, with the count and the limit, instead of a TS5083 error on whichever file it stopped at. A file the parser can't read shows the parser's own message and place instead of "Source syntax cannot be inspected safely". A .tsx file sitting on a page, or a frame inside another frame's folder, is named as not a frame.Slow frames are spelled out only for frames you name; otherwise spool check sums them up in one line after the errors.spool check no longer writes anything. A project that still names frames by folder is left as it is, with a note that spool open renames its walks.
Shots are saved under the frame's own path, like .spool/verify/shop/checkout.png instead of shop%2Fcheckout.png. One frame prints the same block as several: a head line with the content's real height and its console errors, then each file with the CSS rows it shows and its pixel scale. When the content is taller or shorter than the height it was shot at, the head line says both. --at takes a list like 0,1500,4000 and shoots each time in one boot, saved as checkout@1500.png. A page folder shoots every frame in it. A failed shot always ends by naming which frames failed, and spool logs no longer narrates its cache.
Shots are saved under the frame's own path, like .spool/verify/shop/checkout.png instead of shop%2Fcheckout.png. One frame prints the same block as several: a head line with the content's real height and its console errors, then each file with the CSS rows it shows and its pixel scale. When the content is taller or shorter than the height it was shot at, the head line says both. --at takes a list like 0,1500,4000 and shoots each time in one boot, saved as checkout@1500.png. A page folder shoots every frame in it. A failed shot always ends by naming which frames failed, and spool logs no longer narrates its cache.
spool shot and spool logs now tell you more about a frame that renders wrong.
An uncaught error shows its stack pointing at your own .tsx files and lines. React errors come in words instead of a number, because the boot runs React's development build. A Tailwind class that no stylesheet built, such as bg-white after your tokens reset the colours, is listed in one line. So is a WebGL context that was lost, and WebGL that ran in software. shot --at now moves the frame's own clocks to that moment instead of waiting, so the same --at gives the same picture every time.
An uncaught error shows its stack pointing at your own .tsx files and lines. React errors come in words instead of a number, because the boot runs React's development build. A Tailwind class that no stylesheet built, such as bg-white after your tokens reset the colours, is listed in one line. So is a WebGL context that was lost, and WebGL that ran in software. shot --at now moves the frame's own clocks to that moment instead of waiting, so the same --at gives the same picture every time.
A team's Settings has two tabs, General and Billing.
Billing is for admins: it says when the trial ends and that paying during it charges nothing until then, chooses who to pay for (admins and editors are seats) and monthly or yearly, goes to Stripe Checkout, and once paid shows the plan, the next charge and the card with Manage billing, saying there is no charge until the trial ends when paid for during it. spool.page/<team>/settings/billing opens it. Deleting a team with paid time says its subscription is cancelled at once.
Billing is for admins: it says when the trial ends and that paying during it charges nothing until then, chooses who to pay for (admins and editors are seats) and monthly or yearly, goes to Stripe Checkout, and once paid shows the plan, the next charge and the card with Manage billing, saying there is no charge until the trial ends when paid for during it. spool.page/<team>/settings/billing opens it. Deleting a team with paid time says its subscription is cancelled at once.
Settings › Billing now says where a failing, ending or lapsed team stands: when a failed card goes local, when a cancelled team ends and that undoing it is in Manage billing, and that a lapsed team's trial ended or it has gone local.
A failing team's admins also get a warning line on Home, in the app and at spool.page, with Manage billing to fix the card.
A failing team's admins also get a warning line on Home, in the app and at spool.page, with Manage billing to fix the card.
When a team has no paid time left, its local copies stop syncing without ending, and the folder, its link and git stay as they were.
spool says once that the team has gone local, and the copy syncs again by itself within a minute of the team paying, sending what was made meanwhile as ordinary saves. On the team's Home, admins get one dialog to choose who stays an editor and pay, and everyone else a line saying the team has gone local, or that it isn't paid for yet when it never had time. New project in such a team says so before any form, taking admins to Settings › Billing, and moving a project in or sharing from it says that an admin can pay for it there.
spool says once that the team has gone local, and the copy syncs again by itself within a minute of the team paying, sending what was made meanwhile as ordinary saves. On the team's Home, admins get one dialog to choose who stays an editor and pay, and everyone else a line saying the team has gone local, or that it isn't paid for yet when it never had time. New project in such a team says so before any form, taking admins to Settings › Billing, and moving a project in or sharing from it says that an admin can pay for it there.
A new team's admins get a setup list on its Projects page, the same in the app and at spool.page/<team>: name the team, pay first when the account's trial was used, invite people or skip, get spool on your Mac, and move a project in or skip it.
On a team that already pays, each editor's invite row says what one more seat costs. Once the last step is done the list goes for good with a toast, and a link from spool.page can hand a team alone over to spool on this Mac, offering the download when spool isn’t open there.
On a team that already pays, each editor's invite row says what one more seat costs. Once the last step is done the list goes for good with a toast, and a link from spool.page can hand a team alone over to spool on this Mac, offering the download when spool isn’t open there.
An agent at work on a frame now says so on the frame's name row, a turning ring and "working", or "waiting" when it stopped to ask, in its owner's colour on a team canvas. The squares that travelled each frame are gone, a placeholder frame is its dashed edge and name with nothing inside, and a teammate's pointer carries only their name.
Playing a frame no longer opens on a white box. The player stays dark until the frame is ready, then fades into it. A long wait, like the first play of a big project, shows the spool mark winding. In the Mac app the play window appears once it has drawn its bar, instead of empty.
The first play of a big project opens on its frame in about two seconds instead of waiting for every frame's styles to build. The other frames' styles keep building behind it, and walking to one that is not ready yet builds it first.
The dots on a team project's tab now sit after its name, where a long name fades out, so they stay whole however tight the tabs get. Past three people the rest show as a count, and pointing at the dots swells them into everyone's name pills under the tab.
Opening a turn's steps in the agent chat now grows them out of the status line and folds them back smoothly, and a long turn's steps scroll inside a box of their own instead of pushing the chat away, following the newest step while the turn runs.
Teammates' names docked on a frame now line up with even gaps. A frame shows at most three names: with four or more people inside, it shows the first two and a "+N" pill. Hover it to see who else is there.
The agent panel stops asking for a chat's models once you move to another chat. Those asks stayed open until the agent answered, and a few of them could stall the canvas's other requests, so a button like Use mine on a clash appeared to do nothing.
Holding ⌥ inside a live frame now keeps moving between frames when something in the frame has focus that uses the arrow keys, like a tree or a list. Once the overview is up the arrows move it, instead of going to the frame and closing the overview.
When spool.page drops everyone at once, after a deploy or under load, daemons and open team canvases no longer all reconnect in the same second. Each waits a random time that doubles with every failed try, up to about 30 seconds, and only starts again from about a second once its connection held for a minute.
The canvas answers faster right after a save to a shared component. Listing the canvas's frames no longer holds up the canvas's other requests while it reads every frame's folder, and recompiling the frames that use the component spends far less time checking their classes against the stylesheet.
Moving a team project to another team now works the same when your projects folder is reached through a symlink: the copy on this Mac moves to the new team's folder under its real path, so it stays one project here and moves along again the next time.
Zooming out on the canvas now stops where the whole page fits the window with some room around it, instead of shrinking the page to a speck in an empty field. A page of one or two frames still lets you zoom out to a quarter size, and the shared page in the browser stops at the same place.
Holding ⌥ no longer zooms out so far that every frame turns into a sliver. The overview steps back at most to half the zoom you were at, keeps that zoom while you move, and only pans to the frame you move to. A neighbour too far away to show gets a tag at the edge of the screen with its key and name, and its arrow still takes you there.
With ⌥ held for the overview, the pointer picks too. Hover a frame to make it the target, click one to go there at once, or click empty canvas to go back. Clicks never reach a prototype while the overview is up, and the wheel zooms it out so you can reach any frame. The overview also drops its corner marks: the ring on the target is the one mark of where you are going.
Moving from one live frame to another now always brings the new frame to you. A tall frame lands at its top, centered, instead of the camera staying put. Holding ⌥ over many frames no longer starts every frame the overview passes over, so stepping through it stays smooth.
A selected frame zoomed out too far to work on no longer carries its corner handles, its size and its play button over the frames around it: they fade out with its name and come back as you zoom in.
Deleting, moving or typing into an element straight after clicking it no longer refuses with "the file was never read". The gesture waits for the element's file to be read, and that read is now much faster.
The selection ring glides from one element to the next instead of jumping, and the faint outline under the pointer follows it the same way. The live chip on a frame's name fades in, and the frame's name eases between its colours on hover and selection. All of it stops when your system asks for reduced motion.
Deleting an element, and undoing or redoing that delete, now changes the frame at once instead of reloading it. The frame still reloads when the deleted element is drawn more than once on the page, or when it is a row of a list.
A live frame that was still loading when you started panning or zooming now pauses its animations like the others once it has finished arriving. Before, it could keep animating through every pan until it reloaded.
The canvas stays quick after you save a file many frames import. Selecting a frame and opening its flows no longer waits seconds while Spool reads the project again.
The canvas stays smooth when the camera stops. The frames around where it lands come alive one at a time instead of all at once, and a frame finishing its load no longer redraws the whole canvas.
On a team canvas, teammates' names docked on a frame shrink smoothly into dots stacked on one another once they would crowd the frame's own name, as when zoomed out, and grow back into names as you zoom in.
Moving a project into a team no longer stops on spool.page's save limits, and its files no longer count against your saves for the month. When a team project saves faster than spool.page takes saves, your changes now wait and go up by themselves instead of pausing sync, and a wait longer than a few seconds shows how many changes are left and about how long. spool tells you once when you reach 24,000 of your 30,000 saves to a project in a month, and sync paused at the month's cap now says the date it starts again.
Signing in to another account no longer stops your team projects syncing for good. A project now waits while the Mac is signed in to an account that can't edit it, says so, and syncs again as soon as you sign back in to the account that had it. Only that account being removed from the team ends the sync.
Teammates on a team canvas now show up right away and stay shown. A Mac that slept or switched networks reconnects to the team within about half a minute instead of waiting minutes on a dead connection, and tries again every 15 seconds at most while offline. Someone sitting still on the canvas no longer vanishes for everyone else when their app reconnects to Spool in the background, and a canvas opened before its project finished syncing is shown to the team once it has. The same holds for a canvas open in the browser.
Dragging a tab to reorder it no longer leaves an empty tab outline behind: the tab you carry and the tabs stepping aside for it stay visible the whole way, the carried tab covers the one it passes over, and its outline moves with it in the same frame.
When an interrupted Mac app update needs a fresh start before it can try again, the menu now offers "Restart Spool to Retry Update…" instead of sending you to download the dmg.
A frame whose source was deleted no longer sits on the canvas saying a designer is drawing it. Only frames a designer is actually working on show that.
A team's page at spool.page is now the same Home as in the app: the team switcher, Projects with each project's cover and who is inside it, People and Settings.
Every team is a place there, a viewer's too, and a project opens as its read-only canvas.
Every team is a place there, a viewer's too, and a project opens as its read-only canvas.
Its head is one row: the project count, a sort menu, the search and New project, with Open and Import in New project's menu. Each card shows its picture, its name and when you last opened it; point at it or tab to it to see where it lives and how many frames it has. A team project says its team on that line.
Its head is one row: the project count, a sort menu, the search and New project, with Open and Import in New project's menu. Each card shows its picture, its name and when you last opened it; point at it or tab to it to see where it lives and how many frames it has. A team project says its team on that line.
Settings is now a page instead of a sheet over the canvas.
It opens in place of the tab you are on, from the gear, from Settings on Home or with ⌘, (ctrl , elsewhere), and esc or Back takes you to exactly where you were. Its sections are the open project, This Mac, Appearance and Colours, each naming the file it writes. Appearance shows a large preview of the window that wears whichever theme you point at before you pick it.
It opens in place of the tab you are on, from the gear, from Settings on Home or with ⌘, (ctrl , elsewhere), and esc or Back takes you to exactly where you were. Its sections are the open project, This Mac, Appearance and Colours, each naming the file it writes. Appearance shows a large preview of the window that wears whichever theme you point at before you pick it.
The window's tabs start where the left side ends, and follow it as you resize or close it.
The open tab is one sheet that slides from tab to tab and flows into the canvas below it. When the bar fills up, tabs shrink down to their icon instead of scrolling away, and the open tab keeps its name. After you close a tab with the pointer, the others keep their width until the pointer leaves the bar, so you can close several in a row from the same spot.
The open tab is one sheet that slides from tab to tab and flows into the canvas below it. When the bar fills up, tabs shrink down to their icon instead of scrolling away, and the open tab keeps its name. After you close a tab with the pointer, the others keep their width until the pointer leaves the bar, so you can close several in a row from the same spot.
Each designer the agent brings in now gets its own frame on the canvas the moment it starts.
The frame shows up dashed on the page where the work will land, with the direction's name and brief, and says what its designer is doing inside it. The designer draws into it, so the chat tile and the frame stay one thing, on any page. A frame folder that has no source yet no longer shows up as an empty page. When several designers work on one frame, their names no longer pile up or repeat the frame's name, and nothing from another page is drawn on the one you are looking at.
The frame shows up dashed on the page where the work will land, with the direction's name and brief, and says what its designer is doing inside it. The designer draws into it, so the chat tile and the frame stay one thing, on any page. A frame folder that has no source yet no longer shows up as an empty page. When several designers work on one frame, their names no longer pile up or repeat the frame's name, and nothing from another page is drawn on the one you are looking at.
On a team project you can now see your teammates' agents while they work.
Inside their designers' placeholder frames you see what each one is doing, and their agent shows on the frames it reads or edits, in their colour. Their status line, like "3 designers working", shows beside their name on the canvas and in the list of who is here. This needs spool.page to be updated too, so it may take a little while after this release to show up.
Inside their designers' placeholder frames you see what each one is doing, and their agent shows on the frames it reads or edits, in their colour. Their status line, like "3 designers working", shows beside their name on the canvas and in the list of who is here. This needs spool.page to be updated too, so it may take a little while after this release to show up.
On a team project, a placeholder frame now says whose designer is drawing it.
Your teammates see it in your colour with your name, like "ada's designer is drawing this frame", and you see theirs the same way. Your own placeholders look as they did.
Your teammates see it in your colour with your name, like "ada's designer is drawing this frame", and you see theirs the same way. Your own placeholders look as they did.
On a team canvas, you now see what a teammate does inside a live frame.
Their pointer keeps moving in there instead of stopping where they went in. A click makes it squash and burst, a drag turns it into a hand with a line trailing behind, and a scroll turns it into a mouse with arrows showing which way. Your own copy of the frame stays yours to use while they work in theirs.
Their pointer keeps moving in there instead of stopping where they went in. A click makes it squash and burst, a drag turns it into a hand with a line trailing behind, and a scroll turns it into a mouse with arrows showing which way. Your own copy of the frame stays yours to use while they work in theirs.
The agent, its model and effort, and the permission mode are now one choice for the whole machine.
Every new chat in every project starts on what you last picked, and nothing switches it back on its own. Before anything is picked, spool starts on the first agent you have installed, Claude Code before Codex before pi, on Auto-edit. If the agent you picked is uninstalled, new chats use the first one you still have until you install it again, and your pick comes back. A permission mode picked while the agent is working is saved at once and takes effect from the next turn. Requests the agent already made still wait for your answer. Choices saved per project by earlier versions are carried over once, taking the most recent.
Every new chat in every project starts on what you last picked, and nothing switches it back on its own. Before anything is picked, spool starts on the first agent you have installed, Claude Code before Codex before pi, on Auto-edit. If the agent you picked is uninstalled, new chats use the first one you still have until you install it again, and your pick comes back. A permission mode picked while the agent is working is saved at once and takes effect from the next turn. Requests the agent already made still wait for your answer. Choices saved per project by earlier versions are carried over once, taking the most recent.
Every agent in the rail now has a designer from Spool.
Ask for options or a few directions and the agent hands each one to its own designer, and the rail shows a row per designer with what it is doing. Single edits it still makes itself. This works the same in Claude Code, Codex and pi. Spool passes the designer in when it starts the agent and never writes it into your project or your agent's config.
Ask for options or a few directions and the agent hands each one to its own designer, and the rail shows a row per designer with what it is doing. Single edits it still makes itself. This works the same in Claude Code, Codex and pi. Spool passes the designer in when it starts the agent and never writes it into your project or your agent's config.
The chat's title sits on a line under the Agent tab and opens your other chats, and a plus in the tab row starts a new one. The agent icon wears a small dot when another chat is running or has news.
The chat's title sits on a line under the Agent tab and opens your other chats, and a plus in the tab row starts a new one. The agent icon wears a small dot when another chat is running or has news.The composer's controls are small and grey: attach, model and mode on the left, send on the right. Send turns into Stop while a turn runs. A message you send mid-turn waits at the end of the log, and Take back puts it back in the box. Once the conversation fills most of the model's context, a small ring says how full it is and offers a new chat.One menu now picks the agent, model and effort. Each installed agent is a group, effort opens right under the chosen model, and picking another agent in a chat that has started asks before it opens a new chat. A search field appears once there are more than twelve models, a signed-out agent shows the command that signs it in, and agents you don't have yet are listed with the command that installs them. The mode menu says plainly what each mode lets the agent do.The agent's side now resizes from 380 to 560 pixels and keeps its width.
The agent's questions and requests for permission now open out of the work they are about.
A request about a frame opens out of the turn's status line as "Waiting on you", with the agent's reason first, what it wants to run or edit one click away, and Allow, Allow for this chat and Deny. A question whose answers are frames the turn made turns its grid of pictures into numbered choices: press one to answer. Anything else, like a request to run npm install or a question about something other than frames, is a quiet card at the end of the chat, and the status line says "Waiting on you" while it waits. A question that takes several answers has checkboxes and a Send button. You can still type your own answer, and Enter never approves anything. Once answered, each folds to one line, like "Allowed: edit src/theme.ts" or "You picked Timeline". With the agent panel closed, the question stands on the canvas under its frame, or under the place kept for it before it exists, and the agent's icon shows it is waiting on you.
A request about a frame opens out of the turn's status line as "Waiting on you", with the agent's reason first, what it wants to run or edit one click away, and Allow, Allow for this chat and Deny. A question whose answers are frames the turn made turns its grid of pictures into numbered choices: press one to answer. Anything else, like a request to run npm install or a question about something other than frames, is a quiet card at the end of the chat, and the status line says "Waiting on you" while it waits. A question that takes several answers has checkboxes and a Send button. You can still type your own answer, and Enter never approves anything. Once answered, each folds to one line, like "Allowed: edit src/theme.ts" or "You picked Timeline". With the agent panel closed, the question stands on the canvas under its frame, or under the place kept for it before it exists, and the agent's icon shows it is waiting on you.On the canvas, a small square now shows where each agent is working and what it is doing: writing a new frame, reading one, changing a block, taking a screenshot or deleting. It dims when the agent pauses and leaves when the turn ends. Names appear when more than one agent is working.
spool shot takes several frames at once: spool shot home cart checkout shoots them in parallel and prints one block per frame, with its picture and its console errors.
One call now does the check that took a shot and a spool logs per frame. A single frame works exactly as before.
One call now does the check that took a shot and a spool logs per frame. A single frame works exactly as before.
The canvas window has panes, as tabs on either side of the canvas.
Pages stands on the left, and Properties and Agent share the right as two tabs, Properties showing. Click a tab to switch to its pane; a pane behind another tab keeps its draft and scroll. A pane's own buttons show in its tab row when you point at it: Pages has a new page button and a ⋯ menu with Collapse all, and Agent has New chat, with the chat's title on a line under the tab. Drag a tab onto another tab row to move it there, or onto the top or bottom half of a pane to split the side, up to three groups a side; Esc cancels a drag, and a drop that does not fit says why. Right-click a tab to move it to the other side, split it below or merge it into the group above. The button at a side's outer end closes it to a narrow rail of its panes' icons; click an icon to open the side on that pane. Agent's running and unread marks show on its tab and its rail icon. Drag a side's edge to resize it. ⌘B and ⌘⌥B open and close the left and right sides, ⌘⇧E, ⌘⇧I and ⌘⇧K open Pages, Properties and Agent, and ⌘K finds Show, Move, Split and Reset layout. When the window gets too narrow, the side you used least recently closes to its rail. The window bar is the same on Home and in a project, with help and settings at its right end. The layout is remembered per browser; layouts saved by earlier versions are not carried over, so the panes start in the default place once. Pages no longer shows a page count or the "folder switches page" line under its tree.
Pages stands on the left, and Properties and Agent share the right as two tabs, Properties showing. Click a tab to switch to its pane; a pane behind another tab keeps its draft and scroll. A pane's own buttons show in its tab row when you point at it: Pages has a new page button and a ⋯ menu with Collapse all, and Agent has New chat, with the chat's title on a line under the tab. Drag a tab onto another tab row to move it there, or onto the top or bottom half of a pane to split the side, up to three groups a side; Esc cancels a drag, and a drop that does not fit says why. Right-click a tab to move it to the other side, split it below or merge it into the group above. The button at a side's outer end closes it to a narrow rail of its panes' icons; click an icon to open the side on that pane. Agent's running and unread marks show on its tab and its rail icon. Drag a side's edge to resize it. ⌘B and ⌘⌥B open and close the left and right sides, ⌘⇧E, ⌘⇧I and ⌘⇧K open Pages, Properties and Agent, and ⌘K finds Show, Move, Split and Reset layout. When the window gets too narrow, the side you used least recently closes to its rail. The window bar is the same on Home and in a project, with help and settings at its right end. The layout is remembered per browser; layouts saved by earlier versions are not carried over, so the panes start in the default place once. Pages no longer shows a page count or the "folder switches page" line under its tree.
The agent rail can now run your installed Codex (0.151.0 or later).
Pick it in the agent menu for a new chat. It uses your Codex login and settings, and the model menu lists the models and reasoning efforts your Codex reports. Ask first, Auto-edit and Full access map to Codex's own approval rules and sandbox, edits in design/ and spool's read-only commands never ask, and a signed-out Codex asks you to run codex login. An older Codex says it needs updating and gives you npm i -g @openai/codex@latest to copy. Spool never edits Codex's config file.
Pick it in the agent menu for a new chat. It uses your Codex login and settings, and the model menu lists the models and reasoning efforts your Codex reports. Ask first, Auto-edit and Full access map to Codex's own approval rules and sandbox, edits in design/ and spool's read-only commands never ask, and a signed-out Codex asks you to run codex login. An older Codex says it needs updating and gives you npm i -g @openai/codex@latest to copy. Spool never edits Codex's config file.
A turn in the agent rail now shows the frames it touched as a grid of pictures, with one status line under it.
While designers work, each one's frame has its place in the grid and on the canvas from the moment it starts, and the line says how many are working and how many are done. Otherwise it says what the agent is doing in plain words, like "Reading the spool docs" or "Drawing home · 278 lines". A frame the agent is writing fills in line by line before it lands. A designer's frame plays its real code into its place in about a second when it lands, even when the designer names its frame differently from the one it was given; a place no frame took fades out once its designer finishes. Finished frames step back to a smaller size while others are still working, and a frame wears corner marks while its picture is taken. Every step the turn took is still there: press the status line to open them. Reads and searches one after another are one step, with every file and command behind it. When the turn ends the line reads how long it took.
While designers work, each one's frame has its place in the grid and on the canvas from the moment it starts, and the line says how many are working and how many are done. Otherwise it says what the agent is doing in plain words, like "Reading the spool docs" or "Drawing home · 278 lines". A frame the agent is writing fills in line by line before it lands. A designer's frame plays its real code into its place in about a second when it lands, even when the designer names its frame differently from the one it was given; a place no frame took fades out once its designer finishes. Finished frames step back to a smaller size while others are still working, and a frame wears corner marks while its picture is taken. Every step the turn took is still there: press the status line to open them. Reads and searches one after another are one step, with every file and command behind it. When the turn ends the line reads how long it took.A turn now lasts until the designers it started have finished, rather than ending when the agent first answers, so their frames are no longer cut off. Stop ends them too. A frame the agent deletes can be brought back with Put back.
The agent rail now runs the agent you already use, Claude Code or pi, with its own login, models and settings. Pi shows its live models, marks the ones running on your computer as local, and has no permission menu because it never asks. Old spool chats stay readable but can't be continued. With no agent installed, the rail shows an install line for each one with a copy button, and checks again when you come back to the window.
The agent rail now runs the agent you already use, Claude Code or pi, with its own login, models and settings. Pi shows its live models, marks the ones running on your computer as local, and has no permission menu because it never asks. Old spool chats stay readable but can't be continued. With no agent installed, the rail shows an install line for each one with a copy button, and checks again when you come back to the window.
Right-click a tab, or open a cover's menu, and choose Change icon… to pick one: it's saved as design/shared/icon.\*, so it reaches your team with the rest of the project. Without one, spool uses the repo's favicon, or the first letter of the project's name. A team project's tab shows the team's mark in the corner of its icon, hollow while its sync is paused.
Right-click a tab, or open a cover's menu, and choose Change icon… to pick one: it's saved as design/shared/icon.\*, so it reaches your team with the rest of the project. Without one, spool uses the repo's favicon, or the first letter of the project's name. A team project's tab shows the team's mark in the corner of its icon, hollow while its sync is paused.
When there is no browser on the machine, it prints the sign-in link instead. Open it on your phone or laptop and sign in. The browser then lands on a 127.0.0.1 page that won't load. Paste that page's address back into the terminal and you're signed in. --no-browser asks for this on a Mac too. Away from a Mac, the session is kept in a file only you can read in spool's state folder, so sharing and team sync work there too.
When there is no browser on the machine, it prints the sign-in link instead. Open it on your phone or laptop and sign in. The browser then lands on a 127.0.0.1 page that won't load. Paste that page's address back into the terminal and you're signed in. --no-browser asks for this on a Mac too. Away from a Mac, the session is kept in a file only you can read in spool's state folder, so sharing and team sync work there too.
A link share opens straight into its prototype, full screen, with no width cap: the frame fills the whole screen under the notch and the home bar and is told the real safe areas to pad itself by. Opened in the phone's browser for the first time, a card under the running prototype says who shared it, when it last changed, and how to add it to the Home Screen, where it runs like an app.
A link share opens straight into its prototype, full screen, with no width cap: the frame fills the whole screen under the notch and the home bar and is told the real safe areas to pad itself by. Opened in the phone's browser for the first time, a card under the running prototype says who shared it, when it last changed, and how to add it to the Home Screen, where it runs like an app.A team canvas link on a phone gives a navigator instead of the spatial canvas: the frames saved to last, who saved each and when, the pages a level at a time with breadcrumbs and frame counts, find over page and frame names, and each page's frames as covers. A teammate's save arrives as a toast you can tap to see it. Tap a cover to play the frame full screen; pull from the right edge to leave. A desktop frame plays whole and small upright, with its size and "turn the phone"; turn the phone to play it at its authored size scaled to the screen, and turn it upright again to leave.
A member looking at a team canvas at spool.page, a viewer or an editor away from their Mac, sees everyone's pointers, names, docked pills and faces as the Mac's canvas shows them, can press a face to follow someone, and appears on everyone else's canvas the same way. A frame they play counts as the frame they're inside. People you share pages with outside the team see nobody and appear nowhere.
A member looking at a team canvas at spool.page, a viewer or an editor away from their Mac, sees everyone's pointers, names, docked pills and faces as the Mac's canvas shows them, can press a face to follow someone, and appears on everyone else's canvas the same way. A frame they play counts as the frame they're inside. People you share pages with outside the team see nobody and appear nowhere.On a phone, the navigator shows who is in each part: everyone on the canvas at the top, who is on a page or under it beside its row, and who is inside a frame on its cover.On Home, a team project's cover says who is inside it right now, "sam is here" or "2 here", and keeps it current while Home is open.
The team sync protocol is published as spool.page/sync-protocol, so a host that runs a team project's sync speaks exactly the protocol this version of spool does.
Right-click a page and choose Share… to show it, and any other pages you pick, to named people who sign in with their address, or to anyone with a fresh link of its own. The sheet warns about links that leave the pages you share, and never stops you. The Shared control at the top right lists a project's shares; open one to add or remove people, copy its link, see who made it and how often it was opened, or stop sharing, which ends their access at once.
Right-click a page and choose Share… to show it, and any other pages you pick, to named people who sign in with their address, or to anyone with a fresh link of its own. The sheet warns about links that leave the pages you share, and never stops you. The Shared control at the top right lists a project's shares; open one to add or remove people, copy its link, see who made it and how often it was opened, or stop sharing, which ends their access at once.People you share with see only those pages, as they last settled: when your agent finishes its turn, or after half a minute with no saves. A save that breaks a frame leaves them on the last version that compiled.Projects of your own share the same way while you're signed in to spool.page: spool uploads only the files the shared pages are made of, and their covers.In the browser, members see the project's shares in the same Shared control, and editors and admins manage them there.
A teammate's save shows up in place, with the changed mark and a short toast saying who saved what, and a frame you are playing never moves under you: the next screen you walk to is the new version. Covers stand in for frames until they draw.
A teammate's save shows up in place, with the changed mark and a short toast saying who saved what, and a frame you are playing never moves under you: the next screen you walk to is the new version. Covers stand in for frames until they draw.A team project's link at spool.page now opens it in spool when spool is open on your Mac, and offers to look in the browser otherwise. Editors get Open in spool on the browser canvas; viewers never see it.Your Mac now sends the covers it takes of a team project's frames to spool.page, once for each version of a frame, so teammates see them in the browser.
A team's projects that aren't on this Mac yet show dimmed on its page in Home, each with Get it.
Get it puts the project in a clone of its repo you already have here, in another folder you pick, or just on this Mac under your projects folder, and it syncs live from then on. Spool never clones a repo for you: the sheet shows the command to clone it yourself.
Get it puts the project in a clone of its repo you already have here, in another folder you pick, or just on this Mac under your projects folder, and it syncs live from then on. Spool never clones a repo for you: the sheet shows the command to clone it yourself.An existing project can now become a team project with Move to team… in its cover menu or in Settings. Spool uploads the whole project first and changes nothing until the team has every file. Then it makes one commit on your current branch, "design: moved to Spool Cloud", that takes design/ out of git, keeps the files on disk and adds spool.json. The commit runs no hooks, waits for any merge or rebase to finish, and is never pushed. History from before the move stays in git. Teammates who pull that commit get their design/ filled again from the team instead of losing it.Team projects now record which repo their code lives in, read from origin. An ssh and an https remote for the same repo count as one repo.
On the canvas, in the player, in spool shot and spool logs, in covers and in exported websites, a frame can fetch, load scripts and load images only from https, data: and blob: URLs and Spool's own libraries. A frame that called a local dev server such as http://localhost:3000, or any plain http address on your network, is now refused, and the frame's console says which address. Fake a backend with scenarios and a mock module instead. This holds for every project, so a frame someone else wrote can't reach services on your machine or network.
On the canvas, in the player, in spool shot and spool logs, in covers and in exported websites, a frame can fetch, load scripts and load images only from https, data: and blob: URLs and Spool's own libraries. A frame that called a local dev server such as http://localhost:3000, or any plain http address on your network, is now refused, and the frame's console says which address. Fake a backend with scenarios and a mock module instead. This holds for every project, so a frame someone else wrote can't reach services on your machine or network.
Team projects sync only what belongs on the canvas.
A symlink, a dot-folder such as .git or .claude, a file outside frames/ and shared/, or a file over 25 MB stays on your Mac, and spool says it didn't travel; your daemon also refuses to write any of those when they arrive. When a team project's fair-use limit is reached (1 GB of design/, 120 saves a minute, 30,000 saves an editor a month), sync pauses with the reason and picks up by itself when it lifts. When you're removed from a team, made a viewer, or the team or project goes, spool stops syncing, gives design/ back its ordinary .gitignore, and says "No longer synced with <team>. This is now a project on this Mac only." Your files and spool.json stay as they are.
A symlink, a dot-folder such as .git or .claude, a file outside frames/ and shared/, or a file over 25 MB stays on your Mac, and spool says it didn't travel; your daemon also refuses to write any of those when they arrive. When a team project's fair-use limit is reached (1 GB of design/, 120 saves a minute, 30,000 saves an editor a month), sync pauses with the reason and picks up by itself when it lifts. When you're removed from a team, made a viewer, or the team or project goes, spool stops syncing, gives design/ back its ordinary .gitignore, and says "No longer synced with <team>. This is now a project on this Mac only." Your files and spool.json stay as they are.
The package now ships what Spool Cloud needs to show a team project in a browser: the read-only canvas as spool.page/viewer, the modules a frame loads beside itself as spool.page/vendor, and projectDesign in spool.page/compile, which reads a design folder's pages and frames from its files the way your canvas does.
Sign in to spool.page from the foot of Home, or with spool login.
Both open your browser, where you continue with Google, an email code or a passkey, and the Mac stays signed in while you use it. The account menu opens your Macs and passkeys on spool.page and has Sign out of this Mac, which spool logout also does. A sign-in from an earlier version is not carried over, so sign in once more after updating.
Both open your browser, where you continue with Google, an email code or a passkey, and the Mac stays signed in while you use it. The account menu opens your Macs and passkeys on spool.page and has Sign out of this Mac, which spool logout also does. A sign-in from an earlier version is not carried over, so sign in once more after updating.
Each teammate's pointer shows in their own colour with their name, which fades a moment after they stop. An idle teammate's pointer dims, and one who leaves fades out. While someone is inside a frame, their name sits beside that frame's name, and a frame someone is moving shows their colour around it. Their faces are at the top right of the window: press one to follow their view, and press esc or move your own view to stop. Nothing about where people are is saved to disk.
Each teammate's pointer shows in their own colour with their name, which fades a moment after they stop. An idle teammate's pointer dims, and one who leaves fades out. While someone is inside a frame, their name sits beside that frame's name, and a frame someone is moving shows their colour around it. Their faces are at the top right of the window: press one to follow their view, and press esc or move your own view to stop. Nothing about where people are is saved to disk.
Every spool command now fetches a team project's design/ when it finds spool.json without one, so a fresh clone or a new git worktree just works.
Each worktree is another local copy of the same live canvas, Home shows a team project as one cover on its team's page however many copies this Mac has, and spool remove forgets one copy without touching the team. When the fetch can't happen, spool says why: sign in, ask an admin to invite you, open it in a browser as a viewer, or work from a Mac because cloud agents can't fetch it yet.
Each worktree is another local copy of the same live canvas, Home shows a team project as one cover on its team's page however many copies this Mac has, and spool remove forgets one copy without touching the team. When the fetch can't happen, spool says why: sign in, ask an admin to invite you, open it in a browser as a viewer, or work from a Mac because cloud agents can't fetch it yet.Git no longer reaches the team's canvas. Checking out an old branch that still tracks design/, pulling the commit that took it out of git, or any reset or merge that writes there is never sent to your teammates. Spool puts the team's version back, and a design/ that vanished is filled again instead of being deleted for everyone.If you edit in a team, spool init asks where the project goes: a picker in a terminal, or for an agent a message naming the choice, with nothing written. --local keeps the project on this Mac, offline, and the new "New projects go to" setting answers once for every init. Signed out, or editing in no team, spool init works exactly as before. In the app, New project starts the project in the team Home's switcher shows.
When you and a teammate save the same file in a team project at nearly the same time, the save that reaches spool.page first stands.
Yours is kept in the team's history, your file takes theirs, and each frame that shows the file gets a mark saying so. From the mark you can compare the two versions, put yours back on top, or hand both to your agent, which starts only when you press. Coming back online with many of these at once shows one summary instead. An edit always beats a delete, so a file you deleted while a teammate was still editing it comes back, and you are told. Changes to canvas.json never collide: each page's place and the order are merged one at a time.
Yours is kept in the team's history, your file takes theirs, and each frame that shows the file gets a mark saying so. From the mark you can compare the two versions, put yours back on top, or hand both to your agent, which starts only when you press. Coming back online with many of these at once shows one summary instead. An edit always beats a delete, so a file you deleted while a teammate was still editing it comes back, and you are told. Changes to canvas.json never collide: each page's place and the order are merged one at a time.
Start a team project with spool init --team <team>.
Its design/ lives with your team on spool.page instead of in git: every file you or your agent save reaches your teammates' design/ and canvas in about a second, and theirs arrive in yours as real files. Frames, frame.json, canvas.json, shared files and images travel; your camera, selection and caches stay on your Mac. The repo tracks only a small spool.json that names the team project, design/ keeps itself out of git, and spool never commits it. In a clone that has spool.json but no design/, spool open fetches it.
Its design/ lives with your team on spool.page instead of in git: every file you or your agent save reaches your teammates' design/ and canvas in about a second, and theirs arrive in yours as real files. Frames, frame.json, canvas.json, shared files and images travel; your camera, selection and caches stay on your Mac. The repo tracks only a small spool.json that names the team project, design/ keeps itself out of git, and spool never commits it. In a clone that has spool.json but no design/, spool open fetches it.
Once you're signed in, a switcher at the top of Home's sidebar moves between your own projects and each team you're in, and New team… starts one when your account may. A team has Projects, People and Settings for admins. On People you invite people by email with a role, change a role or remove someone, and leave a team. Settings holds the team's logo, name and address, and deleting it. An invite to your address shows as a line above your projects with Join and Decline. A team you only watch opens on spool.page in your browser.
Once you're signed in, a switcher at the top of Home's sidebar moves between your own projects and each team you're in, and New team… starts one when your account may. A team has Projects, People and Settings for admins. On People you invite people by email with a role, change a role or remove someone, and leave a team. Settings holds the team's logo, name and address, and deleting it. An invite to your address shows as a line above your projects with Join and Decline. A team you only watch opens on spool.page in your browser.
A frame's stylesheet that starts with @import, such as a Google Fonts link, now loads in the player and in published websites. Before, the import landed after other rules, so the browser ignored it and the font never loaded.
Playing a frame on spool.page is smoother. The frame grows out of the canvas once it has drawn, instead of as a blank page that fills in, and the canvas fades behind it as it opens and closes. Walking to another screen keeps the last one on show until the next has drawn. A link that names only a frame, like ?frame=shop%2Fcart, opens on that frame's own page.
Home's sidebar no longer has its own Settings at the foot. The gear at the top right and ⌘, open settings from anywhere, so a team's Settings is the only one in the sidebar.
The agent in the rail always finds a spool command now, and it is the spool that started it. Before, a daemon run from a checkout gave the agent no spool at all, and it could spend minutes searching the disk for one.
The agent's square on a frame is quieter while it rests. Parked beside the frame's name it is now smaller and grey, and it turns back into the full square when the agent works on the frame.
A table in the agent's chat now reads as a short bulleted list, one line per row, instead of a long stack of labelled rows. The agent is also asked to sum up its designers' work as a list.
Moving an element with the arrow keys keeps it selected when the frame is slow to reload. Before, a reload that took more than a few seconds dropped the selection to the frame, so the next arrow press nudged the whole frame.
Moving a big project to a team no longer fails when spool.page pauses saves for a minute or the connection drops. The move waits and carries on, and the move sheet shows how many files are up and why it is waiting. Reopening the sheet during a move picks it up where it is. A move that stops on a limit that won't lift, like a full project or the month's saves, now says so, and says when the month's saves come back.
A spool cloud command that fails now says why in one plain line, besides its JSON. An account not yet approved to publish is told that teams work without approval. On a Linux machine missing the libraries Chromium needs, the daemon says once which command installs them, instead of logging a browser error every minute.
A team project's link at spool.page opens its canvas in the browser and stays there. It used to send editors on a computer straight to spool on their machine whenever spool was running. Now "Open in spool" shows at the top right when spool is running on that computer, and it hands the project over only when you press it.
Project tabs now open and close smoothly: a closed tab shrinks away while the tabs after it slide into its place, and a new tab grows in and scrolls into view. You can close a tab with the middle mouse button, and scroll a full row of tabs with an ordinary mouse wheel.
The Mac app brings the canvas back by itself when Spool's background server stops or the page crashes. It used to stay on a black window until you quit and reopened it.
Spool no longer crashes to a black window when the network drops while a team project is syncing. A keepalive sent before spool.page answered used to take the daemon down.
The Mac app's Cloud Account menu now shows only what fits: Sign In when you are signed out, and your email with Sign Out when you are signed in. It follows the account when you sign in or out from Home, the menu or spool login and spool logout, and Home's account now follows those commands too.
A spool.json that belongs to another tool no longer makes spool treat the folder as a team project. Spool walks past it, starts projects beside it and never writes over it.
Opening a .spool file from Finder while the Mac app is starting no longer says it could not open the project after opening it anyway. The canvas also loads once at launch instead of twice.
Frames on the top page can be shared now. Right-click the empty space in the pages rail and choose Share…, or tick the top page in any share's sheet. People you share it with see the top page's own frames and none of the pages under it.
spool now signs in to spool.page instead of beta.spool.page, and new team projects link to spool.page. Sign in once more after updating. SPOOL_CLOUD_ORIGIN still points spool somewhere else.
Checking out a branch from before a project moved to its team no longer stops its local copy syncing, and spool no longer commits the team's design/ to git on that branch.
A team project that stopped syncing here because you were made a viewer or removed shows as not on this Mac again once you're back, and Get it brings that copy back in sync.
Spool no longer deletes a file from a team project's design/ because git seemed to have put it there. Frames a teammate made on their own branch before pulling the move commit now go up to the team, and a file an old branch brings that the team never had stays on disk, unsent, with a note saying so.
Moving a project into a team no longer fails over files that never travel, like a symlink or a file over 25 MB, and those files and anything else in design/ outside spool's layout stay in git, so teammates who pull keep them. A move is refused up front on a detached HEAD, and a move commit git couldn't take, because a crashed git left its lock or spool quit while waiting, is made the next time spool starts instead of being lost.
Move to team now lists the files in design/ that will stay on this Mac and in git before you move, and Home tells you when the move commit wasn't made and what happens next.
A save to a team project made just as spool started watching another folder could wait until the next reconnect to reach your team. It now goes up within moments.
A team project's sync state now stays where you can see it. Its canvas says that sync is paused, which files didn't travel, or that the project is no longer synced with its team, and says it again whenever you open the canvas. A project that stopped syncing while it was closed says so on its cover at Home.
Spool only fetches web fonts from public https addresses now. A shared/fonts.css that points at a plain http URL, at localhost, or at a private network address, directly or through a redirect, fetches nothing, and the daemon prints the URL and why it refused it. Fonts on public https URLs load as before.
Frames find their imports the same way on every machine. An import has to name a file with the same capitals the file has, as on Linux, and a package.json inside or above design/ no longer changes which file an import reaches. A frame that only compiled because of either now shows the real error on the canvas.
Spool now finds the Tailwind classes a frame uses with a scanner of its own, in place of Tailwind's native one, so the same scan can run anywhere a frame is compiled. Every frame gets the same stylesheet as before, and the install no longer carries Tailwind's native scanner.
Frames now compile with Spool's own TypeScript settings. A tsconfig.json in your repo, above design/ or inside it, no longer changes what a frame compiles to, so a frame behaves the same on your canvas and anywhere else it is compiled. If a frame relied on one of those settings and stops compiling, the canvas shows its real error.
spool check now names frames that draw too slowly to play smoothly.
Spool times a frame each time it is edited, at Retina sharpness, and the check lists any that manage fewer than 45 frames a second, so an agent sees a heavy frame before it slows your canvas down. It is a note, never a failure.
Spool times a frame each time it is edited, at Retina sharpness, and the check lists any that manage fewer than 45 frames a second, so an agent sees a heavy frame before it slows your canvas down. It is a note, never a failure.
Spool makes frame pictures in the background, in a browser of its own, about three times faster than before, and the canvas no longer stops to take them.
Pages you have not opened get pictures too, a frame an agent edits gets its new picture within about a second whether or not a canvas is open, and pictures follow the light or dark mode your frames are shown in. A frame that stops responding keeps its last picture and says why, instead of holding up the others. spool shot boots in the same browser: it now waits for the frame to settle the way its picture does instead of a fixed 300 ms, and renders in the light or dark mode you see.
Pages you have not opened get pictures too, a frame an agent edits gets its new picture within about a second whether or not a canvas is open, and pictures follow the light or dark mode your frames are shown in. A frame that stops responding keeps its last picture and says why, instead of holding up the others. spool shot boots in the same browser: it now waits for the frame to settle the way its picture does instead of a fixed 300 ms, and renders in the light or dark mode you see.
Breaking: the Edit tool now selects the deepest element under the pointer with one click, and nothing you do with it reaches the page underneath.
While it is on, animations on every live frame hold still and start again when you put it down. From a selected element, double-click or Enter edits its words or selects the children of a group, Esc or Shift-Enter selects the parent, Tab walks the siblings and ⌘A selects them all. Esc now saves the words you are typing, like Enter. A label beside the outline names the element. When a delete or a text edit can't be made, a note under the element says why and offers to ask the agent. The step-by-step selection and the breadcrumbs in the properties rail are gone.
While it is on, animations on every live frame hold still and start again when you put it down. From a selected element, double-click or Enter edits its words or selects the children of a group, Esc or Shift-Enter selects the parent, Tab walks the siblings and ⌘A selects them all. Esc now saves the words you are typing, like Enter. A label beside the outline names the element. When a delete or a text edit can't be made, a note under the element says why and offers to ask the agent. The step-by-step selection and the breadcrumbs in the properties rail are gone.
Breaking: a frame is now named by its path under design/frames, like shop/checkout, so two pages can each have a frame called buttons.
Walks, links, the CLI and URLs all use the full path; a frame on the root page keeps its plain name. Renaming or moving a frame or page in Spool updates every data-go, ui.go and links literal that pointed at it. If you move folders outside Spool, spool flows lists the walks that need the new path. The first time this version opens a project it rewrites your existing walks to the new names once; check the result with git diff. A published site whose entry frame now has a longer name updates with spool cloud publish <frame> --publication <id>.
Walks, links, the CLI and URLs all use the full path; a frame on the root page keeps its plain name. Renaming or moving a frame or page in Spool updates every data-go, ui.go and links literal that pointed at it. If you move folders outside Spool, spool flows lists the walks that need the new path. The first time this version opens a project it rewrites your existing walks to the new names once; check the result with git diff. A published site whose entry frame now has a longer name updates with spool cloud publish <frame> --publication <id>.
Breaking: editing by hand on the canvas now changes an element's words and deletes elements, and nothing else.
The properties rail no longer edits an element's classes, layout, picture, attributes or visibility, and the element resize, rotate and gap handles and the ⌥ spacing measurement are gone. Ask the agent for those changes; when a hand edit can't be made, the note on the element still offers to. With an element selected, the rail shows the size and position of the frame it is in.
The properties rail no longer edits an element's classes, layout, picture, attributes or visibility, and the element resize, rotate and gap handles and the ⌥ spacing measurement are gone. Ask the agent for those changes; when a hand edit can't be made, the note on the element still offers to. With an element selected, the rail shows the size and position of the frame it is in.
The first time you open it from Applications, it offers to add spool to your terminal, and Install Command Line Tool in the Spool menu does the same later. The command runs the spool inside the app, so updating the app updates it too. If you already installed spool with npm or pnpm, the app leaves yours alone.
The first time you open it from Applications, it offers to add spool to your terminal, and Install Command Line Tool in the Spool menu does the same later. The command runs the spool inside the app, so updating the app updates it too. If you already installed spool with npm or pnpm, the app leaves yours alone.
Select an element and press an arrow key to move it one step among its siblings, or pick up the Edit tool and drag it to where it should go. A drag that starts inside a row of a list moves the whole row, and the row moves in the array that draws the list. Each press and each drop is one change to the file and one step of undo. The frame reloads behind its last picture so nothing blinks, and its state starts over. When the file doesn't write the siblings side by side, for example when one comes from a condition, a note under the element says why and offers to ask the agent.
Select an element and press an arrow key to move it one step among its siblings, or pick up the Edit tool and drag it to where it should go. A drag that starts inside a row of a list moves the whole row, and the row moves in the array that draws the list. Each press and each drop is one change to the file and one step of undo. The frame reloads behind its last picture so nothing blinks, and its state starts over. When the file doesn't write the siblings side by side, for example when one comes from a condition, a note under the element says why and offers to ask the agent.
Right-click a frame and choose Copy share link: the link lands on your clipboard as soon as it has an address, while the files keep uploading, and the next frame you share reuses the same people. The frame's label now says whether it is uploading, shared or changed since the link was updated. Pressing that label opens a small panel beside the frame for access, updates and stopping, replacing the dialog and the progress tray. The player's Share button opens the same panel.
Right-click a frame and choose Copy share link: the link lands on your clipboard as soon as it has an address, while the files keep uploading, and the next frame you share reuses the same people. The frame's label now says whether it is uploading, shared or changed since the link was updated. Pressing that label opens a small panel beside the frame for access, updates and stopping, replacing the dialog and the progress tray. The player's Share button opens the same panel.
A frame heavy enough to slow Spool down no longer drags the whole canvas with it. When the canvas keeps falling behind while you are not moving, the frames you are not pointing at pause where they are, and play again when you point at one or go inside it. If pausing them does not help, they play on.
Play opens much sooner. While a project's canvas is open, Spool prepares play in the background, so pressing play a moment after opening a project no longer waits for every frame to build. After an edit, only the frames that changed are built again. On a project of 859 frames, the first play takes about half a second instead of 12, and playing right after an edit takes under a second instead of about nine.
Panning and zooming stay smooth past heavy live frames. A frame that draws a big 3D scene could hold the whole canvas to a few frames a second while it played. Now, when a pan or zoom starts missing frames, the live frames you are not inside show their pictures until the camera stops, then carry on playing.
Frame names no longer flash over other frames while you zoom. A name whose frame had left the screen could be left standing where an earlier zoom put it, on top of a different frame.
Frame pictures made before this version are taken again once, in the background. Pictures from before 0.26 came out blank for frames that draw in 3D, animate or open a dialog, and stayed blank until the frame was edited. On a big project the retake takes a few minutes the first time Spool opens it.
Spool installs faster and takes far less space. An npm install now fetches about 2,300 files instead of 32,000. The Mac app download and its updates are a third smaller.
The link map and walk arrows appear sooner on big projects. On a project of 1,449 frames, reading the links again takes about 27 ms instead of 360 to 410 ms when nothing changed, and about 30 ms instead of 360 to 410 ms after an edit to one frame.
The canvas draws frame pictures on the GPU, so pages with hundreds of frames stay smooth while you pan and zoom, and a page of 1,000 frames reloads in under a second instead of almost two.
Sharing no longer refuses frames over ordinary code that has nothing to do with navigation. Tags like <motion.div> or <Dialog.Root> and spread props like <button {...rest}> used to stop a share with a navigation error. Now only a data-go or ui.go whose destination Spool can't work out stops it.
When a frame can't be shared yet, the Share panel now lists every problem, each with the file and line to fix and what to do about it. It used to show only the first one, without saying where. A missing import or a missing export no longer reads as a navigation problem.
Frames that import a shader with ?raw, like import fragment from "./effect.glsl?raw", can now be shared. They rendered on the canvas but sharing refused them, and the shader was missing from the export. Editing such a shader now also refreshes the frame on the canvas.
Exported .spool project files are now compressed, so most come out at about half their old size or smaller. Spool keeps responding while a large project exports, and older versions of Spool can still import the new files.
Selecting an element deep in a frame that draws the same markup more than once, like a card repeated down a page, now selects the copy you clicked instead of the first one. To tell the copies apart, an element's selector now runs all the way up to the top of the frame instead of stopping after eight steps. So selectors for deep elements are longer than before, including the ones agents read from the selection. Selectors for elements near the top are unchanged.
On a Mac, Spool no longer asks for access to your Desktop, Documents, Downloads, Movies, Music and Pictures folders as soon as it starts. The new project picker still lists those folders, but it only looks inside one when you open it.
An element inside children that a component passes on, like a page wrapped in a layout component, is no longer mistaken for a row of a list. Deleting it with ⌫ now deletes that element rather than the call that renders the whole section, and dragging it moves it rather than the section around it.