Stop reviewing agent plans in the terminal.
discuss opens any Markdown file (or piped stdin) in your browser with PR-style comment threads on every paragraph. Your Codex or Claude Code session reads your comments and replies in the margins — same terminal session, no copy-paste.
Anchored. Threaded. Bidirectional. No cloud.
Markdown is how engineers share everything that isn't code — PRDs, design docs, RFCs, incident post-mortems, analysis notes. But review tools assume the thing being reviewed is a diff. Docs either get copy-pasted into a chat window, marked up in Google Docs comments no agent can read, or ignored.
discuss makes the doc itself the workspace:
- Inline anchored threads — click any paragraph, drop a comment, get a threaded response.
- Syntax highlighting — tag fenced code blocks with a language (e.g.
```rust,```diff-typescript) for browser-side highlighting. See Prism's supported languages for the full set. - Takes vs replies — the agent posts takes (its view), humans post replies. Rendered distinctly so you can tell who said what at a glance.
- Bidirectional — the browser writes through a local REST API; the agent reads stdout events and writes back through the same API.
- No cloud. One Rust binary, one localhost server, one browser tab.
curl -sSL https://raw.githubusercontent.com/codesoda/discuss-cli/main/install.sh | shDownloads the latest release tarball from GitHub, installs the binary to ~/.discuss/bin/, symlinks ~/.local/bin/discuss, fetches the /discuss skill files into ~/.discuss/skills/discuss/, and links them into every agent root present (~/.claude/skills/, ~/.codex/skills/, ~/.agents/skills/).
git clone https://github.com/codesoda/discuss-cli.git
cd discuss-cli
./install.shSame outcome as the curl path, but builds the binary from source with cargo build --release and links the skill directly out of the clone so git pull updates it.
In Claude Code, Codex, or any agent with the /discuss skill, just ask:
Can you discuss ./plan.md with me?
The agent invokes the skill. If discuss isn't on your PATH yet, it'll prompt before running the installer:
discussisn't on your PATH. Install it now? (runscurl -sSL https://raw.githubusercontent.com/codesoda/discuss-cli/main/install.sh | sh)
Confirm — the installer self-bootstraps in the background, the server launches on http://127.0.0.1:7777, your browser opens with the rendered doc, and the agent starts streaming events. Drop an inline thread anywhere and the agent replies with a take.
discuss ./plan.mdBrowser opens on http://127.0.0.1:7777. You get the full review UI — inline threads, replies, resolution — without any agent participation. Useful for solo review.
| Command | Description |
|---|---|
discuss <file> |
Open a markdown file in a browser-based review session |
discuss update --check |
Check GitHub for a newer release |
discuss update -y |
Download the latest release, verify checksum, self-replace |
| Flag | Default | Description |
|---|---|---|
--port <N> |
7777 |
Bind port. No free-port fallback — fails fast if already bound. |
--no-open |
off | Don't auto-launch the browser |
--history-dir <path> |
~/.discuss/history |
Where transcripts get written |
--no-save |
off | Don't persist transcripts |
While the server is running:
| Method | Path | Purpose |
|---|---|---|
GET |
/api/state |
Current snapshot: threads, replies, takes, drafts |
GET |
/api/events |
SSE event stream (browser UI) |
POST |
/api/threads |
Create a thread |
POST |
/api/threads/{id}/replies |
Add a human reply |
POST |
/api/threads/{id}/takes |
Add an agent take |
POST |
/api/threads/{id}/resolve |
Resolve a thread |
POST |
/api/threads/{id}/unresolve |
Unresolve |
DELETE |
/api/threads/{id} |
Soft-delete (kind = "user" only) |
One newline-delimited JSON object per line. Consumed by the /discuss skill via Monitor; any line-reader works.
| Kind | When |
|---|---|
session.started |
Server bound and listening |
thread.created |
User opened a new thread |
reply.added |
Human posted a reply |
thread.resolved / thread.unresolved |
Resolution toggled |
thread.deleted |
Soft-delete |
prompt.suggest_done |
Idle timeout fired |
session.done |
Server exited cleanly |
Draft keystrokes and agent takes broadcast via SSE only — they never surface on stdout.
The skill lives at skills/discuss/SKILL.md and targets:
- Claude Code —
~/.claude/skills/discuss - Codex —
~/.codex/skills/discuss - Cline / Warp / anything respecting
~/.agents/skills/
What the skill handles:
- Launching
discuss <file>as a background task - Streaming stdout events via the agent's Monitor primitive
- Posting takes in response to user-opened threads
- Self-bootstrapping the binary if it isn't installed
MIT
