Integrations
View on GitHubIntegrations
Orbit lets a project connect third-party tools, along three separate axes: notify integrations (Discord today; Slack and others are shown in the catalog as "coming soon") push Orbit activity out via a webhook, import integrations (Jira today; Linear, Asana, Trello are catalog-only stubs) pull issues/epics/subtasks in from a remote system on request, and github — the one integration of this kind — links a pull request to an Orbit issue through a GitHub App installation. This category documents the whole system: the frontend catalog, the per-project settings persisted in the database, the event-driven pipeline that turns "something happened in Orbit" into "a message landed in Discord", the pull-based pipeline that turns "a user clicked Import" into "Jira's issues exist in Orbit", and the relay-based pipeline that links a GitHub pull request to an Orbit issue.
Guides, in the order you'd actually need them
- Add a new integrationIntegrationsAdd a new integrationWorked example: turning Slack from a locked "coming soon" catalog card into a fully working integration, exactly the way Discord works today. Slack already… — turn a "coming soon" catalog entry (or a brand new one) into a real, working notify integration end to end.
- Add integration settingsIntegrationsAdd integration settingsprojectintegrations currently stores, per project+integration pair: — give a notify integration its own config shape beyond "enabled" and a webhook URL (e.g. a channel name, an API key, a numeric option).
- Add a new event typeIntegrationsAdd a new event typeWorked example: adding IssueCreated — a kind of activity that doesn't exist yet. Today, creating an issue only fires IssueAssigned, and only if it's create… — wire up
an entirely new kind of activity (using
IssueCreatedas the worked example) so both user notifications and notify integrations can react to it. - Frontend ↔ backend wiring overviewIntegrationsFrontend ↔ backend wiring overviewA map of the whole feature, useful to read before diving into any of the other guides. Three separate flows: reading the settings page, writing a toggle/we… — the full request/response shape for the notify-integration feature, useful as a map before diving into guides 1–3.
- Add an import integrationIntegrationsAdd an import integrationWorked example: turning Linear from a locked "coming soon" catalog card into a fully working import integration, the same way Jira works today. This is the… — turn a "coming soon" catalog entry into a real, working import integration (using Linear as the worked example, built from Jira's already-complete implementation).
- The GitHub integrationIntegrationsThe GitHub integrationUnlike the notify (webhook) and import (pull) integrations covered in the other guides in this category, GitHub is a third kind: a GitHub App installation,… — how the
actual, already-wired-up github-kind integration works:
architecture (via the
orbit-apirelay), connecting a project, the<!-- orbit-issue:ID -->marker syntax, and troubleshooting.
Need to gate a new integration ability behind its own permission? See
../permissions/01-add-a-new-permission.mdRoles & permissions (RBAC)Add a new permissionThe general, step-by-step pattern for adding any new projects./issues./comments. permission and getting it to show up correctly in Settings → Roles & manag…
in the roles & permissionsRoles & permissions (RBAC)Every project has its own role-based access control: four built-in system role tiers (Owner, Admin, Member, Viewer) plus any number of project-defined cust… category — that
guide isn't repeated here since it applies to any projects.*/
issues.*/comments.* permission, not just integration ones.
The architecture in one paragraph
The frontend has a static catalog (resources/js/types/Integrations.ts)
of every integration Orbit could ever support — name, icon, category,
description, sub-options, and a kind: 'notify' | 'import' | 'github'
discriminator — regardless of whether it's actually wired up yet
(comingSoon: true/false). Per-project state (is it enabled, its
webhook URL/credentials, which sub-options are on) lives in one
database table, project_integrations. For notify integrations,
domain events (App\Events\*) that already exist for in-app/email
notifications — IssueAssigned, IssueUnassigned, IssueUpdated,
CommentAdded — are also consumed by a second listener,
NotifyProjectIntegrationsListener, which maps each event to a
sub-option category (issue-activity / comment-activity) and hands
it to whichever IntegrationNotifier the event's project has enabled
for that category. For import integrations, there's no event to
react to — a controller action dispatches a queued job that resolves
an IntegrationImporter, maps the remote system's raw payload into a
source-agnostic ExternalIssueDTO, and hands every DTO to the shared
ImportOrchestratorService, which handles dedup (external_issue_links),
field mapping (integration_field_mappings), and hierarchy
(Issue::parent_id) the same way regardless of which remote system
produced the DTO. The github kind is a third, self-contained shape:
a GitHub App installation is proxied through the public orbit-api
relay (see guide 06IntegrationsThe GitHub integrationUnlike the notify (webhook) and import (pull) integrations covered in the other guides in this category, GitHub is a third kind: a GitHub App installation,…) rather than a
webhook or a pull-based import, so it gets its own settings panel
(WorkspaceSettingsGithubConnectPanel) and its own scheduled poller
(PollGithubRelayEvents) instead of reusing the notify/import
pipelines. Adding an integration, a new kind of event, or a new
importer never requires touching the other axes' plumbing — see the
guides for exactly where each new piece plugs in.
