gitstalk
Docs: Repositories

Repositories live

A repository holds your code, a bean branch for every change in flight, and its own checking engine. Create one, push a bean, and it is checked and landed with no other setup.

Create one

Open New repository from the + New menu in the header. Pick an owner (you, or an organization that lets you create repositories), a name, an optional description and a visibility, then choose how it starts.

Namegitstalk.dev / acme /
api
DescriptionOptional.
Payments service
VisibilityPrivate, Internal (organizations only) or Public.
Private
Start withTypeScript starter, Empty, or Import a public git repository.
TypeScript starter
Public git URLShown only when you choose Import.
https://github.com/acme/legacy-api.git
One form. Names are unique per owner, ignoring case. If anything fails on the way, the half-made repository is removed and the name is free again.
Start What you get
TypeScript starter A small library with no dependencies: a module, its test (Node's test runner), a package.json, a README and .gitstalk/checks.yml. The first bean is checked for real from the start.
Empty One commit with a README.
Import a public git repository Any public repository, for example https://github.com/fastify/fastify. Its default branch's history comes along and becomes the stalk. A private URL comes back as an error on the form: the message says it is not a public git repository (it asked for credentials or was not found).

Importing a private repository and two-way sync with another forge are planned.

From an agent, a script or a push

Three more ways create a repository, through the same path as the form, so the same names, owners and starters apply. Each needs the create scope: "may create repositories in namespaces where the person may create them". The setup script asks for it (the SSH key approval page shows it ticked), an agent's consent page offers it, and a token from Settings, Tokens can have it. A new repository is private and empty unless you ask otherwise.

Way How
An agent (MCP) repo_create({ name, owner?, visibility?, start?, description? }). It answers full_name, clone_url, web_url, stalk, visibility and next, the commands to run next. Listed only for sessions with create.
A script The setup script's create [OWNER/]NAME [--public] (the plugin's /gitstalk:new), or POST /api/repos yourself with Authorization: Bearer and a personal token that has create.
A push git push to an address where no repository is, with a credential that has create. The remote: lines name the new repository and its web address.
Terminal
curl -sS https://gitstalk.io/api/repos \
  -H "Authorization: Bearer $GITSTALK_TOKEN" -H 'content-type: application/json' \
  -d '{"name":"api","visibility":"private"}'
Answer Meaning
201 Created; the same JSON as repo_create
401 No token, or one that is expired or bound to one repository
403 The token has no create scope, or the owner is an organization where you may not create repositories
409 exists: the name is taken in that namespace
422 An invalid name; the message says which rule
429 More than 20 repositories created in the last hour

Every error body is {"error": {"code", "message"}}.

Push to create

Pushing to a missing owner/name.git creates it when your credential has create and the owner is you, or an organization whose members may create repositories. Push one branch: main, master, stalk or bean/<name>. That commit, with its history, becomes the first commit of the stalk; no bean is opened, because there was nothing to protect yet. From then on every push is an ordinary one: beans only, checked before they land.

Terminal
git remote add origin https://gitstalk.io/you/api.git
git push origin HEAD:refs/heads/bean/start
  • Without create, the push is refused with a hint: use repo_create, /new, or a credential with the scope.
  • A name you renamed away from still leads to the renamed repository while its redirect exists, so the push goes there and nothing is created.
  • A repository made empty by repo_create or the API holds a README until its first push, which then becomes its stalk, so an existing project keeps its history. Made empty on the web, the README stays and the first bean lands on it.

The start page

Until the first bean lands, the repository page has one job: show exactly how to begin. Everything is copyable.

acme / api private
1. Connect gitThree tabs: Plugin, HTTPS, Env vars.
Plugin | HTTPS | Env vars
2. Hand it to an agentSay this to a connected agent.
Work on acme/api on Gitstalk: clone it, make the change as a bean, and push it.
3. Or push a bean with gitFive commands.
git push -o wait origin bean/first-change
Clone itThe clone URL.
https://gitstalk.dev/acme/api.git
What counts as green.gitstalk/checks.yml
node --test, 120 s
The start page: connect git, hand it to an agent or push a first bean, the clone URL, the files on the stalk and what counts as green.

Connect git: three ways

