The programs a node needs
ffmpeg, LibreOffice and the model runtimes: what each one buys, the command for every platform, and why MeshHold detects them instead of installing them.
The programs a node needs
A MeshHold node can convert a document, transcode a film, transcribe a recording, read a book aloud, index for search and answer a question — and it can do none of those unless somebody puts other people's programs on the machine first.
MeshHold does not install them. It detects what is present, says what each missing piece would enable, and tells you exactly how to get it on the system you are actually running. The rule behind that is the one the model runtime states about itself: weights are data with a published digest and fetching them is a bounded risk; a runtime is executable code, and a daemon that downloads and runs executables is a different kind of program from one that does not.
Model weights are the other half of that sentence and work the opposite way — the node downloads them, verifies them against a digest fixed in the source, and replicates them to your other trusted nodes, so a second machine in the house does not fetch the same eight gigabytes again. One screen shows both halves, and the difference between them is the whole argument.
There is one exception and it is named below.
To see where a particular node stands:
meshhold tools what is here, what is missing, what each enables
meshhold tools status ffmpeg one tool, with the command for this platform
meshhold tools recheck look again, after installing something
Or open Settings → Tools in the web UI, which shows the same list with the model store underneath it.
Or skip all of this. The
-toolscontainer image ships with every program on this page already installed. It is about thirty times the size of the plain image, and it contains no weights — those are still downloaded by the node, into a vault, once.
What each one buys
| Program | What you get | Job types |
|---|---|---|
| FFmpeg | Converting between media formats, making previews, and the audio at both ends of transcription and reading aloud | transcode, media.probe, preview, asr, tts, audio.separate |
| llama.cpp | Answering questions, describing pictures, and turning text into the vectors search ranks on | infer, infer.vision, embed, embed.vector |
| LibreOffice | Converting documents, and letting office formats reach the search index at all | convert, embed |
| audio-separator | Pulling a voice out from under the music, so it can be transcribed | audio.separate |
| sherpa-onnx | Reading documents aloud | tts |
| stable-diffusion.cpp | Drawing pictures from a description | image |
| whisper.cpp | Turning speech into text and subtitles | asr |
| WinFsp | Mounting a vault as a drive letter | — |
The order is the one to read them in: what the most job types depend on first, so a node missing several is told the expensive absence before the cheap one.
Windows (x86-64)
FFmpeg — converting between media formats, making previews, and the audio at both ends of transcription and reading aloud
winget install Gyan.FFmpeg
llama.cpp — answering questions, describing pictures, and turning text into the vectors search ranks on
Download from https://github.com/ggml-org/llama.cpp/releases/latest — take the -bin-win-vulkan-x64 build.
Unpack it into the node's own tools directory (shown by meshhold tools status llama.cpp), or put llama-server anywhere on the daemon's PATH. The archive is searched two levels down, so the folder it unpacks into is fine as it is.
One build for NVIDIA, AMD and Intel, and it uses the processor when there is no card. A -cuda- build is faster on NVIDIA and about half a gigabyte with its runtime.
LibreOffice — converting documents, and letting office formats reach the search index at all
winget install TheDocumentFoundation.LibreOffice
audio-separator — pulling a voice out from under the music, so it can be transcribed
pip install "audio-separator[cpu]" audioread "librosa<1"
The pins are not decoration: onnxruntime lives in an extra, audioread is imported and not declared, and librosa 1.0 renamed a function the tool still calls. This is the one tool MeshHold does not manage — it needs a Python of your own.
sherpa-onnx — reading documents aloud
Download from https://github.com/k2-fsa/sherpa-onnx/releases/latest — take the -shared build for this system.
Unpack it into the node's own tools directory (shown by meshhold tools status sherpa-onnx), or put sherpa-onnx-offline-tts anywhere on the daemon's PATH. The archive is searched two levels down, so the folder it unpacks into is fine as it is.
It also needs espeak-ng-data beside it — the phonemiser's dictionaries, which a voice does not carry.
stable-diffusion.cpp — drawing pictures from a description
Download from https://github.com/leejet/stable-diffusion.cpp/releases/latest — take the -bin-win-vulkan-x64 build.
Unpack it into the node's own tools directory (shown by meshhold tools status stable-diffusion.cpp), or put sd-cli anywhere on the daemon's PATH. The archive is searched two levels down, so the folder it unpacks into is fine as it is.
whisper.cpp — turning speech into text and subtitles
Download from https://github.com/ggml-org/whisper.cpp/releases/latest — take the win build for this architecture.
Unpack it into the node's own tools directory (shown by meshhold tools status whisper.cpp), or put whisper-cli anywhere on the daemon's PATH. The archive is searched two levels down, so the folder it unpacks into is fine as it is.
WinFsp — mounting a vault as a drive letter
meshhold tools install winfsp
This is the one program MeshHold fetches for you, and it is an exception on purpose: WinFsp is a kernel driver, mounting a vault as a drive is unusable without it, and "download an installer and run it" is where most people stop. The package is the vendor's own, signed, and checked against a checksum fixed at build time.
The one thing MeshHold fetches for you: a kernel driver, vendor-signed, pinned by digest at build time. winget install WinFsp.WinFsp does the same thing if you would rather.
Windows (arm64)
Where a program is missing here it is a gap in somebody else's release process, not a decision made in this project, and it closes the day they publish one.
One program on this list has no build for this system: stable-diffusion.cpp.
FFmpeg — converting between media formats, making previews, and the audio at both ends of transcription and reading aloud
winget install Gyan.FFmpeg
llama.cpp — answering questions, describing pictures, and turning text into the vectors search ranks on
Download from https://github.com/ggml-org/llama.cpp/releases/latest — take the -bin-win-cpu-arm64 build.
Unpack it into the node's own tools directory (shown by meshhold tools status llama.cpp), or put llama-server anywhere on the daemon's PATH. The archive is searched two levels down, so the folder it unpacks into is fine as it is.
There is no Vulkan build for arm64; the CPU one is the general answer here.
LibreOffice — converting documents, and letting office formats reach the search index at all
winget install TheDocumentFoundation.LibreOffice
audio-separator — pulling a voice out from under the music, so it can be transcribed
pip install "audio-separator[cpu]" audioread "librosa<1"
The pins are not decoration: onnxruntime lives in an extra, audioread is imported and not declared, and librosa 1.0 renamed a function the tool still calls. This is the one tool MeshHold does not manage — it needs a Python of your own.
sherpa-onnx — reading documents aloud
Download from https://github.com/k2-fsa/sherpa-onnx/releases/latest — take the -shared build for this system.
Unpack it into the node's own tools directory (shown by meshhold tools status sherpa-onnx), or put sherpa-onnx-offline-tts anywhere on the daemon's PATH. The archive is searched two levels down, so the folder it unpacks into is fine as it is.
It also needs espeak-ng-data beside it — the phonemiser's dictionaries, which a voice does not carry.
stable-diffusion.cpp — drawing pictures from a description
Not available here: upstream publishes no build for this architecture. It still shows as not installed rather than as unsupported, because that is what is true and because upstream may publish one.
whisper.cpp — turning speech into text and subtitles
Download from https://github.com/ggml-org/whisper.cpp/releases/latest — take the win build for this architecture.
Unpack it into the node's own tools directory (shown by meshhold tools status whisper.cpp), or put whisper-cli anywhere on the daemon's PATH. The archive is searched two levels down, so the folder it unpacks into is fine as it is.
WinFsp — mounting a vault as a drive letter
meshhold tools install winfsp
This is the one program MeshHold fetches for you, and it is an exception on purpose: WinFsp is a kernel driver, mounting a vault as a drive is unusable without it, and "download an installer and run it" is where most people stop. The package is the vendor's own, signed, and checked against a checksum fixed at build time.
The one thing MeshHold fetches for you: a kernel driver, vendor-signed, pinned by digest at build time. winget install WinFsp.WinFsp does the same thing if you would rather.
Linux (x86-64)
FFmpeg — converting between media formats, making previews, and the audio at both ends of transcription and reading aloud
sudo apt install ffmpeg
Or dnf install ffmpeg on Fedora, where it comes from RPM Fusion rather than the default repositories.
llama.cpp — answering questions, describing pictures, and turning text into the vectors search ranks on
Download from https://github.com/ggml-org/llama.cpp/releases/latest — take the -bin-ubuntu-vulkan-x64 build.
Unpack it into the node's own tools directory (shown by meshhold tools status llama.cpp), or put llama-server anywhere on the daemon's PATH. The archive is searched two levels down, so the folder it unpacks into is fine as it is.
One build for NVIDIA, AMD and Intel, and it uses the processor when there is no card. A -cuda- build is faster on NVIDIA and about half a gigabyte with its runtime.
LibreOffice — converting documents, and letting office formats reach the search index at all
sudo apt install libreoffice-nogui
The headless package — the desktop shell is not wanted and is most of the size.
audio-separator — pulling a voice out from under the music, so it can be transcribed
pip install "audio-separator[cpu]" audioread "librosa<1"
The pins are not decoration: onnxruntime lives in an extra, audioread is imported and not declared, and librosa 1.0 renamed a function the tool still calls. This is the one tool MeshHold does not manage — it needs a Python of your own.
sherpa-onnx — reading documents aloud
Download from https://github.com/k2-fsa/sherpa-onnx/releases/latest — take the -shared build for this system.
Unpack it into the node's own tools directory (shown by meshhold tools status sherpa-onnx), or put sherpa-onnx-offline-tts anywhere on the daemon's PATH. The archive is searched two levels down, so the folder it unpacks into is fine as it is.
It also needs espeak-ng-data beside it — the phonemiser's dictionaries, which a voice does not carry.
stable-diffusion.cpp — drawing pictures from a description
Download from https://github.com/leejet/stable-diffusion.cpp/releases/latest — take the -bin-ubuntu-vulkan-x64 build.
Unpack it into the node's own tools directory (shown by meshhold tools status stable-diffusion.cpp), or put sd-cli anywhere on the daemon's PATH. The archive is searched two levels down, so the folder it unpacks into is fine as it is.
whisper.cpp — turning speech into text and subtitles
Download from https://github.com/ggml-org/whisper.cpp/releases/latest — take the ubuntu build for this architecture.
Unpack it into the node's own tools directory (shown by meshhold tools status whisper.cpp), or put whisper-cli anywhere on the daemon's PATH. The archive is searched two levels down, so the folder it unpacks into is fine as it is.
WinFsp — mounting a vault as a drive letter
Not available here: Windows only; on Linux and macOS this is FUSE, which the node uses directly.
Linux (arm64)
The distribution packages are the same; the release archives are not.
One program on this list has no build for this system: stable-diffusion.cpp.
FFmpeg — converting between media formats, making previews, and the audio at both ends of transcription and reading aloud
sudo apt install ffmpeg
Or dnf install ffmpeg on Fedora, where it comes from RPM Fusion rather than the default repositories.
llama.cpp — answering questions, describing pictures, and turning text into the vectors search ranks on
Download from https://github.com/ggml-org/llama.cpp/releases/latest — take the -bin-ubuntu-cpu-arm64 build.
Unpack it into the node's own tools directory (shown by meshhold tools status llama.cpp), or put llama-server anywhere on the daemon's PATH. The archive is searched two levels down, so the folder it unpacks into is fine as it is.
There is no Vulkan build for arm64; the CPU one is the general answer here.
LibreOffice — converting documents, and letting office formats reach the search index at all
sudo apt install libreoffice-nogui
The headless package — the desktop shell is not wanted and is most of the size.
audio-separator — pulling a voice out from under the music, so it can be transcribed
pip install "audio-separator[cpu]" audioread "librosa<1"
The pins are not decoration: onnxruntime lives in an extra, audioread is imported and not declared, and librosa 1.0 renamed a function the tool still calls. This is the one tool MeshHold does not manage — it needs a Python of your own.
sherpa-onnx — reading documents aloud
Download from https://github.com/k2-fsa/sherpa-onnx/releases/latest — take the -shared build for this system.
Unpack it into the node's own tools directory (shown by meshhold tools status sherpa-onnx), or put sherpa-onnx-offline-tts anywhere on the daemon's PATH. The archive is searched two levels down, so the folder it unpacks into is fine as it is.
It also needs espeak-ng-data beside it — the phonemiser's dictionaries, which a voice does not carry.
stable-diffusion.cpp — drawing pictures from a description
Not available here: upstream publishes no build for this architecture. It still shows as not installed rather than as unsupported, because that is what is true and because upstream may publish one.
whisper.cpp — turning speech into text and subtitles
Download from https://github.com/ggml-org/whisper.cpp/releases/latest — take the ubuntu build for this architecture.
Unpack it into the node's own tools directory (shown by meshhold tools status whisper.cpp), or put whisper-cli anywhere on the daemon's PATH. The archive is searched two levels down, so the folder it unpacks into is fine as it is.
WinFsp — mounting a vault as a drive letter
Not available here: Windows only; on Linux and macOS this is FUSE, which the node uses directly.
macOS
One program on this list has no build for this system: stable-diffusion.cpp.
FFmpeg — converting between media formats, making previews, and the audio at both ends of transcription and reading aloud
brew install ffmpeg
llama.cpp — answering questions, describing pictures, and turning text into the vectors search ranks on
brew install llama.cpp
Metal is built in; nothing else to choose.
LibreOffice — converting documents, and letting office formats reach the search index at all
brew install --cask libreoffice
audio-separator — pulling a voice out from under the music, so it can be transcribed
pip install "audio-separator[cpu]" audioread "librosa<1"
The pins are not decoration: onnxruntime lives in an extra, audioread is imported and not declared, and librosa 1.0 renamed a function the tool still calls. This is the one tool MeshHold does not manage — it needs a Python of your own.
sherpa-onnx — reading documents aloud
Download from https://github.com/k2-fsa/sherpa-onnx/releases/latest — take the -shared build for this system.
Unpack it into the node's own tools directory (shown by meshhold tools status sherpa-onnx), or put sherpa-onnx-offline-tts anywhere on the daemon's PATH. The archive is searched two levels down, so the folder it unpacks into is fine as it is.
It also needs espeak-ng-data beside it — the phonemiser's dictionaries, which a voice does not carry.
stable-diffusion.cpp — drawing pictures from a description
Not available here: upstream publishes no build for this architecture. It still shows as not installed rather than as unsupported, because that is what is true and because upstream may publish one.
whisper.cpp — turning speech into text and subtitles
brew install whisper-cpp
WinFsp — mounting a vault as a drive letter
Not available here: Windows only; on Linux and macOS this is FUSE, which the node uses directly.
Checking it landed
meshhold tools
The node looks for these in the background and remembers the answer for six hours, so after installing something either wait or say so:
meshhold tools recheck
Then meshhold tools again a few seconds later — several of these are proved
by actually running them, and one of them encodes a second of test video, so
the answers arrive over the following half-minute rather than at once.
A program that is present and does not work is reported differently from one that is absent, because they are different problems: the first means an installation somebody believes is fine, and it is worth saying out loud.
Job types and the programs they need
| Job type | Needs |
|---|---|
asr |
FFmpeg, whisper.cpp |
audio.separate |
FFmpeg, audio-separator |
convert |
LibreOffice |
embed |
llama.cpp, LibreOffice |
embed.vector |
llama.cpp |
image |
stable-diffusion.cpp |
infer |
llama.cpp |
infer.vision |
llama.cpp |
media.probe |
FFmpeg |
preview |
FFmpeg |
transcode |
FFmpeg |
tts |
FFmpeg, sherpa-onnx |
A job type with two entries needs both. embed is the one people do not expect: without LibreOffice a .docx is not merely unconvertible, it is unsearchable, because that is how its text reaches the index.