Claros reads the decisions your team already made in its tools: a reviewer asking for changes, a revert, “no, we always…” in a thread, a policy page, a CODEOWNERS file. Not everything: a cheap filter keeps only those slices. Each becomes a candidate rule with the person who decided it as its owner and links to its sources. Nothing a candidate says applies until its owner confirms it, and even then it starts in watch. Claros connects to each tool directly with your workspace’s own token or OAuth grant. No third party holds them.

Connect a tool

Open Connect tools (/app/connect). Each tool takes a token you create in that tool (Slack and GitHub also offer a Connect button when your Claros server has an OAuth app for them). The token is checked with one call before it is saved, stored encrypted, never shown again and never logged. Remove forgets it. What each one reads:
  • Slack: messages in the channels the app is in (top-level messages; thread replies are not read yet), and people’s emails.
  • GitHub: pull requests updated since the last sync, their reviews and review comments, revert commits, CODEOWNERS.
  • Google: Google Docs whose name says they are a policy, guideline, handbook, process, playbook, runbook, SOP, standard, rules, checklist or principles; the Directory’s people (emails, aliases, other tools’ account ids).
  • Notion: the pages shared with the integration, newest first.
  • Linear: issue comments updated since the last sync.
Each sync reads what changed since the last one. The first one returns quickly with the first batch; the rest continues in the background.

OAuth apps (server setup)

The Connect buttons for Slack and GitHub show only when the server has CLAROS_SLACK_CLIENT_ID / CLAROS_SLACK_CLIENT_SECRET or CLAROS_GITHUB_CLIENT_ID / CLAROS_GITHUB_CLIENT_SECRET. The redirect URL to register is <CLAROS_WEB_URL>/v1/connectors/oauth/slack/callback (or /github/callback): the web app passes it to the server, so the callback sees the browser that started the connection, and only that signed-in admin’s workspace gets the token. GitHub OAuth apps have no read-only scope for private repositories, so the grant asks for repo and read:org; a fine-grained token is narrower. Google OAuth is not offered: an app that asks for Drive scopes needs Google’s verification first. Tokens are encrypted with a key derived from CLAROS_SECRET_KEY; without it the server creates data/.connector_key (mode 0600). Set CLAROS_SECRET_KEY on a hosted server so a new disk doesn’t make stored tokens unreadable.

Or import an export

No account at the tool needed: pick what the file is and upload it on the same page, or call the API.
Mark a policy or GitHub import private and what is mined from it is visible only to you.

Who sees a candidate

Every item keeps its source’s permissions: a private Slack channel’s members, a private repository’s collaborators, a Drive file’s sharing, a private Linear team’s members. A candidate rule is visible to the people who could see at least one of its sources. Admins who couldn’t see any of them see that it exists (its owner, how many sources, how sure), not what it says. Public channels, public repositories and Notion pages count as visible to the whole workspace (Notion’s API doesn’t expose page permissions). When GitHub doesn’t let the token list a private repository’s collaborators, what is mined from it is visible only to the person who connected it.

Owners and confidence

The owner is who decided: the reviewer who approved or asked for changes, whoever merged the revert, the person who corrected someone, the owner of the policy, not just whoever wrote the message. People are matched across tools by email (Slack profiles, the Google Directory). Candidates that say the same thing are merged, and confidence rises with each independent source (a different tool or a different person): one source 50%, two 75%, three 88%.

Review in one sitting

Review (/app/review) is one table: the rule, its owner, its sources, how sure, and would fire: the rule judged against your recent checks it could reach, in watch. It works from the keyboard: When a candidate is close to a rule you already have, confirming asks which one wins when both apply (1 the new one, 2 the existing one). Claros stores that: on a check where both fire, only the winner counts. The owner confirms their own candidates; editors and admins can decide any candidate they can see.

API