docs/book/src/channels/git-github-app.md
The Git channel with provider = "github" authenticates as a GitHub App, not as a user. The app has its own bot identity (your-app[bot]), its own permissions, and works on every repository it is installed on. This page walks the one-time app creation and maps each value onto the channel config.
Works for both a personal account and an organization: the only difference is where the app is owned and who can install it.
Official docs: GitHub's own Registering a GitHub App and Managing private keys for GitHub Apps are the upstream reference for everything on this page.
GitHub → Settings → Developer settings → GitHub Apps → New GitHub App.
Fill in:
workflow_run.* eventsClick Create GitHub App.
On the app's settings page after creation:
app_id..pem (RS256). This is your signing key; GitHub keeps only the public half. You paste its contents into private_key; the .pem file itself is not referenced at runtime, so once the key is stored you can delete the download.App settings → Install App → pick your account or org → choose All repositories or a specific selection. Installation is what grants the app access to repos; without it the app can authenticate but sees nothing.
If the app is installed on exactly one account, you can leave installation_id unset: the channel lists installations on first use and auto-selects the sole one, failing fast if it finds zero or several. Set installation_id explicitly only when the app has multiple installations (one channel alias serves one installation).
Set each field below on whichever surface you prefer. The private key is an encrypted secret and gets its own masked widget; the rest are plain fields.
provider: set to github.
{{#config-set channels.git.<alias>.provider}}
app_id: the App ID from step 2.
{{#config-set channels.git.<alias>.app_id}}
private_key: the PEM from step 2. It lives inline in the one encrypted config store; there is no separate key file on disk to protect. Paste the full PEM, BEGIN/END lines included; the dashboard renders it as a masked multi-line field.
{{#secret-config channels.git.<alias>.private_key}}
repos: the owner/repo list to watch. Leave empty to poll every repo the installation can see.
{{#config-set channels.git.<alias>.repos}}
installation_id: optional, only when the app has multiple installations (step 3). With a single installation, leave it unset and the channel auto-selects.
{{#config-set channels.git.<alias>.installation_id}}
For the full field reference, see the Git channel page.
The git channel is not in the lean default build. Build it with --features channel-git (or the broader channels-full):
cargo build --features channel-git
channel-git pulls in every wired forge provider in one build; there is no smaller per-provider subset, and building a bare provider-* feature without channel-git does not register the channel.
On startup the channel mints an app JWT, exchanges it for an installation token, and resolves its own bot login. A pull_request.opened or an @-mention of the app on an issue should now reach the agent. If startup fails with a missing-private-key error, private_key is unset or blank; if it fails with an installation error, the app has zero or multiple installations, so set installation_id. See the Git channel page for event routing, peer-group binding, and operating notes.