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.
| 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.
|
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.
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: userepo_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_createor 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.
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.
| 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.
| 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.
| 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
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
-
Renames chain: after
atobtoc, bothaandblead toc. 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.
| 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.