Skip to content
Goatfied

Changelog

What's new in Goatfied.

What shipped, why it matters, and how to use it. Updated as releases land — roughly weekly.

Aug 11, 2026

A session tells you where its work stands

Each session in the sidebar now shows how far its changes have got — edited, committed, pushed, in review, merged — without you opening it.

An agent that has been working for ten minutes has left something behind, and until now the only way to find out what was to open the session and look. Every session with a checkout of its own now carries a small mark for the stage its work has reached: changes still sitting in the folder, commits that have not left this machine, everything pushed, a pull request in draft or waiting on review, merged, or closed without merging. Hovering names the branch, counts the commits, or gives the pull request number.

The four review marks use the shapes and colours you already know from a pull request page, so a green mark means the same thing in the sidebar as it does in a browser tab. Everything before review stays plain, and a session with nothing to push, in a folder with no remote, shows nothing at all rather than a warning you cannot act on.

Because it is one journey rather than a set of flags, exactly one mark shows at a time, and work that is still on your disk takes precedence over work that is in review — a session with an open pull request and fresh edits tells you about the edits, since the pull request does not have them yet. The PR filters in the sessions menu now filter by the same reading; before this they matched nothing.

Alongside it, the word Local has gone. A session running on a remote machine carries a cloud mark; a session without one is on this machine, which is the ordinary case and did not need saying.

Builds 2.20.0, 2.19.0

Aug 9, 2026

The sidebar stops listing your repositories twice

Sessions already group by repository, so the separate Repositories list has gone and the space has gone to your sessions.

The sidebar used to draw your repositories twice: once as headings over the sessions inside them, and again as a list underneath. The list is gone. Grouping keeps the job, and the sessions get most of the height it was using. The two buttons that sat beside it — the one that opens or clones a repository, and the one that groups and filters — now sit beside Sessions, next to the work they act on. Closing a repository moved into the first of those menus.

Grouping by repository used to be the same thing as grouping by workspace under a different name; both listed folders. Repository now means the repository: two checkouts or worktrees of one project gather under a single heading instead of reading as unrelated folders. Workspace still groups by folder, for when that is the distinction you care about.

Small things around a session followed. A group you are working in offers a plus to start another session in the same repository without leaving the list. Pinning moved to the front of the row you are on, where it reads as something you can press rather than something hidden until you hover. Sessions running on a remote machine carry a cloud mark that stays put, because where a session's files live is worth knowing at a glance. And Customize is now called Marketplace, which is what it has been for a while.

Build 2.18.0

Aug 12, 2026

Commit the way you actually work

A new Git, Commits & PRs settings page decides what happens between an agent finishing and the work reaching a branch — including doing all of it for you.

Two people can use Goatfied in opposite ways and both be right. One reads every hunk before anything is committed and wants a branch per session. Another describes the task, trusts the result, and wants it committed and pushed without ever opening a diff. Until now the app had one opinion and everyone else worked around it.

Settings has a new Git, Commits & PRs page. The big button at the bottom of a session now does whatever you tell it to — commit, commit and push, branch and push, or open a pull request — with the rest still one click away in its menu. Commit messages can be written by the model from the diff instead of listing filenames. And if you would rather not press anything at all, the app can run any of those actions automatically the moment a session finishes, skipping runs that failed or changed nothing.

The same page decides what the review list does. Files you have ticked off can stay listed and dimmed, fold into a group, or disappear; the changes bar itself can go once you have been through everything; and the change count beside a session in the sidebar can show the whole session or only what is left to look at. Undo now counts properly in all of them — a file you have undone leaves the list and stops being counted, because those lines are no longer anywhere on disk.

Attribution moved here too, and now does something. The commit and pull request toggles have been in Settings for a long time without writing anything; they work from this release, they are off by default, and you choose which trailer they add — a plain “Made with Goatfied” note, or the Co-authored-by form that GitHub reads into contributor lists. Nothing is added to your commits unless you ask for it.

Build 2.17.0

Aug 11, 2026

Undo an agent's edit without losing your own

Undo now puts a file back exactly as the agent found it, and the review list remembers which files you have already been through.

Undoing a single file used to mean returning it to your last commit. That is fine if you had not touched the file yourself, and quietly destructive if you had: any work of your own that was sitting uncommitted in that file went along with the agent's. It is exactly the sort of thing you only discover afterwards.

Goatfied already takes a snapshot of your project before a session starts, so that you can rewind a whole conversation. Undo now reads from that snapshot instead. A file goes back to the state the agent inherited — your own unsaved-to-history changes included — and a file the agent created is simply removed. Where there is genuinely no earlier version to restore, Undo says so and stops, rather than guessing and deleting something you wrote.

The tick beside each file changed too. It used to hide a row and forget it the moment you looked at another session; on a large changeset that meant starting your review from the top again after every switch. It is now a Reviewed marker that stays with the session, so the count in the header is a real measure of what is left. If a later turn edits a file you had already ticked, the tick clears itself and the file comes back — you have not seen that version. None of it depends on version control, so a plain folder gets the same running tally as a repository does.

Build 2.16.0

Aug 10, 2026

Your project can now refuse to let an agent finish

Point Goatfied at the command that decides whether your work is done, and no agent can call itself finished until that command is happy.

Asking an agent to verify its own work gets you a long way, and the last release made that a rule rather than a suggestion. But it is still the agent marking its own homework. If it convinces itself the job is complete, nothing downstream disagrees.

Now something can. A stop hook is a command your project owns, and it runs at the moment an agent tries to finish. If it exits with a refusal, the agent does not finish — it is told, in your hook's own words, what is still wrong, and it goes back to work. Point it at your test suite, your type-checker, your linter, or a script that checks all three, and "done" stops being an opinion.

It cannot be walked around and it cannot trap you. Every route an agent has out of a task goes through the same gate, so it cannot finish by phrasing things differently. And a hook that can never be satisfied — a genuinely broken test, a service that is down — gets a limited number of refusals before the run is allowed to end and tell you what happened, rather than burning your budget arguing with a condition it cannot reach. Projects with no stop hook behave exactly as before; nothing runs and nothing changes.

Set one up

  1. Create .goatfied/hooks.json in your project.
  2. Add: {"hooks":{"stop":[{"command":"./verify.sh","type":"command"}]}}
  3. In verify.sh, run whatever proves the work: tests, a build, a linter.
  4. Exit 0 to let the agent finish. Exit 2, printing the reason on stderr, to send it back to work.

Build 2.15.0

Changelog · Page 7 · Goatfied