{"slug": "show-hn-qitt-an-agent-that-triages-my-slack-and-jira-and-drafts-my-replies", "title": "Show HN: Qitt – An agent that triages my Slack and Jira and drafts my replies", "summary": "A developer released Qitt, an open-source \"chief of staff\" agent built on T3 Code threads and scheduled tasks that triages incoming Slack and Jira requests and drafts replies for the owner to review, but never sends anything itself. Qitt runs on one always-on machine, keeps its behavior in Markdown AGENTS.md charters and a local context.md, ships Slack and Jira as folders under input-sources/ with a _template/ skeleton for adding Teams, email or Trello, and requires Node.js 22.19 or later; it has run on Claude only so far, and events arriving while the machine is down are lost by design.", "body_md": "A proactive chief of staff that lives inside [T3 Code](https://github.com/pingdotgg/t3code).\n\n- **Chief of staff.** One pinned thread watches the requests that reach its owner and keeps a\nlive picture of all work in flight, so it can be asked anything without context.\n- **Proactive.** It triages each request as it arrives and starts a worker thread to research it\nahead of time. It never sends anything: every output is proposed text for the owner to review.\n- **Vendor-agnostic.** It is built from T3 Code threads and scheduled tasks, and its rules are`AGENTS.md` files any coding agent reads. It has run on Claude only so far.\n- **Customizable.** Its behaviour is plain Markdown: two charters written in the owner's voice,\nand a local context file for your people, priorities and playbooks.\n- **Extendable.** Slack and JIRA ship as two folders under`input-sources/` . Teams, email, Trello\nor anything else is[one more folder](https://github.com/bquenin/qitt/blob/main/docs/input-sources.md) .\n\n- **T3 constructs only.** qitt is a thread; intake and the ticket sweep are scheduled tasks bound to\nit. Code outside T3 exists only where something must hold a connection.\n- **Never sends.** Each source's send tools are denied for qitt and its workers. Workers are\nresearch-only, except the routine field edits a ticket playbook lists and work the owner asks a\nworker for directly.\n- **Runs on one always-on machine.** Events that arrive while it is down are lost, by design.\n\n[docs/architecture.md](https://github.com/bquenin/qitt/blob/main/docs/architecture.md) describes each part and how a request travels through\nthem. Planned, not in this repo yet: an interval supervision pass and a JQL backstop.\n\n| Path | What | \n|---|---|\n| `agents/` | The two agents qitt is made of, `qitt` and`worker` . For each, a charter (`AGENTS.md` ) with the rules that hold for every source, and`.claude/settings.json` (for qitt a 150k auto-compact window: every call re-reads the whole thread, and its durable state lives in the threads, not its context). | \n| `input-sources/` | One folder per input source, a place requests come from: its charter sections, its webhook task's prompt, the send tools to deny, and a bridge if it needs one. `slack/` and`jira/` ship here;`_template/` is a skeleton for your own. | \n| `bin/` | `install-agents` assembles each agent's T3 project root from its charter, the enabled sources and your local`context.md` (re-run it after editing any of them);`qitt-filter` and`qitt-bridge` keep the filter and the Slack bridge running;`qitt-mute` mutes Slack conversations for the bridge. | \n| `docs/` | `architecture.md` : the parts and how a request travels.`input-sources.md` : what a source is made of and how to add one.`setup.md` : how the thread, intake tasks, and endpoint are wired, and every config key. | \n| `filter/` | Path filter that exposes only the T3 webhook routes, with optional HMAC signature checks ( `bin/qitt-filter` runs it). Shared by every source that calls a webhook. | \n| `config/example/` | Placeholder versions of the local config files. | \n\n- A [T3 Code](https://github.com/pingdotgg/t3code) server, with the qitt and worker projects\nregistered (see[docs/setup.md](https://github.com/bquenin/qitt/blob/main/docs/setup.md) ).\n- Node.js 22.19 or later for the installer, the bridge and the filter.\n- What each source you enable needs:\n- Skills and MCP servers come from your own agent setup, not from this repo. `context.md` names\nthe ones workers use for evidence, documents and ticket playbooks.\n\nThe repo holds code and generic templates only. Everything specific to a workplace or a person (names, timezone, people, Slack and JIRA IDs, hostnames, tokens) stays on the machine and is never committed:\n\n- `~/.config/qitt/` for config and secrets (start from`config/example/` ; keys in[docs/setup.md](https://github.com/bquenin/qitt/blob/main/docs/setup.md#configuration) ), and for sources of your own\n- `~/.local/state/qitt/` for the installed project roots, the bridge's state, and logs\n\n```\nnpm test --prefix input-sources/slack/bridge\nnode --test \"filter/test/*.test.mjs\"\nnode --test \"bin/test/*.test.mjs\"\n```\n\n", "url": "https://wpnews.pro/news/show-hn-qitt-an-agent-that-triages-my-slack-and-jira-and-drafts-my-replies", "canonical_source": "https://github.com/bquenin/qitt", "published_at": "2026-11-10 18:13:06+00:00", "updated_at": "2026-11-10 18:23:12.659416+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "artificial-intelligence"], "entities": ["Qitt", "T3 Code", "Slack", "Jira", "Claude", "Node.js", "pingdotgg"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/show-hn-qitt-an-agent-that-triages-my-slack-and-jira-and-drafts-my-replies", "markdown": "https://wpnews.pro/news/show-hn-qitt-an-agent-that-triages-my-slack-and-jira-and-drafts-my-replies.md", "text": "https://wpnews.pro/news/show-hn-qitt-an-agent-that-triages-my-slack-and-jira-and-drafts-my-replies.txt", "jsonld": "https://wpnews.pro/news/show-hn-qitt-an-agent-that-triages-my-slack-and-jira-and-drafts-my-replies.jsonld"}}