OliveTin: Run Shell Commands from a Web Browser
SSH is powerful, but sometimes you want to restart a service, run a backup, or trigger a script from your phone without opening a terminal. OliveTin gives you a simple web interface with big buttons that execute predefined shell commands on your server. No code, no complex automation — just buttons that do things.
Photo by Danist Soh on Unsplash
What OliveTin Does
- Web UI with action buttons: Define shell commands; OliveTin displays them as clickable buttons
- Mobile-friendly: Works from phone browser without SSH
- Argument inputs: Prompt for parameters before running commands
- Output display: See the stdout/stderr from command execution
- Permissions: Run specific actions as different users
- Cronlike scheduling: Run actions on a schedule in addition to manually
Docker Setup
services:
olivetin:
image: jamesread/olivetin:latest
container_name: olivetin
restart: unless-stopped
ports:
- 1337:1337
volumes:
- ./olivetin:/config
- /var/run/docker.sock:/var/run/docker.sock # If managing Docker containers
Configuration
OliveTin is configured via config.yaml. Create ./olivetin/config.yaml:
actions:
- title: Restart Nginx
shell: docker restart nginx
icon: 🔄
- title: Run Backups
shell: /home/user/scripts/backup.sh
icon: 💾
- title: Update Containers
shell: docker compose -f /opt/stacks/main/docker-compose.yml pull && docker compose -f /opt/stacks/main/docker-compose.yml up -d
icon: ⬆️
- title: Reboot Server
shell: sudo reboot
icon: 🔃
timeout: 10
Navigate to http://your-server:1337. Each action appears as a labeled button.
Actions with Arguments
Prompt for input before running a command:
actions:
- title: Wake Device
shell: wakeonlan {{ mac_address }}
icon: 💻
arguments:
- name: mac_address
title: MAC Address
description: "Format: AA:BB:CC:DD:EE:FF"
type: ascii
- title: Ping Host
shell: ping -c 4 {{ hostname }}
icon: 🏓
arguments:
- name: hostname
title: Hostname or IP
type: ascii
- title: Pull Docker Image
shell: docker pull {{ image }}:{{ tag }}
icon: 📦
arguments:
- name: image
title: Image name
type: ascii
- name: tag
title: Tag
default: latest
type: ascii
When you click the button, OliveTin shows a dialog for the arguments before executing.
Dropdown Arguments
actions:
- title: Set Log Level
shell: /opt/scripts/set-log-level.sh {{ level }}
icon: 📋
arguments:
- name: level
title: Log Level
type: select
choices:
- debug
- info
- warning
- error
Scheduled Actions
Run actions on a schedule:
actions:
- title: Daily Backup
shell: /opt/scripts/backup.sh
icon: 💾
trigger:
schedule: "0 2 * * *" # Cron syntax: 2 AM daily
This acts like a simplified cron with the added benefit of manual triggering via the UI.
Execution Permissions
OliveTin runs as a specific user by default. For commands requiring different permissions:
actions:
- title: Restart SSH Service
shell: systemctl restart sshd
icon: 🔐
shell: sudo systemctl restart sshd
Or run the OliveTin container with appropriate user mapping and sudoers configuration.
Practical Use Cases
Homelab server management:
- Restart services without SSH
- Trigger backup scripts from phone while away
- Restart Pi-hole DNS, update containers, run maintenance scripts
Household automation:
- Button to "run backups now" for family members who don't SSH
- Trigger wake-on-LAN for sleeping devices
- Start/stop services for kids' gaming servers
Development:
- Trigger deployments
- Run database migrations
- Clear caches
Monitoring response:
- Quick-action buttons next to alerts (pair with Uptime Kuma webhooks)
Grouping Actions
Organize buttons into sections:
actions:
- title: Restart Nginx
shell: docker restart nginx
icon: 🌐
- title: Restart Vaultwarden
shell: docker restart vaultwarden
icon: 🔐
- title: Run Backup
shell: /opt/backup/run.sh
icon: 💾
- title: Check Disk Usage
shell: df -h
icon: 💿
OliveTin displays actions in configuration order. Use consistent icon themes for visual grouping.
Output and Logs
After running a command, OliveTin shows:
- The command output (stdout)
- Error output (stderr)
- Exit code
- Execution time
Execution history is stored and viewable from the UI — useful for confirming a scheduled backup ran or debugging a failed command.
Security
OliveTin is designed for internal network use. It has no authentication by default:
- Run it on a port not exposed to the internet
- Put it behind Authelia, Authentik, or your reverse proxy's basic auth
- Or access via VPN/Tailscale only
Don't expose OliveTin directly to the internet without authentication — the buttons run arbitrary shell commands.
Comparison to Alternatives
| OliveTin | Portainer | n8n | |
|---|---|---|---|
| Setup complexity | Minimal | Moderate | High |
| Target use | Shell commands | Docker management | Workflow automation |
| Mobile UI | Yes | Yes | Limited |
| Scheduling | Simple cron | No | Complex workflows |
| Code required | No | No | Sometimes |
OliveTin fills the niche of "I want a button that runs a shell command" without the overhead of a full automation platform.
The project is at github.com/OliveTin/OliveTin. For anyone running a homelab who wants non-technical household members to be able to trigger scripts, or for your own use to avoid opening a terminal for routine tasks, OliveTin is a well-designed solution.
