Nothing is installed on the server
No service, no systemd unit, no agent, no uploaded script. You need Hermes with its API server switched on, which is its own documented configuration.
Open source | Windows 10 and 11 | No service in the middle
Nothing is installed on the server, and nothing leaves your machine. Every number on screen is read from your own VPS over an SSH session the app opens itself. Every sentence you speak is transcribed on your own processor.

Drag the image sideways
Nothing is displayed that cannot be measured, and anything computable on this machine is computed here. The server is never asked to install a thing.
No service, no systemd unit, no agent, no uploaded script. You need Hermes with its API server switched on, which is its own documented configuration.
The wake word, the transcription and the speech all run in a local Python process on 127.0.0.1. Audio is never uploaded. Hermes receives the finished text.
Every reading comes from /proc over SSH. The deltas are computed on this side, because /proc reports counters and the HUD shows rates. A reading that cannot be taken shows a dash.
/proc/net/tcp inside each running container when it has to.docker exec for a container.~/.hermes/.env over the same session, so you never paste a secret you already own.One round trip a second batches the whole lot into a single command, with a @@ sentinel between sections, so one read fills every gauge.
# CPU, per core
cat /proc/stat; echo "@@";
cat /proc/meminfo; echo "@@";
cat /proc/loadavg; echo "@@";
cat /proc/uptime; echo "@@";
cat /proc/net/dev; echo "@@";
df -B1 -P -x tmpfs -x devtmpfs -x squashfsProcesses every 5 seconds, systemd timers every 60, the watched file tree every 3. At that cadence the whole loop stays a handful of kilobytes a second.
Each capture below is a whole screen, taken while the application was connected to a live server. The window is sized to sit over the desktop instead of covering it.

Drag the image sideways




