2-06 / Series
2-06 № 06 · 2026

Put the home of your code
on your own side.

The builder's workshop, on your own side — repositories and CI, outside Microsoft

*A builder's work is not writing code. It is having AI write it, evaluating it, and integrating it* (1-04). But the code that results needs a place to live — the repository.

2-05 stood up the gate. The workshop goes inside it. The more code AI generates, the more control over where it lives matters.

GitHub and Azure DevOps both sit on someone else's servers. Here, that workshop gets stood up on the one machine handed to the AI in 2-02.

Keep control of where the code lives

Code is an asset. The substance of the business itself is written there. The reason to leave it parked on someone else's platform is now thin.

Generic Git hosting is already there as OSS. You don't write it, you stand it up.

Stand up Forgejo

The workshop is Forgejo, a single Gitea-family binary carrying repositories, issues, pull requests, review, and CI in one. It is a replacement for GitHub, GitLab, and Azure DevOps. The project ships a single binary, and its documentation carries the systemd unit. So, as 2-02 decided, place the file and register it with systemd.

# after placing the binary, creating the git user, and registering the official forgejo.service
sudo systemctl enable --now forgejo
git remote add origin [email protected]:team/app.git
git push -u origin main          # already on your own server

The PostgreSQL role name and password for Forgejo are the human's to decide and supply.

Run CI/CD with Forgejo Actions

Automating tests, builds, and deploys is Forgejo Actions. Workflows in the same syntax as GitHub Actions run as-is. Just drop one file in the repository.

# .forgejo/workflows/ci.yml
on: [push]
jobs:
  test:
    runs-on: host            # no container; runs directly on this machine
    steps:
      - uses: actions/checkout@v4
      - run: uv run pytest   # on your own runner, at no extra charge

The runner (forgejo-runner) is a single binary too, run under systemd. With no Docker, jobs run directly on the machine (host). The official documentation warns that there is no isolation and a single job can destroy the host, so three decisions go with it.

Step off GitHub Actions' minute caps and billing. The runner is on your side too, so you can verify AI-written code any number of times without watching a meter.

The local tools are Zed and the AI called from inside it

If the server is Forgejo, local editing is Zed: a Rust-built, lightweight editor with co-editing, which can host an AI agent inside the editor (ACP). Call the AI subscribed to in 2-02 in place to generate, fix, and explain, while the builder concentrates on evaluation and integration.

git clone [email protected]:team/app.git
zed app/          # call the AI, have it write, evaluate, and push

AI writes; the human decides. With the workshop (Forgejo) and the tool (Zed) in place, that division of labor just runs.

Place it behind the gate, and migrate in stages

Put Forgejo behind the reverse proxy (2-05). Migrating from GitHub, Forgejo's "New Migration" imports a repository together with its issues and PRs.

git.example.com { reverse_proxy localhost:3000 }

There is no need to switch in one stroke. Keep GitHub as a mirror and run in parallel, then move production onto Forgejo once it feels natural (2-12).

Code is the substance of the business itself. Control of where it lives belongs to you, not another company.

How to check you are done

This chapter is done when these five hold.

  1. You open git.example.com in a browser and log in as the administrator you created
  2. Code you git push from your own machine appears in the Forgejo web UI
  3. After the push, the workflow runs on Forgejo's Actions page and the pytest result is visible
  4. You open the repository in Zed, call the AI to write code, and push it from there
  5. A repository imported from GitHub with "New Migration" arrives with its issues and PRs attached
systemctl status forgejo forgejo-runner # both running under systemd
git push -u origin main                 # then look at the web UI
curl -sI https://git.example.com        # does it answer through Caddy

What the human holds

Values the human supplies

Actions the AI states before performing

Versions checked, and when

Summary

The builder's workshop, on your own side.

The only code written is configuration. The generic is already there, as OSS. The next chapter keeps the manuscript of every document as text, and turns Word and Claude Docs into doors you pass through.


Related articles