Repository navigation
Open
Labels
EpicEpic tracking issueEpic tracking issuehelp wantedDenotes an issue that needs help from a contributor. Must meet "help wanted" guidelines.Denotes an issue that needs help from a contributor. Must meet "help wanted" guidelines.hive/partially-addressedA merged PR addressed only part of this issue; remainder still actionableA merged PR addressed only part of this issue; remainder still actionablehive/verified-openHive verified that a likely/already-done claim did not finish this issue; keep open for more workHive verified that a likely/already-done claim did not finish this issue; keep open for more workstage/010-actionableTriaged; eligible for the hive to pick upTriaged; eligible for the hive to pick upstage/stalledIn its current stage longer than expectedIn its current stage longer than expected
Description
Why
Voice is becoming a primary way maintainers capture intent: a Plaud recording in the car, a Wispr Flow dictation, a meeting transcript. Today those end up as Knowledge facts (PR #17821) and go no further unless someone on a laptop runs a local agent. The hive should treat voice recorders as first-class input sources: connect once, then triage every recording from the hive UI into real work — an RFC with child issues (spektacular), a dibs idea, or knowledge only — with the hive doing all the execution inside the spoke.
Architecture
Sources (connect in Knowledge → Integrations) Inbox (triage) Destinations
┌───────────┐ Source interface ┌──────────────────┐ ┌──────────────┐
│ plaud │ List() / Fetch(id) / Auth() ───▶ │ items keyed │ ─────▶ │ knowledge │ (always; items ARE facts)
│ wisprflow │ │ (source,item_id) │ │ spek_rfc │ spektacular voice --publish → RFC + children
│ file-drop │ │ + RouteState per │ │ dibs │ POST /api/ideas (private draft)
│ webhook │ │ destination │ └──────────────┘
│ … │ └──────────────────┘
└───────────┘ routing rules: (source?, title_prefix|tag) → destination[, repo]
Source—List(),Fetch(id)(title, summary, transcript, provenance URI<source>://recordings/<id>),Auth()(connected/pending/account). Implemented byplaud,wisprflow(✨ knowledge: Wispr Flow dictation history as a knowledge source #17855 lands it as a connector → adapt),file-drop,webhook, and future recorders. First implementation reads the facts the connectors already write (source,source_id,attr_*), so any connector that writes recording facts is a Source with zero Inbox changes.Inbox— items keyed(source, item_id), never Plaud-specific. Per-item per-destinationRouteState{status: queued|running|filed|delegated|failed, url, children[], error}, persisted next to connector state (connector-state/_inbox.json). Unprocessed = not dismissed and no route.Destination—Route(ctx, item, content, req) (Result, error).knowledge(implicit),spek_rfc(spektacular voice --from stdin --title T --publish --repo R, spektacular PR ✨ voice: draft a spec from a Plaud/Wispr/file/stdin voice note and publish it as an RFC for a hive spektacular#123; JSON output when--format jsonexists, printed-URL parsing otherwise; agent-kick fallback viainbox.spek.agentuntil a release carriesvoice),dibs(POST {url}/api/ideas, Bearerinbox.dibs.token_env).- Routing rules —
inbox.rules[] {source?, title_prefix|tag, destination, repo?}, first match wins, applied once per new item after each connector sync; manual triage otherwise. - Hosted OAuth contract — a Source's
Auth()must be completable from the browser against the hive's public URL:POST /api/knowledge/connectors/{name}/auth/connect→auth_url; callback/api/knowledge/connectors/{name}/auth/callback. Limitation: Plaud's OAuth client is hard-wired tohttp://localhost:8199/auth/callback, so for Plaud the contract is satisfied byPOST …/auth/complete(paste the redirect URL the browser landed on, forwarded in-pod while the login is pending; or paste~/.plaud/tokens-mcp.json). Browser-only redirect for Plaud needs Plaud to allow extra redirect URIs. - UI — Integrations = connect/disconnect only (card shows state + "Open Inbox"). Inbox = one left-nav entry (Intelligence, badge = unprocessed) listing items with source icon, title, date, duration, excerpt, state pills, actions → RFC (repo picker), → dibs, Knowledge only, Retry, bulk select, ⚙ auto-routing drawer. Settings → Inbox section later (
inbox.*parity). - Hub rollup (later) — hub shows per-spoke unprocessed counts; no hub-side routing.
Future sources (research: API availability)
| Source | Integration path |
|---|---|
| Otter.ai | REST API + webhooks |
| Fireflies.ai | GraphQL API + webhooks |
| Fathom | REST API |
| tl;dv | REST API + webhooks |
| Granola | webhook / export |
| Notion AI Meeting Notes | Notion API (pages) |
| Limitless Pendant | export only → file-drop |
| Bee | limited export → file-drop |
| Omi | open-source, self-hostable API |
| Apple Voice Memos / Google Recorder | file-drop only |
Two generic sources cover the long tail: webhook (POST transcript JSON to the hive) and file-drop (watch a folder / upload).
Children
- Inbox core + API + nav (
pkg/inbox,/api/inbox*, Inbox section, sidebar badge) — ✨ Inbox: Inbox core + API + nav #17876 - Plaud source onto the
Sourceinterface (list/fetch/auth adapter over the plaud connector) — ✨ Inbox: Plaud source onto the Source interface #17877 - Wispr Flow source (✨ knowledge: Wispr Flow dictation history as a knowledge source #17855 lands as connector → adapt onto
Source) — ✨ Inbox: Wispr Flow source #17878 -
spek_rfcdestination (spektacular voice --publish, JSON/URL parsing, agent fallback) — ✨ Inbox: spek_rfc destination #17879 -
dibsdestination (POST /api/ideas, provenance, idea URL) — ✨ Inbox: dibs destination #17880 - Hosted OAuth callback / token-paste (
/auth/complete, Plaud localhost limitation) — ✨ Inbox: Hosted OAuth callback / token-paste #17881 - Docs page
src/docs/inbox-voice-sources.md+ quickstart link from the Integrations card — ✨ Inbox: Docs page + quickstart link #17882 - Settings parity +
inbox.*config (Settings → Inbox section) — ✨ Inbox: Settings parity + inbox.* config #17883 - Ship
spektacularin the hive image (Dockerfile, pinned release, amd64/arm64) — ✨ Inbox: ship spektacular in the hive image #17888 - Tests / ratchets (state transitions, rules, prompt rendering, publish-output fixture, API handlers) — ✨ Inbox: Tests / ratchets #17884
Metadata
Metadata
Assignees
Labels
EpicEpic tracking issueEpic tracking issuehelp wantedDenotes an issue that needs help from a contributor. Must meet "help wanted" guidelines.Denotes an issue that needs help from a contributor. Must meet "help wanted" guidelines.hive/partially-addressedA merged PR addressed only part of this issue; remainder still actionableA merged PR addressed only part of this issue; remainder still actionablehive/verified-openHive verified that a likely/already-done claim did not finish this issue; keep open for more workHive verified that a likely/already-done claim did not finish this issue; keep open for more workstage/010-actionableTriaged; eligible for the hive to pick upTriaged; eligible for the hive to pick upstage/stalledIn its current stage longer than expectedIn its current stage longer than expected
Activity
hivecommons-hive commentedon Nov 12, 2026
PR #17899 covers this issue: #17899
The PR body says this is partial/non-closing work (
Refs/Part ofor leave-open wording), so Hive will not add a closing keyword. GitHub will not show its issue-list PR icon without a closing keyword; the stage comment is the link.✨ inbox: Plaud source onto the Source interface (#17900)
hivecommons-hive commentedon Nov 12, 2026
Verified (scanner): not resolved yet, labelled
hive/verified-open. #17899/#17900 landed children #17876/#17877; 8 of 10 children are closed. Remaining: #17878 (Wispr Flow source — covered by #17891, human-claimed) and #17888 (ship spektacular in the image —blocked). The epic closes once those two land; no further scanner work here.🐝 Hive Agent:
scanner| Instance:hosted-available-oke-11-placeholder-r05x| SHA:unknown— hive: agent=scanner backend=copilot model=claude-fable-5.1 copilot=1.0.88
hivecommons-hive commentedon Nov 12, 2026
Scanner status 2026-11-12T19:1xZ: 9 of 10 children are now closed (#17878 Wispr Flow source landed since the last check). The only remaining child is #17888 (ship
spektacularin the hive image), which isblockedon an upstream Spektacular release that containsvoice --publish(hivecommons/spektacular#123 still open; 0.31.0 has no voice command). Nothing in this epic is implementable from the hive until that release exists; no dispatch this cycle.🐝 Hive Agent:
scanner| Instance:hosted-available-oke-11-placeholder-r05x| SHA:unknown— hive: agent=scanner backend=copilot model=claude-fable-5.1 copilot=1.0.88
🌱 Top up v6 with v5 latest (v5.237.2) (#18030)
✨ inbox: Plaud source onto the Source interface (#17900)