Compare changes
Choose two branches to see what changed or to start a new pull request.
1 commit
18 files changed+423−17
Files (18)
- .github/ISSUE_TEMPLATE/config.yml+3−0
- .gitignore+0−2
- AGENTS.md+78−0
- CHANGELOG.md+55−0
- CITATION.cff+34−0
- CLAUDE.md+1−0
- README.md+98−14
- ROADMAP.md+41−0
- SUPPORT.md+18−0
- apps/diffinery/src/web/site.tsx+2−0
- apps/diffinery/test/unit/site.test.ts+1−1
- context7.json+15−0
- docs/README.md+50−0
- docs/images/actions-run.png+0−0
- docs/images/job-logs-dark.png+0−0
- docs/images/pull-request.png+0−0
- docs/images/repository.png+0−0
- package.json+27−0
modified.github/ISSUE_TEMPLATE/config.yml+3−0View file
| @@ -6,3 +6,6 @@ | ||
| 6 | 6 | - name: Documentation |
| 7 | 7 | url: https://diffinery.com/docs |
| 8 | 8 | about: Guides for every feature, the REST API, CLI and MCP references, and self-hosting. |
| 9 | + - name: Questions and help | |
| 10 | + url: https://diffinery.com/faq | |
| 11 | + about: Answers to common questions, with links to the guides. See SUPPORT.md for where to ask the rest. |
modified.gitignore+0−2View file
| @@ -7,5 +7,3 @@ | ||
| 7 | 7 | coverage/ |
| 8 | 8 | .DS_Store |
| 9 | 9 | wrangler.deploy.jsonc |
| 10 | -# Written by turbo for AI agents; opted out in turbo.json (agentGuidance) | |
| 11 | -/AGENTS.md |
addedAGENTS.md+78−0View file
| @@ -1,0 +1,78 @@ | ||
| 1 | +# AGENTS.md | |
| 2 | + | |
| 3 | +Guidance for AI coding agents (Claude Code, Codex, Cursor and others) working on this | |
| 4 | +repository. People should read [CONTRIBUTING.md](CONTRIBUTING.md); everything here agrees | |
| 5 | +with it. | |
| 6 | + | |
| 7 | +## What this repository is | |
| 8 | + | |
| 9 | +Diffinery: an open-source git forge with GitHub Actions–compatible CI that runs entirely on | |
| 10 | +Cloudflare. One Cloudflare Worker serves the web UI, git over HTTPS, a GitHub-compatible | |
| 11 | +REST and GraphQL API and an MCP server; each repository is a Durable Object with its own | |
| 12 | +SQLite database; CI jobs run in Cloudflare Containers. Development happens at | |
| 13 | +https://diffinery.com/codician/diffinery; https://github.com/codician-team/diffinery is a | |
| 14 | +mirror. | |
| 15 | + | |
| 16 | +## Layout | |
| 17 | + | |
| 18 | +``` | |
| 19 | +apps/diffinery the Worker: src/ (web UI, git, REST/GraphQL, MCP, Actions), migrations/ (D1), | |
| 20 | + docs/ (served at diffinery.com/docs), site/ (marketing pages), test/ (unit and e2e) | |
| 21 | +apps/cli the `diffinery` command-line client | |
| 22 | +apps/vscode the VS Code, Cursor and Windsurf extension | |
| 23 | +apps/jetbrains the JetBrains IDE plugin | |
| 24 | +plugins the Claude Code and Codex plugins | |
| 25 | +containers/runner the runner agent, sandbox server and container image | |
| 26 | +packages/git-core git objects, packfiles, deltas, diff and merge, in pure TypeScript | |
| 27 | +packages/workflow-yaml the GitHub Actions workflow parser, expressions, matrices and cron | |
| 28 | +packages/shared types shared by the Worker and the runner | |
| 29 | +scripts setup and deploy scripts for Cloudflare | |
| 30 | +``` | |
| 31 | + | |
| 32 | +## Commands | |
| 33 | + | |
| 34 | +Node.js 22 and pnpm 10 (`corepack enable`). No Cloudflare account is needed to develop. | |
| 35 | + | |
| 36 | +```sh | |
| 37 | +pnpm install | |
| 38 | +pnpm -r build # runner agent, web islands and docs | |
| 39 | +pnpm -r typecheck | |
| 40 | +pnpm -r test # unit tests (Vitest) | |
| 41 | +pnpm --filter @diffinery/app db:migrate:local # local D1 | |
| 42 | +pnpm dev # http://localhost:8787, signed in as dev@diffinery.local | |
| 43 | +cd apps/diffinery && node --test --test-timeout=600000 test/e2e/<file>.test.mjs # one e2e file | |
| 44 | +``` | |
| 45 | + | |
| 46 | +Run repository tools with `pnpm exec`, never bare `npx`. Run the typecheck and the unit | |
| 47 | +tests before you ask for review, and the end-to-end file closest to your change. Tests must | |
| 48 | +not depend on the speed of the machine they run on. | |
| 49 | + | |
| 50 | +## Rules | |
| 51 | + | |
| 52 | +- **Docs ship with the feature.** Any user- or admin-visible change updates the Markdown in | |
| 53 | + `apps/diffinery/docs` (and `apps/diffinery/site` for product pages). Write for people and | |
| 54 | + agents: short sentences, exact names of buttons, settings, endpoints and flags. | |
| 55 | +- **Follow GitHub where GitHub has an API, event or workflow feature**, so git, `gh`, | |
| 56 | + Octokit and actions keep working. Document any difference in | |
| 57 | + `apps/diffinery/docs/actions/compatibility.md` or the relevant page. | |
| 58 | +- **D1 migrations** live in `apps/diffinery/migrations`. Use the next free number and never | |
| 59 | + edit a migration that has shipped. | |
| 60 | +- **Security:** guardrails for agents are enforced on the server for git, REST, MCP and the | |
| 61 | + web UI alike. Never add a bypass, never log secrets or tokens, and never weaken push | |
| 62 | + protection, branch protection or the runner sandbox to make something pass. | |
| 63 | +- **UI:** passkeys first, no passwords; Kumo components through `KSelect`, `KCheckbox` and | |
| 64 | + `KRadio`, never a native `<select>`, checkbox or radio. See | |
| 65 | + [docs/PREFERENCES.md](docs/PREFERENCES.md). | |
| 66 | +- **Code style:** strict TypeScript, few dependencies, comments that say why, matching the | |
| 67 | + density and style of the code around your change. | |
| 68 | +- **Pull requests:** one change each, a title that says what it does, an `intent` that says | |
| 69 | + what it is for, and the person you work for in the description. Changes under | |
| 70 | + `.github/workflows` need a maintainer to merge them. Never skip or disable a test to get | |
| 71 | + green. | |
| 72 | + | |
| 73 | +## Reading the docs as an agent | |
| 74 | + | |
| 75 | +Every docs page is Markdown at `https://diffinery.com/docs/<page>.md`, the whole set is in | |
| 76 | +https://diffinery.com/llms.txt and https://diffinery.com/llms-full.txt, and the MCP server | |
| 77 | +at `https://diffinery.com/mcp` has `search_docs` and `read_docs`. See | |
| 78 | +[Docs for AI agents](https://diffinery.com/docs/agents/docs-for-agents). |
addedCHANGELOG.md+55−0View file
| @@ -1,0 +1,55 @@ | ||
| 1 | +# Changelog | |
| 2 | + | |
| 3 | +Notable changes to Diffinery. Diffinery is deployed continuously from `main`; versions mark | |
| 4 | +points worth naming. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). | |
| 5 | + | |
| 6 | +## [0.1.0] - 2026-10-25 | |
| 7 | + | |
| 8 | +The first open-source release, under the Apache License 2.0. | |
| 9 | + | |
| 10 | +### Git hosting and collaboration | |
| 11 | + | |
| 12 | +- Git over HTTPS with tokens or browser sign-in, shallow clones, Git LFS and | |
| 13 | + `refs/pull/<n>/head` and `/merge`; each repository is a Durable Object with its own SQLite | |
| 14 | + database, and large pushes are unpacked from R2 in pieces. | |
| 15 | +- Pull requests with an `intent` field, drafts, reviews with line comments, required | |
| 16 | + approvals and checks, merge, squash and rebase, auto-merge, merge on green and a merge | |
| 17 | + queue with `merge_group` runs. | |
| 18 | +- Issues, labels, milestones, reactions and mentions; releases with assets and generated | |
| 19 | + notes; checks and commit statuses. | |
| 20 | +- Branch protection, push protection that blocks leaked credentials on every push, an | |
| 21 | + append-only audit log, moderation, quotas and kill switches. | |
| 22 | +- A container registry for OCI images. | |
| 23 | + | |
| 24 | +### Actions (CI/CD) | |
| 25 | + | |
| 26 | +- Runs GitHub Actions workflows from `.github/workflows/` (and `.diffinery/workflows/`): | |
| 27 | + triggers, expressions, matrices, `needs`, outputs, reusable workflows, environments, | |
| 28 | + secrets, variables, OIDC, service containers, Docker, concurrency groups and schedules. | |
| 29 | +- JavaScript, composite and Docker actions from GitHub, with `checkout`, `setup-node`, | |
| 30 | + `setup-python`, `setup-go`, `cache` and the artifact actions built into the runner. | |
| 31 | +- Hosted runners in Cloudflare Containers: a fresh Ubuntu 24.04 container per job, 4 vCPU and | |
| 32 | + 12 GiB by default, smaller sizes chosen per job from its own measured runs, jobs starting in | |
| 33 | + about 3 to 5 seconds. Self-hosted runners with `diffinery runner`. | |
| 34 | + | |
| 35 | +### AI agents | |
| 36 | + | |
| 37 | +- Agent accounts owned by a person or an organization, with server-enforced guardrails: no | |
| 38 | + pushes or merges to protected branches unless a rule allows it, a person's approval on | |
| 39 | + agent pull requests, and no secrets for runs of agent-written code. | |
| 40 | +- A built-in MCP server at `/mcp` with browser sign-in, sandboxes, agent tasks that run | |
| 41 | + Claude Code, Codex or your own command and open a pull request, agent code review, | |
| 42 | + projects with shared memory and a Today page of what needs you. | |
| 43 | +- Plugins for Claude Code and Codex, the `diffinery` CLI, `gh` support, and extensions for | |
| 44 | + VS Code, Cursor, Windsurf and JetBrains IDEs. | |
| 45 | + | |
| 46 | +### Moving and running | |
| 47 | + | |
| 48 | +- A GitHub importer for a repository or a whole organization, with history, issues, pull | |
| 49 | + requests, reviews and releases. | |
| 50 | +- GitHub-compatible REST (`/api/v3`) and GraphQL (`/api/graphql`) APIs and webhooks. | |
| 51 | +- `scripts/setup.sh`, which deploys an instance to your own Cloudflare account and domain. | |
| 52 | +- Documentation at https://diffinery.com/docs, also as Markdown, `llms.txt` and | |
| 53 | + `llms-full.txt`. | |
| 54 | + | |
| 55 | +[0.1.0]: https://diffinery.com/codician/diffinery/releases/tag/v0.1.0 |
addedCITATION.cff+34−0View file
| @@ -1,0 +1,34 @@ | ||
| 1 | +cff-version: 1.2.0 | |
| 2 | +message: "If you use or refer to Diffinery, please cite it as below." | |
| 3 | +type: software | |
| 4 | +title: "Diffinery" | |
| 5 | +abstract: >- | |
| 6 | + Diffinery is an open-source git forge with GitHub Actions-compatible CI that runs | |
| 7 | + entirely on Cloudflare (Workers, Durable Objects, D1, R2, Queues, Workflows and | |
| 8 | + Containers). It hosts Git repositories, pull requests with reviews and a merge queue, | |
| 9 | + issues, releases and a container registry, runs existing .github/workflows files on | |
| 10 | + per-job containers, and gives AI coding agents accounts of their own with | |
| 11 | + server-enforced guardrails and a built-in MCP server. | |
| 12 | +authors: | |
| 13 | + - name: "The Diffinery Authors" | |
| 14 | +version: "0.1.0" | |
| 15 | +date-released: "2026-10-25" | |
| 16 | +license: Apache-2.0 | |
| 17 | +url: "https://diffinery.com" | |
| 18 | +repository-code: "https://github.com/codician-team/diffinery" | |
| 19 | +repository: "https://diffinery.com/codician/diffinery" | |
| 20 | +keywords: | |
| 21 | + - git | |
| 22 | + - git-forge | |
| 23 | + - github-alternative | |
| 24 | + - github-actions | |
| 25 | + - continuous-integration | |
| 26 | + - ci-cd | |
| 27 | + - cloudflare-workers | |
| 28 | + - durable-objects | |
| 29 | + - cloudflare-containers | |
| 30 | + - self-hosted | |
| 31 | + - serverless | |
| 32 | + - code-review | |
| 33 | + - ai-agents | |
| 34 | + - mcp |
addedCLAUDE.md+1−0View file
| @@ -1,0 +1,1 @@ | ||
| 1 | +@AGENTS.md |
modifiedREADME.md+98−14View file
| @@ -1,21 +1,32 @@ | ||
| 1 | 1 | # Diffinery |
| 2 | 2 | |
| 3 | -**An open-source, self-hostable git forge with GitHub Actions–compatible CI, built for teams of people and AI agents, running entirely on Cloudflare.** | |
| 3 | +**The open-source GitHub and GitHub Actions alternative that runs entirely on Cloudflare.** Git hosting, pull requests, code review and drop-in GitHub Actions CI, built for teams of people and AI agents. Deploy it to your own Cloudflare account: no servers, no runner machines, nothing to patch. | |
| 4 | 4 | |
| 5 | 5 | [](LICENSE) |
| 6 | -[](https://diffinery.com/docs) | |
| 7 | -[](https://diffinery.com/built-on-cloudflare) | |
| 6 | +[](https://diffinery.com/docs/actions/compatibility) | |
| 7 | +[](https://diffinery.com/built-on-cloudflare) | |
| 8 | +[](https://diffinery.com/docs/agents/mcp) | |
| 9 | +[](https://diffinery.com/docs) | |
| 10 | +[](CONTRIBUTING.md) | |
| 8 | 11 | |
| 9 | -Diffinery hosts Git repositories, pull requests with reviews and a merge queue, issues, releases and a container registry, and runs your existing `.github/workflows/*.yml` files as they are. AI agents get accounts of their own, with guardrails the server enforces, and work through MCP, the REST API, git or the CLI. Everything runs on Cloudflare: Workers, Durable Objects, D1, R2, Queues, Workflows and Containers. There are no servers to run, and you can deploy your own instance to your own Cloudflare account. | |
| 12 | +[Website](https://diffinery.com) · [Docs](https://diffinery.com/docs) · [Deploy your own](https://diffinery.com/docs/self-hosting/deploy) · [Compare](https://diffinery.com/compare) · [Performance](https://diffinery.com/performance) · [Roadmap](ROADMAP.md) · [llms.txt](https://diffinery.com/llms.txt) | |
| 10 | 13 | |
| 11 | -- **Website and public instance:** [diffinery.com](https://diffinery.com) | |
| 12 | -- **Documentation:** [diffinery.com/docs](https://diffinery.com/docs) ([llms.txt](https://diffinery.com/llms.txt) for AI assistants) | |
| 13 | -- **Source:** [diffinery.com/codician/diffinery](https://diffinery.com/codician/diffinery), where development happens. [github.com/codician-team/diffinery](https://github.com/codician-team/diffinery) is a mirror of it. | |
| 14 | +[](docs/images/pull-request.png) | |
| 14 | 15 | |
| 16 | +Diffinery hosts Git repositories, pull requests with reviews and a merge queue, issues, releases and a container registry, and runs your existing `.github/workflows/*.yml` files as they are, marketplace actions included. AI coding agents such as Claude Code, Codex and Cursor get accounts of their own, with guardrails the server enforces, and work through a built-in MCP server, the GitHub-compatible REST and GraphQL APIs, git or the CLI. Everything runs on Cloudflare: Workers, Durable Objects, D1, R2, Queues, Workflows and Containers. It is free, open-source software under the Apache License 2.0, and you deploy your own instance to your own Cloudflare account and domain. | |
| 17 | + | |
| 18 | +- **Source:** [diffinery.com/codician/diffinery](https://diffinery.com/codician/diffinery), where development, CI and deploys happen, mirrored to [github.com/codician-team/diffinery](https://github.com/codician-team/diffinery). | |
| 19 | +- **Documentation:** [diffinery.com/docs](https://diffinery.com/docs), also as Markdown and in [llms.txt](https://diffinery.com/llms.txt) and [llms-full.txt](https://diffinery.com/llms-full.txt) for AI assistants. | |
| 20 | + | |
| 21 | +If Diffinery is useful to you, a star on GitHub helps other people find it. | |
| 22 | + | |
| 15 | 23 | ## Contents |
| 16 | 24 | |
| 25 | +- [Who Diffinery is for](#who-diffinery-is-for) | |
| 17 | 26 | - [Why Diffinery](#why-diffinery) |
| 27 | +- [Screenshots](#screenshots) | |
| 18 | 28 | - [Features](#features) |
| 29 | +- [How it compares](#how-it-compares) | |
| 19 | 30 | - [Self-host on your own Cloudflare account](#self-host-on-your-own-cloudflare-account) |
| 20 | 31 | - [How it runs on Cloudflare](#how-it-runs-on-cloudflare) |
| 21 | 32 | - [Develop locally](#develop-locally) |
| @@ -24,6 +35,14 @@ | ||
| 24 | 35 | - [FAQ](#faq) |
| 25 | 36 | - [Contributing, security and license](#contributing-security-and-license) |
| 26 | 37 | |
| 38 | +## Who Diffinery is for | |
| 39 | + | |
| 40 | +- **Teams looking for a GitHub Actions alternative** that keeps their workflow YAML: Diffinery reads `.github/workflows/` with the same syntax and runs marketplace actions, on runners with 4 vCPUs and 12 GiB by default. | |
| 41 | +- **Teams that want a self-hosted GitHub alternative without running servers.** Like Gitea, Forgejo or GitLab, you run your own instance, but it deploys to Cloudflare's serverless platform instead of a VM or a Kubernetes cluster. | |
| 42 | +- **Teams that want faster CI runners** than GitHub's standard 2-vCPU runner for private repositories, without paying a separate runner service such as Blacksmith or Depot. | |
| 43 | +- **Teams working with AI coding agents** (Claude Code, Codex, Cursor and others) that should open pull requests a person approves, rather than push to `main`. | |
| 44 | +- **Cloudflare developers** looking for a large, real-world application built on Durable Objects with SQLite, Containers, Workflows, Queues and R2. | |
| 45 | + | |
| 27 | 46 | ## Why Diffinery |
| 28 | 47 | |
| 29 | 48 | - **Git hosting, pull requests and CI in one serverless app.** One Cloudflare Worker serves the web UI, git over HTTPS, a GitHub-compatible REST and GraphQL API, and an MCP server. Each repository is its own Durable Object with its own SQLite database, so repositories scale out instead of sharing one database server. |
| @@ -33,6 +52,14 @@ | ||
| 33 | 52 | - **Secure by default.** Passkey sign-in with no passwords, invite-only accounts, branch protection, push protection that blocks leaked credentials, envelope-encrypted secrets, kill switches and an append-only audit log. |
| 34 | 53 | - **Moving from GitHub is one step.** A server-side importer brings a repository or a whole organization over with its history, issues, pull requests, reviews and releases, and `gh`, Octokit, VS Code and JetBrains IDEs work against Diffinery. |
| 35 | 54 | |
| 55 | +## Screenshots | |
| 56 | + | |
| 57 | +| A repository, with the clone URL and one-click open in VS Code, Cursor, Windsurf and IntelliJ IDEA | A workflow run from `.github/workflows/ci.yml`, with a matrix and `needs` | | |
| 58 | +| --- | --- | | |
| 59 | +| [](docs/images/repository.png) | [](docs/images/actions-run.png) | | |
| 60 | + | |
| 61 | +[](docs/images/job-logs-dark.png) | |
| 62 | + | |
| 36 | 63 | ## Features |
| 37 | 64 | |
| 38 | 65 | | Area | What you get | Docs | |
| @@ -47,6 +74,24 @@ | ||
| 47 | 74 | | Security | Passkeys (WebAuthn), branch protection, push protection, encrypted secrets, audit log, moderation, rate limits, quotas and kill switches | [Security overview](https://diffinery.com/docs/security/overview) | |
| 48 | 75 | | Migration | Import from GitHub with history, issues, pull requests, reviews and releases, from the web, CLI, API or MCP | [Migrate from GitHub](https://diffinery.com/docs/migrate-from-github) | |
| 49 | 76 | |
| 77 | +## How it compares | |
| 78 | + | |
| 79 | +Diffinery is a forge: it hosts your code and runs your CI. Here is how it sits next to the tools people usually compare it with. Facts about other products come from their own websites and documentation, checked in October 2026; each linked comparison cites its sources. | |
| 80 | + | |
| 81 | +| | Diffinery | GitHub + GitHub Actions | GitLab | Gitea / Forgejo | Runner services (Blacksmith, Depot) | | |
| 82 | +| --- | --- | --- | --- | --- | --- | | |
| 83 | +| What it is | Open-source forge with built-in CI | Hosted forge with built-in CI | Forge with built-in CI | Open-source self-hosted forges with built-in CI | Faster runners for GitHub Actions; your code stays on GitHub | | |
| 84 | +| Who runs it | You, on your own Cloudflare account | GitHub (Enterprise Server: your servers) | GitLab, or you (self-managed) | You, on your own servers (or Gitea Cloud, Codeberg) | The vendor | | |
| 85 | +| Servers to operate | None | None (hosted) | None (hosted) or your own | Your servers and your runner machines | None | | |
| 86 | +| CI workflow format | GitHub Actions YAML in `.github/workflows/` | GitHub Actions YAML | `.gitlab-ci.yml` | GitHub Actions–style YAML, "mostly compatible" (Gitea) or "not designed to be compatible" (Forgejo) | GitHub Actions YAML, with a new `runs-on` label | | |
| 87 | +| Default hosted Linux runner | 4 vCPU, 12 GiB, started per job in Cloudflare Containers | 2 vCPU, 8 GB for private repositories | 2 vCPU, 8 GB | Runners you install | Several sizes, priced per minute | | |
| 88 | +| Hosted macOS and Windows | No (self-hosted runners) | Yes | Beta | Runners you install | Yes | | |
| 89 | +| Guardrails for AI agents | Built in for every agent account | Rulesets and token permissions you configure | Approval rules and service accounts you configure | Not covered | Not applicable | | |
| 90 | +| Built-in MCP server | Yes, at `/mcp` | Yes | Yes | Gitea: a separate MCP server | Not applicable | | |
| 91 | +| License | Apache-2.0 | Proprietary | Open core | MIT (Gitea), GPL v3+ (Forgejo) | Proprietary | | |
| 92 | + | |
| 93 | +Read the details: [Diffinery vs GitHub](https://diffinery.com/compare/github) · [vs GitLab](https://diffinery.com/compare/gitlab) · [vs Gitea and Forgejo](https://diffinery.com/compare/gitea) · [vs Blacksmith](https://diffinery.com/compare/blacksmith) · [vs Depot](https://diffinery.com/compare/depot) · [vs CircleCI](https://diffinery.com/compare/circleci) · [vs Buildkite](https://diffinery.com/compare/buildkite) · [vs Bitbucket](https://diffinery.com/compare/bitbucket) · [all GitHub Actions alternatives](https://diffinery.com/compare) · [other Git and CI projects on Cloudflare](https://diffinery.com/built-on-cloudflare#other-git-and-ci-projects-on-cloudflare) | |
| 94 | + | |
| 50 | 95 | ## Self-host on your own Cloudflare account |
| 51 | 96 | |
| 52 | 97 | Diffinery is designed to be deployed by anyone to their own Cloudflare account and domain. Nobody who uses your instance needs a Cloudflare account; only the deployment does. |
| @@ -123,33 +168,72 @@ | ||
| 123 | 168 | |
| 124 | 169 | ## What Diffinery doesn't do (yet) |
| 125 | 170 | |
| 126 | -Diffinery is honest about its gaps. Today it has no hosted macOS, Windows or Arm runners (use self-hosted runners), no forks, no app marketplace, and nothing like Codespaces, Pages or Discussions. Some GitHub events, such as `issues` and `issue_comment`, are accepted in workflows but never start a run. The full list is in [Compatibility with GitHub Actions](https://diffinery.com/docs/actions/compatibility) and [Diffinery vs GitHub](https://diffinery.com/compare/github). | |
| 171 | +Diffinery is young, and we'd rather you know its limits before you move: | |
| 127 | 172 | |
| 173 | +- **Hosted runners are Linux x64 only.** macOS, Windows and Arm jobs need [self-hosted runners](https://diffinery.com/docs/actions/runners#self-hosted-runners). | |
| 174 | +- **HTTPS only for Git.** There's no SSH access. | |
| 175 | +- **No forks.** Pull requests are between branches of the same repository. | |
| 176 | +- **No wikis, discussions, Pages-style sites, Codespaces-style cloud editors or app marketplace.** | |
| 177 | +- **Reviews are simpler than GitHub's.** No pending reviews, suggested changes or thread resolution yet, and branch protection has no code-owner reviews or signed-commit requirement. | |
| 178 | +- **Some GitHub events**, such as `issues` and `issue_comment`, are accepted in workflows but never start a run. | |
| 179 | +- **No hosted service.** Nobody runs Diffinery for you: you deploy your own instance. | |
| 180 | + | |
| 181 | +The full lists are in [Compatibility with GitHub Actions](https://diffinery.com/docs/actions/compatibility) and [Diffinery vs GitHub](https://diffinery.com/compare/github), and where we'd like to go next is in the [roadmap](ROADMAP.md). | |
| 182 | + | |
| 128 | 183 | ## FAQ |
| 129 | 184 | |
| 130 | 185 | **What is Diffinery?** |
| 131 | -An open-source git forge and CI platform that runs entirely on Cloudflare. It replaces GitHub's code hosting, pull requests and GitHub Actions in one app that you can self-host on your own Cloudflare account. | |
| 186 | +An open-source git forge and CI platform that runs entirely on Cloudflare. It replaces GitHub's code hosting, pull requests and GitHub Actions in one app that you deploy to your own Cloudflare account. | |
| 132 | 187 | |
| 188 | +**Is Diffinery an open-source GitHub Actions alternative?** | |
| 189 | +Yes. Diffinery runs GitHub Actions workflow files from `.github/workflows/` with the same triggers, expressions, matrices, `needs`, reusable workflows, environments, secrets, OIDC, service containers and Docker, and downloads and runs marketplace actions (`uses: owner/repo@ref`). Every known difference is listed in [Compatibility with GitHub Actions](https://diffinery.com/docs/actions/compatibility). | |
| 190 | + | |
| 133 | 191 | **Is Diffinery a self-hosted GitHub alternative?** |
| 134 | -Yes. Like Gitea, Forgejo or GitLab, you can run it yourself, but instead of a server or a Kubernetes cluster it deploys to Cloudflare's serverless platform, and its CI runs GitHub Actions workflow files instead of a format of its own. | |
| 192 | +Yes. Like Gitea, Forgejo or GitLab, you run it yourself, but instead of a server or a Kubernetes cluster it deploys to Cloudflare's serverless platform, and its CI runs GitHub Actions workflow files instead of a format of its own. | |
| 135 | 193 | |
| 194 | +**How is Diffinery different from Gitea and Forgejo?** | |
| 195 | +All three are open-source forges you run yourself. Gitea and Forgejo run on your own servers, with runner machines you install for CI. Diffinery runs only on Cloudflare: there are no servers or runner machines to look after, and each CI job gets a fresh container, but your code lives on Cloudflare's infrastructure. Gitea and Forgejo have wikis and a package registry, which Diffinery doesn't. See [Diffinery vs Gitea and Forgejo](https://diffinery.com/compare/gitea). | |
| 196 | + | |
| 197 | +**Is Diffinery an alternative to Blacksmith or Depot?** | |
| 198 | +For a different kind of team. Blacksmith and Depot keep your code and pull requests on GitHub and run your jobs on faster machines, for a per-minute price. Diffinery replaces GitHub as well: your repositories move to your own instance, and your jobs run on 4-vCPU runners that your Cloudflare account pays for by the 10 ms. If you want to stay on GitHub and run nothing yourself, a runner service is the simpler choice. See [Diffinery vs Blacksmith](https://diffinery.com/compare/blacksmith) and [vs Depot](https://diffinery.com/compare/depot). | |
| 199 | + | |
| 136 | 200 | **Do my GitHub Actions workflows run without changes?** |
| 137 | 201 | Most do. Diffinery reads `.github/workflows/*.yml` with the same syntax and runs marketplace actions. Jobs that need hosted macOS, Windows or Arm runners need a self-hosted runner. See [Compatibility with GitHub Actions](https://diffinery.com/docs/actions/compatibility). |
| 138 | 202 | |
| 203 | +**Is Diffinery faster than GitHub Actions?** | |
| 204 | +We don't run jobs on GitHub to benchmark it, so we don't claim a speed-up figure. Diffinery's default runner has 4 vCPUs and 12 GiB, while GitHub's standard Linux runner for private repositories has 2 vCPUs and 8 GB, so jobs that use several cores get twice as many. On Diffinery, jobs start about 3 to 5 seconds after they're queued. See the [measured performance](https://diffinery.com/performance). | |
| 205 | + | |
| 206 | +**Can I run Diffinery CI while my code stays on GitHub?** | |
| 207 | +Yes. A small GitHub workflow mirrors every push to your Diffinery instance, which then runs the same `.github/workflows/` files, and can fail the GitHub job when the runs on Diffinery fail. See [Run Diffinery CI while your code stays on GitHub](https://diffinery.com/docs/guides/mirror-from-github). | |
| 208 | + | |
| 139 | 209 | **What does it cost to run?** |
| 140 | -Diffinery is free and open source under the Apache License 2.0. Running it costs whatever your own Cloudflare account bills: the Workers Paid plan plus usage. Hosted runners are Cloudflare Containers, which bill only while a job runs. | |
| 210 | +Diffinery is free and open source under the Apache License 2.0, with no paid edition. Running it costs whatever your own Cloudflare account bills: the Workers Paid plan plus usage. Hosted runners are Cloudflare Containers, which bill only while a job runs. | |
| 141 | 211 | |
| 212 | +**Does it run on Cloudflare's free plan?** | |
| 213 | +No. Containers, Durable Objects with SQLite, Workflows and Queues need the Workers Paid plan. See [Deploy your own Diffinery](https://diffinery.com/docs/self-hosting/deploy). | |
| 214 | + | |
| 142 | 215 | **Does it work with AI coding agents?** |
| 143 | 216 | Yes. Agents connect over MCP (`https://<your host>/mcp`), the REST API, git or the GitHub CLI. There are guides for Claude, Claude Code, Codex, Cursor and VS Code, and a plugin for Claude Code and Codex, installable with `claude plugin marketplace add https://diffinery.com/codician/diffinery.git` (sources in [`plugins/`](plugins)). See [Connect AI apps](https://diffinery.com/docs/connect). |
| 144 | 217 | |
| 218 | +**Can an AI agent merge its own pull request?** | |
| 219 | +Not by default. Unless a branch protection rule allows it, agents can't push to or merge into protected branches, their pull requests need a person's approval, their check results never satisfy required checks, and runs of code they pushed get no secrets. See [Guardrails](https://diffinery.com/docs/agents/overview#guardrails). | |
| 220 | + | |
| 145 | 221 | **Can I move my repositories from GitHub?** |
| 146 | -Yes. The importer brings a repository or a whole organization with history, issues, pull requests, reviews and releases. Secret names come over with a field to enter each value. See [Migrate from GitHub](https://diffinery.com/docs/migrate-from-github). | |
| 222 | +Yes. The importer brings a repository or a whole organization with history, issues, pull requests, reviews and releases. Secret names come over with a field to enter each value. `gh`, Octokit, VS Code and JetBrains IDEs work against Diffinery. See [Migrate from GitHub](https://diffinery.com/docs/migrate-from-github). | |
| 147 | 223 | |
| 224 | +**Can I sign up on diffinery.com?** | |
| 225 | +diffinery.com is the project's home and the instance Diffinery is developed on; accounts there are by invitation for the people working on it. It isn't a hosted service. To use Diffinery, deploy your own instance. | |
| 226 | + | |
| 227 | +**Is Diffinery the only Git platform on Cloudflare?** | |
| 228 | +No. Other open-source projects run Git or CI on Cloudflare too, and [Built on Cloudflare](https://diffinery.com/built-on-cloudflare#other-git-and-ci-projects-on-cloudflare) lists how they differ. As far as we know, Diffinery is the one where Git hosting, pull requests with reviews in a web UI and GitHub Actions–compatible CI with marketplace actions all run on Cloudflare (checked October 25, 2026). | |
| 229 | + | |
| 148 | 230 | **Where is development happening?** |
| 149 | -On Diffinery itself, at [diffinery.com/codician/diffinery](https://diffinery.com/codician/diffinery). Diffinery's own CI, deploys and pull requests run there. The GitHub repository is a mirror. | |
| 231 | +On Diffinery itself, at [diffinery.com/codician/diffinery](https://diffinery.com/codician/diffinery). Diffinery's own CI, deploys and pull requests run there. The GitHub repository is a mirror, and issues and pull requests are welcome in either place; see [CONTRIBUTING.md](CONTRIBUTING.md). | |
| 150 | 232 | |
| 151 | 233 | ## Contributing, security and license |
| 152 | 234 | |
| 153 | -- **Contributing:** see [CONTRIBUTING.md](CONTRIBUTING.md). Please follow the [Code of Conduct](CODE_OF_CONDUCT.md). | |
| 235 | +- **Contributing:** see [CONTRIBUTING.md](CONTRIBUTING.md), and [AGENTS.md](AGENTS.md) if you're an AI coding agent. Please follow the [Code of Conduct](CODE_OF_CONDUCT.md). Questions go to [SUPPORT.md](SUPPORT.md). | |
| 236 | +- **Roadmap and changes:** [ROADMAP.md](ROADMAP.md) and [CHANGELOG.md](CHANGELOG.md). | |
| 154 | 237 | - **Security:** please don't open public issues for vulnerabilities. Report them privately as described in [SECURITY.md](SECURITY.md). |
| 238 | +- **Citing Diffinery:** use GitHub's "Cite this repository" button, or [CITATION.cff](CITATION.cff). | |
| 155 | 239 | - **License:** [Apache License 2.0](LICENSE). See [NOTICE](NOTICE). |
addedROADMAP.md+41−0View file
| @@ -1,0 +1,41 @@ | ||
| 1 | +# Roadmap | |
| 2 | + | |
| 3 | +Diffinery is young. This page lists what it can't do yet and the directions we'd like to | |
| 4 | +take, so you can judge whether it fits you today and where help is most welcome. Nothing | |
| 5 | +here has a date. If something matters to you, open an issue or a pull request. | |
| 6 | + | |
| 7 | +## Works today | |
| 8 | + | |
| 9 | +Git hosting over HTTPS, pull requests with reviews, auto-merge and a merge queue, issues, | |
| 10 | +releases, a container registry, GitHub Actions–compatible CI on per-job Cloudflare | |
| 11 | +Containers with automatic runner sizing, self-hosted runners, a GitHub importer, the | |
| 12 | +GitHub-compatible REST and GraphQL APIs, an MCP server, agent accounts with guardrails, | |
| 13 | +sandboxes, agent tasks and agent review, the CLI, editor plugins and one-command | |
| 14 | +deployment to your own Cloudflare account. See [Features](https://diffinery.com/features). | |
| 15 | + | |
| 16 | +## Known gaps | |
| 17 | + | |
| 18 | +These are the main differences from GitHub that people ask about: | |
| 19 | + | |
| 20 | +- **Hosted macOS, Windows and Arm runners.** Hosted runners are Linux x64; other platforms | |
| 21 | + use [self-hosted runners](https://diffinery.com/docs/actions/runners#self-hosted-runners). | |
| 22 | +- **Git over SSH.** Git works over HTTPS only. | |
| 23 | +- **Forks**, and pull requests between repositories. | |
| 24 | +- **Richer reviews:** pending reviews, suggested changes and resolving threads; code-owner | |
| 25 | + reviews and signed-commit requirements in branch protection. | |
| 26 | +- **Workflow events** that are accepted but don't start runs yet, such as `issues` and | |
| 27 | + `issue_comment`. See [Compatibility](https://diffinery.com/docs/actions/compatibility). | |
| 28 | +- **Importing from Gitea, Forgejo and GitLab.** The importer reads from GitHub; other forges | |
| 29 | + move with [plain Git](https://diffinery.com/docs/migrate-from-github#move-with-plain-git). | |
| 30 | +- **Wikis, discussions and Pages-style static sites.** | |
| 31 | + | |
| 32 | +## Good places to start contributing | |
| 33 | + | |
| 34 | +- Compatibility gaps listed in | |
| 35 | + [Compatibility with GitHub Actions](https://diffinery.com/docs/actions/compatibility): | |
| 36 | + each one comes with the GitHub behaviour to match. | |
| 37 | +- Documentation: corrections, missing examples and guides for moving from other CI systems. | |
| 38 | +- Issues labelled `good first issue` and `help wanted`. | |
| 39 | + | |
| 40 | +See [CONTRIBUTING.md](CONTRIBUTING.md) for how to build, test and send changes, and | |
| 41 | +[CHANGELOG.md](CHANGELOG.md) for what has shipped. |
addedSUPPORT.md+18−0View file
| @@ -1,0 +1,18 @@ | ||
| 1 | +# Getting help with Diffinery | |
| 2 | + | |
| 3 | +- **How do I…?** Start with the [documentation](https://diffinery.com/docs) and the | |
| 4 | + [FAQ](https://diffinery.com/faq). Every page is also Markdown, and | |
| 5 | + [llms.txt](https://diffinery.com/llms.txt) lets an AI assistant read all of it. | |
| 6 | +- **Deploying your own instance:** [Deploy your own Diffinery](https://diffinery.com/docs/self-hosting/deploy), | |
| 7 | + [Configuration](https://diffinery.com/docs/self-hosting/configuration) and the | |
| 8 | + troubleshooting section of the deploy guide. | |
| 9 | +- **A workflow behaves differently from GitHub Actions:** check | |
| 10 | + [Compatibility with GitHub Actions](https://diffinery.com/docs/actions/compatibility) first, | |
| 11 | + then open an issue with the "Actions compatibility" template. | |
| 12 | +- **Bugs and feature requests:** open an issue on the | |
| 13 | + [GitHub mirror](https://github.com/codician-team/diffinery/issues) or, if you have an | |
| 14 | + account there, on [Diffinery](https://diffinery.com/codician/diffinery/issues). | |
| 15 | +- **Security problems:** never in a public issue. See [SECURITY.md](SECURITY.md). | |
| 16 | + | |
| 17 | +Diffinery is a volunteer-run open-source project with no paid support. There is no hosted | |
| 18 | +service: diffinery.com is the instance the project itself is developed on. |
modifiedapps/diffinery/src/web/site.tsx+2−0View file
| @@ -250,6 +250,8 @@ | ||
| 250 | 250 | isAccessibleForFree: true, |
| 251 | 251 | offers: { "@type": "Offer", price: "0", priceCurrency: "USD", description: "Free, open-source software. Your instance's Cloudflare usage is billed by Cloudflare." }, |
| 252 | 252 | softwareHelp: { "@type": "CreativeWork", url: `${o}/docs/self-hosting/deploy` }, |
| 253 | + installUrl: `${o}/docs/self-hosting/deploy`, | |
| 254 | + downloadUrl: `${SOURCE.repo}/releases`, | |
| 253 | 255 | publisher: { "@id": id.org }, |
| 254 | 256 | sameAs: [`${o}/docs`, SOURCE.repo, SOURCE.github], |
| 255 | 257 | }, |
modifiedapps/diffinery/test/unit/site.test.ts+1−1View file
| @@ -161,7 +161,7 @@ | ||
| 161 | 161 | // Open source: the license and the repositories, and no early access or pricing. |
| 162 | 162 | const source = g.find((n) => n["@type"] === "SoftwareSourceCode")!; |
| 163 | 163 | expect(source).toMatchObject({ codeRepository: "https://diffinery.com/codician/diffinery", license: "https://www.apache.org/licenses/LICENSE-2.0", sameAs: ["https://github.com/codician-team/diffinery"] }); |
| 164 | - expect(g.find((n) => n["@type"] === "SoftwareApplication")).toMatchObject({ license: "https://www.apache.org/licenses/LICENSE-2.0", isAccessibleForFree: true }); | |
| 164 | + expect(g.find((n) => n["@type"] === "SoftwareApplication")).toMatchObject({ license: "https://www.apache.org/licenses/LICENSE-2.0", isAccessibleForFree: true, installUrl: `${ORIGIN}/docs/self-hosting/deploy`, downloadUrl: "https://diffinery.com/codician/diffinery/releases" }); | |
| 165 | 165 | expect(html).not.toContain('href="/early-access"'); |
| 166 | 166 | expect(html).not.toMatch(/not been announced|hasn't been announced|invite-only while/i); |
| 167 | 167 | for (const href of ["/compare/github", "/compare/blacksmith", "/performance", "/agents", "/about", "/llms.txt", "/open-source", "/docs/self-hosting", "https://diffinery.com/codician/diffinery", "https://github.com/codician-team/diffinery"]) expect(html, href).toContain(`href="${href}"`); |
addedcontext7.json+15−0View file
| @@ -1,0 +1,15 @@ | ||
| 1 | +{ | |
| 2 | + "$schema": "https://context7.com/schema/context7.json", | |
| 3 | + "projectTitle": "Diffinery", | |
| 4 | + "description": "Open-source git forge with GitHub Actions-compatible CI, pull requests, an MCP server and AI agent guardrails, running entirely on Cloudflare Workers, Durable Objects, R2 and Containers.", | |
| 5 | + "folders": ["apps/diffinery/docs", "apps/diffinery/site"], | |
| 6 | + "excludeFolders": ["apps/diffinery/docs/images", "apps/diffinery/site/blog"], | |
| 7 | + "rules": [ | |
| 8 | + "Diffinery runs GitHub Actions workflow files from .github/workflows/ (or .diffinery/workflows/); check docs/actions/compatibility.md for every known difference before assuming GitHub behaviour.", | |
| 9 | + "Hosted runners are Linux x64 Ubuntu 24.04 containers with 4 vCPU and 12 GiB by default; macOS, Windows and Arm jobs need self-hosted runners started with `diffinery runner`.", | |
| 10 | + "Git works over HTTPS only, with a Diffinery token as the password; there is no SSH.", | |
| 11 | + "The REST API is GitHub-compatible at https://<host>/api/v3 and GraphQL at https://<host>/api/graphql, so gh and Octokit work with the instance as a GitHub Enterprise host.", | |
| 12 | + "AI agents should use their own agent account and token; they cannot push or merge to protected branches unless a branch rule allows it, and their pull requests need a person's approval.", | |
| 13 | + "Diffinery is self-hosted on your own Cloudflare account (Workers Paid plan); deploy with scripts/setup.sh as described in docs/self-hosting/deploy.md." | |
| 14 | + ] | |
| 15 | +} |
addeddocs/README.md+50−0View file
| @@ -1,0 +1,50 @@ | ||
| 1 | +# Diffinery documentation | |
| 2 | + | |
| 3 | +The documentation is published at **[diffinery.com/docs](https://diffinery.com/docs)**. Its | |
| 4 | +source is Markdown in this repository, under | |
| 5 | +[`apps/diffinery/docs/`](../apps/diffinery/docs), and every page is also available as | |
| 6 | +Markdown at `https://diffinery.com/docs/<page>.md` and in | |
| 7 | +[llms.txt](https://diffinery.com/llms.txt) and [llms-full.txt](https://diffinery.com/llms-full.txt) | |
| 8 | +for AI assistants. | |
| 9 | + | |
| 10 | +## Start here | |
| 11 | + | |
| 12 | +| Page | Source | | |
| 13 | +| --- | --- | | |
| 14 | +| [Quickstart](https://diffinery.com/docs/quickstart) | [quickstart.md](../apps/diffinery/docs/quickstart.md) | | |
| 15 | +| [Concepts](https://diffinery.com/docs/concepts) | [concepts.md](../apps/diffinery/docs/concepts.md) | | |
| 16 | +| [Deploy your own Diffinery](https://diffinery.com/docs/self-hosting/deploy) | [self-hosting/](../apps/diffinery/docs/self-hosting) | | |
| 17 | +| [Migrate from GitHub](https://diffinery.com/docs/migrate-from-github) | [migrate-from-github.md](../apps/diffinery/docs/migrate-from-github.md) | | |
| 18 | +| [Connect AI apps (Claude, Claude Code, Codex, Cursor)](https://diffinery.com/docs/connect) | [connect/](../apps/diffinery/docs/connect) | | |
| 19 | + | |
| 20 | +## By topic | |
| 21 | + | |
| 22 | +| Topic | What it covers | Source | | |
| 23 | +| --- | --- | --- | | |
| 24 | +| [Actions](https://diffinery.com/docs/actions/overview) | GitHub Actions–compatible CI: workflow syntax, events, runners, caching, artifacts, secrets, environments, OIDC, Docker, and the [compatibility list](https://diffinery.com/docs/actions/compatibility) | [actions/](../apps/diffinery/docs/actions) | | |
| 25 | +| [Repositories](https://diffinery.com/docs/repositories/git) | Git over HTTPS, browsing code, branch protection, push protection, cloning in editors | [repositories/](../apps/diffinery/docs/repositories) | | |
| 26 | +| [Collaboration](https://diffinery.com/docs/collaboration/pull-requests) | Pull requests, reviews, merge on green, merge queue, issues, releases, checks | [collaboration/](../apps/diffinery/docs/collaboration) | | |
| 27 | +| [Agents](https://diffinery.com/docs/agents/overview) | Agent accounts and guardrails, the MCP server, sandboxes, tasks, review, projects, Today | [agents/](../apps/diffinery/docs/agents) | | |
| 28 | +| [Packages](https://diffinery.com/docs/packages/container-registry) | The container registry | [packages/](../apps/diffinery/docs/packages) | | |
| 29 | +| [Accounts](https://diffinery.com/docs/accounts/passkeys-and-sign-in) | Passkeys, tokens, organizations, permissions, invitations | [accounts/](../apps/diffinery/docs/accounts) | | |
| 30 | +| [Security](https://diffinery.com/docs/security/overview) | Security model, push protection, audit log, vulnerability disclosure | [security/](../apps/diffinery/docs/security) | | |
| 31 | +| [Self-hosting](https://diffinery.com/docs/self-hosting) | Deploy, configure and operate your own instance on Cloudflare; architecture | [self-hosting/](../apps/diffinery/docs/self-hosting) | | |
| 32 | +| [Reference](https://diffinery.com/docs/reference/rest-api) | REST and GraphQL APIs, webhook events, limits | [reference/](../apps/diffinery/docs/reference) | | |
| 33 | +| [Guides](https://diffinery.com/docs/guides) | Faster CI, moving GitHub Actions workflows, running CI while code stays on GitHub, an AI agent with guardrails | [guides/](../apps/diffinery/docs/guides) | | |
| 34 | + | |
| 35 | +## Comparisons | |
| 36 | + | |
| 37 | +[Diffinery vs GitHub](https://diffinery.com/compare/github), | |
| 38 | +[GitLab](https://diffinery.com/compare/gitlab), | |
| 39 | +[Gitea and Forgejo](https://diffinery.com/compare/gitea), | |
| 40 | +[Bitbucket](https://diffinery.com/compare/bitbucket), | |
| 41 | +[CircleCI](https://diffinery.com/compare/circleci), | |
| 42 | +[Buildkite](https://diffinery.com/compare/buildkite), | |
| 43 | +[Blacksmith](https://diffinery.com/compare/blacksmith) and | |
| 44 | +[Depot](https://diffinery.com/compare/depot), with sources, in | |
| 45 | +[`apps/diffinery/site/compare/`](../apps/diffinery/site/compare). | |
| 46 | + | |
| 47 | +## Also in this folder | |
| 48 | + | |
| 49 | +- [PREFERENCES.md](PREFERENCES.md): product and design conventions for contributors. | |
| 50 | +- [images/](images): screenshots used in the README. |
addeddocs/images/actions-run.png+0−0View file
Binary file not shown.
addeddocs/images/job-logs-dark.png+0−0View file
Binary file not shown.
addeddocs/images/pull-request.png+0−0View file
Binary file not shown.
addeddocs/images/repository.png+0−0View file
Binary file not shown.
modifiedpackage.json+27−0View file
| @@ -1,6 +1,33 @@ | ||
| 1 | 1 | { |
| 2 | 2 | "name": "diffinery", |
| 3 | 3 | "private": true, |
| 4 | + "description": "Open-source GitHub and GitHub Actions alternative that runs entirely on Cloudflare: git hosting, pull requests, code review, drop-in GitHub Actions CI and AI agent guardrails.", | |
| 5 | + "homepage": "https://diffinery.com", | |
| 6 | + "repository": { | |
| 7 | + "type": "git", | |
| 8 | + "url": "https://github.com/codician-team/diffinery.git" | |
| 9 | + }, | |
| 10 | + "bugs": { | |
| 11 | + "url": "https://github.com/codician-team/diffinery/issues" | |
| 12 | + }, | |
| 13 | + "keywords": [ | |
| 14 | + "git", | |
| 15 | + "git-server", | |
| 16 | + "forge", | |
| 17 | + "github-alternative", | |
| 18 | + "github-actions", | |
| 19 | + "ci-cd", | |
| 20 | + "continuous-integration", | |
| 21 | + "cloudflare", | |
| 22 | + "cloudflare-workers", | |
| 23 | + "durable-objects", | |
| 24 | + "cloudflare-containers", | |
| 25 | + "self-hosted", | |
| 26 | + "serverless", | |
| 27 | + "code-review", | |
| 28 | + "ai-agents", | |
| 29 | + "mcp" | |
| 30 | + ], | |
| 4 | 31 | "license": "Apache-2.0", |
| 5 | 32 | "packageManager": "pnpm@10.28.0", |
| 6 | 33 | "scripts": { |