The work that needs you is scattered — review requests on GitHub, mentions on Slack, threads waiting on a reply. Triage collects it through the logins you already have, ranks it into one inbox on your machine, and hands any item to your locally installed Claude Code with the context already read.
Open source · runs on your machine · no API key — it uses your Claude Code login
payments: make retries idempotent — PR #4182
Review requested 2h ago · also raised in #payments — merged into one card
@you — “can you sanity-check the ingest lag on the eu shard?”
Mentioned in #platform-oncall · 40m ago
fix: cursor pagination on the audit log — PR #4179
CI failed on main · needs a rebase
“anyone tried the new deploy runner yet?”
Matched your watch on #infra · ranked below direct asks
One list, every source. Ranked by code, not by a model — and any item is one key from a Claude Code session that has already read it.
Open one tab and see everything that needs you, most important first. No more sweeping GitHub notifications, Slack channels and DMs to assemble the list yourself.
Press one key and Claude Code opens in the right repo, having already read the PR or thread. You start at “what should we do about it”, not at pasting links and re-explaining.
Done and snoozed items stay handled — and quietly return if their source changes. Watches tell you when something you care about happens in a channel you don’t read.
01
Review requests and your open PRs from GitHub, mentions and reply-pending threads from Slack — read through the logins you already have. Triage itself never holds a credential.
02
Scoring is deterministic code: mentions and review requests outrank topical matches, and items that reference the same PR merge into one card with both sources shown. No model sits in the ranking path, so the order is explainable and repeatable.
03
One key hands the item's full context to a real Claude Code session, opened in the right project folder. You arrive at a conversation that has already read the thread.
A watch is one plain-English instruction scoped to a channel or DM — hourly, daily or weekly. Before it exists, a required preview runs it against the scope's last week and shows every match with a one-line reason, so you know exactly what it will and won't surface.
The model only answers "does this match, and why". Identity, de-duplication, scheduling and scoring stay in code.
“Tell me when someone in #platform-oncall asks about the ingest pipeline.”
"anyone know why ingest is lagging on the eu shard?"
Match — asks about the pipeline by name
"ingest backfill PR #2201 needs a look"
Match — shares a ref with an open review request
"lunch?"
Skipped — no relation to the instruction
Each session is a long-lived Claude Code process in the folder you choose. Close the tab, come back, and the transcript restores; the agent resumes where it stopped.
Tool-use prompts surface as Allow / Deny in the UI. Your existing allowlists apply first — only unmatched tools ask.
Sessions load your user, project and local settings, so claude.ai connectors and installed plugins work exactly as they do in an interactive session.
Your decisions live in their own table and survive every re-sync. A done item whose source changes afterwards quietly returns.
One shortcut opens everything: pages, actions, a new session in any folder, dispatching the item under your cursor.
The ingestion API is exposed as MCP tools, so any script or scheduled agent can feed the inbox — every rule enforced server-side.
No API keys
It runs on your existing Claude Code login and never holds a credential of its own.
localhost only
The server binds to your machine and nowhere else. Nothing is exposed, nothing phones home.
One SQLite file
Inbox, sessions and history live in ~/.triage/ — yours to inspect, back up or delete.
Ranking is code
Deterministic scoring decides the order — explainable, repeatable, never a model's mood.
One global install. The server binds to localhost, keeps its data in ~/.triage/, and opens a web UI in your browser.
Early software — a young project moving fast. Expect rough edges and breaking changes between minor versions.
No. Triage runs on localhost, reads sources through the logins you already have, and keeps everything in a SQLite file under ~/.triage/. Nothing is exposed and nothing phones home.
No. Triage drives your locally installed Claude Code and uses its existing login — it never holds a credential of its own.
GitHub (review requests and your open PRs, via the GitHub CLI) and Slack (mentions and reply-pending threads, via the claude.ai Slack connector). Beyond that, the ingestion API is exposed as MCP tools, so any script or scheduled agent can add items.
By deterministic code, not a model. Mentions and review requests outrank topical matches, and items referencing the same PR merge into one card. The same inputs always produce the same order, and every rank is explainable.
Triage is open source and free. Claude usage happens through your existing Claude Code plan, same as running it in a terminal.