Four things, and you probably already have three of them. The fourth is Hermes on your server, which may take some setting up.
%LOCALAPPDATA%./proc, so all of them.127.0.0.1.Leave it bound to 127.0.0.1. The API server never has to face the internet.
API_SERVER_ENABLED=true API_SERVER_HOST=127.0.0.1 API_SERVER_PORT=8642 API_SERVER_KEY=<your key>
On first run JARVIS walks a checklist: SSH reachable, authenticated, host identified, Hermes detected, API key accepted, telemetry reading. A step turns green only once it passes, and a failure stops the cascade and says what to do about it.
The drawing, the readings and the command line cost almost nothing. Every number below is about the speech model, and all of them were measured on this project.
One to two seconds a sentence, with mistakes on numbers and technical words. The running guess at what is being said switches itself off on two cores, since it is a second transcription competing with the real one.
About five seconds a sentence, and it gets version numbers right. This is the model that ships in the installer, so there is nothing to download.
Under two seconds a sentence and the best answer for Arabic. It needs only cuBLAS, 737 MB, bundled in the installer.
No voice at all. Any machine that runs Windows 10 or 11 runs JARVIS by keyboard: the readings, the terminal, the pop up windows and everything else work the same. No model is loaded, no microphone is opened, and the microphone indicator is struck through so you can see that voice is off and not broken.
The arithmetic happens in your browser and is sent nowhere. What you get is an estimate built on measurements from this project.
The browser reports its core count and a rounded memory estimate. The reading stays on this page and is sent nowhere.
SMALL on the CPU, about 5.4 seconds a sentence. It takes roughly 1.0 GB on disk in total.
| Model | Download | RAM | On the CPU | On the GPU |
|---|---|---|---|---|
| TINY | 75 MB | 1.3 GB | Excellent 1.0 s | No card |
| BASE | 145 MB | 1.4 GB | Quick 1.9 s | No card |
| SMALL Bundled | 484 MB | 1.9 GB | Comfortable 5.4 s | No card |
| MEDIUM | 1.5 GB | 3.3 GB | Unusable 19 s | No card |
| LARGE V3 TURBO | 1.6 GB | 3.5 GB | Unusable 26 s | No card |
The anchors are two measurements from this project on one spoken Arabic command: SMALL took 5.4 seconds on the CPU and 0.7 on a laptop RTX 3050, and LARGE V3 TURBO took 26 seconds on the same CPU. The factors for the other models are derived from those two points.
The decoder takes half the cores, so threads used are max(2, cores/2) against a reference of four. Scaling is sublinear at an exponent of 0.65, because doubling threads does not halve the time. The generation factor stands for single core performance.
The disk figure adds the application, the two voices, the wake word model and the chosen speech model, plus 737 MB of cuBLAS when the GPU is selected. The memory figure assumes about 0.9 GB for the application and the sidecar together, plus the model's own working set.
This is an estimate. Your actual machine is the arbiter, and the application measures what it can at runtime and lowers its own expectations accordingly.
There is no large language model inside JARVIS. The reasoning lives in Hermes on your server. The models here listen and speak.
Listens continuously for one phrase: "Hey JARVIS". A pretrained model for that phrase alone, small enough to run on the CPU on any machine. The detector is deaf while listening and while speaking, so JARVIS cannot trigger itself.
| Source | github.com/dscripka/openWakeWord |
|---|---|
| Code licence | Apache 2.0 |
| Model licence | CC BY-NC-SA 4.0 |
The pretrained openWakeWord models are non-commercial by their own licence. That restriction applies to this component alone, and it is set out in full in the terms.
Turns what you say into text, on the CPU or on an NVIDIA card. The models are multilingual, which matters here: the English only models cannot do Arabic at all.
| Model | Size | When to pick it |
|---|---|---|
| TINY | 75 MB | An old or very slow machine. |
| BASE | 145 MB | A reasonable floor for a weak CPU with no GPU. |
| SMALL | 484 MB | The default, and it ships in the installer. |
| MEDIUM | 1.5 GB | Better on accented speech, and it needs a GPU. |
| LARGE V3 TURBO | 1.6 GB | The most accurate, and the best answer for Arabic, on a GPU only. |
| Source | SYSTRAN/faster-whisper · Hugging Face |
|---|---|
| Licence | MIT (faster-whisper, CTranslate2, Whisper) |
A second copy of whisper that never transcribes anything. Its only job is to answer which language was spoken. Identifying a language is an easy problem and transcribing speech is not, so the cheap model answers it and the real model is told the answer.
| Model | Identifies the language in |
|---|---|
| small | 2.07 s |
| base | 0.70 s |
| tiny | 0.30 s |
Over eight clips in English and Jordanian Arabic, clean and noisy: 39.2 seconds before the change and 24.4 after, with identical text on seven of the eight. Below 0.5 confidence the detector is ignored in favour of whatever language the speaker was last using.
Speech out. Two voices: en_GB-alan-medium for English and ar_JO-kareem-medium for Arabic. The voice follows the script of the text, so Arabic characters mean the Arabic voice, and that stays right even when Hermes answers in a language you did not use. With no Piper voice present, Windows speech takes over, so JARVIS is never mute.
| Source | rhasspy/piper · piper-voices |
|---|---|
| Licence | MIT, each voice's training data on its own terms |
All of them inside one Python process on your machine, which owns the microphone, and which the application talks to over a websocket on 127.0.0.1:8765. No audio reaches a server or a service, and Hermes receives only the finished text. Each part degrades on its own: a missing model stops transcription without stopping the level meter, and a missing voice stops speech without stopping listening.
The interface contains no Material or Cupertino widget. Every gauge, ring, panel and frame is a CustomPainter, and one global ticker drives all of them.
Hermes is an open source AI agent from Nous Research, MIT licensed, which runs on your own machine or server and learns from how you use it. This project is not affiliated with or endorsed by Nous Research.


