Websites from repositories on the capivaras forge.
Every account on src.capivaras.dev has an address here. Push HTML to a branch, or upload what your build produced. There is no account to create on this side and nothing to configure: the forge is the login and the repository is the source of truth.
you.capivaras.page
repository pages · branch main
you.capivaras.page/project
repository project · branch pages
Publish
The files are already HTML
- Create a public repository named
pages. The clone is anonymous, so a private repository cannot be read this way — use the workflow below instead. - Put
index.htmlat the root of branchmain. - In Settings → Webhooks, add a Forgejo webhook. Target URL
https://you.capivaras.page/, content typeapplication/json, trigger on push. - Push. The webhook arrives, the branch is cloned, the site replaces itself atomically.
For a project site, the same four steps with the repository named after the project, the
branch pages, and the webhook pointed at
https://you.capivaras.page/project/.
The site has to be built first
Build in Forgejo Actions and hand the output to this server with
git-pages-cli, which is on the PATH of every job container on the runner. The run
token is checked for push access to the repository the job came from, and that is what
authorizes the upload — so private repositories work, and there is no password to store.
- name: Deploy
env:
FORGE_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
git-pages-cli https://you.capivaras.page/ \
--upload-dir ./public \
--token "$FORGE_TOKEN"
Only the changed files are sent, so a second deploy of a large site is a small request. The
command prints replaced when it published something and no-change when
the build already matched what was live.
The docker-based actions/git-pages does not run on this instance. Job
containers here take their /bin from the runner's own toolchain, and that mount
lands on an action's image too, shadowing the entrypoint it was built with. The container exits
before the runner attaches and the step fails with
unable to upgrade to tcp, received 500. Call the CLI instead.
Your own domain
Point the domain at this server, prove you hold it with a TXT record, and it serves your site under its own name. Which record depends on where the content comes from.
| Content comes from | TXT record | Value |
|---|---|---|
| a repository, cloned by this server | _git-pages-challenge.domain |
printed by git-pages-cli https://domain/ --challenge --password secret |
| a directory built in Actions | _git-pages-forge-allowlist.domain |
the clone URL, e.g. https://src.capivaras.dev/you/site.git |
Uploading a directory with only a password is refused. This server accepts content it can trace to a repository on src.capivaras.dev, and a password names no repository. Use the allowlist record and the run token for built output.
Limits
| Site size | 128 MB, measured before compression |
|---|---|
| File count | 1 MB of manifest, roughly 5 000 files |
| Update timeout | 60 seconds per publish |
| Repositories | src.capivaras.dev only |
| Git LFS | not supported; a diagnostic is emitted and the file is skipped |
| Routing files | _redirects and _headers, a subset of the Netlify syntax |
| Custom headers | only X-Clacks-Overhead is allowed through |
| Password-protected paths | off |
Source
This page is a handful of files at capivaras/website, published by the workflow in that repository. The server is git-pages, and it holds nothing about you that the forge does not already hold.