Skip to content

Releases

Picard 0.10.0

Choose a tag to compare

@github-actions github-actions released this 01 Nov 03:10
Immutable release. Only release title and notes can be modified.
10a62af

Open the .dmg and drag Picard to Applications.

Added

  • Every row under Needs you in the Clean window has an Open in Finder button.
  • A broken worktree row has a Delete button. After you confirm, Picard moves the folder to the Trash. Picard still never removes one on its own. Just before acting it refuses if the folder is no longer a broken worktree, is ignored or excluded, is in use by a running process, or if a clean is running. It also refuses a folder that sits inside an ignored folder, node_modules, target or .git, or that holds another git checkout, a bare repo, a configured root or the home folder. Delete is not offered if the repo may be on a drive that is not mounted. A worktree that lost its .gitignore cannot be deleted this way. Finder's Put Back may not be offered, but the folder can be dragged out of the Trash. The space returns when the Trash is emptied, so a deleted folder is not added to the history or to "Freed by Picard".

Changed

  • The message on a broken worktree now says Picard never removes it on its own. This also changes the picard scan output.
  • storybook-static is no longer on the default dirs list of build_output. A dirs list in your config keeps it until you remove it.

Picard 0.9.0

Choose a tag to compare

@github-actions github-actions released this 01 Nov 01:11

Open the .dmg and drag Picard to Applications.

Added

  • A broken worktree is a folder whose .git file names a worktree record that no longer exists. A failed removal leaves one. picard scan and the Clean window now list these under Needs you, with path and size. Picard never removes one, and they are not counted in any total. Submodules are not reported, and neither is a record on a drive that is not mounted. picard scan escapes control characters in these paths.
  • A partly deleted worktree is one whose status lists deleted tracked files and nothing else, as a git worktree remove that stopped part way leaves it. It is now removed with --force, but only after stale_days, never min_idle_minutes, and only if another branch or a remote holds its commits. Any other change in it keeps it. Its reason says "partly deleted". Deletions count as activity for this wait, and Picard judges the wait and the submodule repositories again just before removal. If the root .gitignore is among the deleted files, ignored folders look like new work, so the worktree is listed under Needs you and never removed.
  • A clean clone in a package folder no longer keeps a worktree or a build output folder for ever. This covers a checkout below vendor or .terraform/modules, with a .git folder, that the repo around it ignores. It must have no repo filters, no submodules, no linked worktrees, no paused operation and no uncommitted changes. Every commit must have been fetched from a configured network remote. A local path or a file: URL does not count. A ref made by hand does not count alone, but a repo that also forges its remote config cannot be detected offline. Picard cannot see what changed on the remote since the last fetch. It checks again just before removal, and keeps the folder if the clone's .git was written to after the run started. Any other checkout is still refused, and so is anything in .claude/worktrees inside the worktree or project.
  • Outside any git repo, .next with a BUILD_ID file and vendor with a composer/installed.json file are now cleaned from stale projects. This includes external drives. Every other name stays kept there, including dist and build. A git failure does not count as "outside a repo".

Changed

  • .terraform, storybook-static and target are now on the default dirs list of build_output. A dirs list in your config replaces the defaults, so add them there to use them. After .terraform is removed, terraform init must run again, possibly with -backend-config flags, and the selected workspace may be lost.
  • A worktree, submodule checkout or nested clone with a file marked skip-worktree or assume-unchanged is now kept, because git status does not check those files. This includes sparse checkouts.
  • .idea and .phpstorm.meta.php are now on the default list of changes that do not count as work. A custom activity_ignore list is not changed.
  • The log starts a new file at 5 MB and keeps three old ones. It used to start again at 40 kB, which lost the history a bug report needs. Each build_output scan logs one summary line, and the line for each folder moved to debug level.

Fixed

  • The folder names field in Settings can be edited again. It used to delete each comma as you typed it, so you could not add a name.
  • git worktree remove now has 30 minutes instead of 60 seconds. A large worktree could reach the old limit, and stopping it part way left the worktree half deleted.
  • build_output now judges each folder again just before removing it. It used to act on the scan's answer alone.
  • build_output used to skip a folder it could not read while looking for nested repos, so a repo inside it went unseen. It now keeps the output folder.
  • build_output now keeps a folder that holds a bare git repo, or a .hg or .svn folder. A cancelled scan stops searching output folders at once.

Picard 0.8.0

Choose a tag to compare

@github-actions github-actions released this 24 Oct 21:17

Open the .dmg and drag Picard to Applications.

Added

  • Each cleanable item has a Skip action. A skipped item is dimmed, unticked and left out of Clean, Select all and the totals for that scan. A new list clears the skipped state.

Fixed

  • A stale Git untracked cache can no longer make git worktree remove refuse an empty worktree after Picard has confirmed that it is clean.

Picard 0.7.1

Choose a tag to compare