"The agent that grows with you." It creates skills from experience, improves them during use, and searches its own past conversations.
POST /v1/runs | Start a task |
GET /v1/runs/{id}/events | The event stream: tools, subagents, completion |
POST /v1/runs/{id}/approval | Answer a pause |
POST /v1/runs/{id}/steer | Pass a note to a live agent |
POST /v1/runs/{id}/stop | Stop it |
GET /api/sessions/{id}/messages | The permanent transcript |
event: line. Every frame is a bare data: line with the name inside the JSON, so a parser keyed on the event field sees nothing at all.tool.completed carries no output. Real stdout comes from the session transcript, where a tool row's content needs a second decode.subagent.complete never fires, and a parent run reaches run.completed while its children are still working.Hermes has to live somewhere before JARVIS can talk to it. Hostinger carries it as a one-click template, so the agent is running before you have opened a terminal, and the Docker manager, the container logs and the weekly backups are all in the panel already.
Sponsored
The template pulls the image, starts the container and hands you the panel. What is left is the SSH work in section 1Ø, and then JARVIS can see it.
Set up your Hermes VPS30 day money back guarantee.
10% off yearly plans
Ten percent off any yearly plan, on top of whatever the page is already showing, plus the account benefits that come with it. Paste it at checkout.
Enter it in the coupon field on the payment step, before you pay.

Hermes runs a browser and executes code, so memory is what runs out first. KVM 2 is the one to take for ordinary use. KVM 1 carries it if the agent is mostly answering questions, and the larger two are for running several heavy tasks at once.
| Plan | Cores | Memory | Disk | Monthly | Renews at |
|---|---|---|---|---|---|
| KVM 1 | 1 | 4 GB | 50 GB | $6.49 | $11.99 |
| KVM 2Take this one | 2 | 8 GB | 100 GB | $8.99 | $14.99 |
| KVM 4 | 4 | 16 GB | 200 GB | $12.99 | $28.99 |
| KVM 8 | 8 | 32 GB | 400 GB | $25.99 | $49.99 |
Prices read off the page on 4 September 2026, for the longest term, before the code. They move, so the figure on Hostinger is the real one. Every plan renews higher than it starts, which the table shows because the first bill is not the one that surprises people.

