Skip to content

GitHub Sync

GitHub Sync connects Ironspire to your GitHub repositories using a Personal Access Token (PAT). Once connected, it pulls in pull requests, issues, releases and reviews, then uses that data to auto-populate your Blueprint project structure.

Setting up your token

  1. Open Settings (click the gear icon in the status bar or press Ctrl+,)
  2. Navigate to the GitHub section
  3. Click Connect GitHub account
  4. Paste your GitHub Personal Access Token

The token is stored using Electron's safeStorage API, which encrypts it with your operating system's credential store (Windows DPAPI, macOS Keychain or Linux libsecret). The token is never stored in plain text on disk.

Required token scopes

Your PAT needs the following permissions:

ScopeWhy it is needed
repoRead access to repositories, pull requests, issues and releases
read:orgList organisation repositories (if your project is in an org)

To create a token, go to GitHub Settings > Developer settings > Personal access tokens and generate a new token (classic) with the scopes above. Fine-grained tokens also work as long as they grant read access to the target repository's contents, issues, pull requests and releases.

Never share your Personal Access Token. If you suspect it has been compromised, revoke it immediately from GitHub and generate a new one in Ironspire Settings.

Token display and management

Once saved, your token appears masked in the GitHub Settings section (e.g., ghp_****...****). You can:

  • Test connection: verify the token works and see your GitHub username
  • Revoke: remove the token from Ironspire's secure storage. This does not revoke the token on GitHub; do that separately if needed.

What gets synced

GitHub Sync fetches four types of data from your connected repository:

Data typeWhat is storedUsed for
Pull requestsTitle, state, author, dates, labels, merge statusBlueprint plan generation, agent context
IssuesTitle, state, labels, assignees, milestoneBlueprint task awareness, backlog context
ReleasesTag, title, body, date, draft/prerelease statusMilestone timeline enrichment
ReviewsPR review comments, status, reviewerCode quality context for agents

All data is stored in a per-profile SQLite database (github_intel.db) using WAL mode for concurrent read performance. The database is registered with the ShutdownManager so it closes cleanly when the app exits or the profile changes.

Sync behaviour

Incremental updates

After the initial full sync, subsequent syncs only fetch records updated since the last sync timestamp. This keeps API usage low and sync times fast, even for repositories with thousands of issues and pull requests.

Polling intervals

ContextInterval
Foreground (app is focused)Every 5 minutes
Background (app is minimised or another profile is active)Every 30 minutes
ManualClick the refresh button in the Git Intelligence section header

You can trigger a manual sync at any time. The refresh button shows a spinning indicator while the sync is in progress.

Rate limit awareness

GitHub's API allows 5,000 requests per hour for authenticated users. Ironspire monitors the remaining request count from each API response. When fewer than 100 requests remain, the sync pauses until the rate limit window resets. A status message appears in the Git Intelligence section when rate limiting is active.

Incremental sync typically uses 4 - 8 API requests per cycle (one per data type, plus pagination if needed). Under normal usage you will never approach the rate limit.

Blueprint auto-population

The most powerful feature of GitHub Sync is automatic Blueprint population. When sync data is available, the Blueprint Population Service maps GitHub data to the Blueprint hierarchy:

Mapping rules

GitHub sourceBlueprint levelHow it maps
Semver tagsMilestoneEach tag becomes a milestone with its version, date and commit range
Commit typesPhaseConventional commit prefixes (feat, fix, refactor, etc.) are grouped into phases within each milestone
Pull requestsPlanEach merged PR becomes a plan with its title, description and linked commits
CommitsTaskIndividual commits within a PR become tasks, linked to their parent plan

How it works

  1. GitHub Sync fetches the latest data
  2. The Blueprint Population Service compares synced data against existing Blueprint items
  3. New milestones, phases, plans and tasks are created for any data that does not already have a corresponding Blueprint entry
  4. Existing Blueprint items are not modified or overwritten

This means you can freely edit Blueprint items after they are auto-populated. Manual changes are preserved across future syncs.

Source and confidence badges

Auto-populated Blueprint items carry two visual indicators:

  • Source badge: shows "GitHub" to distinguish auto-populated items from manually created ones
  • Confidence badge: indicates how reliable the mapping is (High for direct matches like tag-to-milestone, Medium for inferred mappings like commit-type-to-phase)

These badges appear in the Progress panel next to each Blueprint item.

Sync submodules

Internally, GitHub Sync is divided into four submodules that run independently:

SubmoduleResponsibility
sync-pullsFetches open and recently closed pull requests
sync-issuesFetches open and recently updated issues
sync-releasesFetches published releases and drafts
sync-reviewsFetches review comments for synced pull requests

Each submodule tracks its own "last synced" timestamp, so a failure in one does not block the others. If sync-reviews fails (e.g., due to a network error), pull requests, issues and releases continue syncing normally.

Data storage

All synced data lives in a per-profile SQLite database named github_intel.db, stored alongside your profile's other data files. The database uses WAL (Write-Ahead Logging) mode for concurrent read performance, meaning the UI can read from the database while a background sync writes new data without contention.

The database is registered with Ironspire's ShutdownManager. When you close the app, switch profiles or trigger an E-STOP, the database connection is closed cleanly to prevent corruption. If the app crashes unexpectedly, WAL mode ensures the database remains in a consistent state on next launch.

Database size depends on the repository. A project with 500 pull requests, 1,000 issues and 50 releases typically occupies 2 - 5 MB on disk.

Troubleshooting

Common issues and their solutions:

ProblemCauseFix
Sync never completesInvalid or expired tokenRevoke and re-enter your PAT in Settings
Missing pull requestsToken lacks repo scopeGenerate a new token with the correct scopes
"Rate limited" messageToo many API requests in the current hourWait for the rate limit window to reset (shown in the status message)
Stale data after force-pushIncremental sync missed the rewritten historyClick the manual refresh button to trigger a full re-sync

Disconnecting

To remove GitHub integration:

  1. Open Settings > GitHub
  2. Click Revoke next to your masked token
  3. Confirm the removal

This removes the token from Ironspire's secure storage and stops all sync activity. Your local github_intel.db database is retained so previously synced data remains available. Delete the database file manually if you want a clean slate.

Next steps