Skip to content

Where people and agents ship software together. The open-source git platform for the whole job: issues, agents, checks and deploys to the edge.

2branchesTags
syntaqxRepositories can be forked into a workspace, and pull requests merge by merge commit, squash, rebase or fast-forward, with every repository setting for pull requests, commits, pushes and issues. Forks: a fork is an ordinary repository with parent_id (repos 0019; fork_of still means only a pull request's hidden working copy) and forked_from, which is never cleared. Forking (web Fork button and page, POST /repos/{owner}/{name}/forks, MCP repository.fork, g1t repo fork) copies the code (the default branch only unless asked) and description, nothing else; Actions (actions 0023, Settings → Actions → Run workflows) and Issues (work has_issues) start off in a fork and stay off once it is detached unless someone turns them on. Public repositories can always be forked, private ones only with Allow forking, and the fork stays private; an hourly sweep deletes (restorably) a private fork whose maker can no longer read its parent (identity can_read_repo). A fork counts at its full size toward its workspace's storage, and a free workspace's private cap is checked first. Artifacts forks in the source's namespace, or the code is copied when the workspace keeps its data in the EU. A fork cannot change its visibility; a parent going public or private detaches its forks (repo.detached), and a purged parent's forks move to its parent. Sync fork (POST merge-upstream, g1t repo sync) fast-forwards, merges line by line, or names the clashing files, under the fork's own rules. Pull requests from a fork's branch (head_repo, work 0041) are reviewed, checked and merged on the parent; their runs are untrusted (no secrets, read-only token) whoever opened them; a reader of the parent sees a private fork's pull request diff only through commits the parent already holds; forks list, detach and the new-pull-request head picker complete it. A token for chosen repositories can no longer create a repository by forking or creating one. Merging: repos land makes merge commits, squashes (author the pull request's, Co-authored-by for the others, Signed-off-by where required) and rebases with line-level three-way merges, refusing with the clashing files, and fast-forward lands the checked commit as before; limits are 1,000 files, 100 line merges and 250 rebased commits. Update branch merges or rebases (PUT update-branch, g1t pr update-branch --rebase), honouring expected_head. Work (0042) adds the settings: allowed methods and the default, default messages for merge and squash with custom templates ({title} {number} {body} {branch} {head_repo} {base} {author} {commits} {issues} {co_authors}), always suggest updating branches, allow auto-merge, delete head branches on merge, require sign-off on web commits, allow commit comments, auto-close issues; merge_choices tells the merge box what may be used and the default messages. Rules' allowed_merge_methods are enforced and linear history refuses merge commits. A behind pull request, a fork's included, now merges directly unless it must be up to date. Auto-merge per pull request (PUT/DELETE auto-merge, g1t pr merge --auto) merges as whoever turned it on, checked against their access now and then, and turns itself off with a note and a notification when it no longer can, or when someone else pushes. Closing keywords (Fixes #12, closes owner/repo#3) close every issue named; head branches are deleted and restored from the pull request. Commit comments (work 0043) on a commit or a line, with notifications and commit_comment.* events; a per-push branch and tag limit (repos 0020, max_ref_updates); Include Git LFS objects in archives is shown, off and marked coming soon. The site's settings, merge box (methods, messages, auto-merge, update, delete and restore branch), commit page comments, fork pages and sync bar; the API (fork, forks, sync, detach, actions permissions, merge options, update branch, auto-merge, head branch, commit comments), MCP and CLI; docs: forking guide, forks concept page, pull requests, managing repositories, rules, Actions, webhooks, limitations, MCP reference and llms.txt. Deploy migrations first: repos 0019 and 0020, work 0041 to 0043, actions 0023; then identity, repos, work, actions, security, events, the API and the site together. Not yet: the merge queue lands the combination it tested as it is, whatever method was asked; Actions reads its settings more often than it needs; rebase force-moves branches in the git store, to be confirmed live. Checked: cargo test --workspace (repos 333, contracts 309, api 202, work 184, identity 174, actions 111, security 89, rules 74, events 57, the CLI's 105 and 51, all others passing), wasm32 checks of repos, work, actions, api, identity, security, events and search, the site's typecheck, tests (926) and production build, the contracts' and mobile app's typechecks, and the docs build; the site's new pages rendered with fixtures.

README.md

g1t

Git tracks changes. g1t coordinates change.

g1t is a git platform built for teams whose code is written by people and their coding agents at the same time. You keep your own harness (Claude Code, Codex, Cursor, Copilot or anything that speaks MCP); g1t is the place they all work through. It hosts the repositories, shows who and what is working on each project right now, keeps parallel work from colliding, tests changes together before they land, deploys them, and remembers why each change was made.

g1t is MIT-licensed and in alpha. Use it on g1t.sh (anyone can sign up), or run it yourself. It runs on Cloudflare Workers, with repositories in Cloudflare Artifacts, and the core runs in Docker.

Try it

# 1. Sign up and make a workspace at https://g1t.sh/register.

# 2. Install the g1t CLI (Windows: irm https://g1t.sh/install.ps1 | iex).
curl -fsSL https://g1t.sh/install | sh
g1t auth login

# 3. Install g1t's Claude Code plugin. It adds g1t's MCP server and records
#    your sessions; run /mcp in Claude Code and sign plugin:g1t:g1t in.
claude plugin marketplace add https://g1t.sh/flagon-io/g1t.git
claude plugin install g1t@g1t
sh

Then work as you always do in a g1t repository: the session shows on the project's page as it runs. Getting started walks through it in full, and Connect a coding agent sets up other harnesses. An assistant can do it for you from https://g1t.sh/llms.txt.

What's in it

Coordinating agents

  • Sessions. Every run of a coding agent is recorded as it works: its prompts, tool calls, subagents, branches, commits and pull requests. Work that is not an issue yet is a session titled by what it is for. The Claude Code plugin does it with no setup; any harness can with the CLI or MCP.
  • Live now. A project's page shows who is working on it right now and with which harness, grouped by issue, pull request or branch.
  • Claims. Advisory, expiring claims on issues, so two agents don't do the same work, with hand-offs between sessions and coordination events (g1t work events --follow, or over MCP) when work overlaps.
  • Integration. The merge queue tests changes together before they land, tests smaller combinations to narrow a failure without assuming a single culprit, and sends the evidence to the session responsible for repair.
  • Why-blame and decisions. g1t why file:line answers why code is as it is: its commit, pull request, issue, the decisions recorded along the way, and the sessions behind it.
  • Ask g1t. Ask about your work from any page, or by messaging @g1t. It answers with your workspace's own AI provider and reads g1t as you.

Code

  • Public and private repositories, git over HTTPS, creating a repository by pushing to it, GitHub import (every branch and tag, and issues).
  • Issues, milestones, labels, pull requests, line comments and reviews.
  • Required checks, rulesets, CODEOWNERS and the merge queue.
  • Workflows from .g1t/workflows in GitHub Actions syntax, on g1t's Linux runners or self-hosted ones on Linux, macOS and Windows, with caches, secrets and variables.
  • Packages: npm, Cargo, Composer, Maven, NuGet, RubyGems, Go modules and container images.
  • Secret push protection, history scanning and dependency update pull requests.

Deployments and observability

  • A preview of every pull request on g1t.page, production on merge, custom domains. Static sites, Workers and containers, chosen from the project.
  • Logs, traces, metrics and errors from your apps over OpenTelemetry.

The workspace

  • Chat: channels, direct messages and threads, live.
  • Artifacts: docs written together, live, with comments, suggestions and history.
  • Home, notifications with browser push, people and teams, roles, invites.
  • A desktop app for Windows and Linux that can also be a runner for your workspace, and an Android app in testing (g1t.sh/download).

Extend

  • REST API, OpenAPI, an MCP server, webhooks and the g1t CLI, all from one set of operations.
  • Integrations: your own AI providers, Sentry, Datadog and webhook alerts, Jira and Linear.
  • Usage billing with no seats and a public price book.

Layout

PathWhat it isLanguage
apps/webThe site: server-rendered React on a Worker. Holds no data.TypeScript
apps/docsThe documentation site, with the API explorer.TypeScript
apps/apiREST API and MCP server.Rust
apps/desktopThe desktop app (Tauri), with a runner inside.Rust, TypeScript
apps/mobileThe phone app (Expo).TypeScript
apps/statusThe status page at status.g1t.sh.TypeScript
apps/sudog1t's own staff console.TypeScript
services/identityAccounts, workspaces, sessions, keys, tokens and invites.Rust
services/reposRepository registry, contents, forks, diffs, landing, git over HTTPS.Rust
services/workIssues, pull requests, reviews, check runs, agent sessions, claims and the merge queue.Rust
services/eventsThe event bus and its log.Rust
services/searchSite-wide search and Explore.Rust
services/billingUsage, the price book, limits, invoices and payments.Rust
services/actionsWorkflows, runs, caches and self-hosted runners.Rust
services/securityPush protection findings, history scanning and dependency updates.Rust
services/integrationsAI providers, Ask, alerts, trackers and the GitHub App.Rust
services/webhooksWebhook deliveries.Rust
services/packagesThe package registries and container images.Rust
services/runnerStarts sandboxes for workflow jobs, builds and the merge queue.TypeScript
services/projectsProjects: what a workspace builds and runs, and where its code lives.TypeScript
services/deploymentsBuilds, previews and production on g1t.page.TypeScript
services/pagesServes every app deployed on g1t.page, and custom domains.TypeScript
services/telemetryObservability: OpenTelemetry ingest, logs, traces, metrics and errors.TypeScript
services/chatChannels, direct messages, threads and their live sockets.TypeScript
services/artifactsDocs: their spaces, sharing and live editing.TypeScript
services/notifyNotifications: each person's feed, live counts and browser push.TypeScript
services/ogSocial cards at og.g1t.sh: a PNG per page, showing only what anyone may see.TypeScript
crates/g1tThe g1t command line.Rust
crates/runnerThe program inside a sandbox, and the self-hosted runner: runs a workflow job or a build and reports back.Rust
crates/contractsTypes and service interfaces for the Rust services.Rust
crates/kitPlumbing shared by Rust services on Workers.Rust
crates/rulesThe rules engine for rulesets on branches and tags.Rust
crates/blobstoreObject storage: R2 on Cloudflare, any S3-compatible store self-hosted.Rust
crates/actionsReads workflows and evaluates their expressions.Rust
crates/scanSecret and lockfile scanning, shared by services.Rust
crates/secretsSecrets at rest and signatures.Rust
crates/sshdGit over SSH, bridged to Cloudflare Artifacts. Not deployed.Rust
packages/contractsThe same interfaces for TypeScript callers.TypeScript
packages/themeDesign tokens and the logo, shared by the site and the docs.CSS
plugins/claude-codeg1t's Claude Code plugin: hooks, skills and commands.JavaScript
plugins/other-harnessesThe AGENTS.md snippet for Codex, Cursor and other harnesses.Markdown
deploystack.jsonc, every deployable part and its resources; self-host, the Docker Compose version.JSON, Docker Compose

Each service is its own Worker, and each one that keeps data has its own database. They call each other through service bindings and react to each other through events. The core services are written in Rust; the web apps and the rest of the Workers in TypeScript.

Run your own

On your own machine

The core forge runs in Docker, with no Cloudflare account:

docker compose -f deploy/self-host/docker-compose.yml up --build
sh

Then open http://localhost:8787 and sign up. The confirmation mail is in Mailpit at http://localhost:8025. Repositories, push and clone, issues, pull requests, code browsing, search, webhooks and observability work, and the API and MCP server answer at http://localhost:8789; packages and container images are kept in the bundled S3-compatible store, RustFS. Deployments and billing are off, and the merge queue can't test or land pull requests without g1t's runner. Run g1t yourself says what works, and how a self-hosted g1t runs what runs inside it.

On Cloudflare

You need a Cloudflare account on the Workers Paid plan (Cloudflare Artifacts, where repositories are stored, requires it), Node 24 (.nvmrc, and engines in package.json), Rust with the wasm32-unknown-unknown target, and Docker to build the sandbox image.

npm install
npx wrangler login
sh

Then, once:

  1. Create the resources each part needs: D1 databases, queues, KV namespaces, R2 buckets and the Cloudflare Artifacts namespace (npx wrangler d1 create <name>, npx wrangler queues create <name>, and so on), and set each part's secrets. deploy/stack.jsonc lists them all.
  2. Put your own account_id, database ids and hostnames in each wrangler.jsonc.
  3. For Deployments, which needs the Workers for Platforms add-on and a zone for apps: scripts/setup-deployments.sh.

Deploy everything, migrations first, in dependency order:

scripts/deploy.sh
sh

Or only what changed, still in order: scripts/deploy.sh billing web. Both use your wrangler login, not a token in .env.

Create the first account by registering on your site, or with node services/identity/scripts/create-user.mjs <username>. Deploy g1t to Cloudflare covers the deploy tool, the workflow and first-time setup in full.

License

MIT