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.

SourceYou pickIt readsIt never reads
Slackchannelsdecisions, blockers, completions and questions answered, in the public channels you pickDMs, private channels, or any channel you have not enabled
GitHubrepositoriesmerged pull requests, their review discussion and markdown docs, in the repos you pickrepos you have not enabled, issue rows, or CI noise
GitLabprojectsmerged merge requests, their review discussion and markdown docs, in the projects you pickprojects you have not enabled, issue rows, or pipeline noise
Notionpagespages nested under the roots you pickpages nobody shared with the integration, or private workspaces
Google Drivefoldersreadable files in the folders you pick, and in their sub-foldersfiles nobody shared with the integration, or folders you have not enabled
Linearteamsdocuments in projects, project updates and closed-issue discussionsissue rows, statuses, assignees, or open tickets
Confluencespacespages in the spaces you pick, split by headingpersonal spaces, archived pages, blog posts, or spaces you have not enabled
Jiraprojectsclosed issues in the projects you pick, with their comment threadsissue rows, statuses, assignees, open tickets, bot comments, or projects you have not enabled
Granolafoldersmeetings in the Granola folders you pickprivate 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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.