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.
OAuth apps (server setup)
The Connect buttons for Slack and GitHub show only when the server hasCLAROS_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.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.