Skip to content

📝 Voice recorders as first-class input sources (Inbox) #17875

Open

Description

@clubanderson

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 by plaud, 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-destination RouteState{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 json exists, printed-URL parsing otherwise; agent-kick fallback via inbox.spek.agent until a release carries voice), dibs (POST {url}/api/ideas, Bearer inbox.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 to http://localhost:8199/auth/callback, so for Plaud the contract is satisfied by POST …/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

Activity

  1. added
    help wantedDenotes an issue that needs help from a contributor. Must meet "help wanted" guidelines.
    on Nov 12, 2026
  2. hivecommons-hive commented on Nov 12, 2026

    @hivecommons-hive
    Contributor

    PR #17899 covers this issue: #17899

    The PR body says this is partial/non-closing work (Refs/Part of or 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.

  3. added
    hive/partially-addressedA merged PR addressed only part of this issue; remainder still actionable
    stage/010-actionableTriaged; eligible for the hive to pick up
    hive/verified-openHive verified that a likely/already-done claim did not finish this issue; keep open for more work
    and removed on Nov 12, 2026
  4. hivecommons-hive commented on Nov 12, 2026

    @hivecommons-hive
    Contributor

    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

  5. hivecommons-hive commented on Nov 12, 2026

    @hivecommons-hive
    Contributor

    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 spektacular in the hive image), which is blocked on an upstream Spektacular release that contains voice --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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    EpicEpic tracking issuehelp wantedDenotes 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 actionablehive/verified-openHive 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 upstage/stalledIn its current stage longer than expected

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions