Deployaar integrates with GitHub through a GitHub App — not a personal access token or a classic OAuth token. A GitHub App grants fine-grained, organization-level repository access, generates short-lived installation tokens instead of storing long-lived credentials, and can be installed to specific repositories rather than an entire account. This is what allows Deployaar to clone private repositories, push branches, and open pull requests on your behalf without ever storing a permanent GitHub credential.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/paramveer-cyber/Deployaar/llms.txt
Use this file to discover all available pages before exploring further.
Setting Up the GitHub App
Create a GitHub App in your organization
Go to your GitHub organization’s settings → Developer settings → GitHub Apps → New GitHub App. Give it a name (e.g., “Deployaar”) and a homepage URL.
Configure required permissions
Set the following repository permissions:
Deployaar does not require any organization or account permissions.
| Permission | Level |
|---|---|
| Contents | Read and write |
| Pull requests | Read and write |
| Metadata | Read (required by GitHub, always enabled) |
Set the webhook URL
Enter your API domain’s webhook endpoint:Enable the following webhook events: Pull requests, Issues.
Generate and download the private key
Scroll to the bottom of the App settings page and click Generate a private key. Download the
.pem file. This is the only time GitHub gives you the key — store it securely.Installing the App
Creating the GitHub App is a one-time setup step. After creation, each user or organization that wants to use Deployaar must install the App to grant it access to their repositories. Users install the App from the Deployaar settings page at/dashboard/settings/github. The installation flow redirects to GitHub, where the user selects which repositories to grant access to. On completion, GitHub stores the installation record and Deployaar records the installationId against the user’s account.
An installationId is required for every repository operation. Deployaar resolves it through getInstallationOctokit(userId), which fetches the stored installation from the database and calls app.getInstallationOctokit(installation.installationId).
Linking a Repository to a Project
Every Deployaar project is linked to exactly one GitHub repository. The linked repository is:- The one the coding agent shallow-clones into the E2B sandbox
- The one the agent pushes branches to and opens PRs against
- The one whose webhook events are routed to the corresponding feature requests
Webhook Events
Deployaar handles two categories of GitHub webhook events. Every incoming webhook is first verified for authenticity before any logic runs.Signature verification
Signature verification
Every webhook payload is verified using HMAC-SHA256 with Webhooks with invalid signatures are rejected immediately with no processing. Duplicate deliveries (identified by the
GITHUB_WEBHOOK_SECRET:X-GitHub-Delivery ID) are also deduplicated — Deployaar records each delivery ID in github_webhook_deliveries and ignores redeliveries.pull_request events — routed when the action is opened, synchronize, or reopened. The webhook handler fires the github/pull-request.received Inngest event for all matching repos. Inside the onPullRequestReceived Inngest function, the head.ref branch name is checked against the pattern deployaar_([0-9a-f-]{36}). If it matches, the feature request ID is extracted and AI review runs. PRs from branches that don’t match the pattern are silently skipped at the Inngest function level.
issues events — routed when the action is opened or edited. A new feature request is created from the issue title and body with source: "feature_request_issue". Duplicate issues (same repoId + issueNumber) are returned as-is without creating a duplicate record.
Webhook events for repositories not connected to any Deployaar project are silently ignored — no error, no processing.
GitHub API Operations
Deployaar uses Octokit (viapackages/services/github) for the following operations. All calls use an installation-scoped Octokit instance, never a user token.
| Operation | API Endpoint |
|---|---|
| List repositories for an installation | GET /installation/repositories |
| Get a single repository | GET /repos/{owner}/{repo} |
| List branches | GET /repos/{owner}/{repo}/branches |
| List commits | GET /repos/{owner}/{repo}/commits |
| List issues | GET /repos/{owner}/{repo}/issues |
| List pull requests | GET /repos/{owner}/{repo}/pulls |
| Get a pull request | GET /repos/{owner}/{repo}/pulls/{pull_number} |
| Get PR files (diff) | GET /repos/{owner}/{repo}/pulls/{pull_number}/files |
| Get PR commits | GET /repos/{owner}/{repo}/pulls/{pull_number}/commits |
| Create a pull request | POST /repos/{owner}/{repo}/pulls |
| Merge a pull request | PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge |
feat: {featureRequest.title} (#prNumber).
Installation Tokens
Deployaar never stores a GitHub access token in the database. For each clone and push operation the coding agent needs to perform, a short-lived installation token is generated on demand:git clone and git push URLs and are never written to disk or stored in any database table. GitHub installation tokens expire after one hour, which is well within the time window of a single agent run.
For GitHub OAuth login setup (the “Sign in with GitHub” button), see Authentication. The OAuth App credentials (
GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRET) are configured separately from the GitHub App credentials used here.