JARVISVersion 1.20.0Licence Apache 2.0Runs locallySource

Open source | Windows 10 and 11 | No service in the middle

A Windows HUD for a Hermes agent on your own server.

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.

Platform
Windows 10 / 11 · x64
Server footprint
Zero
Voice
Entirely local
Admin rights
Not required
JARVIS running on a Windows desktop over a nebula wallpaper: server gauges on the left, the reactor in the middle, and two floating windows showing a weather sprite and a firewall status readout.

Drag the image sideways

Screen captureRunning against an Ubuntu 24.04 server. The two floating windows are separate processes, and either one can be dragged onto another monitor.
Ø1  Overview

The rules everything else follows from.

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.

Ø1.1

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.

Ø1.2

Voice never leaves the machine

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.

Ø1.3

No invented numbers

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.

How it reaches the server

  • Opens an SSH session with the password or key you entered once.
  • Finds Hermes, on the host or inside a Docker container, reading /proc/net/tcp inside each running container when it has to.
  • Opens a local port forward to wherever it turned out to be, relaying through docker exec for a container.
  • Reads the API key from ~/.hermes/.env over the same session, so you never paste a secret you already own.
  • Runs a health check, then the HUD comes up.

What the readings cost your server

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 squashfs

Processes 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.

Ø2  Interface

What it looks like while it is working.

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.

Ø3  Requirements

What you need before you download.

Four things, and you probably already have three of them. The fourth is Hermes on your server, which may take some setting up.

Required

  • Windows 10 or 11, x64. No account and no administrator rights: it installs per user, into %LOCALAPPDATA%.
  • A Linux server you can reach over SSH with a password or a key. Any distribution that exposes /proc, so all of them.
  • Hermes installed on that server with its API server enabled and bound to 127.0.0.1.
  • About 3 GB of free space. The installer alone is 1.6 GB, and most of that is the speech models.

Not required

  • An account, a subscription, or a sign in of any kind.
  • Pasting an API key. JARVIS reads it off your server over the SSH session you just authenticated.
  • An NVIDIA card. It makes speech about seven times faster and nothing depends on it.
  • A microphone. Voice is optional and the app works just as well by keyboard.
  • Opening any port to the internet. Hermes stays on loopback and JARVIS reaches it through an SSH forward.

The Hermes side, on your server~/.hermes/.env

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.

Ø4  Machine specs

The interface runs anywhere. Voice is the part that asks for something.

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.

Minimum
CPU
2 cores
RAM
4 GB
Disk
3 GB
GPU
Not needed
Model
TINY / BASE

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.

Recommended
CPU
4 to 8 cores
RAM
8 GB
Disk
6 GB
GPU
Not needed
Model
SMALL

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.

Ideal
CPU
8 cores or more
RAM
16 GB
Disk
8 GB
GPU
NVIDIA, 4 GB VRAM or more
Model
LARGE V3 TURBO

Under two seconds a sentence and the best answer for Arabic. It needs only cuBLAS, 737 MB, bundled in the installer.

And there is a fourth tier

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.

Ø5  Measure yours

Enter your machine, and read what each model will do on it.

The arithmetic happens in your browser and is sent nowhere. What you get is an estimate built on measurements from this project.

CPU generation
NVIDIA card

The browser reports its core count and a rounded memory estimate. The reading stays on this page and is sent nowhere.

Reading
SMALL · on the CPU

SMALL on the CPU, about 5.4 seconds a sentence. It takes roughly 1.0 GB on disk in total.

Model estimates for the machine you entered
ModelDownloadRAMOn the CPUOn the GPU
TINY75 MB1.3 GBExcellent 1.0 sNo card
BASE145 MB1.4 GBQuick 1.9 sNo card
SMALL Bundled484 MB1.9 GBComfortable 5.4 sNo card
MEDIUM1.5 GB3.3 GBUnusable 19 sNo card
LARGE V3 TURBO1.6 GB3.5 GBUnusable 26 sNo card
How this is worked out

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.

Ø6  The models

Four models, all of them running on your machine.

There is no large language model inside JARVIS. The reasoning lives in Hermes on your server. The models here listen and speak.

openWakeWord · hey_jarvis3 MB

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.

Sourcegithub.com/dscripka/openWakeWord
Code licenceApache 2.0
Model licenceCC 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.

faster-whisper75 MB to 1.6 GB

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.

ModelSizeWhen to pick it
TINY75 MBAn old or very slow machine.
BASE145 MBA reasonable floor for a weak CPU with no GPU.
SMALL484 MBThe default, and it ships in the installer.
MEDIUM1.5 GBBetter on accented speech, and it needs a GPU.
LARGE V3 TURBO1.6 GBThe most accurate, and the best answer for Arabic, on a GPU only.
SourceSYSTRAN/faster-whisper · Hugging Face
LicenceMIT (faster-whisper, CTranslate2, Whisper)

The language detectortiny · 75 MB

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.

ModelIdentifies the language in
small2.07 s
base0.70 s
tiny0.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.

