Feed
It reads what your team already writes.
Nine connectors, and each one states what it reads and what it refuses to read. Nothing is connected by default, nothing is watched until you pick it, and anything Harbor cannot attribute to somebody inside your company waits for a person.
What a connector actually does
A source is one tool your team already uses, watched for the things that would be non-obvious to somebody new. When a pull request merges or a decision lands in a channel, the connector reads that one unit of work and proposes what it learned.
It proposes rather than decides. Whether that proposal waits for a person is a workspace setting, and it is the same setting that governs what your agents capture. One dial covers both inlets, so a fact distilled from Slack is treated exactly like the same fact recorded by an agent. On the default setting a routine extraction is added straight away but only provisionally, which means it has to earn its place or it decays back out. See what gets in, and what stays for the dial and what each position does.
Two shapes are held for a person in every setting, including the most permissive one. Anything that contradicts a rule you already have is held, because quietly overwriting a rule a colleague wrote is the one thing that would make the brain untrustworthy. And anything Harbor cannot place inside your company is held: an outside contributor on a public repo, a Slack Connect guest, a customer filing a ticket. A private repo answers for an author it cannot name, because an admin decided who can push to it. A public one does not.
It also declines a great deal without asking you. The filter is whether a fact would be non-obvious to a new joiner, so a convention that can be read off the code does not become a rule about the code.
The nine, and what each one reads
Two columns matter here and the second one matters more. Every string below is read from the same constant the product’s own connector tiles render from, so what this page promises and what your Sources page says cannot drift apart.
| Source | You pick | It reads | It never reads |
|---|---|---|---|
| Slack | channels | decisions, blockers, completions and questions answered, in the public channels you pick | DMs, private channels, or any channel you have not enabled |
| GitHub | repositories | merged pull requests, their review discussion and markdown docs, in the repos you pick | repos you have not enabled, issue rows, or CI noise |
| GitLab | projects | merged merge requests, their review discussion and markdown docs, in the projects you pick | projects you have not enabled, issue rows, or pipeline noise |
| Notion | pages | pages nested under the roots you pick | pages nobody shared with the integration, or private workspaces |
| Google Drive | folders | readable files in the folders you pick, and in their sub-folders | files nobody shared with the integration, or folders you have not enabled |
| Linear | teams | documents in projects, project updates and closed-issue discussions | issue rows, statuses, assignees, or open tickets |
| Confluence | spaces | pages in the spaces you pick, split by heading | personal spaces, archived pages, blog posts, or spaces you have not enabled |
| Jira | projects | closed issues in the projects you pick, with their comment threads | issue rows, statuses, assignees, open tickets, bot comments, or projects you have not enabled |
| Granola | folders | meetings in the Granola folders you pick | private notes, meetings in folders you have not enabled, or meetings Granola has not finished summarising |
Connecting one
Sources is admin-only. A member has no nav entry, the route bounces, and the API answers 404 rather than 403, so the surface does not confirm its own existence to somebody who cannot use it. See roles and access for which roles hold source.manage and which hold only source.read.
Open Sources and pick the tool
Each tile states what that connector reads before you grant anything. The grant is OAuth for most sources and an API key for the rest, and it is the tool’s own consent screen, not ours.
Pick the units
Channels, repos, folders, teams, spaces, projects. This is the step that decides everything: an unenabled unit is not watched, not polled and not readable. Granting the integration does not turn on a single channel.
Attach each unit to a Space
Every unit you enable has to be attached to at least one scope, and this is the step people skip. It decides who the knowledge is served to, and on GitHub and GitLab it decides whether any knowledge is produced at all. See below.
Read the first few, wherever they land
Some will be waiting in Review and some will already be live on Knowledge, depending on your capture setting. Either way, judge two or three by hand early: what you approve, edit or archive is what teaches Harbor where your team draws the line, and the first week is when that teaching is cheapest.
Scoping, and the one mistake that produces silence
Knowledge is scoped so that a backend convention is not served to somebody working on the mobile app. You choose that scope where the knowledge comes in, which for a connector means on the unit: this repo feeds that Space.
Where to start
The order below is the one that gets a design partner to a useful brain fastest, and it is worth following even though nothing stops you connecting everything at once.
- Start with GitHub. Review discussion on merged pull requests is the richest tribal knowledge most teams have written down anywhere.
- Add one Slack channel. The one where engineering decisions actually get made, not the busiest one.
- Then stop. Clear that queue before connecting a third source. A queue nobody reviews is the failure mode for this whole surface, and it arrives fastest for the teams who connect everything on day one.
Next, what happens to an extraction once Harbor has it: what gets in, and what stays.