- Authenticated repository cloning — agents clone private repos using short-lived installation tokens
- PR lifecycle automation — webhooks automatically move tasks to “done” when PRs are merged and detect merge conflicts
Prerequisites
- A running Konduktor server (
konduktor-server start) - A GitHub account with permission to create GitHub Apps
- Your Konduktor server accessible from the internet (for webhook delivery)
Local development? If your server isn’t publicly accessible, use a tunnel service like zrok, ngrok, or Cloudflare Tunnel to expose it.
Step 1: Create the GitHub App
-
Go to GitHub Settings > Developer settings > GitHub Apps > New GitHub App
- Direct link: https://github.com/settings/apps/new
- For an organization:
https://github.com/organizations/<org>/settings/apps/new
-
Fill in the basic fields:
Field Value App name Something unique, e.g. konduktor-myteamHomepage URL Your Konduktor server URL, or https://github.com/yakkomajuri/konduktor-oss -
Configure the Webhook section:
Generate a webhook secret:
Field Value Active Checked Webhook URL https://<your-konduktor-host>/api/webhooks/githubWebhook secret A random secret (see below) Save this value — you’ll need it when configuring the Konduktor server. -
Set Permissions (under “Permissions & events”):
Category Permission Access Repository Contents Read-only Repository Pull requests Read & write Repository Metadata Read-only (auto-selected) - Contents (read) — allows cloning repositories with installation tokens
- Pull requests (read & write) — allows reading PR status for merge conflict detection and task automation
- Metadata (read) — required by GitHub for all apps, auto-selected
-
Under Subscribe to events, check:
- Pull request
-
Under Where can this GitHub App be installed?, select:
- Only on this account (recommended for self-hosted setups)
- Or Any account if you need cross-organization support
- Click Create GitHub App.
Step 2: Note your App ID
After creation, you’ll land on the app’s settings page. Note the App ID displayed near the top — you’ll need it during configuration. The App ID is a numeric value (e.g.123456).
Step 3: Generate a private key
Still on the app settings page:- Scroll down to Private keys
- Click Generate a private key
- A
.pemfile will download automatically — save it somewhere accessible to your server
Step 4: Install the app on your repositories
- In the app settings sidebar, click Install App
- Select the account (user or organization) where your repositories live
- Choose repository access:
- All repositories — the app works with every repo in the account
- Only select repositories — pick specific repos (recommended)
- Click Install
Step 5: Configure Konduktor
Run the interactive configuration command:- Copy the PEM file to
~/.konduktor/github-app.pem(with0600permissions) - Auto-discover the installation ID by querying the GitHub API
- Save the configuration to
~/.konduktor/github-app.json(with0600permissions)
Configuration files
After setup, two files are created in~/.konduktor/:
| File | Contents |
|---|---|
github-app.json | app_id, installation_id, webhook_secret |
github-app.pem | RSA private key for JWT authentication |
0600 permissions (owner read/write only).
Custom data directory
If you use a custom data directory, set theKONDUKTOR_DIR environment variable before running the configuration:
Step 6: Restart the server
Restart Konduktor so it picks up the new GitHub App configuration:POST /api/webhooks/github is now active.
Step 7: Verify the setup
Test webhook delivery
- Go to your GitHub App settings page:
https://github.com/settings/apps/<your-app-name> - Click Advanced in the sidebar
- Check Recent Deliveries — you should see a
pingevent from when the app was installed - Click the delivery and verify it shows a
200response
Test with a pull request
- Create a test PR on a repository where the app is installed
- Include a kid tag in the PR title — e.g.
Test PR [kid: #abcd1234](whereabcd1234matches the first 8+ characters of a task ID) - Check Konduktor’s server logs for processing output:
- Merge the PR — the linked task should automatically move to the “done” column
Verify authenticated cloning
How it works
Webhook flow
Authentication flow
Kid tags
Konduktor links PRs to tasks using kid tags in PR titles. The format is:Fix login timeout [kid: #4d9d444d]
The tag prefix must match the first 8+ hex characters of a task ID. When agents create PRs through Konduktor, kid tags are added automatically.
Troubleshooting
Webhook returns 503
Cause: GitHub App is not configured on the Konduktor server. Fix: Runuv run konduktor-server configure-github-app and restart the server.
Webhook returns 401
Cause: Webhook signature verification failed — the webhook secret doesn’t match. Fix: Ensure the webhook secret in your GitHub App settings matches the one stored in~/.konduktor/github-app.json. Re-run configure-github-app if needed.
”No installations found” during configuration
Cause: The GitHub App hasn’t been installed on any account yet. Fix: Go to your app’s settings page, click Install App, and install it on your account/organization (Step 4).”Multiple installations found”
Cause: The app is installed on more than one account. Fix: The error message lists all installations with their IDs. Currently, Konduktor auto-discovers the installation ID when there’s only one. If you have multiple installations, you may need to re-install the app on only the target account, or manually edit~/.konduktor/github-app.json to set the correct installation_id.
Webhook events are not reaching the server
- Check your server is accessible from the internet at the webhook URL
- In your GitHub App settings, go to Advanced > Recent Deliveries to see if GitHub is sending events
- If deliveries show connection errors, verify your tunnel or DNS setup
- Ensure your firewall allows inbound HTTPS traffic on the server port
PR merged but task didn’t move to “done”
- Verify the PR title contains a valid kid tag:
[kid: #<prefix>] - Check that the task ID prefix matches an existing task
- Confirm the task is in the
pr_submittedcolumn (only tasks inpr_submittedmove todoneon merge) - Check server logs for processing details
Updating the GitHub App
Changing the webhook URL
If your server address changes (e.g. new domain, new tunnel URL):- Go to your GitHub App settings
- Update the Webhook URL field
- Click Save changes
Rotating the webhook secret
- Generate a new secret:
openssl rand -hex 32 - Update the secret in your GitHub App settings
- Re-run
uv run konduktor-server configure-github-appwith the new secret - Restart the server
Regenerating the private key
- Go to your GitHub App settings > Private keys
- Click Generate a private key (a new
.pemfile downloads) - Optionally revoke the old key
- Re-run
uv run konduktor-server configure-github-appwith the path to the new PEM file - Restart the server