capivaras.page src.capivaras.dev

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

  1. Create a public repository named pages. The clone is anonymous, so a private repository cannot be read this way — use the workflow below instead.
  2. Put index.html at the root of branch main.
  3. In Settings → Webhooks, add a Forgejo webhook. Target URL https://you.capivaras.page/, content type application/json, trigger on push.
  4. 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 fromTXT recordValue
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 size128 MB, measured before compression
File count1 MB of manifest, roughly 5 000 files
Update timeout60 seconds per publish
Repositoriessrc.capivaras.dev only
Git LFSnot supported; a diagnostic is emitted and the file is skipped
Routing files_redirects and _headers, a subset of the Netlify syntax
Custom headersonly X-Clacks-Overhead is allowed through
Password-protected pathsoff

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.