Documentation

Last updated: 2026-09-27

The repository web UI

The host that serves git over HTTP also serves a browser surface over every hosted repository — one interface for the instance, not one per repository. It comes up with the backend: /backends enable git-http plus a host in git.http.vhost serves the transport, the browser surface and the workflow runner protocol together, because they are one product on one host.

There is nothing to configure beyond that. What a visitor sees is decided by grants.

Pages

PathPage
/repositories the viewer may read
/-/login, /-/logoutsign in and out
/-/newcreate a repository
/-/settingsinstance settings, including runner registration
/{repo}home: root tree, README, clone URL
/{repo}/tree/{ref}/{path}browse a directory
/{repo}/blob/{ref}/{path}view a file, with syntax highlighting
/{repo}/raw/{ref}/{path}the file's bytes
/{repo}/commits/{ref}history
/{repo}/commit/{oid}one commit's diff
/{repo}/branchesbranches, with delete
/{repo}/pullsopen pull requests
/{repo}/pull/{slug}/{target}one pull request, with merge and close
/{repo}/workflowswhat the repository runs, and its runs
/{repo}/workflows/{run}one run's jobs and logs
/{repo}/settingsrepository secrets, variables and retention

Pages are templates compiled into the binary and styled from the Everlock website's own tokens, so the browser surfaces read as one product. Markdown rendering and syntax highlighting come from everlock-markup, shared with the site backend.

What a visitor sees

Every page resolves the viewer's grants as it renders. An unauthenticated visitor is evaluated as the built-in anon user, so public browsing is a grant like any other:

/users grant anon */git/my-project reader

That repository is now readable without signing in. An instance that should show nothing publicly is one that grants anon nothing.

Authorization runs before a repository is opened, so a repository the viewer may not see is indistinguishable from one that does not exist. The repository list shows only what the viewer may read.

Capabilities follow the same roles the rest of the Git backend uses:

  • reader — browse trees, blobs, history, pull requests and runs.
  • writer — delete a branch, start a workflow run.
  • owner — set repository secrets, variables and retention.

Starting a run takes writer because it is the same power as pushing a commit that would have started one. Reading a run takes the same access as browsing the repository, because a build log quotes the code that produced it.

Registering a workflow runner is instance administration rather than any one repository's business, so it lives under /-/settings and is offered to an instance administrator only.

Sessions

Signing in sets a cookie signed with a key generated at start and held only in memory, so a restart signs everyone out.

That is deliberate. A session proves identity and nothing else: because every page re-resolves grants as it renders, revoking a grant takes effect on the next request rather than at the next sign-in. The cookie is HttpOnly and SameSite=Lax, and Secure wherever the host is not local.

Pull requests in the browser

A pull request page derives everything from its ref — there is no second copy of the change in a database. From refs/pull/{slug}/{target} the page computes the commits it adds, its diff against the commit it last shares with its target, and a mergeability chip worked out on demand.

Opening one is a push, so it needs no account:

git push origin HEAD:refs/pull/my-fix/main

See Pull requests for the full scheme and the matching /git pr commands.

git web-ui browser sessions permissions