Developer Setup on an Installed System
If you’re running JARVIS OS as your daily driver or a dev VM (not just booting a live ISO), this page covers how to get the full stack working correctly.
Prerequisites
- JARVIS OS installed from the live ISO (or kernel + daemon installed via
--host-install+--overlay) - Ollama running (
systemctl status ollama) - At least one model pulled:
ollama list
1. Verify the kernel module loads at boot
The jarvis.ko module must be loaded before any service starts.
lsmod | grep jarvis # Should show: jarvis, dibs
ls -l /dev/jarvis # Should exist
If the module isn’t loading automatically at boot, create the modules-load config:
sudo tee /etc/modules-load.d/jarvis.conf << 'EOF'
jarvis
EOF
sudo systemctl restart systemd-modules-load.service
modprobe resolves the dibs dependency automatically — no separate entry needed.
2. Configure the LLM model
The JARVIS service and CLI both read /etc/jarvis/jarvis.conf:
ollama list # Find installed models
sudo nano /etc/jarvis/jarvis.conf
Key fields:
LLM_MODEL=qwen3:14b # Match an ollama list entry exactly
LLM_URL=http://localhost:11434
OUTPUT_MODE=text # Use "text" if no working audio device
LLM_AUTO_PULL=false # Set true to auto-pull missing models
Apply to the running service:
sudo systemctl restart jarvis.service
jarvis model # Should echo the model name
3. Run the TUI
The interactive terminal UI (jarvis tui) requires the textual package in the JARVIS Python
environment:
which jarvis # Should be /usr/local/bin/jarvis
sudo /opt/jarvis-env/bin/pip install textual
jarvis tui
| Key | Action |
|---|---|
Ctrl+N |
New session |
Ctrl+Q |
Quit |
Ctrl+L |
Focus chat log (scroll with arrows/PgUp) |
Ctrl+I |
Focus input |
F1 |
Help / keybinding reference |
Enter |
Submit message |
4. Send messages to the running daemon
The JARVIS systemd service listens on a Unix socket:
jarvis send "what is my CPU temperature"
# Or use text chat mode directly (bypasses the socket, runs its own event loop)
jarvis chat
5. Verify the full stack
ls /dev/jarvis && echo "kernel driver OK"
systemctl is-active jarvis.service
curl -s http://localhost:11434/api/tags | python3 -m json.tool | grep name
jarvis model
jarvis ask "say hello"
Runtime file layout
| Path | Purpose |
|---|---|
/usr/local/bin/jarvis |
Shell entry point (wraps /opt/jarvis-env/bin/jarvis) |
/opt/jarvis-env/ |
Python venv with JARVIS and all dependencies |
/usr/lib/jarvis/ |
JARVIS Python package source |
/etc/jarvis/jarvis.conf |
System-wide config (model, URLs, modes) |
/usr/lib/jarvis/.env |
Fallback config when JARVIS_CONFIG_DIR is unset |
/var/lib/jarvis/ |
Runtime data (models dir, secondary venv) |
/run/jarvis/input.sock |
Unix socket — jarvis send writes here |
/run/jarvis/output.sock |
Unix socket — subscribe to receive JSON responses |
/var/log/jarvis/ |
Logs (also in journalctl -u jarvis) |
/etc/modules-load.d/jarvis.conf |
Ensures jarvis.ko loads at boot |
/dev/jarvis |
JARVIS kernel character device |
/sys/class/misc/jarvis/sysmon/ |
Live hardware metrics from kernel |
Config precedence
JARVIS_CONFIG_DIR env var → /etc/jarvis/jarvis.conf (system install, daemon)
↓ fallback
/usr/lib/jarvis/.env (dev fallback)
The systemd unit sets JARVIS_CONFIG_DIR=/etc/jarvis via Environment=. The
/usr/local/bin/jarvis wrapper sets it the same way so CLI and daemon always agree.
Running into errors on any of these steps? See Troubleshooting.