Tab What it is for
Plugin The default. One line installs the Gitstalk plugin for Claude Code and runs /gitstalk:setup acme/api, which finds or makes an SSH key, asks you to approve it once in the browser and points git at the repository. Codex has its own line and a sentence to paste. See Connecting agents.
HTTPS Clone over HTTPS. When git asks for a password, paste a personal token with write access from Settings, Tokens; any user name works.
Env vars For CI and scripts: make a deploy token on the spot and copy a block that sets GITSTALK_TOKEN so git never prompts. The block needs git 2.31 or newer. Deploy tokens are made by an owner or a maintainer, and never on an archived repository. Settings, Deploy tokens shows the same block after the start page is gone.

The Code button

Once something has grown, the repository page opens on the Code tab, and the start page gives way to a Code button at the right of the bar above the files, where GitHub puts it. It opens a panel with three tabs; the last one you used opens next time. On a phone the panel is a sheet from the bottom of the screen. Escape or a click outside closes it.

stalk ▾Code ▾
HTTPSCopy the clone URL.
https://gitstalk.dev/acme/api.git
SSHShown once SSH is public.
SSH: coming soon
CloneOne line.
git clone https://gitstalk.dev/acme/api.git
Push a changeTo a bean branch.
git push origin HEAD:bean/<name>
Clone: the HTTPS URL, SSH (marked coming soon until it is public), the clone command and how to push a change back. Every address is the deployment's own.
Tab What it holds Status
Clone The HTTPS clone URL, SSH (live once the deployment serves it), a git clone line and git push origin HEAD:bean/<name>, each with a copy button. Below them: where git's password comes from (a personal token from Settings, Tokens) and, for owners and maintainers, a link to Settings, Deploy tokens for CI. Without JavaScript the button still opens this tab. live
Agent Claude Code, Codex, Cursor, Gemini CLI and any other MCP client, one tab each, with the lines that connect that agent to this repository and what to ask it next. For Claude Code that is the plugin plus /gitstalk:setup acme/api. The harness you pick is shared with the install page. Links to the plugin and to Connecting agents. live
Submit intent Describe what you want, and Gitstalk opens a bean with your intent for an agent to pick up. Shown, but not working yet. planned

The file tree

The Code tab's left pane has two tabs, Stalk and Files. On a folder (the front page included) it shows the beanstalk: beans growing at the tip and landings down the line, each linking to its page in Changes. Open a file and it switches to the file tree; either tab is a click away, and opening a folder brings the stalk back.

In the Files tab a folder tree sits beside whatever you open, as in an editor: the tree on the left, the file (or the folder and its README) on the right, and the bar with the line or bean you are browsing across both. The tree opens down to the open file and highlights it, and a green line runs down the indent guides from the top folder to it. Opening a file keeps the tree as it was: the folders you opened stay open and the tree keeps its scroll. The address is always the file's own, so a link or a refresh opens the same place. Switching to the sprout or a bean switches both sides.

Filter open folders
docs
src
server
routes
health.ts
users.ts
app.ts
index.ts
package.json
README.md
38 lines, 1.2 KB
import { Hono } from 'hono'; export const users = new Hono(); users.get('/:id', async (c) => { const id = c.req.param('id'); return c.json(await find(id)); });
The tree open down to users.ts, the file beside it. Line numbers link to the line.
To Do this
Open a folder in the tree Click it, or press the right arrow. A folder's files are read once for each commit and kept, so opening it again is instant. Ctrl-click (Cmd-click) opens the folder's own page.
Move with the keyboard Tab into the tree, then the up and down arrows to move, right and left to open and close a folder (or step into it and back out), Home and End for the first and last rows, Enter to open a file, * to open every folder beside the current one. Type the start of a name to jump to it.
Find a file by name Press t (or Go to file) and type a few letters of its path; the best matches come first, those in the file's name ahead of those in its folders. The arrows choose, Enter opens, Escape closes. The filter box at the top of the tree only narrows the folders you have opened.
Make room Drag the edge between the tree and the file, or focus it and use the arrow keys (Shift for bigger steps, Home and End for the narrowest and widest). Hide or show the tree with Files or Ctrl+B (Cmd+B on a Mac). Your browser remembers the width and whether the tree is hidden.
Use a phone Below 1024 pixels wide the file takes the page and the tree opens as a drawer from Files. Opening a file, Escape or a tap outside closes it. Long lines scroll inside the code, never the page.

