You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A progress bar when you clone a repo. Cloning from the repo picker or the project menu's Clone from GitHub now shows how far git has got (receiving objects with size and speed, resolving deltas, checking out) instead of a bare "Cloning…" (lib/clone-progress.ts, components/CloneProgress.tsx, components/ProjectCloneForm.tsx).
Fold any column, and let the full ones spread out. A chevron in every column's header folds it to a thin strip with its name and count, even while cards wait in it. Click the strip to open it again; cards dragged onto it still land there, and Weft remembers which columns are folded. When the board has room, the column with the most cards spreads them over two columns, then the next fullest, as long as its cards don't fit its height and another column's width still fits. Narrow the window and they go back to one (components/FoldedColumn.tsx, components/BoardColumns.tsx, components/BoardColumn.tsx, lib/board-overflow.ts, lib/board-prefs.ts).
After an update, Weft says what's new in a few lines. The first time Weft opens on a new version, a small What's new in Weft X splash lists up to three changes you'll notice, each with its payoff, and sometimes a short video, with a link to the full release notes. Weft's Copywriter writes the lines when the release is cut, so they read like Weft and not like a commit log. New installs meet the welcome instead, and Settings → General → Reset tips shows the current splash again. Check for Updates… is now in the File menu too. (components/ReleaseSplash.tsx, lib/release-splash.ts, lib/release-splashes.json, lib/use-release-splash.ts, scripts/release-splash.mjs, electron/menus.cjs)
The weekly repo-analysis report now reads the real systems, instead of the numbers it was written with. The report is a file in ~/.weft/show, so every figure in it was a snapshot from the day it was written. Now a guarded route (app/api/infra/live) reads the project's actual numbers and the page asks for them on open: the database size, the file storage and its object count, the auth users, the provider states, and the quota rows with how much of each ceiling is left. The egress is measured too — it has no API of its own, so Weft reads the Analytics log stream and splits the response's content_length by cache status, which is the difference between the cheap CDN rate and the full one. A missing credential never fails the read: that half comes back unread and the report says so plainly, rather than showing a stale number as if it were live. A file: page reaches the route through Weft's own bridge (electron/live-data.cjs): it names a path, never a URL, and Electron main holds the launch token so the page never has it. pnpm infra:probe prints the same snapshot the report reads.
Your Weft plan now comes with BlastCP, and BlastCP applies it. If you're connected to BlastCP with your Weft account, your own BlastCP workspace moves to BlastCP Creator (every channel, unlimited posts, $3 a month of AI generation) while you're on a Team seat or own a Pro, Open Source or Education workspace. It goes back to BlastCP Free when that ends, and a BlastCP plan you pay for yourself is never touched. Weft tells BlastCP when you sign in, twice a day, and as soon as your plan changes, so a Checkout shows up in BlastCP within seconds. The pricing cards, upgrade dialog and access row list the BlastCP tier again and say who gets it ("for the owner", "for every seat"). Main files: lib/billing/blastcp-bundle.ts, app/api/billing/blastcp/route.ts, lib/blastcp-plan.ts, components/home/Plans.tsx.
Z reopens the last card you had open. Close a card, press Z on the board, and it opens again: the same card that stays outlined after you close it. Undo the last archive moves to Shift+Z (the toast's Undo still works). Files: components/board-shortcuts.ts, components/use-board-commands.ts, components/board-palette.ts.
Changed
The privacy policy now covers Google account data. A new "Google user data" section on weft.zip/privacy says what Weft's Google sign-in reaches (Gmail, Calendar, Drive, Docs, Sheets, Slides, Contacts, Tasks), that the token stays in your Mac's Keychain and the data goes from Google straight to your Mac, never through weft.zip, that it's used only to do what you ask, and never sold, used for ads or to train models. It states Google's Limited Use terms, which Google's OAuth review looks for before Weft's own Google client can leave Testing. (app/privacy/page.tsx)
Fixed
Project Sync follows you to your other Macs. Sign in on a second Mac and every project you sync elsewhere turns on there too, matched by its GitHub repo rather than its folder path, including a project you've just cloned on that Mac. Before, a new Mac started with every project off. The switch is kept per repo in your account (lib/cloud-sync-repos.ts, cloud_sync_repos).
A "use client" module that reaches a Node built-in no longer takes the board down. The board 500'd with nothing the UI could show — Turbopack panics on node:fs ("the chunking context does not support external modules") and the whole route goes with it. The model menu was the culprit: it read the models you named straight from lib/goose-models.ts, which reads the settings file off disk. It reads them from the server instead now (lib/use-named-models.ts), the way the plan limits already were. And the class of bug is now a lint rule: a "use client" file that reaches a Node built-in, "server-only" or "use cache" fails pnpm lint (weft/no-client-server-leak), so the pre-commit hook refuses the change instead of the next restart. It reuses the analysis lib/client-graph.test.ts already walked the real tree with, and names the chain it found. Files: eslint-rules/no-client-server-leak.mjs, eslint.config.mjs, lib/use-named-models.ts, lib/settings.ts, lib/types-settings.ts, components/ModelSelect.tsx.
weft.zip offers a new release within minutes. The home page's download button and weft.zip/download kept pointing at the old dmg for up to an hour after a release, because the release lookup was cached for hours from the last deploy. It's now re-read at most once a minute, so a new version shows up on the site within a couple of minutes, without a redeploy. (lib/home-release.ts)
Slim scrollbars, and cards that stay inside their column. Every scroll area now has a slim rounded thumb in the theme's line colour on a clear track, brighter on hover, instead of the heavy grey default bar. A board column no longer scrolls sideways: a card with a long footer (several tags, "+1 here", age) used to push past the column's edge and add a horizontal bar. The tags now shrink with an ellipsis and the footer clips to the card. Files: app/globals.css, components/BoardColumn.tsx, components/CardMarks.tsx, components/CardFooterMeta.tsx.
The model picker shows "Let Codex choose" once. In a menu that also picks the CLI (New thread, Settings → Models' default), Codex and Goose each showed two "Let … choose" rows. The second one picked the sentinel model id instead of moving the thread to that CLI, and Codex's row was noted "Runs Let Codex choose". Now each CLI gets one row that picks it. The typeahead's CLI groups are also named for screen readers again, as the old menu's groups were. Files: lib/model-options.ts, components/ModelTypeahead.tsx. The picker's tests now drive the typeahead itself through components/model-picker-test-utils.ts.