Out of the box the agent has a shell, but only the container's own. hostname gives back a container ID, docker ps fails, and nothing it does touches the machine you actually pay for. Eight steps move its terminal onto the host over SSH, and then everything JARVIS shows you is something the agent can also act on.
172.17.0.1 is the default Docker bridge gateway and holds on most machines. If yours differs, ip route | awk '/default/ {print $3}' inside the container prints the right one.$CONTAINER lives only in the shell you set it in. Close that SSH session and come back later and it is gone, so run step 2 again before anything that uses it.
One thing to weigh first: on the SSH backend everything runs on the host, so the agent can no longer edit its own code inside the container.
From your own machine, the ordinary way in.
ssh root@YOUR_VPS_IP
The template runs Traefik as well, so take the one with hermes-agent in the name. Setting it as a variable lets the rest of the guide be pasted as it stands.
docker ps --format '{{.Names}}' | grep hermes
CONTAINER=hermes-agent-xxxx-hermes-agent-1Inside the container, on the persisted volume, so a redeploy does not take the key with it. An ed25519 key with no passphrase, because nothing is there to type one.
docker exec -it $CONTAINER bash mkdir -p /opt/data/ssh chmod 700 /opt/data/ssh ssh-keygen -t ed25519 -f /opt/data/ssh/id_ed25519 -N "" cat /opt/data/ssh/id_ed25519.pub
exit drops you out of the container and back on the VPS, which is where this runs. Paste the public key printed by the previous step in place of the placeholder.
exit mkdir -p /root/.ssh chmod 700 /root/.ssh echo "PASTE_PUBLIC_KEY_HERE" >> /root/.ssh/authorized_keys chmod 600 /root/.ssh/authorized_keys
Back into the container for this one. Hermes cannot answer a host key prompt. Left untrusted, its terminal dies on Host key verification failed before the key is ever offered. Recording it system wide covers every user in the container.
docker exec -it $CONTAINER bash ssh-keyscan -H 172.17.0.1 >> /etc/ssh/ssh_known_hosts
Still inside the container. Three answers come back: the VPS hostname, root, and /root. If this fails, the config in the next step cannot save you.
ssh -i /opt/data/ssh/id_ed25519 root@172.17.0.1 'hostname && whoami && pwd'
Still in the container. The live config on the one-click template is /opt/data/config.yaml, so open it with nano /opt/data/config.yaml and set the terminal block to this. Keep cwd: / rather than /root, which trips a permission error on /root/.git when Hermes scans for context. Then read it back. If what comes out differs from what you wrote, you edited the wrong file, and ~/.hermes/config.yaml is the other candidate.
terminal:
backend: ssh
cwd: /
timeout: 180
ssh_host: 172.17.0.1
ssh_user: root
ssh_port: 22
ssh_key: /opt/data/ssh/id_ed25519
persistent_shell: trueThen confirm Hermes read it:
hermes config get terminal
exit again, because the restart is run on the VPS and not from inside the container being restarted. Once it is back, ask Hermes in the chat to run hostname, whoami and pwd. The VPS hostname, root and / mean it is out. Ask it for docker ps and it should list the containers running on the VPS, itself among them.
exit docker restart $CONTAINER
Host key verification failedthe containerThe host is untrusted and Hermes has no way to answer the prompt. Redo step 5, then confirm the entry landed. If you are already inside the container, skip the first line.
docker exec -it $CONTAINER bash ssh-keygen -F 172.17.0.1 -f /etc/ssh/ssh_known_hosts
TERMINAL_* environment variables outrank config.yaml. Find them, remove any you did not set, then exit and restart the container.
docker exec -it $CONTAINER bash env | grep TERMINAL cat /opt/data/.env 2>/dev/null | grep TERMINAL
Identity file not accessiblethe containerThe user Hermes runs as cannot read the key. Compare the owner against the process, then chown -R USER:GROUP /opt/data/ssh to that user. Do not widen the file mode, because SSH refuses a private key others can read.
docker exec -it $CONTAINER bash ls -l /opt/data/ssh/ ps -o user,pid,args -e | grep -i hermes
Permission denied (publickey)the VPSThe public key never reached the host. Run this on the VPS, not in the container, then redo step 4 if the key is missing.
cat /root/.ssh/authorized_keys
The new container has a new name and an empty filesystem, but /opt/data survives, so the key and the config are still where you left them. Redo step 2 for the name and step 5 to trust the host again.
Written against the Hostinger one-click Hermes template, though the steps hold for any Dockerised Hermes. The full version, with the output of every command, is in its own repository.
Read it on GitHubThis guide changes the configuration of software you host. It is not endorsed by Nous Research or Hostinger, and running an agent as root on the host is a decision only you can make. See the terms of use.
There is no server anyone runs on your behalf. You download the file, run it on your machine, and point it at your server. That is the whole arrangement.
One file, installed for a single user into %LOCALAPPDATA%\Programs\JARVIS with no administrator rights. It carries the application and the voice sidecar together, and most of its size is the speech models, which are what let JARVIS listen and answer with no network round trip.
Tick the box to enable the download.
flutter build windows --release
# then the installer
ISCC.exe installer/jarvis.issThe sound cues and the application icon are both generated by scripts in the repository, so no binary asset is checked in that cannot be produced again.
The JARVIS code itself is under the Apache 2.0 licence. The components it uses carry their own, and one of them restricts commercial use.
| Component | Licence | Note |
|---|---|---|
| JARVIS | Apache 2.0 | This project's code, and the cues and icon it generates. The licence grants no right in the name |
| Flutter, Dart | BSD-3-Clause | |
| dartssh2, http, window_manager, flutter_secure_storage, audioplayers | MIT / BSD | Per package, on pub.dev |
| Whisper, faster-whisper, CTranslate2 | MIT | Code and the converted weights |
| Piper | MIT | Each voice's training data on its own separate terms |
| openWakeWord (code) | Apache 2.0 | |
| openWakeWord (pretrained models) | CC BY-NC-SA 4.0 | Non-commercial. This covers the hey_jarvis model |
| ONNX Runtime, NumPy, sounddevice, websockets | MIT / BSD-3-Clause | |
| NVIDIA cuBLAS | NVIDIA's own licence | Optional, redistributed under NVIDIA's terms |
| Orbitron, Rajdhani, JetBrains Mono, Noto Sans Arabic | SIL OFL 1.1 | |
| Hermes Agent | MIT | A separate project by Nous Research, which you install on your own server |
The required notices in full are in NOTICE in the repository. The project name, the trademark position and what it means for you are covered in the terms, and what happens to your data, which is nothing, is in the privacy notice.