Your Raspberry Pi is sitting at home doing something useful — logging sensor data, driving a relay, running a home assistant script. You’re out. You want to check on it. You used to SSH in from your laptop. Today you just open Telegram and ask. You: is the temperature sensor still working? Agent: ✓ ran: cat /sys/bus/w1/devices/28-*/w1_slave Current temperature: 24.3°C — sensor is responding normally.
You: turn the fan relay on
Agent: ⚠ This will trigger GPIO 18 — confirm? [y/n]
You: y
Agent: ✓ ran: python3 ~/scripts/relay.py on 18
Relay ON. Fan is running. This is Garudust Agent with an SSH sandbox. The agent lives on a cloud VPS (or any server with internet access). You chat via Telegram. The agent SSHes into your Pi and runs whatever it needs to. Your Pi only needs SSH enabled — no extra software, no port forwarding for the agent. How It Works You (Telegram)
│
▼
garudust-server ← runs on a VPS or home server
(Telegram adapter)
│
│ SSH (key auth, BatchMode, StrictHostKeyChecking)
▼
Raspberry Pi ← just needs sshd running
(GPIO, sensors, scripts) The agent’s terminal tool normally runs commands locally. With terminal_sandbox: ssh , every command is forwarded through ssh to the Pi instead. The agent never knows or cares — it still calls the same tool. The routing happens transparently in the sandbox layer. Prerequisites A Raspberry Pi with SSH enabled (any model, any recent Raspberry Pi OS) A server to run Garudust on — a $5 VPS, another machine on your network, or even the Pi itself pointing at localhost A Telegram bot token (from @BotFather ) Garudust installed on the server # On the server — install Garudust curl -LO “https://github.com/garudust-org/garudust-agent/releases/latest/download/garudust- $( curl -s https://api.github.com/repos/garudust-org/garudust-agent/releases/latest | grep tag_name | cut -d ‘”’ -f4 ) -x86_64-unknown-linux-musl.tar.gz” tar -xzf garudust- * .tar.gz && sudo mv garudust garudust-server /usr/local/bin/ Step 1 — Set Up a Dedicated SSH Key Never use your personal SSH key for an agent. Create a dedicated one on the server: ssh-keygen -t ed25519 -f ~/.ssh/garudust_pi -N “” -C “garudust-agent” Copy the public key to the Pi: ssh-copy-id -i ~/.ssh/garudust_pi.pub pi@192.168.1.50 # or if Pi is not on the same network yet: # cat ~/.ssh/garudust_pi.pub | ssh pi@
You: set the LED strip to blue Agent: ✓ ran: python3 ~/scripts/led_strip.py color 0 0 255 Done.
You: turn everything off Agent: ✓ ran: python3 ~/scripts/all_off.py All GPIO outputs set LOW. Check System Health You: how is the Pi doing? Agent: ✓ ran: vcgencmd measure_temp && free -h && df -h / && uptime CPU temp: 52.1°C RAM: 823 MB used / 1.9 GB total Disk: 12 GB used / 29 GB total (41%) Uptime: 14 days, 3 hours
You: is anything hogging the CPU? Agent: ✓ ran: ps aux –sort=-%cpu | head -6 python3 sensor_logger.py 4.2% node homebridge 2.8% Everything else < 1%. Manage Services You: restart homebridge Agent: ⚠ This will restart the homebridge service — confirm? You: y Agent: ✓ ran: sudo systemctl restart homebridge homebridge restarted. Status: active (running).
You: is the camera stream still up? Agent: ✓ ran: systemctl is-active mjpg-streamer active
You: show me the last 20 lines of the sensor log Agent: ✓ ran: tail -20 ~/logs/sensor.log [2026-05-26 14:01] temp=24.3 hum=58.2 [2026-05-26 14:02] temp=24.4 hum=57.9 … Run Your Own Scripts The agent can run any script already on the Pi. You don’t need to teach it the commands — just describe what you want: You: water the plants for 30 seconds Agent: ✓ ran: python3 ~/scripts/sprinkler.py on 30 Valve opened. Will close in 30 seconds.
You: take a photo and tell me if the bird feeder is empty Agent: ✓ ran: raspistill -o /tmp/feeder.jpg -w 1280 -h 720 [reads image] The feeder appears about 30% full — seeds visible on the left side. Automate With Cron Set recurring checks without staying in the chat: # config.yaml cron : timezone : “ Asia/Bangkok” jobs : - schedule : “ 0 8 * * *” task : “ check Pi health and send a morning summary to Telegram” - schedule : “ */30 * * * *” task : “ read the temperature sensor; if above 70°C send a warning to Telegram” Now the agent proactively messages you — no need to ask. Security Notes A few things worth knowing before you deploy this: The SSH connection is hardened automatically. Garudust uses BatchMode=yes (no password prompts), StrictHostKeyChecking=accept-new (rejects changed host keys to prevent MITM), and clears the subprocess environment before spawning ssh so no API keys or secrets reach the Pi. Approval mode gates destructive commands. With approval_mode: smart , read-only commands (reading sensors, checking logs, git status ) run without asking. Anything that modifies state asks for confirmation first. Set approval_mode: auto only for yourself after you’ve tested it. Lock down the pi user if you want to go further. Restrict the SSH key to specific commands using command= in authorized_keys , or run the agent’s SSH user in a dedicated account with only the scripts it needs to call. The Pi never exposes a port to the internet. The agent SSHes out from the server to the Pi — the Pi only needs port 22 open to your server, not to the world. What’s Next Multiple Pis — point different agent sessions at different hosts; or build a thin wrapper script that SSHes to the right Pi based on what you ask Voice control — pair with iApp TTS to get spoken responses back on a speaker connected to the Pi Skill learning — after you run a workflow a few times, Garudust automatically writes it as a reusable skill so you don’t need to describe it step by step anymore The full source for Garudust is at garudust-org/garudust-agent . The SSH sandbox landed in v0.13 — grab the latest binary from Releases or build from source with cargo build –release .