@github-actions github-actions released this 24 Oct 00:19

Open the .dmg and drag Picard to Applications.

Fixed

  • 0.7.0 was never published. A test failed on git 2.56, so the release stopped before the build. 0.7.1 holds every change listed under 0.7.0. The fix changes only tests.

Picard 0.6.0

Choose a tag to compare

@github-actions github-actions released this 23 Oct 00:23

Open the .dmg and drag Picard to Applications.

Added

  • The top of the Clean tab shows the disk size, the space available and the total freed.

Picard 0.5.0

Choose a tag to compare

@github-actions github-actions released this 22 Oct 22:05

Open the .dmg and drag Picard to Applications.

Fixed

  • Clicking a cleanup notification, such as "35 GB can be cleaned", opens the Clean tab on the scan behind that number. The tab used to open empty. It also shows when each volume was scanned.
  • A newer background scan appears behind a Show it banner. It does not replace the list, so the ticks you changed stay.
  • Picard refuses a scan that started before the volume's last clean, so folders it removed do not come back.
  • Clean and Rescan wait until a stored scan is checked against the ignore list.
  • Show it reads the stored scan again, so it shows the latest results.
  • When a background clean removes folders on a volume, the open Clean tab says its list may be out of date.

Picard 0.4.0

Choose a tag to compare

@github-actions github-actions released this 21 Oct 21:25

Open the .dmg and drag Picard to Applications.

Added

  • Picard updates itself. It checks GitHub for a newer release shortly after it starts and then once a day, downloads it, verifies it against a public key built into the app, and replaces Picard.app. The menu and the About tab then offer Restart to finish updating. Picard never restarts by itself and refuses to restart during a cleanup. Turn it off with Check for updates daily and install them in Settings, or auto_update = false in the config. With it off, the About tab offers Install it when you check by hand.
  • Updates are installed only from a GitHub release download, only when Picard runs from an installed Picard.app, and without an administrator password prompt. Otherwise the About tab offers Install it. A failed install is retried after 1, 2, 4 hours and so on, up to a day.
  • On first run, Picard shows a use-at-your-own-risk warning before it watches disk space or checks for updates. I understand continues, and Quit exits Picard. The warning shows once. Picard saves the acceptance as warning-accepted.txt next to the config, and existing installs see it once too.

Changed

  • The About tab shows the update progress: checking, downloading, installed, or failed with the reason. It follows a background download live.
  • The update check uses the Tauri updater plugin instead of curl, which adds an HTTP and TLS client to the app.
  • Versions before this one cannot update themselves. Install this release by hand once.

Picard 0.3.0

Choose a tag to compare

@github-actions github-actions released this 21 Oct 09:59

Open the .dmg and drag Picard to Applications.

Added

  • Each category on the Clean page has a chevron toggle. After every scan a category is closed when nothing in it can be cleaned, and open otherwise. It is also open when the scan failed, so the error shows. A closed heading shows a summary. Closing hides the list only, so Select all and Clean still reach it.
  • The Clean page shows how much Picard has freed in total, and since when. The total is summed from history.jsonl (get_totals command).
  • The total and the "Recently removed" list on the Clean page update while the window is open when auto mode, the daily scan or picard run removes something. Picard watches history.jsonl and sends the window a history-changed event. Only those two parts reload; the scan results stay as they are.

Changed

  • The Clean page no longer scans when it opens. Press Scan to find build folders, caches and stale worktrees. The total and the "Recently removed" list still load on open.
  • Worktrees merged into a branch other than the default one are now found. A merge commit or a reflog merge entry in any local branch counts as merged, so repos that integrate into a branch such as 2.0-dev are cleaned after min_idle_minutes. A worktree whose commits another local branch holds, with no record of a merge, is cleaned after stale_days.

Fixed

  • The scrollbar track is always reserved, so the tab bar and the cards keep the same width on every tab, whether or not the page scrolls.
  • After a failed first scan the Clean page no longer shows an empty-state line. The button stays labelled Scan until a scan succeeds.

Picard 0.2.0

Choose a tag to compare

@github-actions github-actions released this 21 Oct 03:12

Open the .dmg and drag Picard to Applications.

Added

  • About tab with the running version, links to the Velvet Tiger website and GitHub issues, and a check for a newer release on GitHub. The check runs only when you open the tab or press Check again (debf414, a409677, 4ec3979).
  • Appearance setting to make the window light or dark, or follow macOS (appearance in the config) (e13c16d).
  • activity_ignore config key, edited in Settings under "Changes that don't count as work". It lists the names whose changes do not make a project look active. The defaults can be removed or restored (d3e1d68, a080985, a43ead0).