Piper63 MB × 2

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.

Sourcerhasspy/piper · piper-voices
LicenceMIT, each voice's training data on its own terms

Where exactly these models run

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.

Ø7  The stack

Every piece used, by name and by link.

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.

The applicationWindows

The voice sidecar127.0.0.1:8765

Type and soundSIL OFL 1.1

On your own serverSSH

Ø8  Hermes

JARVIS is the interface. Hermes is the agent.

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.

Hermes AgentNous Research

"The agent that grows with you." It creates skills from experience, improves them during use, and searches its own past conversations.

This frame does not load until you ask for it. Pressing the button opens a connection to nousresearch.com, and it is the only request this page ever makes to anyone else.

What JARVIS uses from the Hermes API

POST /v1/runsStart a task
GET /v1/runs/{id}/eventsThe event stream: tools, subagents, completion
POST /v1/runs/{id}/approvalAnswer a pause
POST /v1/runs/{id}/steerPass a note to a live agent
POST /v1/runs/{id}/stopStop it
GET /api/sessions/{id}/messagesThe permanent transcript

Quirks worth knowing about

  • Hermes sends no SSE 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.
  • A finished run's event stream is destroyed on disconnect, so reconnecting rebuilds the ending from the transcript.
Ø9  Get a server

You need a Linux box for the agent. Here is the shortest way to one.

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

One click, and Hermes is running

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 VPS

30 day money back guarantee.

Discount code
IPDEV

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.

The Hostinger page for the Hermes Agent template, showing one click deployment and the starting price.
The templateHermes Agent in the application catalogue, deployed in one click.

The plans, and which one to take

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.

PlanCoresMemoryDiskMonthlyRenews at
KVM 114 GB50 GB$6.49$11.99
KVM 2Take this one28 GB100 GB$8.99$14.99
KVM 4416 GB200 GB$12.99$28.99
KVM 8832 GB400 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.

The Hostinger plan grid for Hermes Agent, showing four KVM tiers with prices and specifications.
The plan gridFour tiers, with KVM 2 marked as the common choice.

What the template does for you

  • Hermes is installed and running when the machine finishes provisioning. No image to pull, no compose file to write.
  • A Docker manager in the panel, so restarting the container or reading its logs takes a click instead of an SSH session.
  • Weekly backups, kept automatically, which matters once the agent has a memory worth losing.
  • Root over SSH. Section 1Ø needs it to move the agent's shell onto the host.

Then what

  1. Pick a plan and pay, with the code in the coupon field.
  2. Choose Hermes Agent from the application catalogue when the machine asks what to install.
  3. Follow section 1Ø to give the agent the host rather than its own container.
  4. Download JARVIS in section 11 and point it at the server.
  Host access

Hermes runs inside a container. This hands it the whole VPS.

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.

Two values are yours, not ours

  • The container name. The Hostinger one-click template appends a random suffix, so it differs on every deployment and changes again if you redeploy. Step 2 prints it.
  • The host address. 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.

Where a command ends up

  1. Hermes container
  2. SSH
  3. root@172.17.0.1
  4. VPS host

The eight steps

  1. Reach the VPSyour computer

    From your own machine, the ordinary way in.

    ssh root@YOUR_VPS_IP
  2. Name the containerthe VPS

    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-1
  3. Cut a keythe container

    Inside 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
  4. Authorise it on the hostthe VPS

    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
  5. Trust the host keythe container

    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
  6. Prove it works by handthe container

    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'
  7. Point Hermes at SSHthe container

    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: true

    Then confirm Hermes read it:

    hermes config get terminal
  8. Restart and checkthe VPS

    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

When it does not work

Host key verification failedthe container

The 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
The config edit has no effectthe container

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 container

The 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 VPS

The 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
A redeploy broke everything

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.

The guide on its own

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 GitHub

This 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.

11  The download

Free, open source, and with no service behind it.

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.

The installerv1.20.0

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.

Read and accept the terms firstSource code

Tick the box to enable the download.

Or build it yourself

flutter build windows --release

# then the installer
ISCC.exe installer/jarvis.iss

The 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 licences, in full

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.

ComponentLicenceNote
JARVISApache 2.0This project's code, and the cues and icon it generates. The licence grants no right in the name
Flutter, DartBSD-3-Clause
dartssh2, http, window_manager, flutter_secure_storage, audioplayersMIT / BSDPer package, on pub.dev
Whisper, faster-whisper, CTranslate2MITCode and the converted weights
PiperMITEach voice's training data on its own separate terms
openWakeWord (code)Apache 2.0
openWakeWord (pretrained models)CC BY-NC-SA 4.0Non-commercial. This covers the hey_jarvis model
ONNX Runtime, NumPy, sounddevice, websocketsMIT / BSD-3-Clause
NVIDIA cuBLASNVIDIA's own licenceOptional, redistributed under NVIDIA's terms
Orbitron, Rajdhani, JetBrains Mono, Noto Sans ArabicSIL OFL 1.1
Hermes AgentMITA 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.