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: |
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.
host.containers.internal:10300host.containers.internal:10200<speaker-ip>:10700pine repo on a laptop:
python3 -m http.server 8377 --bind 127.0.0.1, then
open http://localhost:8377 in Chrome.✓ PROVISIONED and the
speaker chimes.host.containers.internal:10300 (Whisper) and
:10200 (Piper).<speaker-ip>:10700.