database
backend
frontend
integrations
Multi-repo changelog support: link multiple GitHub repos to a project
- Link multiple GitHub repositories to a single project — Projects can now track one or more GitHub repositories via a new project_repos table. You can add and remove repo links in project settings, webhooks and sync pipelines now run per linked repo (so one repository can trigger multiple projects), and history is preserved when removing links.
API
- Added GET /v1/projects/:projectId/repos to list linked repositories and POST /v1/projects/:projectId/repos to link a repository; the POST validated installation ownership, created a project_repos row, fired repo/sync.requested with projectRepoId, and wrote a repo.connected audit entry.backend
- Added DELETE /v1/projects/:projectId/repos/:repoId to remove a repository link, enforced a minimum of one linked repo (returned 422 if removal would leave zero), preserved commit and changelog history, and wrote a repo.disconnected audit entry.backend
- Changed POST /v1/projects to create a seed project_repos row during project creation and include projectRepoId in the repo/sync.requested event.backend
- Changed POST /v1/projects/:projectId/resync and the GitHub webhook handler to fan out one sync or push event per linked repo, with each event carrying projectRepoId and trackedBranch so multiple projects can receive events from the same repository.backend
- Removed repo_owner and repo_name from the project object in GET /v1/changelog/:slug responses since repo coordinates moved to project_repos.backend
Improvements
- Added a new project_repos join table via migration that backfilled existing projects, stored repo coordinates and sync metadata, enforced uniqueness, and applied row-level security consistent with projects.database
- Added ProjectRepoRepository (exposed as db.projectRepos) with create, findByProjectId, findByRepo, findByInstallation, findById, updateSyncStatus, updateAvailableBranches, and delete methods.database
- Moved repo-specific data and methods off the projects row — ProjectRepository was simplified and database types were updated so repo fields are now stored only on project_repos.database
- Updated Inngest pipelines and event shapes to include projectRepoId on github/push.received, repo/sync.requested and commit/received; repo/sync.requested now accepted a 'repo_added' trigger and wrote sync status to project_repos.backend
- Changed sync and push processing (github-sync-all-commits, github-process-push, and sync-repo) to fan out per project_repos row and to use trackedBranch and projectRepoId from the project_repos row.backend
Improvements
- Added ProjectReposSection to project settings with an Add Repository modal (installation → repo → branch), per-row Remove button with confirmation, and display of sync status, tracked branch, and last-synced time.frontend
- Added web proxy routes and client hooks (useProjectRepos, useAddProjectRepo, useRemoveProjectRepo), updated Dashboard, ProjectGrid, ProjectCard, project header, ProjectSwitcher, and ProjectSettings to fetch and render primary repo data correctly.frontend
Bug Fixes
- Fixed a bug where the project_repos create result was not assigned (projectRepo was undefined), preventing the Inngest event from including projectRepoId.backend
- Added and updated unit and end-to-end tests across database, API, and Inngest to cover the new multi-repo behavior, repository methods, and webhook fan-out.