name: myna
description: Myna push-to-talk dictation for Ubuntu Desktop - the client that
captures the microphone, streams it to a local speech-to-text inference snap
over a Unix socket, and injects the transcript into the focused application
snapcraft: https://github.com/canonical/myna/blob/integration-220627/myna-snap/snap/snapcraft.yaml
upstream: https://github.com/canonical/myna
upstream-relation: the publisher is the upstream (Canonical); this snap is built
from that repository
plugs:
pipewire:
request-type: auto-connection
reasoning: |
Myna is a push-to-talk dictation client; capturing the microphone is its
entire function. The myna app is a supervised user daemon started at
login that holds a GlobalShortcuts portal binding and opens a PipeWire
capture stream only while the shortcut is invoked. The audio is pushed over
a Unix domain socket to a local inference snap and never leaves the machine:
no snap in the fleet plugs network, and the model weights ship as snap
components so there is nothing to fetch at runtime.
Without an auto-connection every user must run snap connect myna:pipewire`
before the application does anything at all. The precedent we are matching is
the audio-record auto-connection granted to snaps whose declared purpose is capture
(browsers, media and conferencing apps).
Notes for the reviewer
-
pipewireis the only interface on this snap that does not auto-connect from the base declaration.desktop,desktop-legacy,gsettings,homeandnetwork-bindall already do. -
desktop-legacyis what reaches the IBus daemon’s private socket, which is how the transcript is injected into the focused application.network-bindis only there because snapd’s seccomp template gatesbind(2)behind it even for the AF_UNIX control socket. -
The snap slots
dictation(interfacedbus, session bus, nameorg.myna.Dictation) for the GNOME Shell indicator. The consumer is an unconfined Shell extension, so there is no plug side and no declaration is needed - it is listed here only so the picture is complete. -
If the board would rather see this as
audio-recordthanpipewire, say so and we will change the plug;pipewirewas chosen because the client speaks the PipeWire API directly for low-latency streaming capture, not through PulseAudio compatibility.