A tour of the tabs

Every repository has the same seven tabs. Everyone who may see the repository sees the tabs; the Settings tab shows for people with a role.

acme / api private

Code: files, README, beans. Changes: open, landed, parked.

bean/add-truncate claude-code, 12 s ago checking
bean/rename-cache codex, 14 min ago red
bean/fix-retry ada, 2 h ago landed
bean/docs-links ada, yesterday on the stalk
The Changes tab shows one list at a time (Open, Landed or Parked); this mock mixes them. The number beside the tab counts beans in check, red or waiting.
Tab What it shows Status
Code The front page. Folders and files at the stalk, the sprout, any pushed bean or any commit, with syntax highlighting and a rendered README, and the beanstalk beside a folder and the file tree beside a file. A side column shows the description and how many beans are on the stalk; the Code button clones it or connects an agent. Before the first bean it is the start page above. live
Changes Beans in three lists: open (in check, red, conflict, waiting), landed and parked. A bean's page tells its journey: each push, the pre-land check with its failing tests, rework, landing, validation and any decision card. The list updates live. live
History The stalk's commits, and above them the sprout commits that landed but are not validated yet, with every validation verdict. live
Automations One tab, two views: Actions (your .github/workflows and their runs) and Automations (agents and scripts in .gitstalk/automations). See GitHub Actions and Automations. live
Ask Type a question in plain words (what changed on coupons?) and the page reshapes around the answer: the files, their diffs and the beans behind them. Live answers still take a few seconds. live
People Who has access, and every session and token that cloned or pushed. See Collaborators and visibility. live
Settings One page per section, from General to Danger zone. See the Settings map. live
Insights Landing rate, waiting time and rework per person and agent. planned

There is no separate Home or Stalk tab. The old Stalk address redirects to History. The pages work at night, by day and at phone width.

Reading History

On the sprout, not validated yet 1 commit landed
The stalk: Add percentage discounts validated, 3 h ago green
The stalk: Fix retry backoff validated, yesterday green
Landed means on the sprout. Green means validated on the stalk. The Concepts page explains the difference.

Renamed and moved

live When a repository is renamed or moved to another owner (you to an organization, an organization to you, or between organizations), its old address keeps working, so existing clones, CI and agent setups do not break.

Where What happens at the old address
Web Pages redirect to the repository's home at the new address.
Git Clone, fetch and push keep working at the old remote. Git does not follow a redirect on a push, so the old address is served in place. A push there prints where the repository is now and the line to switch.
Agents MCP tools that take owner/name accept the old name.
$ git push origin bean/first-change
remote: gitstalk: this repository moved to acme/payments; the old address keeps working.
remote: gitstalk: to use the new one: git remote set-url origin https://gitstalk.dev/acme/payments.git
The push still works; the remote lines tell you how to switch.
  • Renames chain: after a to b to c, both a and b lead to c. An old handle and an old name together still work.
  • An old address stops redirecting once someone creates a repository with exactly that owner and name, as on GitHub. Deleting the repository removes its old addresses.
  • An internal repository moved to a person becomes private, because only organizations have internal repositories.

Archive, transfer, delete

These live in Settings, Danger zone, which the owner sees. Each asks before it acts.

ArchiveRead-only. It still clones and fetches.
Archive acme/api
TransferTo you, or an organization where you are an owner or admin.
Transfer
Delete this repositoryType acme/api to confirm.
Delete acme/api
Archive and transfer ask in a dialog. Delete asks you to type the full name.
Action What it does
Archive Makes it read-only: reads and clones keep working, while pushes, decision answers, deploy tokens, workflow runs and Actions secret changes are refused, and it leaves Home. Name, description and visibility are fixed until you unarchive.
Transfer Moves it, with its history, beans, collaborators and deploy tokens. The old address keeps working (above).
Delete Removes its history, beans and decisions for good. Agents connected to it lose access at once.

Renaming, the description and the social image are in Settings, where profile and upload details also live.

Good to know

  • Storage is named by id, so renaming never moves git data.
  • Teams are not built yet (planned). Give access person by person or through an organization.
  • Organization handles cannot be changed yet.

Sources