app: id: pine name: Pine version: "1.0.0" description: A private voice assistant for your home. Pine runs speech-to-text (Whisper) and text-to-speech (Piper) on your own node and pairs with a PineVoice satellite speaker, so Home Assistant Assist works locally with nothing sent to the cloud. category: home # The user-facing launcher (app_id + container both "pine", matching the # runtime references + the live container so the orchestrator adopts it). A # tiny nginx that serves the setup / status page for the voice stack. The two # Wyoming engines (pine-whisper, pine-piper) are internal stack members. container_name: pine container: image: docker.io/library/nginx:1.27-alpine pull_policy: if-not-present network: archy-net network_aliases: [pine] dependencies: - app_id: pine-whisper - app_id: pine-piper - storage: 128Mi resources: memory_limit: 64Mi security: # cap-drop=ALL is applied by the orchestrator. nginx (master as root, drops # workers) binds :80 inside the container — needs the worker-drop caps + # NET_BIND_SERVICE for the privileged port. capabilities: [CHOWN, DAC_OVERRIDE, SETGID, SETUID, NET_BIND_SERVICE] readonly_root: false no_new_privileges: true network_policy: isolated ports: - host: 10380 container: 80 protocol: tcp volumes: - type: bind source: /var/lib/archipelago/pine/index.html target: /usr/share/nginx/html/index.html options: [ro] environment: [] # The setup / status page, written to the host before create and served # read-only. Web-Bluetooth WiFi provisioning of the speaker only works from a # secure/localhost context (not this LAN page), so the page documents that # flow rather than embedding it — the live provisioner lives in the `pine` # Gitea repo (index.html), run from a laptop on localhost. files: - path: /var/lib/archipelago/pine/index.html overwrite: true content: | Pine — private voice assistant

Pine

A private voice assistant that runs on your node.

Pine gives Home Assistant a local voice: your PineVoice speaker hears you, Whisper turns speech into text on this node, and Piper speaks the reply back — nothing leaves your home.

Whisper (STT)listening on host.containers.internal:10300
Piper (TTS)listening on host.containers.internal:10200
SpeakerWyoming satellite on <speaker-ip>:10700

1 · Get the speaker on WiFi

  1. Web-Bluetooth provisioning needs a secure/localhost page, so run the setup tool from the pine repo on a laptop: python3 -m http.server 8377 --bind 127.0.0.1, then open http://localhost:8377 in Chrome.
  2. Put the speaker in provisioning mode (ring LED blinking yellow), enter your WiFi, and press the centre button when the page asks for authorization.
  3. Success: the log shows ✓ PROVISIONED and the speaker chimes.

2 · Wire it into Home Assistant

  1. In Home Assistant: Settings → Devices & services. Add the two Wyoming Protocol integrations — host.containers.internal:10300 (Whisper) and :10200 (Piper).
  2. Add the speaker as a third Wyoming device at <speaker-ip>:10700.
  3. Build an Assist pipeline: STT = faster-whisper, TTS = Piper, then set it as the speaker's pipeline.
  4. Say the wake word (“Hey Jarvis”) or press the speaker's centre button, and talk to your home.
health_check: type: tcp endpoint: localhost:80 interval: 30s timeout: 5s retries: 5 start_period: 10s interfaces: main: name: Pine description: Set up and check your private voice assistant type: ui port: 10380 protocol: http path: / metadata: author: Archipelago icon: /assets/img/app-icons/pine.svg website: https://github.com/rhasspy/wyoming repo: https://github.com/rhasspy/wyoming license: MIT category: home launch: open_in_new_tab: true tags: - home - voice - assistant - privacy