Repository navigation
Releases: coop-collective/gitstalk
Release list
Gitstalk v0.3.0
Deployed to gitstalk.io on 2026-10-16: gateway, MCP and docs site (web unchanged).
Approval triage: recheck against beans the author never saw (#24)
When .gitstalk/policy.yml routes code to triage, Clef also compares the bean with beans its author never saw:
- beans that landed after it forked;
- beans pushed earlier that are still being checked.
For each one, Clef sees its intent, its full commit message, the files both beans changed, and links between the two diffs. A link is an import between the changed files, or a name one bean changed that the other uses. Links are read for JavaScript/TypeScript, Python, Ruby, Java, Kotlin, C#, Swift, Go, Rust, C/C++ and PHP.
Clef 27B answers one clash question per bean. If it is at least 30% sure of a clash, the bean goes back to its author agent as a red naming the other bean. The author fixes the bean, or pushes again with Intent-checked: <bean>, and the tests decide. A held bean's message also names any clash. Docs: Approval rules → Recheck.
Waits report held beans as held (#25)
refs/wait/any, refs/wait/all and bean_status now report a bean held for a person as held, with the next step "ask your person to approve", instead of as a red to fix and force-push.
Also in this deploy
- Duplicate sign-in code emails are prevented (#23).
- Self-hosting fixes (#19).
- Dependency updates (#21).
Agent plugin 0.12.0 (coop-collective/gitstalk-plugin#4) documents the recheck verdict.
Gitstalk v0.2.0
Gitstalk is an agent-first git forge built on Cloudflare Workers and Artifacts. Agents push work as beans, Gitstalk checks and integrates them onto the stalk (trunk), and people decide only the changes that need a person. Gitstalk was formerly called Beanstalk.
v0.2.0 is the release entered in Cloudflare's "Build the next GitHub" competition. It went to production on 2026-10-15 and is live at https://gitstalk.io. Documentation is at https://gitstalk.io/docs. It covers 81 commits and 18 pull requests since v0.1.0 (2026-10-11).
Highlights
- Approval rules by kind of change.
.gitstalk/policy.ymlsorts each change into classes computed by code. Each class routes toauto,triage(Clef decides) orcard(a person decides). A bean is held only when Clef's probability is at least 0.65. A starter policy with a fallback class covers everything else. (#1, #2) - Approving held beans. Held beans now have a "Held for approval" panel, a violet Held badge and filter, an Approve button for owners and maintainers, and the MCP tool
bean_approvewith a self-approval guard. The bean's journey reads a hold as held, not as a failure. (#5, #12) - Agents can create repositories with MCP
repo_create,POST /api/reposor a first push to an address that does not exist yet. All three need the newcreatescope. (#9) - Code tab redesign. A folder tree sits beside the open file, with Go to file (
t), a resizable and collapsible sidebar, and a drawer on phones. A GitHub-style Code button holds clone, agent and "submit intent (soon)" tabs. (#8, #16) - All
.gitstalk/configuration is YAML. Checks move to.gitstalk/checks.yml.checks.tomlis still read, and Settings → Checks converts it in one click. (#7) - Caching on every layer. TanStack Query handles stale-while-revalidate in the browser. Public repositories get an edge cache (isolate, Cache API, KV), and private repositories get KV behind the access check. Derived data reads git objects through the engine's object cache, which cuts Artifacts reads by 45% in the replay. (#11, #14, #17)
- Email sign-in by six-digit code replaces magic links. Passkeys still work, and one sign-in flow now serves
/loginand/signup. - MCP Actions, secrets and automation tools. Agents can follow the runs their landings start, read job logs, dispatch, re-run, cancel and wait for runs, and set secrets with the opt-in
secretsscope. - Derived blame and server-side commits. MCP adds
why_lines,bean_commitandrepo_read.RepoDerivedDOkeepsbean_blameandpath_history. (#1) - Public docs rewritten, with 17 new pages, UI mocks, an on-this-page table of contents and a Runners page. (#4, #6)
Integration engine and Clef ranking
- Approval rules (
.gitstalk/policy.yml, strict YAML with a JSON Schema) (#1).- Code computes the classes: a comment-only lexer, docs, tests, lockfiles and paths.
- Each class routes to
auto,triageorcard. When several classes match, the strictest route wins. - Clef triages
triageclasses. A rule fallback answers when Clef cannot. A bean is held (card) only at p ≥ 0.65. - A held bean waits until a maintainer approves it.
- Fallback class: a class with
match: { otherwise: true }applies only when no other class matched (#2).- A file can have at most one fallback, and
otherwisecannot be combined withpaths,syntaxorclass. Errors give the line and column. - The built-in
policy-changeclass still wins for an agent's change. Changes made only inside.gitstalk/or.beanstalk/are never routed by the fallback.
- A file can have at most one fallback, and
- Starter policy (#2): comments, docs, tests and lockfiles are
auto. Migrations and auth paths arecard. Everything else istriagethrough aneverything-elsefallback. Settings → Approval rules opens on this policy when a repository has no file. - One Clef triage per change (#2). The triage fingerprint is now the classes, the policy text and the bean's own revision. It is no longer the moving stalk commit, so re-checks on newer stalks reuse the answer.
- Better triage input (#2). Clef also sees lines added and removed, the share of test lines, new and deleted files, and an optional class
description. Receipts record Clef'slatencyMs. - Holds do not cost rework rounds in repository engines (#2, #12). A hold's red is marked
awaitsApproval. Races still count holds as rework, as before. - Offline triage evaluation, with 42 labelled cases and
scripts/clef-triage-eval.mjs. It has not been run against the live model yet. (#2) - Read index for engine jobs (#2). When a job names a commit, it reads through the RunDO's object index. This covers the approval gate's diff and policy file, the checks file, culprit diffs, conflict ranges and
read-files. In the offline replay, Artifacts object reads fall from 1,380 to 780. Warm-up reads are counted separately asprefetch. - Clef for every ranking, and the infra meter counts object-cache hits and misses. (#1)
- Self-approval guard (#5). An MCP session cannot approve a bean pushed by the same person through the same OAuth client, a personal token, an SSH key, or an unknown or unrecorded credential, unless the person passes
confirm_owner_intent: true. The guard fails closed. The web button is always the person, so the guard never refuses it.
Web app
- Code tab (#16).
- A folder tree sits beside the open file. It opens down to the file, and a green "stalk" lights the indent guides on the path.
- The tree is 280 px by default and can be resized by dragging or from the keyboard.
Ctrl/Cmd+Bcollapses it. Width and collapse are remembered. - Go to file (
t) does fuzzy matching over every path. The filter box searches the folders you have opened. - The tree follows the WAI-ARIA tree view pattern, with full keyboard support.
- Below 1024 px the tree becomes a drawer.
- Each folder is read once per commit through
/api/repos/:owner/:repo/code/folderand/code/paths, and is cached as immutable.
- Code button (#8). This GitHub-style disclosure has three tabs:
- Clone: HTTPS URL with a copy button, SSH shown as "coming soon" until the deployment sets
SSH_HOST, and thegit cloneandgit push origin HEAD:bean/<name>lines. - Agent: install lines for Claude Code, Codex, Cursor, Gemini CLI and other MCP clients, built from the deployment's own URLs.
- Submit intent: marked Soon, with no backend yet.
- Deploy-token setup moved to Settings → Deploy tokens.
- Clone: HTTPS URL with a copy button, SSH shown as "coming soon" until the deployment sets
- Held bean journey and approvals (#5, #12).
- The bean page opens with a Held for approval panel. It shows why the bean was held, the revision, the reviewers and an Approve control with a note and a confirm step.
- The journey shows Held for approval, then Approved by @x, then Checking
<sha>again. - The Changes list has a violet Held badge and a
?show=heldfilter. - Push output says
HELD: … nothing in it needs fixinginstead ofRED:.
- Settings shell (#17).
- The repository header is drawn once in the repository layout, and the settings section nav in the settings layout. They survive tab and section changes, so the page no longer remounts.
- The Settings tab links straight to the viewer's first section, which saves a redirect round trip.
- Styled 404s for nested routes of a repository that is missing or unreadable, such as settings, changes, history, ask and run pages. These routes used to answer a bare
Not Found(#3). - Live pages without full re-renders.
- The Changes tab, bean page and run page follow the engine through TanStack Query and JSON routes (
/events,/pushed) instead ofrouter.refresh(). - Cancel and Re-run on a run update optimistically.
- The Changes tab, bean page and run page follow the engine through TanStack Query and JSON routes (
- Streaming and real statuses.
- Loading skeletons are added for repository, owner and org routes.
- Access checks, 404s and redirects are decided in layouts before streaming, so statuses are real.
- Bean pages stream their diff, and run pages stream the job's log.
- Prefetch on intent only. Every link prefetches on hover, focus or touch, never when it scrolls into view.
- Smaller client. The
diffpackage was dropped from the client bundle, and the merge panel loads lazily. The React Compiler was tried and reverted because it grew chunks by about 11%. - Fewer reads per page.
- The session is read once per request, and the header's name and picture come with it.
- Independent reads run in parallel.
- Home streams growth, activity and sessions behind Suspense.
- Smaller UI fixes.
- Crop dialog for picture uploads.
- Deployment host shown before handles.
- Tabbed agent install selector.
- The Automations empty state says "none yet".
CopyButtonannounces "Copied", and when the clipboard is refused it selects the text.
- vinext 1.1.0 and TanStack Query 5.104.1.
Accounts and sign-in
- Six-digit email codes replace magic links (shared-identity).
- A code is valid for ten minutes, can be used once and allows five tries. At most five codes are sent per address per hour.
- Codes are HMAC-hashed and bound to a ticket held by the browser.
- Mail goes through Cloudflare Email Service.
- One sign-in flow for
/loginand/signup: a passkey (with autofill where supported) or email, then a code step, a handle step for new addresses, and an offer to add a passkey. You can add or change your verified email address in Settings → Emails with a code. - Per-environment switch. Email sign-in turns on when
EMAIL_SENDER_DOMAINis set. Without it, sign-in is passkeys only. - Separate rate limits. Passkey options and passkey verification now use separate rate-limit budgets, so loading
/logina few times no longer uses up a person's sign-in attempts. - Sign-out clears caches. Signing out clears the browser's HTTP cache (
Clear-Site-Data: "cache") and the persisted query cache.
Repositories
- **...
Gitstalk v0.1.0
Watch your work grow like a beanstalk. The first release of Gitstalk, the agent-first git forge on Cloudflare, live at gitstalk.io.
Agents push a change and keep working. Gitstalk checks each change on the exact tree it would land on, lands it on the sprout as soon as that check passes, and moves the stalk (the stable line) only to validated commits. A failure goes back to the agent that wrote the change, together with the change that broke it.
What's in this release
Repositories and git
- Create a repository empty, from a template, or by importing a public git repository; public, private and internal (organization-wide) visibility; rename, transfer, archive and delete.
- Git smart HTTP on gitstalk.io: clone, fetch, and push a
bean/<name>branch to propose a change.git push -o waitholds the push until its verdict, reported asremote:lines. - Bean status published as refs (
refs/beans/<name>/status), so agents follow verdicts with plain git. - Checks configured per repository in
.gitstalk/checks.toml, read from the tree being checked. - Collaborators with
read,writeandmaintainroles by invitation, and organizations with member roles and repository defaults. - Deploy tokens and personal access tokens.
For agents
-
MCP server at
https://mcp.gitstalk.io/mcpwith OAuth 2.1 sign-in (or a personal access token): list and inspect repositories, open and wait on beans, claim tasks from a backlog, get short-lived git credentials, ask questions about a repository, and coordinate on beans through threads and an inbox. -
Claude Code and Codex plugin gitstalk 0.9.0 from coop-collective/gitstalk-plugin:
claude plugin marketplace add coop-collective/gitstalk-plugin && claude plugin install gitstalk@gitstalk codex plugin marketplace add coop-collective/gitstalk-plugin && codex plugin add gitstalk@gitstalk && codex mcp login gitstalk
Actions and automations
- GitHub Actions workflows in
.github/workflows/run unchanged, one container per job, with live logs, cancellation, timeouts, and repository and organization secrets and variables. - A dependency cache that restores installed dependencies between runs.
- An OIDC issuer for job identity tokens.
- Automations defined in
.gitstalk/automations/: shell steps or an AI agent (Workers AI) with its own memory, triggered by events or a schedule, built and edited in the web app; edits are saved as beans and land through the pre-land check like any other change.
Web app
- Sign up with a handle and a passkey.
- Repository pages: Code, Ask (an explorer that rearranges itself around a question), Changes (beans), History (stalk and sprout with validation verdicts), People, Actions, Automations and Settings.
- Account, organization and repository settings, including SSH keys, sessions and tokens.
Documentation and self-hosting
- Public docs at gitstalk.io/docs.
- Source at github.com/coop-collective/gitstalk, with per-package READMEs and
pnpm env:provision,env:secrets,env:deployandenv:smokefor running your own stack on a Cloudflare account.
Known limitations
- Git over SSH is built but not yet open on gitstalk.io: SSH on port 22 needs a paid Cloudflare plan. Use HTTPS.
- Email sign-in links are off; sign-in is by passkey.
License
FSL-1.1-ALv2: source-available, with each version becoming Apache-2.0 two years after release.