{ "app-id": "org.nexa.Assistant", "runtime": "org.gnome.Platform", "runtime-version": "50", "sdk": "org.gnome.Sdk", "command": "nexa", "finish-args": [ "--socket=wayland", "--socket=x11", "--socket=pulseaudio", "--device=dri", "--filesystem=xdg-config/nexa:create", "--filesystem=xdg-data/nexa:create", "--share=network", "--env=GSK_RENDERER=gl", "--talk-name=org.freedesktop.Notifications", "--talk-name=org.freedesktop.Flatpak", "--talk-name=org.freedesktop.ScreenSaver", "--talk-name=org.gnome.ScreenSaver", "--talk-name=org.mpris.MediaPlayer2.*", "--talk-name=org.kde.StatusNotifierWatcher", "--talk-name=org.freedesktop.portal.*", "--talk-name=org.nexa.NotificationBridge", "--own-name=org.nexa.CommandRegistry", "--talk-name=io.github.ShiroOSL.*", "--system-talk-name=org.freedesktop.login1", "--system-talk-name=org.freedesktop.UPower", "--system-talk-name=org.freedesktop.NetworkManager", "--system-talk-name=org.bluez", "--env=PYTHONPATH=/app/lib/python3.13/site-packages" ], "modules": [ { "name": "piper-tts", "buildsystem": "simple", "build-commands": [ "mkdir -p /app/lib/piper", "cp -r * /app/lib/piper/", "chmod +x /app/lib/piper/piper" ], "sources": [ { "type": "archive", "url": "https://github.com/rhasspy/piper/releases/download/2023.11.14-2/piper_linux_x86_64.tar.gz", "sha256": "a50cb45f355b7af1f6d758c1b360717877ba0a398cc8cbe6d2a7a3a26e225992" } ] }, { "name": "whisper-cpp", "buildsystem": "cmake-ninja", "config-opts": [ "-DCMAKE_BUILD_TYPE=Release", "-DBUILD_SHARED_LIBS=ON", "-DWHISPER_BUILD_EXAMPLES=ON", "-DWHISPER_BUILD_TESTS=OFF" ], "build-options": { "arch": { "x86_64": { "config-opts": [ "-DGGML_SSE42=ON", "-DGGML_AVX=ON", "-DGGML_AVX2=ON", "-DGGML_FMA=ON", "-DGGML_F16C=ON", "-DGGML_BMI2=ON" ] }, "aarch64": { "config-opts": [ "-DGGML_NATIVE=OFF" ] } } }, "sources": [ { "type": "archive", "url": "https://github.com/ggerganov/whisper.cpp/archive/refs/tags/v1.8.6.tar.gz", "sha256": "f8e632016ceae556f3132a16c7f704be1e7715595041f474fa81a2b64c1abf7c" } ] }, { "name": "whisper-shim", "buildsystem": "simple", "build-commands": [ "gcc -shared -fPIC -O2 -I/app/include -o /app/lib/libnexa_whisper_shim.so nexa_whisper_shim.c -L/app/lib -lwhisper" ], "sources": [ { "type": "file", "path": "native/nexa_whisper_shim.c" } ] }, { "name": "pyenchant", "buildsystem": "simple", "build-commands": [ "pip3 install --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} pyenchant==3.3.0" ], "sources": [ {"type": "file", "path": "third_party/pyenchant-wheel/pyenchant-3.3.0-py3-none-any.whl", "sha256": "3da00b1d01314d85aac733bb997415d7a3e875666dc81735ddcf320aa36b7a70"} ] }, { "name": "mutagen", "buildsystem": "simple", "build-commands": [ "pip3 install --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} mutagen==1.48.1" ], "sources": [ {"type": "file", "path": "third_party/mutagen-wheel/mutagen-1.48.1-py3-none-any.whl", "sha256": "4f077fe87d3fc7fba259aa63d8c026b18382ca6a42ef37c61e16f1b1b5b82fe7"} ] }, { "name": "openwakeword-deps", "buildsystem": "simple", "build-commands": [ "pip3 install --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} openwakeword==0.4.0" ], "sources": [ {"type": "file", "path": "third_party/openwakeword-wheels/openwakeword-0.4.0-py3-none-any.whl", "sha256": "2c353f49a35d384507403efde3db439353d8281a52d08a0e42a5b493e5145075"}, {"type": "file", "path": "third_party/openwakeword-wheels/onnxruntime-1.28.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", "sha256": "54fa221d669282bd8f582708ce4c96010a7e9fb0661f9006b37fe2fedafb73fe", "only-arches": ["x86_64"]}, {"type": "file", "url": "https://files.pythonhosted.org/packages/c0/23/b46045c3bf67a9cf54c12f5df0f018a422c65fbb9d6072b10071bebfaae2/onnxruntime-1.28.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", "sha256": "f649dd6f6452d12a8059888aa489fe519e062e18793dac72b9efa0f9fdb64135", "only-arches": ["aarch64"]}, {"type": "file", "path": "third_party/openwakeword-wheels/scikit_learn-1.9.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", "sha256": "da76d09304a4706db7cc1e3ebaa3b6b98a67365cc11d2996c4f1e58ba47df714", "only-arches": ["x86_64"]}, {"type": "file", "url": "https://files.pythonhosted.org/packages/0c/39/ffe829a5b8ecb40a518724a997794657fdc354ada5e8fe8e64d998c0bac9/scikit_learn-1.9.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", "sha256": "38c3dcb9a1ffb85505ec53d54c7b4aea0cff70050425a7760c2af661ac85df05", "only-arches": ["aarch64"]}, {"type": "file", "path": "third_party/openwakeword-wheels/scipy-1.18.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", "sha256": "a46f9273dbd0eb1cefba61c9b8648b4dfe3cbc14a080176f9a73e44b8336dc7f", "only-arches": ["x86_64"]}, {"type": "file", "url": "https://files.pythonhosted.org/packages/ea/b2/e83ea34279a52c03374477c74006256ec78df65fc877baa4617d6de1d202/scipy-1.18.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", "sha256": "0d13bca67c096d89fb95ced0d8921807300fce0275643aef9533cc63a0773468", "only-arches": ["aarch64"]}, {"type": "file", "path": "third_party/openwakeword-wheels/numpy-2.5.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", "sha256": "9726558e8db4a5bf7929a70ae50f63abda4daf0efe810e3bfbab95976f75fc1a", "only-arches": ["x86_64"]}, {"type": "file", "url": "https://files.pythonhosted.org/packages/2e/20/1ee6614d64332a1bba6411f38e68cb79eec1b2459e20a623777c5c5492a2/numpy-2.5.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", "sha256": "1c6759f538fb912fc46de0a6b1758ccf7b57bc7c7ebebc23974fdac3de8db0cd", "only-arches": ["aarch64"]}, {"type": "file", "path": "third_party/openwakeword-wheels/tqdm-4.70.0-py3-none-any.whl", "sha256": "7f585706bfddbdebf89daac705b2dfcc16890130727d3197ca62c732b4310953"}, {"type": "file", "path": "third_party/openwakeword-wheels/joblib-1.5.3-py3-none-any.whl", "sha256": "5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713"}, {"type": "file", "path": "third_party/openwakeword-wheels/narwhals-2.24.0-py3-none-any.whl", "sha256": "42fdedf44e5b2ca7505630d45b4ac3058f38d8485cba9fe1652ca23152df7489"}, {"type": "file", "path": "third_party/openwakeword-wheels/threadpoolctl-3.6.0-py3-none-any.whl", "sha256": "43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb"}, {"type": "file", "path": "third_party/openwakeword-wheels/flatbuffers-25.12.19-py2.py3-none-any.whl", "sha256": "7634f50c427838bb021c2d66a3d1168e9d199b0607e6329399f04846d42e20b4"}, {"type": "file", "path": "third_party/openwakeword-wheels/protobuf-7.35.1-py3-none-any.whl", "sha256": "4bc97768d8fe4ad6743c8a19403e314511ed9f6d13205b687e52421c023ac1b9"}, {"type": "file", "path": "third_party/openwakeword-wheels/packaging-26.2-py3-none-any.whl", "sha256": "5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e"} ] }, { "name": "piper-voices", "buildsystem": "simple", "build-commands": [ "mkdir -p /app/share/nexa/voices", "cp en_US-amy-medium.onnx en_US-amy-medium.onnx.json en_US-ryan-medium.onnx en_US-ryan-medium.onnx.json /app/share/nexa/voices/" ], "sources": [ {"type": "file", "url": "https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/amy/medium/en_US-amy-medium.onnx", "sha256": "b3a6e47b57b8c7fbe6a0ce2518161a50f59a9cdd8a50835c02cb02bdd6206c18"}, {"type": "file", "url": "https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/amy/medium/en_US-amy-medium.onnx.json", "sha256": "95a23eb4d42909d38df73bb9ac7f45f597dbfcde2d1bf9526fdeaf5466977d77"}, {"type": "file", "url": "https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/ryan/medium/en_US-ryan-medium.onnx", "sha256": "abf4c274862564ed647ba0d2c47f8ee7c9b717d27bdad9219100eb310db4047a"}, {"type": "file", "url": "https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/ryan/medium/en_US-ryan-medium.onnx.json", "sha256": "44034c056cb15681b2ad494307c7f3f2e4499d1253c700c711fa0a4607ffe78d"} ] }, { "name": "whisper-model", "buildsystem": "simple", "build-commands": [ "mkdir -p /app/share/nexa/whisper-models", "cp ggml-tiny.en.bin /app/share/nexa/whisper-models/" ], "sources": [ {"type": "file", "url": "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-tiny.en.bin", "sha256": "921e4cf8686fdd993dcd081a5da5b6c365bfde1162e72b08d75ac75289920b1f"} ] }, { "name": "nexa-assistant", "buildsystem": "simple", "build-commands": [ "mkdir -p /app/bin /app/share/nexa /app/share/nexa/wakeword-models /app/share/nexa/sounds /app/share/nexa/weather-icons", "cp -r src/* /app/share/nexa/", "cp -r data/wakeword-models/* /app/share/nexa/wakeword-models/", "cp -r data/sounds/* /app/share/nexa/sounds/", "cp -r data/weather-icons/* /app/share/nexa/weather-icons/", "echo '#!/bin/sh' > /app/bin/nexa", "echo 'exec python3 /app/share/nexa/main.py \"$@\"' >> /app/bin/nexa", "chmod +x /app/bin/nexa", "mkdir -p /app/share/applications /app/share/icons/hicolor/scalable/apps /app/share/metainfo", "install -Dm644 data/org.nexa.Assistant.desktop /app/share/applications/org.nexa.Assistant.desktop", "install -Dm644 data/org.nexa.Assistant.svg /app/share/icons/hicolor/scalable/apps/org.nexa.Assistant.svg", "install -Dm644 data/org.nexa.Assistant.metainfo.xml /app/share/metainfo/org.nexa.Assistant.metainfo.xml", "install -Dm644 LICENSE /app/share/doc/nexa/LICENSE", "install -Dm644 LICENSE-PRIVATE.md /app/share/doc/nexa/LICENSE-PRIVATE.md", "install -Dm644 TRADEMARKS.md /app/share/doc/nexa/TRADEMARKS.md" ], "sources": [ { "type": "dir", "path": ".", "skip": ["tools", "build-dir", ".flatpak-builder", ".git", "__pycache__", "docs", "README.md", ".github", ".gitignore", "setup.sh", "third_party"] } ] } ] }