Linux, Spotify, and a first run that tells you what is wrong.
Install
Windows — download Jarvis-0.4.0-Setup.exe and run it. Windows 10/11 x64, per-user by default (no admin). Unsigned, so SmartScreen will warn — More info → Run anyway. Upgrading keeps everything in %LOCALAPPDATA%\Jarvis.
Linux — new:
curl -fsSL https://raw.githubusercontent.com/Explicabler1/Jarvis/master/install.sh | bash
Python 3.12–3.14 and git, no root. It puts a virtualenv under ~/.local/share/jarvis, a launcher in ~/.local/bin, and then runs jarvis setup — the same questions the Windows wizard asks, in a terminal.
Six Windows-only wheels were unconditional dependencies, so pip install . failed outright on Linux before this. Underneath them, three subsystems were Windows-shaped and are not any more: the media session (MPRIS via playerctl, volume via wpctl/pactl/amixer), app launching (an XDG desktop-entry scan including the Flatpak and Snap export paths), and where Jarvis writes — ~/.local/share/jarvis, or $XDG_DATA_HOME, or JARVIS_HOME.
Jarvis will not start without a brain
This is the change most likely to be noticed. FreeLLMAPI with no key, or Ollama with nothing pulled, produced an assistant that answered every single message with a connection error — which reads as a broken app rather than an unconfigured one.
jarvis, jarvis web, jarvis gui and jarvis chat now probe both backends first. If neither can answer they print what is missing and how to fix it, and do not open. Either backend alone is enough.
jarvis doctor the same checks, on demand
jarvis setup the wizard; safe to re-run to change anything
jarvis setup --brain-only fix just this
The wizard will install Ollama, start it, and pull a model for you. It never runs the install script without being asked — that is the one prompt that defaults to no, because --yes and a non-interactive run take every default and taking a default must not mean piping a remote script into a root shell.
JARVIS_SKIP_READINESS=1 bypasses the gate.
Play a named song on a free Spotify account
"Play Bohemian Rhapsody" was something Jarvis had to decline. Spotify's Web API can search on any account and its playback endpoints are Premium-only, returning 403 forever otherwise — so Jarvis does not ask Spotify to play something. It asks the Spotify client you are already signed into to.
jarvis spotify install into the Spotify desktop app, via Spicetify
jarvis spotify chrome or the web player, via a Chrome extension
jarvis spotify status what is connected
A small extension inside that client connects to a loopback bridge and takes commands: search, play, queue, transport, volume, shuffle. jarvis spotify install substitutes this install's port and token into the extension it copies, so nothing is typed by hand. Needs Spicetify and one spicetify backup apply first.
Eight new tools under spotify.*, and every one of them degrades to an explanation rather than an error when no client is connected.
The web UI got the things it was missing
Artifacts. The browser had none, so when Jarvis said "I've drawn you a diagram" the UI toasted the title and offered nowhere to go and look at it. There is now an Artifacts tab that renders Mermaid — from the same pinned library the desktop app uses, served locally, not from a CDN — sanitises model-authored SVG, and renders markdown tables, which the transcript renderer could not do at all.
Setup. The same readiness report jarvis doctor prints, with install buttons for every speech model and for Mermaid, and a Spotify status card.
Voice that works. Four separate causes, all fixed:
- A page served over plain http to anything but localhost has no microphone at all —
navigator.mediaDevicesis undefined outside a secure context, which is exactly what happens when you open the tab on your phone. Detected at load now, with the three real fixes named. - The recording container was whatever the browser picked, which is not always one the server can decode.
- Sliding the pointer off the button stopped the recording, cutting utterances in half. Pointer capture instead — plus spacebar push-to-talk, click-to-toggle, and stop-when-you-stop-talking.
- Replies were played with
new Audio().play(), which browsers refuse without a recent user gesture, so speech worked right after you pressed Send and silently did not otherwise. Everything plays through one unlocked AudioContext now, a sentence at a time as the reply streams.
Plus a Test the microphone and speaker button that exercises the whole path without the model.
Better speech models
distil-small.en replaces small.en as the default: smaller, faster, and no less accurate. With a GPU, large-v3-turbo is the one to pick — large-v3's decoder cut from 32 layers to 4, roughly 6x faster for accuracy within a point or two. distil-large-v3.5 joins them.
Kokoro is now offered at all three published precisions. The int8 export is 115 MB against the f32's 337, with the same voices and no audible loss, and is what the installer preselects.
Three decoding options that were left at their defaults are not any more: vad_filter (what stops a browser recording's trailing room tone becoming "Thank you."), condition_on_previous_text=False (what stops the repetition loop), and language, which was hardcoded to English and so quietly reduced the multilingual models to English-only ones.
Mermaid
artifacts.mermaid_js_path has always defaulted to data/vendor/mermaid.min.js, nothing ever put a file there, and the renderer blocks network access by design — so every diagram Jarvis drew rendered as a "library not found" notice. The installer offers it, jarvis setup offers it, both Settings screens have a button, and jarvis install-assets mermaid does it from a terminal. Pinned by version and verified against a SHA-256, because it is executed with unsafe-eval inside the artifact webview.
Everything downloadable, from wherever you are
Speech models and Mermaid were previously only obtainable from the installer's wizard page or a CLI most users had no reason to know about. There is now a Downloads card in the desktop Settings view and a Setup tab in the browser, both driving the same catalogue and the same downloader as the wizard.
Also
- CI runs the suite on Linux as well as Windows, with
JARVIS_HOMEoutside the checkout so the installed-copy path is what gets exercised. - The Core view's popover measured 151px against its 150px band with some fonts, silently clipping a line.
tts_statusread the active voice as "whichever of the Kokoro and Piper paths is set", and both are normally set at once — so every Piper voice reported itself unselected while Kokoro was configured.- Media control asks its provider whether it works rather than reading a module global, which is what made the media tools testable off Windows.