Git hosting built on Cloudflare
How Githome runs Git hosting on Cloudflare Workers, Durable Objects, D1, R2, Queues and Workflows, what that means for users, and its limits.
Githome is a private, internal git forge that runs on Cloudflare, at git.pkgforge.dev, with copies kept off Cloudflare. There are no servers, virtual machines or databases behind it that anyone has to run: one Cloudflare Worker and the Cloudflare products it uses serve Git, pull requests, the REST and GraphQL APIs, the MCP server and the container registry. This page explains which Cloudflare product does what, what that means for the people using it, and the limits that come with it.
Where it runs
Githome is deployed by its operator, from a private repository, to one Cloudflare account. It is not a product for sale: there is no hosted service to sign up for, no plan and no price, and accounts are by invitation from the superadmin. The deployment uses the Workers Paid plan, R2, D1, Queues and Workflows, and each part of the instance has its own host:
git.pkgforge.devis the core: the web UI, Git, the APIs, MCP, the container registry and the documentation. Anyone can browse and clone public repositories there without an account.dash.git.pkgforge.devis the superadmin console, a Worker of its own with its own passkey sign-in.NAME.git.pkgforge.devis the host of each module, once the module is deployed.
Nobody who uses Githome needs a Cloudflare account; people sign in with passkeys. See Deployment and operation, Deploy and update Githome, Configuration and Architecture.
Which Cloudflare product runs what
This is the same mapping as the Architecture documentation, which goes into more detail.
| Cloudflare product | What it runs in Githome |
|---|---|
| Workers | The web UI and the public docs, Git over HTTPS, Git LFS, the REST and GraphQL APIs, the MCP server and the container registry. The Worker holds no state of its own: it signs the caller in, checks their role and hands the request to the right repository. The superadmin console is a second Worker, and each module is another. |
| Durable Objects with SQLite, one per repository | Everything inside one repository: branches and tags, git objects, issues, pull requests, reviews, checks and commit statuses, releases, environments, secrets, webhooks and the merge queue. Live pull request updates reach the browser over the object's WebSockets. |
| R2 | Anything too large for SQLite: git objects over 512 KiB compressed, Git LFS files, container image layers, release assets and cached source archives. |
| D1 | Data that belongs to no single repository: accounts, organizations, tokens, the list of repositories and who can reach them, invitations, notifications, the audit log and the container registry's index. |
| Queues | Webhook deliveries and their retries, notifications, audit log entries and email jobs, sent in the background so the request that caused them doesn't wait. |
| Workflows | Imports and account exports and deletions, as durable Cloudflare Workflows whose steps and waits survive restarts and deploys. |
| Durable Object alarms and Cron Triggers | Housekeeping such as registry cleanup and token expiry reminders, the mirror and backup jobs, and the workflow scheduler. |
| Email Sending | Notification and security email, where the deployment has email sending set up. Githome sends no email for an invitation. |
The forge CI of git.pkgforge.dev is dormant: the instance starts no Actions run, no hosted job and no Cloudflare Container. The Actions code is part of Githome, and the Actions documentation keeps its reference content.
How a push moves through it
git pushreaches the Worker, which checks your token and your role on the repository and passes the push to the repository's Durable Object.- The object scans every new file for leaked credentials (push protection), stores the objects (small ones in its SQLite database, large ones in R2), checks branch protection and moves each branch with a compare-and-swap, so two pushes to the same branch are applied one after the other.
- The object emits a
pushevent to the events queue, which writes the audit log entry, delivers webhooks and creates notifications in the background. A push mirror, where one is set up, copies the repository with its forge state to another provider.
What this means for you
- No servers to run. The instance is a Worker and the Cloudflare products it binds to, so there is nothing to provision, patch or scale.
ghand your editor's plain HTTPS clone work as they do with GitHub. - One busy repository never slows another. Each repository is its own Durable Object with its own database, the single writer for everything in it, so ref updates and merges are strongly consistent without locks.
- Long work survives restarts. An import is a durable Workflow, so a deploy or a restart doesn't lose it.
- Mirrored and backed up. Push mirrors copy each repository, with its forge state in
refs/githome/meta, to GitHub, Cloudflare Artifacts, GitLab, Forgejo or Codeberg, and backups go to an S3-compatible bucket off Cloudflare once its credentials are set. - Cloudflare's network. Requests are answered by the Worker at the Cloudflare location that receives them. A repository's own data lives in its Durable Object, in one place, so pages that read a repository make a trip to wherever that object is.
Limits that come with building on Cloudflare
- A push carries at most 100 MB. Use Git LFS for large files. Container image layers larger than Cloudflare's 100 MB request limit can't be pushed in one request.
- Clones send more bytes than GitHub's. Packs are sent without deltas, so clones and fetches download more data. See Git over HTTPS.
- No Cloudflare Containers in use. Because the forge CI is dormant, there are no hosted runners and no agent sandboxes on git.pkgforge.dev. Imports from GitLab, Forgejo, Gitea and Codeberg run without a container; the server-side import from GitHub needs the import container and stops at its Git step.
- Per-account quotas. The superadmin sets quotas for repositories and storage per account. See Limits.
Frequently asked questions
Does Githome run on Cloudflare?
Yes, with copies off Cloudflare. A Cloudflare Worker serves the web UI, Git, the APIs and MCP; each repository is a Durable Object with its own SQLite database; large files live in R2 and accounts in D1; imports are Cloudflare Workflows. See Architecture.
Can I sign up for Githome?
No, accounts are by invitation. The superadmin invites each account in the dash and sends the one-time invitation link by hand. Anyone can browse and clone public repositories without an account. See Invitations.
Does Githome run CI?
Not on git.pkgforge.dev. The forge CI is dormant, so no workflow runs there now. The Actions documentation keeps the reference content for the code that stays in Githome.
Where do I report a bug or ask a question?
In the public tracker, github.com/Azathothas/issues, with the label git.pkgforge.dev. Report security problems privately with the report form, which takes reports only from signed-in people until the deployment has its Turnstile keys.