Changed

  • Changes to agent config such as AGENTS.md, CLAUDE.md, .mcp.json, .automatic/ and .claude/ no longer make a project look active. Stale build output in projects that tools like Automatic sync is now cleaned. Git checkouts inside those folders still count as work (d3e1d68).
  • Worktrees with checked-out submodules are removed when nothing would be lost: every submodule is clean, filter-free and has no commit missing from its remote (622eea2).

Security

  • Every git call sets GIT_NO_LAZY_FETCH=1 and GIT_ALLOW_PROTOCOL=none, so a crafted repository cannot make a status check fetch or run a command (622eea2).
  • Just before a worktree is removed, Picard refuses it if anything inside it or its submodules changed since the run started (622eea2).
  • A worktree that holds another git checkout is never removed (d3e1d68).

Fixed

  • A preview started while a clean is running is refused, instead of listing folders about to be deleted (7cf3d4e).

Build / CI

  • The release workflow publishes the release with this changelog as its notes. It refuses tags that are not on main, never replaces a published release, and checks the notarisation ticket on signed builds (3e22ac4, 831ccdd).

Picard 0.1.0

Choose a tag to compare

@github-actions github-actions released this 20 Oct 21:37

Open the .dmg and drag Picard to Applications.

The first release of Picard, a macOS menu bar app that watches free disk space
and removes build output and finished work when a drive runs low.

Added

  • Menu bar app with a live free-space line and an icon for the ok, low and cleaning states (ba31f0d, fe5c4ee, 20417e3).
  • config.toml with roots, thresholds, hysteresis and a cooldown. Picard reloads it while running and maps each root to its volume (411290d, df30927, 692b508, 313c6af).
  • Per-volume overrides in [[volume]], matched by volume UUID. An override for / also applies to the APFS Data volume (d0af5de, e14df92).
  • Ask, Auto and Off modes. Ask-mode alerts estimate how much space can be cleaned and offer a Clean button (b2cb955, 2df9d0f).
  • Cleanup tasks:
    • node_modules and cargo_clean for stale build folders (a2d7d78).
    • git_worktrees for merged or pushed worktrees, never with --force (ea03a4d).
    • python_venv for stale virtualenvs (ecd8212).
    • build_output for git-ignored build folders such as dist and .next (7b1e821).
    • tool_caches, which asks uv, Homebrew, the iOS Simulator and bun to prune their own caches on the low drive (6aed048).
    • command for your own cleanup scripts, with timeouts (bd02014, c27a621).
    • Optional npm and pnpm cache pruning after node_modules cleanup (dccbab5).
  • Runner with early stop, a cross-process run lock and a history.jsonl log of every removal (d60d5c8).
  • picard scan and picard run --yes on the command line (c464676).
  • Tool PATH taken from the login shell, with [tools] overrides (6e6dd50).
  • One window with Clean and Settings tabs. Settings lists every task with a checkbox and keeps the comments in config.toml when it saves (2213dbe, 8197759, 49f0aa1, 8a2d7b1).
  • Clean tab with an animated scanning panel, per-task select-all checkboxes and path tooltips (842a584, c04fb74).
  • Ignore a folder from the Clean tab. Picard never removes an ignored folder or any folder that holds one (ac7bb8b, 5ffd047, cb9158a, 4e8f08a).
  • Optional once-a-day scan at a set local time (215d9dc, 73d4f91, e1a22ab, b53eaff).
  • Launch at login and a native folder picker for roots (8197759, ea4fa1a).
  • Picard is released under the MIT License (37b48a3).

Security

  • Repository config cannot make git run programs during scans, including through submodules (582468f, c0875e0).
  • Picard refuses config.toml unless only the current user can change it, and reads it through one O_NOFOLLOW handle (8aa6f47, d1439db).
  • The command task only runs from a private config.toml (c27a621).

Fixed

  • Removals retry on ENOTEMPTY, and package cache pruning runs from the home folder (dc53850).
  • Staleness checks ignore folder modification times and .DS_Store (8453a19).
  • Worktrees are skipped only when their submodules are checked out (2c039c7).
  • build_output reads folder names literally in git checks (a222924).
  • Tool cache sizes show as a ceiling instead of 0 MB (3de5599).
  • Long paths and option text no longer wrap in the window (261db4d, 327364d).
  • Reloading the window stays on the active tab (b58136d).
  • The Cargo mode dropdown and day count sit on one row in Settings (534ad69).

Build / CI

  • Makefile for checks and local release builds (8e8bc24).
  • Release workflow that builds the .dmg and attaches it to a draft GitHub release. Actions are pinned to commit SHAs. Lint and tests run in a separate job with no signing secrets, and neither job uses the Actions cache (9c645fb, a411ea3, 8817cd4, f162bde, d6fe9ea).
  • Dependabot updates for actions/checkout, actions/setup-node and pnpm/action-setup (0758dc7, 65fcd6a, 5083ae1).

Testing

  • Disk image volume test (a918137).
  • Vitest tests for api.ts, Preview and Settings (5eeb28a).