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.

Claudeagent and ClaudeagentA g1t.page build can be a container. A project with a `Dockerfile` (or `Containerfile`, or the path set as its Dockerfile) and no framework that builds a static site or a Worker, a framework set up to need a server (Next.js without a static export, Astro with `@astrojs/node`, SvelteKit with `adapter-node`, a server-rendered React Router or Remix app), or a Node.js, Python (Django, Flask, FastAPI), Go, Ruby (Rails, Rack) or PHP (Laravel, Composer) server is built as one; with no Dockerfile g1t writes one for the server it recognises, shows it whole in the build's log to be committed and changed, and builds it with a `.dockerignore` of its own, never touching the checkout. Build as (`BUILD_AS`: auto, static, workers or docker) wins over all of it, and Auto keeps a Wrangler config a Workers project and a static framework static, which cost nothing while no one visits; a project with nothing to serve now says to add a Dockerfile. The image is built with the sandbox's own Docker Engine (or the job's, from a workflow) for linux/amd64, held to the instance's disk, and pushed to Cloudflare's registry with the push-only login the deployments service gives the build in a new `registry` step, kept in a folder of its own and redacted; the finish report carries the image by digest, its port (the Dockerfile's `EXPOSE`, else 8080) and size. While g1t.page runs no containers (`not_enabled`), a project that is a container only for its Dockerfile is built as the site it is without one, as before. `g1t-runner detect` prints `kind=container`, `framework` (the framework, the server, or `dockerfile`), `dockerfile` and `port`.

README.md

g1t/detect

Says what a g1t.page build of the checkout would find, without building or deploying anything: the same rules g1t/deploy builds with.

steps:
  - uses: actions/checkout@v5
  - id: detect
    uses: g1t/detect@v1
  - if: steps.detect.outputs.kind == 'none'
    run: echo "::error::Nothing here would be served."
  - if: steps.detect.outputs.framework == 'hugo'
    run: echo "A Hugo site, served from ${{ steps.detect.outputs.output-dir }}"
  - if: steps.detect.outputs.install != ''
    run: ${{ steps.detect.outputs.install }}
yaml

Inputs

InputDefault
root-dirThe checkoutWhere the project is in the checkout.
build-commandNoneA build command of your own, as g1t/deploy takes it.
output-dirNoneAn output folder of your own, as g1t/deploy takes it.

Outputs

Output
kindworkers (a wrangler.jsonc, wrangler.json or wrangler.toml, or a framework's Cloudflare adapter), static (a site a build writes), html (the files as they are) or none (nothing to serve, or a framework set up to need a server).
frameworkThe framework it is built with, from the table below. Empty when there is none.
installHow dependencies are installed, from the lockfile: npm ci, pnpm install --frozen-lockfile, and so on, and bundle install for Jekyll. Empty when there is nothing to install.
buildWhat builds it: your command, the package's build script (npm run build), the framework's own command, or wrangler deploy --dry-run for Workers. Empty when nothing does.
output-dirThe folder served, relative to the project (. for the project itself): yours, a Workers project's assets directory, the folder the framework writes, or the first of dist, build, out, public, _site, .output/public that exists. Empty when a build has yet to write it, as for a Cloudflare adapter's Worker.

When kind is none because of how a framework is set up, such as a Next.js app without output: 'export', the step's log says what to change.

Frameworks

frameworkFound byServes
vite, vite-react, vite-vue, vite-svelte, vite-solid, vite-preactvite, and the framework's Vite plugindist, or build.outDir
astroastrodist, or outDir; a Worker with @astrojs/cloudflare
nextjsnextout with output: 'export'; a Worker with @opennextjs/cloudflare and a wrangler.jsonc
sveltekit@sveltejs/kitbuild with adapter-static; a Worker with adapter-cloudflare
nuxtnuxt.output/public, from nuxi generate
react-router, remix@react-router/dev, @remix-run/devbuild/client with ssr: false
gatsbygatsbypublic
docusaurus@docusaurus/corebuild
eleventy@11ty/eleventy_site
angular@angular/core and angular.jsondist/<project>/browser
create-react-appreact-scriptsbuild
hugohugo.toml, or Hugo's config.tomlpublic
jekyll_config.yml and a Gemfile_site
mdbookbook.tomlbook

What deploys has each one's build command. Your build-command and output-dir win over what is detected.

It runs g1t-runner detect, found or downloaded as g1t/deploy finds it.