Put Natro on a server
You need
- A Linux server (2 vCPU and 4 GB are enough)
- Tailscale on the server, PC and phone, one account
- Root or sudo on the server
Join your tailnet
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
tailscale ip -4
The address it prints (100.x.y.z) is where Natro will listen.
Get the code
Natro gets its own user and folder:
sudo useradd -m natro && sudo -iu natro
git clone https://github.com/tuxa4life/Natro.git ~/natro
cd ~/natro
curl -LsSf https://astral.sh/uv/install.sh | sh
uv venv --python 3.13 .venv
uv pip install --python .venv/bin/python -e voice -e agent
Add your secrets
Copy .env and google-key.json into ~/natro with scp, then chmod 600 .env google-key.json. In .env:
NATRO_LISTEN=100.x.y.z:8700
NATRO_DEVICE_TOKEN=a-long-random-secret
Make the token with python -c "import secrets; print(secrets.token_urlsafe(32))" and use the same one on every device.
Check that it answers:
cd agent && ../.venv/bin/python -m natro_agent.chat --once "hi"
Run it as a service
Use deploy/natro.service; the steps are inside it. From the PC, curl http://100.x.y.z:8700/health answers ok.
Close the firewall
Natro listens only on its Tailscale address, so the internet can’t reach it. Closing everything but SSH is still good:
ufw default deny incoming
ufw allow OpenSSH
ufw enable
Check first with ss -tlnp that nothing else on the server needs a public port. Use SSH keys only, and turn on automatic security updates.
Connect the PC
In the PC’s .env, set NATRO_SERVER=ws://100.x.y.z:8700 and the same NATRO_DEVICE_TOKEN, then start the app with --wake.
Keep
.env, keys and tokens private. Never commit them.