Evaluate Vocalinux as dictation input layer + cf-orch as annotation backend #35
Labels
No labels
a11y
backlog
blocked
bug
cf-core-dep
design
enhancement
good first issue
infrastructure
internal
privacy
status:blocked
status:in-progress
status:review
tier:free
tier:paid
ux
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: Circuit-Forge/linnet#35
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Background
Vocalinux is a local-only Linux voice dictation tool (589 stars, actively maintained, v0.14.2 shipped 2026-07-18) that transcribes speech and injects text into any X11/Wayland application.
Stack: Python + TypeScript, whisper.cpp / OpenAI Whisper / VOSK as swappable STT backends, Silero VAD, Vulkan GPU acceleration, GTK tray UI.
Proposed integration
Vocalinux and Linnet are complementary layers:
This means:
cf-orch backend angle
For users without local GPU headroom, cf-orch can serve as the annotation backend:
This fits the CF architecture pattern: local inference first, cf-orch as smart fallback.
License constraint
Vocalinux is GPL-3.0 — Linnet (BSL 1.1) cannot bundle or statically link it. Integration must be process-boundary / IPC:
Next steps
plugins/dir and README)References
circuitforge-plans/shared/(cf-orch docs)circuitforge-plans/linnet/Extension point audit results
No plugin system exists today. Source:
recognition_manager.py.Internal callbacks present but in-process only:
The existing HTTP Remote API (
docs/HTTP_REMOTE.md) is inbound only — Vocalinux as STT client posting audio to a remote server. No outbound webhook, no DBus, no plugin registry.Recommended IPC path: upstream webhook PR
Add
post_transcription_webhook_urlconfig key torecognition_manager.py. After_notify_text_callbacks()fires, POST the transcript JSON to the configured URL. Estimated ~15 lines. GPL-isolated at the HTTP boundary (no linking).Linnet runs a local HTTP listener (e.g.
localhost:8650/annotate), receives the transcript, annotates, returns tone data.This is general-purpose enough to propose upstream — any post-processing tool (translation, logging, accessibility) could use it, not just Linnet.
Fallback (prototype only)
Parse
~/.local/share/vocalinux/vocalinux.logfor transcription lines. Zero upstream changes needed. Fragile — use only to validate the annotation pipeline before investing in the upstream PR.Next step
Draft the upstream PR to Vocalinux adding
post_transcription_webhook_url. Frame it as a general post-processing hook, not a Linnet-specific feature.