/interview opens a local browser UI for refining a feature idea inside the same OpenCode session.
Use it when chat feels too loose and you want a cleaner question/answer flow plus a markdown spec saved in your repo.
Tip:
/interviewusually works well with a fast model. If the flow feels slower than it should, switch models in OpenCode withCtrl+X, thenm, and pick a faster one.
Start a new interview:
/interview build a kanban app for design teams
What happens:
OpenCode posts a localhost URL like this:
And the browser UI looks like this:
Resume an existing interview:
/interview interview/kanban-design-tool.md
You can also resume by basename if it exists in the configured output folder:
/interview kanban-design-tool
Promote an interview spec into the current goal:
/goal from kanban-design-tool
This uses the interview title and Current spec section as the pinned goal, so
todos, delegation, and verification stay aligned with the clarified spec.
By default, interview files are written to:
interview/
Example:
interview/kanban-design-tool.md
The file contains two sections:
Current spec — rewritten as the interview becomes clearerQ&A history — append-only question/answer recordExample:
# Kanban App For Design Teams
## Current spec
A collaborative kanban tool for design teams with shared boards, comments, and web-first workflows.
## Q&A history
Q: Who is this for?
A: Design teams
Q: Is this web only or mobile too?
A: Web first
For new interviews, the assistant can suggest a concise title for the markdown filename.
Example:
build a kanban app for design teams with lightweight reviewsinterview/kanban-design-tool.mdIf the assistant does not provide a title, the original input is slugified as a fallback.
Interview files include YAML frontmatter for recovery after a crash or restart:
---
sessionID: ses_abc123
baseMessageCount: 42
updatedAt: 2026-04-14T10:30:00.000Z
---
This allows the dashboard to rebuild state from disk without a live session.
Inside the interview page:
1, 2, 3, ... select options for the active questionCustom↑ / ↓ move the active questionCmd+Enter or Ctrl+Enter submitsCmd+S or Ctrl+S also submitsThe interview module has two modes: per-session (default) and dashboard (opt-in).
When port is 0 (or unset) and dashboard is false (or unset), each OpenCode process runs its own interview server on a random port. This is the original behavior — no configuration needed.
{
"oh-my-opencode-slim": {
"interview": {}
// or explicitly:
// "interview": { "port": 0 }
}
}
/interview commandWhen dashboard is true or port is set to a value greater than 0, interview switches to dashboard mode. A single dashboard server aggregates interviews from all OpenCode sessions on the same machine.
// Option A: dashboard on default port (43211)
"interview": { "dashboard": true }
// Option B: dashboard on custom port
"interview": { "dashboard": true, "port": 8888 }
// Option C: port > 0 implies dashboard mode
"interview": { "port": 43211 }
.md files on disk.interview/ (or your configured output folder) across all known project directories, including your home directory.┌──────────────────────────────────────────────┐
│ Dashboard (dumb aggregator) │
│ │
│ • Receives state pushes from sessions │
│ • Serves dashboard UI + interview pages │
│ • Stores pending answers for session pickup │
│ • Binds to 127.0.0.1, token-authenticated │
└───────────▲───────────────────▲───────────────┘
│ POST state │ GET pending answers
┌───────────┴────────┐ ┌───────┴──────────────┐
│ Session Process A │ │ Session Process B │
│ (smart — drives │ │ (smart — drives │
│ LLM locally) │ │ LLM locally) │
└─────────────────────┘ └───────────────────────┘
Sessions are smart — they drive LLM interaction locally (parse state, inject prompts, write .md files). The dashboard is a dumb aggregator with a web UI. This means zero cross-process SDK dependency.
Any OpenCode process can become the dashboard. The first process to bind the configured port wins. If it dies:
.md files on disk using frontmatterSessions register their project directory with the dashboard so it knows where to scan for interview files. This happens automatically on first /interview command or session event — no manual setup needed.
The dashboard also scans your home directory's output folder by default, so interviews created from a home-directory OpenCode session are always visible.
The dashboard page includes a settings panel for:
{
"oh-my-opencode-slim": {
"interview": {
"maxQuestions": 2,
"outputFolder": "interview",
"autoOpenBrowser": true,
"port": 0,
"dashboard": false
}
}
}
maxQuestions — max questions per round, 1-10, default 2outputFolder — where markdown files are written, default interviewautoOpenBrowser — open the localhost UI in your default browser during interactive runs, default true (suppressed automatically in tests and CI)port — port for the interview server, 0-65535, default 0 (OS-assigned in per-session mode). Set a fixed port to enable dashboard mode. Note: ports 1-1023 require elevated privileges on most systems.dashboard — enable dashboard mode on the default port (43211), default false. Setting port to a value greater than 0 also enables dashboard mode. If both are set, port takes precedence.port |
dashboard |
Mode |
|---|---|---|
0 (default) |
false (default) |
Per-session — each process runs its own server |
0 |
true |
Dashboard on default port 43211 |
> 0 |
any | Dashboard on the specified port |
The interview UI binds to 127.0.0.1. To access it from a remote machine:
tailscale serve --bg --https=443 http://127.0.0.1:<port>
cloudflared tunnel --url http://127.0.0.1:<port>
ssh -L <port>:127.0.0.1:<port> your-server
<interview_state> blocks