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.

g1t.sh
syntaqxg1t's Claude Code plugin installs from its own repository, published by a workspace token, and a token for chosen repositories no longer creates others by pushing. `claude plugin marketplace add https://g1t.sh/flagon-io/g1t-plugins.git` then `claude plugin install g1t@g1t` clones only the plugin, not this monorepo, which stays its source (.claude-plugin/marketplace.json, plugins/claude-code/). scripts/plugins-release.mjs builds the published tree (the plugin and a marketplace that points at it), checks that both manifests agree and that nothing else is in it, and pushes it with a tag `g1t--v<version>`; it refuses changed plugin files under a version already published, and says "nothing to publish" when that version is there. .g1t/workflows/plugins-release.yml runs it on pushes to main with the flagon-io workspace token PLUGINS_PUBLISH_TOKEN, sent as Basic auth, never a person's token; CI runs its tests. The README, the plugin guide, the docs' agent list, the MCP reference and its instructions, bring-your-own-agent, why-blame, the site's agent setup and the Live now empty state, llms.txt, install/claude.sh and bench/ask all give the new address, and the earlier ~/.g1t/hook.mjs install path is gone. Automation is pointed at a workspace's own tokens: the API reference's Authentication section, Actions' note on changing workflows from a job (it said a personal token) and llms.txt (never ask your person for a personal token for that) now say so, as Settings → Access tokens, the authentication and workspaces guides and git's deploy keys already did. Pushing to an address that does not exist made a repository for any token holding code:write and a member's or the workspace's identity, so a workspace token for only g1t-plugins could create flagon-io/<anything> and push to it; repos' git_token_refusal now refuses push-to-create for a token whose reach is chosen repositories, public ones only, or another workspace, and the git guide says so. Checked: the plugin's hook tests (49), plugins-release tests (8) and its check (g1t@g1t 0.2.2), cargo test -p g1t-repos --lib (314, new: chosen repositories never create one, all of a workspace creates there only, a token without a reach as before) and its wasm32 check, the site's agent-setup and llms.txt tests (20), the docs build (513 pages).

README.md

g1t/deploy

Builds the checkout a g1t Actions job is in and puts it on g1t.page: production when the run is on the project's production branch, the pull request's preview for a pull request's run, and the branch's preview for a run on any other branch.

name: Deploy

on:
  push:
    branches: [main]
  pull_request:

permissions:
  contents: read
  deployments: write

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
      - id: deploy
        uses: g1t/deploy@v1
      - run: echo "Live at ${{ steps.deploy.outputs.url }}"
yaml

The project must have Deployments on, and the workspace's plan must include them. The guide, Deploying from a workflow, says what is built and when.

Inputs

InputDefault
projectThe repository's one project with Deployments onThe project's slug. Needed when the repository has several.
root-dirThe project's settingWhere the project is in the checkout.
build-commandThe project's setting, else what the build findsWhat builds it.
output-dirThe project's setting, else the folder the framework writes, else the first of dist, build, out, public, _site, .output/publicThe folder a static build writes.
build-asThe project's setting, else autoWhat it is built as: auto, static, workers or docker. A container is built with the docker on the job's PATH.
dockerfileThe project's setting, else Dockerfile or ContainerfileThe Dockerfile a container is built from, relative to the project.
shaThe run's commitThe commit this is a build of, for its g1t / deploy check.
token${{ github.token }}The job's own token. It needs deployments: write; any other token is refused.

Outputs

Output
urlWhere the app is served.
deployment-idThe build's id, dpl_….
kindproduction or preview.

How it works

  1. It calls POST /repos/{owner}/{repo}/deployments/builds with the job's token. g1t checks the plan and the spend limit, decides production or preview from the run, sets the commit's g1t / deploy check to pending, and answers with a token for this build alone and the project's variables and secrets for builds of that kind.
  2. It masks that token and every secret with ::add-mask::.
  3. It runs g1t-runner deploy in the checkout, which installs, builds and uploads the app exactly as g1t's own builds do, and reports to g1t with the build's token. The build's log is in the step's.

A pull request from a fork or from someone without the Write role, and a run that had to be approved, build without the project's secrets. The build's time is the job's Actions time; it is not charged again.

g1t-runner is on g1t's machines. Elsewhere (a self-hosted runner), the action uses the one on PATH, or downloads the newest release from https://g1t.sh/downloads/runner/latest/ and checks it against the release's SHA256SUMS. It runs on Linux and macOS, with curl and either jq or python3.