Control Your Home Network
From Any Slack Channel.
Turn Slack messages into real-time commands across your LAN. Works seamlessly behind NAT, firewalls, and CGNAT with zero open ports. Discover network devices, send Wake-on-LAN packets, manage Docker containers, and execute commands on remote Windows and Linux PCs via authenticated standalone agents.
Engineered for Complete Network Autonomy
A lightweight, enterprise-grade architecture that bridges your Slack workspace to distributed machines without exposing a single open port.
Socket Mode & Zero Open Ports
Classic Slack bots require public HTTPS endpoints and port forwarding. Cmdiqo leverages Slack Socket Mode to establish a single encrypted outbound WebSocket connection. Works completely behind NAT, firewalls, and CGNAT with zero exposed ports.
- Zero open inbound firewall ports
- Works behind CGNAT, cellular, and hotel WiFi
- TLS encryption handled directly by Slack Bolt
Native C++20 Standalone Agents & Setup
Ultra-compact standalone daemons written in ISO C++20 with super-lightweight memory footprint (under 1.5 MB binary, ~1.1 MB RAM on Linux x86_64, ARM64 & ARMv6, ~3.3 MB RAM on Windows) and sub-10ms startup. Features native setup wizards (~5.2 MB RAM on Windows GUI, CLI on ARM64 and ARMv6) with UAC elevation, Authenticode signing, and Win32 Job Object process isolation.
- Super-lightweight C++20 binaries: ~1.1 MB RAM on Linux (x64/ARM64/ARMv6), ~3.3 MB on Windows
- Full architecture support: Windows x64, Linux x86_64, Linux ARM64, and Linux ARMv6 (RPi Zero W / Pi 1)
- Win32 Job Objects & POSIX process group process tree isolation
- Authenticode signed Windows PE executables & systemd service
YAML-Driven Extensibility & Subcommand Help
Add custom commands in seconds without writing bot code. Simply define command triggers, arguments, and regex captures in commands.yaml. Built-in interactive help engine dynamically resolves multi-word subcommand topics like /help host restriction or /help docker with copy-pasteable examples.
- Captured argument placeholders like {host}, {user}, and {svc}
- Intelligent second-level /help discovery for subcommands (e.g. /help host restriction, /help blockapp)
- Configurable execution timeouts and working directories
- Automatic slash command aliases like /home, /wol, and /restrict
LAN Discovery & Wake-on-LAN
Keep complete visibility of your home network. Discover active devices via arp-scan with ip neigh fallback, map MAC vendors, ping IP addresses, and send Wake-on-LAN magic packets to wake sleeping PCs across subnets.
- Instant ARP sweep of local subnet with MAC lookup
- Wake-on-LAN magic packet injection
- Live agent ping and connectivity checks
Docker & Container Ops
Control Docker containers running on any host from your mobile Slack app. Inspect running containers, inspect memory and CPU utilization stats, tail the last 50 lines of logs, and trigger compose restarts on demand.
- Live docker ps and resource stats snapshots
- Tail container logs straight into Slack threads
- Automatic thread responses with clean formatting
Remote Host Telemetry
Query real-time hardware and OS metrics across your fleet. Inspect uptime, free RAM, drive space partitions, and top CPU-consuming processes on Windows and Linux machines without SSH or RDP overhead.
- Instant RAM and storage utilization metrics
- Cross-platform top CPU process identification
- Safe remote system reboot and shutdown commands
Integrated Real-time WebGUI
Launch an ultra-lightweight, zero-install web dashboard directly from the bot container by setting the WEB_PORT. Real-time Server-Sent Events (SSE) stream host connectivity, architecture badges, sortable connected hosts with persistent order, synchronized live uptimes, and terminal events without polling.
- Zero-configuration single-port activation via WEB_PORT
- Sortable Connected Agents table (Host Name, Arch, OS, Uptime) with localStorage persistence
- Real-time SSE event log ring buffer with zero polling overhead
System Services & Windows Updates
Manage system background daemons remotely. Query service states, restart failing services via systemd or Windows Service Control Manager, and query installed Windows Hotfix updates for security compliance.
- Service status inspection and restart triggers
- Windows SCM and Linux systemd unification
- Installed Windows Update hotfix auditing
Parental, App & Logon Guard
Enforce focus or bedtime rules in one message. Enforce allowed logon hours (M-F schedules), lock desktop sessions, audit active screentime, send on-screen alerts, and instantly block or restore games (Roblox, Minecraft, Steam, Epic, Discord, etc.) via DNS hosts redirects and OS-level execution interception (Windows IFEO/AppX & Linux Flatpak).
- Mandatory user logon hours enforcement with T-5m toast, T-1m alert, and cutoff forced logoff
- Instant graphical desktop lock (/host lock) and screentime session auditing
- DNS and hosts-file domain blocking for video and gaming sites
- Native process execution blocking via Windows IFEO & Linux Flatpak overrides
Integrated Real-Time WebGUI & Remote Console
Need a visual overview of your home fleet? Activate the built-in WebGUI with a single environment variable (WEB_PORT=8080). Monitor connected nodes with zero polling, trigger host actions with one click, and inspect Slack-formatted terminal output right in your browser.
| Arch | Host Name | Operating System | Uptime | Action |
|---|---|---|---|---|
PC-KIDS | Windows 11 Pro | 01d 04h 22m 18s | ||
pi-home | Debian 12 (bookworm) | 42d 18h 05m 12s | ||
backup-nas | Ubuntu 24.04 LTS | 18d 02h 45m 30s |
Live Agent Fleet Grid
Sort connected hosts by Name, Architecture, OS, or Uptime with full localStorage persistence. WebP architecture icons and 1Hz local uptime tickers deliver instant fleet status.
One-Click Action Menus
Trigger system telemetry, tail Docker logs, restart containers, manage system services, and apply parental rules directly from categorized context submenus without typing raw CLI commands.
Slack-Rendered Terminal
Live execution responses translate Slack formatting, code syntax, and emojis in real time. Automated status detection flags failed commands with red FAILED badges.
Server-Sent Events (SSE)
Real-time event stream pushes host registrations, disconnections, and command outputs directly to your browser with zero polling overhead. Built-in 50-event ring buffer with reverse-order toggle.
Experience Cmdiqo Right in Your Browser
Click a quick command pill below or type your own slash command into the interactive Slack simulator. Experience how real-time Socket Mode acknowledgments and output blocks arrive in Slack channels.
ws://0.0.0.0:8765 (3 remote agents online).Type a slash command or click one of the pills above to test remote network operations!
/lan devices listIP ADDRESS MAC ADDRESS HOST NAME
192.168.1.1 aa:bb:cc:dd:ee:ff router.home
192.168.1.10 22:33:44:55:66:77 nas.home
192.168.1.20 11:22:33:44:55:66 rpi4-server.home
192.168.1.55 88:99:aa:bb:cc:dd workstation-win11.homeDecoupled Three-Tier Topology
Engineered specifically for home labs and distributed networks. Outbound WebSockets eliminate inbound firewall holes, dynamic DNS headaches, and reverse proxy vulnerabilities.
1. Slack Cloud Platform
Users interact seamlessly via Slack desktop, browser, or mobile apps. Slash commands and messages are queued through Slack's secure cloud infrastructure.
2. cmdiqo-bot & WebSocket Hub
Runs as a Docker container or Python service on your primary local server. Connects OUTBOUND to Slack via Socket Mode, parses YAML commands, checks user permissions, dispatches tasks to remote agents, and serves an optional real-time WebGUI dashboard.
3. Distributed Native C++20 Agents
Statically linked native C++20 standalone binaries (under 1.5 MB). Each agent maintains a persistent outbound WebSocket to the Hub, executes commands safely with Win32 Job Objects / POSIX process tree isolation, and streams stdout/stderr back.
System Architecture & Agent Communication Topology

End-to-End Command Dispatch Lifecycle
ws://<hub_ip>:8765 with Bearer token authentication:{
"type": "hello",
"name": "PC-OLO",
"version": "1.0.42",
"platform": "windows"
}{
"id": "a1b2c3d4e5f67890123456789abcdef0",
"type": "exec",
"kind": "ps1",
"cmd": "Get-Service | Where-Object {$_.Status -ne 'Running'} | Format-Table -AutoSize",
"cwd": null,
"timeout": 180
}{
"id": "a1b2c3d4e5f67890123456789abcdef0",
"type": "result",
"ok": true,
"code": 0,
"output": "Status Name DisplayName\n------ ---- -----------\nStopped ALG Application Layer Gateway Service...",
"error": null
}Built-In Operations & Custom Extensions
Explore default Slack commands for network administration, remote diagnostics, and container management. Extend effortlessly with your own custom shell scripts or Python functions in commands.yaml.
lan devices list/lan devices listList all devices seen on local network via ARP broadcast scan
IP ADDRESS MAC ADDRESS HOST NAME
192.168.1.1 aa:bb:cc:dd:ee:ff router.home
192.168.1.10 22:33:44:55:66:77 nas.home
192.168.1.20 11:22:33:44:55:66 rpi4-server.home
192.168.1.55 88:99:aa:bb:cc:dd workstation-win11.home
/wol 00:11:22:33:44:55/lan wake 00:11:22:33:44:55Send Wake-on-LAN magic packet to boot a sleeping PC or server
✨ Magic packet sent to 00:11:22:33:44:55 on port 9
(broadcast 255.255.255.255). Target device should boot shortly.
/lan ping 192.168.1.1Ping an IP or hostname from Hub container to verify latency
PING 192.168.1.1 (192.168.1.1): 56 data bytes
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.421 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.389 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.405 ms
--- 192.168.1.1 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max = 0.389/0.405/0.421 ms
/lan agents listList all connected remote agents, platform, version, and IP
CONNECTED AGENTS (3 online):
NAME PLATFORM IP VERSION CONNECTED
home-nas linux 192.168.1.10 1.0.42 3d 14h 22m
PC-GAMING windows 192.168.1.55 1.0.42 8h 12m 04s
rpi-sensor linux 192.168.1.20 1.0.42 12d 02h 11m
/host version/lan versionCheck running cmdiqo-bot hub version and connected socket engine
ℹ️ *Cmdiqo Version*
cmdiqo-bot v0.12.14
/host home ping 1.1.1.1Ping an IP or domain name directly from the remote agent's perspective
PING 1.1.1.1 (1.1.1.1) from home:
64 bytes from 1.1.1.1: icmp_seq=1 ttl=58 time=7.82 ms
64 bytes from 1.1.1.1: icmp_seq=2 ttl=58 time=7.65 ms
64 bytes from 1.1.1.1: icmp_seq=3 ttl=58 time=7.91 ms
--- 1.1.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, rtt min/avg/max = 7.65/7.79/7.91 ms
/host home portsList listening network TCP/UDP ports and owning processes on remote host
[home] LISTENING PORTS & PROCESSES:
PROTO LOCAL ADDRESS PORT PID PROCESS
TCP 0.0.0.0 22 812 sshd
TCP 0.0.0.0 8765 1402 cmdiqo-bot
TCP 0.0.0.0 32400 1822 plex-mediaserver
TCP 127.0.0.1 5432 930 postgres
UDP 0.0.0.0 53 610 pihole-FTL
/host home speedtestBenchmark internet download speed & latency via Cloudflare CDN on host
⚡ [home] Cloudflare Speedtest Benchmark:
• Downloaded: 10 MB payload
• Duration: 0.12s
• Throughput: 666.67 Mbps
• Status: Excellent WAN connectivity
/home uptime/host home uptimeCheck standardized system uptime, boot time, and current load average
[home] Uptime: 45d 08h 12m 00s
Boot time: 2026-08-11 14:22:18 UTC
Load Average: 0.18, 0.22, 0.19 (4 cores)
/home memory/host home memoryInspect RAM usage, free memory, and swap utilization
[home] MEMORY USAGE:
Total RAM: 31.2 GB
Used RAM: 12.4 GB (39.7%)
Available: 18.8 GB (60.3%)
Swap: 2.0 GB used of 8.0 GB
/home disk/host home diskCheck disk partitions, mounts, and available storage space
[home] FILESYSTEM USAGE:
Filesystem Size Used Avail Use% Mounted on
/dev/nvme0n1p2 938G 312G 579G 36% /
/dev/sda1 7.3T 4.1T 2.9T 59% /data/storage
/dev/sdb1 3.6T 1.2T 2.3T 35% /mnt/backup
/host home topDisplay top 10 CPU-consuming processes on remote host
[home] TOP CPU PROCESSES:
PID USER %CPU %MEM COMMAND
14202 docker 14.2 8.1 plex-transcoder
18911 root 3.8 2.4 containerd
2290 node 2.1 3.2 homebridge
841 systemd 0.4 0.2 systemd-journald
/host home usersList all OS users on remote host (active ✔️ or locked 🚫)
[home] OS USERS:
USERNAME STATUS SESSIONS
admin active ✔️ (console, 2h 15m)
deploy active ✔️ (ssh, 45m)
guest locked 🚫 (none)
/host home user john/host home user john statusInspect specific user profile, home directory, and active session duration
👤 *User Status for `john` on `home`:*
• Full Name: John Doe
• Home Directory: `/home/john`
• Status: ✔️ active
• Current Session: 2h 15m 30s
/host home user guest enable/host home user guest disableLock (disable) or unlock (enable) user account without physical or RDP access
🚫 *User `guest` on `home` disabled (locked).*
/host PC-OLO rebootReboot remote host safely after 10-second warning
✅ [PC-OLO] System reboot initiated successfully:
shutdown /r /t 10
Machine will restart in 10 seconds.
/host PC-OLO shutdownSafely power down remote host after 10-second warning
✅ [PC-OLO] System shutdown initiated successfully:
shutdown /s /t 10
Machine will power off in 10 seconds.
/host PC-KIDS screentimeShow active logged-in user sessions, console/RDP state, and idle time
⏱️ [PC-KIDS] Active Sessions & Screentime:
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
alex console 1 Active none 2026-10-11 15:30
/host PC-KIDS lockInstantly lock active graphical workstation session without closing apps
🔒 [PC-KIDS] Workstation locked.
Active desktop session is now locked. Running applications remain open in the background.
/host PC-KIDS msg Dinner is ready!Broadcast an on-screen desktop notification or popup alert to target PC
💬 [PC-KIDS] Message delivered: Dinner is ready!
On-screen alert displayed to the active user session.
/host PC-OLO eventsShow recent system warning and error event logs (Windows Event Log or journalctl)
[PC-OLO] RECENT SYSTEM EVENTS (Warning / Error):
TimeCreated Id Level Message
2026-10-11 18:22:10 10016 Warning The application-specific permission settings do not grant Local Activation
2026-10-11 17:05:40 7036 Info The Windows Modules Installer service entered the stopped state.
2026-10-11 14:12:02 41 Critical The system has rebooted without cleanly shutting down first.
/home docker ps/host home docker psList all running and stopped Docker containers
CONTAINER ID IMAGE STATUS PORTS NAMES
b8f9e0a12c4d plexinc/pms-docker Up 14 days 0.0.0.0:32400->32400/tcp plex
a1b2c3d4e5f6 homeassistant/home Up 45 days 0.0.0.0:8123->8123/tcp homeassistant
e7f8a9b0c1d2 portainer/portainer Up 45 days 0.0.0.0:9443->9443/tcp portainer
3c4d5e6f7a8b pihole/pihole:latest Up 45 days 0.0.0.0:53->53/udp pihole
/home docker restart plex/host home docker restart plexRestart Docker container or docker compose service
✅ [home] Container plex restarted successfully in 2.14s.
Status: Up 2 seconds (healthy)
/home docker logs plex/host home docker logs plexTail the last 50 lines of container standard output & error logs into Slack
[plex] LAST 50 LOG LINES:
[2026-10-09 17:45:10] INFO - Starting Plex Media Server (v1.40.2)...
[2026-10-09 17:45:12] INFO - Database migration completed in 120ms.
[2026-10-09 17:45:14] INFO - Listening for TLS socket connections on port 32400.
[2026-10-09 17:45:15] INFO - DLNA server ready.
/host home docker statsSnapshot of CPU, RAM, and network usage per container
NAME CPU % MEM USAGE / LIMIT MEM % NET I/O
plex 8.42% 1.41GiB / 31.24GiB 4.52% 142MB / 8.9GB
homeassistant 1.12% 485MiB / 31.24GiB 1.51% 45MB / 12MB
pihole 0.28% 128MiB / 31.24GiB 0.40% 89MB / 67MB
/host PC-OLO servicesList active system daemons (systemd or Windows SCM)
[PC-OLO] ACTIVE SYSTEM SERVICES:
SERVICE NAME DISPLAY NAME STATUS
cmdiqo-agent Cmdiqo Agent Daemon Running
LanmanServer Server (SMB/CIFS) Running
wuauserv Windows Update Running
WinDefend Microsoft Defender Antivirus Service Running
/host nas service status smbd/host PC-OLO service status WinDefendInspect specific daemon or service state and startup type
[PC-OLO] SERVICE STATUS:
Name : WinDefend
DisplayName : Microsoft Defender Antivirus Service
Status : Running
StartType : Automatic
/host nas service restart smbd/host PC-OLO service restart SpoolerForce-restart a hanging Windows SCM service or Linux systemd unit
✅ [PC-OLO] Service Spooler restarted successfully.
Status: Running
/host PC-OLO win updatesQuery installed Windows updates and recent hotfixes
[PC-OLO] RECENT WINDOWS HOTFIXES:
HotFixID Description InstalledBy InstalledOn
KB5039212 Security Update NT AUTHORITY\SYSTEM 2026-09-12
KB5038285 Update NT AUTHORITY\SYSTEM 2026-08-20
KB5037771 Security Update NT AUTHORITY\SYSTEM 2026-07-15
/parental PC-KIDS on/host PC-KIDS parental onBlock YouTube, Roblox, TikTok, Twitch, Discord, Minecraft, and gaming/proxy sites in hosts file & flush DNS
🛡️ [PC-KIDS] Parental Guard ENABLED.
Blocked domains: YouTube, Roblox, Minecraft, Discord, TikTok, Twitch, Instagram, Reddit, AI, Web Games, Proxies
DNS resolver cache flushed successfully.
/parental PC-KIDS off/host PC-KIDS parental offUnblock gaming and video sites and restore normal internet access
🔓 [PC-KIDS] Parental Guard DISABLED.
Hosts file restored. DNS resolver cache flushed successfully.
/parental PC-KIDS status/host PC-KIDS parental statusQuery active parental blocking status without physical access
[PC-KIDS] Parental Guard Status:
Status: ACTIVE 🛡️
Blocked categories: Entertainment (YouTube, TikTok, Twitch), Gaming (Roblox, Minecraft, Poki, now.gg), Chat/Social (Discord, Instagram, Reddit), AI & Proxies (Character.ai, CroxyProxy)
Rule applied at: 2026-09-25 18:00:00
/blockapp PC-KIDS roblox on/host PC-KIDS blockapp roblox onBlock execution of games and apps via IFEO, AppX, or Flatpak overrides
✅ 🚫 [PC-KIDS] Application execution BLOCKED!
Target: Windows (PC-KIDS IFEO/AppX)
Blocked Apps: Roblox
Interception rules and process termination applied.
/blockapp PC-KIDS roblox off/host PC-KIDS blockapp roblox offCleanly restore normal execution permissions for blocked applications
✅ 🔓 [PC-KIDS] Application execution UNBLOCKED!
Target: Windows (PC-KIDS IFEO/AppX)
Unblocked Apps: Roblox
Clean execution state restored successfully.
/blockapp PC-KIDS tlauncher on | /appblock PC-KIDS tlauncher on/host PC-KIDS blockapp tlauncher onBlock TLauncher Minecraft launcher executables and process trees on target machine
✅ 🚫 Application execution BLOCKED on `PC-KIDS`
Target: Windows (`PC-KIDS` IFEO/AppX)
Blocked Apps:
• TLauncher (TLauncher.exe, TLauncherBeta.exe, tlauncher.exe)
Interception debugger rules applied & active processes terminated./blockapp PC-KIDS all on | /appblock PC-KIDS all on/host PC-KIDS blockapp all onBlock execution for ALL configured games, launchers, and apps simultaneously
✅ 🚫 Application execution BLOCKED on `PC-KIDS`
Target: Windows (`PC-KIDS` IFEO/AppX)
Blocked Apps: Roblox, Steam, Epic Games, Discord, Minecraft, TLauncher, Riot Games, Battle.net, TikTok, GeForce NOW
Interception rules applied across all 10 configured apps & active processes terminated./blockapp PC-KIDS all off | /appblock PC-KIDS all off/host PC-KIDS blockapp all offCleanly restore execution permissions for ALL configured applications at once
✅ 🔓 Application execution UNBLOCKED on `PC-KIDS`
Target: Windows (`PC-KIDS` IFEO/AppX)
Unblocked Apps: Roblox, Steam, Epic Games, Discord, Minecraft, TLauncher, Riot Games, Battle.net, TikTok, GeForce NOW
Interception rules cleared. Clean execution state restored across all apps./blockapp PC-KIDS all | /host PC-KIDS blockapp all status/host PC-KIDS blockapp allQuery execution interception status across all configured apps (defaults to status)
🛡️ Application Execution Status on PC-KIDS:
• Roblox (roblox): 🚫 BLOCKED
• Steam (steam): ✅ ALLOWED
• Epic Games Launcher (epic): ✅ ALLOWED
• Discord (discord): 🚫 BLOCKED
• Minecraft (minecraft): ✅ ALLOWED
• TLauncher (tlauncher): 🚫 BLOCKED
• Riot Games (riot): ✅ ALLOWED
• Battle.net (battlenet): ✅ ALLOWED
• TikTok (tiktok): 🚫 BLOCKED
• GeForce NOW (gfn): ✅ ALLOWED
/blockapp PC-KIDS tlauncher | /host PC-KIDS blockapp roblox/host PC-KIDS blockapp tlauncherCheck execution status of an individual application without altering state (defaults to status)
🛡️ Application Execution Status on `PC-KIDS` (Windows/11):
• TLauncher (tlauncher): 🚫 BLOCKED
Executables: TLauncher.exe, TLauncherBeta.exe, tlauncher.exe
Mechanism: IFEO Debugger hook (systray/sub-process blocked)/restrict PC-KIDS alex status/host PC-KIDS restrict alex statusInspect active user logon hours allowed on remote host (Windows SAM or Linux PAM)
⏰ Logon Hours Status on PC-KIDS:
• User: alex
• Allowed Hours: Monday 07:00 - 18:00, Tuesday 07:00 - 18:00, Wednesday 07:00 - 18:00, Thursday 07:00 - 18:00, Friday 07:00 - 18:00, Saturday 08:00 - 18:00, Sunday 08:00 - 18:00
• Status: 🔒 Restricted (M-F: 07:00-18:00; Sa-Su: 08:00-18:00)
• Active Tasks: 5-min toast warning, 1-min alert dialog & forced logoff
/restrict PC-KIDS alex set M-F,07:00-18:00;Sa-Su,08:00-18:00/host PC-KIDS restrict alex set M-F,07:00-18:00;Sa-Su,08:00-18:00Enforce allowed login schedule with 5m toast, 1m modal alert, and forced cutoff logoff
✅ 🔒 Logon hours restriction successfully applied on PC-KIDS:
• Target: alex
• Schedule: M-F,07:00-18:00;Sa-Su,08:00-18:00
• Rule: Access permitted M-F 07:00-18:00, Sa-Su 08:00-18:00 with T-5m toast warning, T-1m alert, and cutoff logoff.
/restrict PC-KIDS alex off/host PC-KIDS restrict alex offClear logon restrictions, purge scheduled enforcement tasks, and restore unlimited 24/7 access
✅ 🔓 Logon hours restriction removed on PC-KIDS:
• Target: alex
• Allowed Hours: All (unlimited 24/7 access restored)
• Cleanup: All scheduled warning and logoff tasks purged.
/lan help | /host help/help [topic]Dynamic command manual with nested topic breakdowns and trailing help routing
Available Categories:
• /lan devices list | wake <mac> | ping <ip> | agents list | version
• /host <name> uptime | memory | disk | top | reboot | shutdown | events
• /host <name> users | user <user> [status|disable|enable] | screentime | lock | msg <text>
• /host <name> docker ps | logs <svc> | restart <svc> | stats
• /host <name> services | service restart <svc> | win updates
• /host <name> parental on | off | status
• /host <name> blockapp <app|all> on | off | status (alias: appblock)
• /host <name> restrict <user> <status|set <schedule>|off> (alias: /restrict)
• /host <name> ping <target> | ports | speedtest
• Configured Aliases: /home <action>, /wol <target>, /restrict <host> <user> <action>
Pro-tip: Append 'help' to any category (e.g. /lan help, /host help, /blockapp help, /restrict help) or query specific subcommands (e.g. /help host restriction).
/help host restriction | /help restrict/help [subcommand]Intelligent second-level subcommand search with multi-word and synonym matching
Command: /host {host} restrict {user} <status | set <schedule> | off> (alias: /restrict)
Description: Manage user logon hours restriction on Windows (SAM / Task Scheduler / Toast & Alert) or Linux (PAM time.conf)
Actions:
• status: Show active logon hours and scheduled tasks for user
• set <schedule>: Enforce allowed schedule with T-5m toast notification, T-1m alert, and forced logoff
• off: Remove all restrictions, purge enforcement tasks, and restore unlimited 24/7 access
Schedule Syntax:
• Weekdays 7am-6pm, Weekends 8am-6pm: M-F,07:00-18:00;Sa-Su,08:00-18:00
• Weekdays after school: M-F,16:00-20:00
/host home docker restart plex/home docker restart plexConfigurable prefix alias routing /home directly to /host home
✅ [home] Container plex restarted successfully in 2.14s.
Status: Up 2 seconds (healthy)
/lan wake 00:11:22:33:44:55/wol 00:11:22:33:44:55Convenience shortcut sending Wake-on-LAN magic packet to target MAC
✨ Magic packet sent to 00:11:22:33:44:55 on port 9
(broadcast 255.255.255.255). Target device should boot shortly.
/host PC-KIDS blockapp roblox on/blockapp PC-KIDS roblox onDirect root shortcut for application execution blocking (also /appblock)
✅ 🚫 [PC-KIDS] Application execution BLOCKED!
Target: Windows (PC-KIDS IFEO/AppX)
Blocked Apps: Roblox
Interception rules and process termination applied.
/blockapp PC-KIDS tlauncher on | /appblock PC-KIDS all/appblock PC-KIDS tlauncher onInterchangeable alias for /blockapp and /host {host} blockapp
✅ 🚫 Application execution BLOCKED on `PC-KIDS` (alias: appblock)
Target: Windows (`PC-KIDS` IFEO/AppX)
Blocked Apps:
• TLauncher (TLauncher.exe, TLauncherBeta.exe, tlauncher.exe)
Interception debugger rules applied & active processes terminated.Download Standalone Binaries & Containers
Precompiled standalone executables for Windows and Linux, multi-architecture Docker containers, and the offline console emulator.
Single-Command Piped Setup
Single-command bootstrap with automatic architecture detection, background service registration, and instant startup. The fastest and recommended way to deploy the Cmdiqo Agent across servers, cloud instances, and workstations without manually unzipping or moving files.
Linux / Cloud Server
Zero DependenciesAuto-detects CPU architecture, downloads the lightweight headless daemon (~1.1 MB RAM, no X11/GTK), creates the system user, installs systemd unit, and starts the service immediately.
curl -fsSL https://raw.githubusercontent.com/lhotakj/cmdiqo/main/install.sh | sudo bash -s -- --hub-url ws://<HUB_IP>:8765 --token <AGENT_TOKEN> --name <HOST_NAME>Windows 10 / 11 / Server
PowerShell AdminDownloads the verified Windows setup package and automatically configures and registers the cmdiqo-agent service (~3.3 MB RAM) with the Service Control Manager (SCM).
& ([scriptblock]::Create((irm https://raw.githubusercontent.com/lhotakj/cmdiqo/main/install.ps1))) -HubUrl "ws://<HUB_IP>:8765" -Token "<AGENT_TOKEN>" -Name "<HOST_NAME>"Windows Setup Wizard (.exe)
Self-contained native C++ setup executable embedding the agent payload. Features an ultra-lightweight graphical setup wizard (~5.2 MB RAM) with UAC elevation, token validation, and automated Windows Service (SCM) registration (~3.3 MB RAM).
# 1. Quick One-Liner (PowerShell as Administrator):
& ([scriptblock]::Create((irm https://raw.githubusercontent.com/lhotakj/cmdiqo/main/install.ps1))) -HubUrl "ws://192.168.1.10:8765" -Token "<AGENT_TOKEN>" -Name "PC-01"
# Or download and run native GUI setup wizard:
.\cmdiqo-agent-windows-x64-setup.exe
Windows Standalone Agent (ZIP)
Native C++20 cmdiqo-agent.exe executable (~3.3 MB RAM, sub-10ms startup), automated PowerShell service installer (install-service.ps1), uninstall script, and configuration templates.
# 1. Extract zip and navigate to directory:
Expand-Archive cmdiqo-agent-windows-x64.zip -DestinationPath C:\cmdiqo-agent
cd C:\cmdiqo-agent
# 2. Install as automatic background Windows Service:
powershell.exe -ExecutionPolicy Bypass -File .\install-service.ps1 -HubUrl "ws://192.168.1.10:8765" -Token "<AGENT_TOKEN>" -Name "MY-PC"
Linux x64 CLI Installer
Pure headless C++ setup executable embedding the agent payload. Zero GUI/X11 dependencies — built specifically for headless cloud hosts (Oracle Cloud OCI, AWS EC2, GCP, Hetzner), VPS, and minimal server distributions. Installs and registers the super-lightweight background daemon (~1.1 MB RAM) with systemd.
# 1. Quick One-Liner (Auto-detects architecture & installs systemd service):
curl -fsSL https://raw.githubusercontent.com/lhotakj/cmdiqo/main/install.sh | sudo bash -s -- --hub-url ws://192.168.1.10:8765 --token <AGENT_TOKEN> --name server
# Or run standalone CLI setup binary:
chmod +x cmdiqo-agent-linux-x64-setup-cli
sudo ./cmdiqo-agent-linux-x64-setup-cli --install --hub-url ws://192.168.1.10:8765 --token <AGENT_TOKEN> --name server
Linux Desktop Setup Wizard
Interactive native setup wizard for Linux desktop workstations with a graphical session (X11 / Wayland, GTK3). Provides visual connection testing, credential input, and automated background daemon registration (~1.1 MB RAM).
# 1. Make executable and run setup wizard:
chmod +x cmdiqo-agent-linux-x64-setup
sudo ./cmdiqo-agent-linux-x64-setup --install --hub-url ws://192.168.1.10:8765 --token <AGENT_TOKEN> --name desktop
# Or in-place upgrade keeping existing configuration:
sudo ./cmdiqo-agent-linux-x64-setup --upgrade
Linux Standalone Agent (ZIP)
Single-file native C++20 cmdiqo-agent binary (under 1.5 MB binary size, super-lightweight ~1.1 MB RAM) with systemd service unit, automated installer script (install-service.sh), and environment templates.
# 1. Unzip archive:
unzip cmdiqo-agent-linux-x64.zip -d /opt/cmdiqo-agent
cd /opt/cmdiqo-agent
# 2. Install and start as systemd service:
sudo ./install-service.sh --hub-url ws://192.168.1.10:8765 --token <AGENT_TOKEN> --name server
Linux ARM64 CLI Installer
Self-contained native setup executable embedding the agent payload for 64-bit ARM architectures (Raspberry Pi, SBCs, Graviton). Automatically provisions directories, generates systemd unit files, and registers the super-lightweight background daemon (~1.1 MB RAM).
# 1. Quick One-Liner (Auto-detects architecture & installs systemd service):
curl -fsSL https://raw.githubusercontent.com/lhotakj/cmdiqo/main/install.sh | sudo bash -s -- --hub-url ws://192.168.1.10:8765 --token <AGENT_TOKEN> --name rpi
# Or run standalone ARM64 CLI setup binary:
chmod +x cmdiqo-agent-linux-arm64-setup
sudo ./cmdiqo-agent-linux-arm64-setup --cli --install --hub-url ws://192.168.1.10:8765 --token <AGENT_TOKEN> --name rpi
Linux ARM64 Standalone Agent (ZIP)
Single-file native C++20 cmdiqo-agent binary for aarch64 architectures (under 1.5 MB binary size, super-lightweight ~1.1 MB RAM) with systemd service unit, automated installer script (install-service.sh), and environment templates.
# 1. Unzip archive:
unzip cmdiqo-agent-linux-arm64.zip -d /opt/cmdiqo-agent
cd /opt/cmdiqo-agent
# 2. Install and start as systemd service:
sudo ./install-service.sh
Linux ARMv6 CLI Installer
Self-contained native setup executable embedding the agent payload for 32-bit ARMv6 architectures (Raspberry Pi Zero, Zero W, Pi 1). Cross-compiled with -march=armv6zk -mfloat-abi=hard -mfpu=vfp. Automatically provisions directories and installs systemd daemon service.
# 1. Quick One-Liner (Auto-detects architecture & installs systemd service):
curl -fsSL https://raw.githubusercontent.com/lhotakj/cmdiqo/main/install.sh | sudo bash -s -- --hub-url ws://192.168.1.10:8765 --token <AGENT_TOKEN> --name rpi-zero
# Or run standalone ARMv6 CLI setup binary:
chmod +x cmdiqo-agent-linux-armv6-setup
sudo ./cmdiqo-agent-linux-armv6-setup --cli --install --hub-url ws://192.168.1.10:8765 --token <AGENT_TOKEN> --name rpi-zero
Linux ARMv6 Standalone Agent (ZIP)
Single-file native C++20 cmdiqo-agent binary for 32-bit ARMv6 (armv6l) architectures (Raspberry Pi Zero / Zero W / Pi 1) with systemd service unit, automated installer script (install-service.sh), and environment templates.
# 1. Unzip archive:
unzip cmdiqo-agent-linux-armv6.zip -d /opt/cmdiqo-agent
cd /opt/cmdiqo-agent
# 2. Install and start as systemd service:
sudo ./install-service.sh
Docker Hub Bot Container
All-in-one container including Python runtime, Slack Bolt with Socket Mode, WebSocket Hub server, arp-scan LAN tools, and Docker CLI.
# Pull image from Docker Hub:
docker pull lhotakj/cmdiqo-bot:latest
# Run container with your .env file:
docker run -d --name cmdiqo-bot \
--restart unless-stopped \
--net host \
--env-file .env \
-v /var/run/docker.sock:/var/run/docker.sock \
lhotakj/cmdiqo-bot:latest
Interactive Slack Simulator
Built-in interactive Slack console emulator. Test commands, regex captures, and live remote agents without needing Slack credentials or Socket Mode.
# Clone repository and run interactive simulator:
git clone https://github.com/lhotakj/cmdiqo.git
cd cmdiqo
python run.py sim
From Zero to Full Network Control
Follow these four simple steps to provision your Slack App, run the bot container, and register your first remote agent.
Create the Slack App
Go to api.slack.com/apps → Create New App → From scratch.
- Socket Mode: Settings → Socket Mode → Enable. Create an App-level Token with scope
connections:write(copyxapp-...). - Bot Scopes: OAuth & Permissions → Add
commands,chat:write,channels:read,groups:read,channels:join,channels:history. - Slash Commands: Add
/help,/lan,/host, and optional aliases/home,/wol,/restrict. - Install: Click Install to Workspace and copy the Bot User OAuth Token (
xoxb-...).
💡 Step-by-step channel and bot instructions: View Click-by-Click Slack Guide ↓
Configure Environment
Create a .env file on your primary server alongside your docker-compose.yml:
SLACK_BOT_TOKEN=xoxb-your-bot-token
SLACK_APP_TOKEN=xapp-your-app-token
# Optional: Restrict to authorized user IDs
ALLOWED_USERS=U0123ABCDEF,U0456GHIJKL
# Optional: Shared secret for agents
AGENT_TOKEN=my-secret-token
# Optional: Enable integrated real-time WebGUI dashboard
WEB_PORT=8080Start the Bot Container
Launch via Docker or run directly with Python. The bot opens a secure outbound TLS WebSocket to Slack:
# Run via Docker:
docker run -d --name cmdiqo-bot \
--restart unless-stopped \
--net host \
--env-file .env \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$PWD/config:/config:ro" \
lhotakj/cmdiqo-bot:latest
# Or via Docker Compose:
docker compose -f docker/docker-compose.yml up -d
# Or pure Python:
python run.py hub💡 Run python run.py --help for full CLI command options. If WEB_PORT is configured, navigate to http://<server-ip>:8080 for the live dashboard and real-time SSE stream!
Connect Remote Agents
Run the lightweight standalone binary on any Windows or Linux (x86_64 & ARM64) host across your network:
# Windows:
.\cmdiqo-agent.exe --hub-url ws://192.168.1.10:8765 \
--token my-secret --name PC-01
# Linux:
./cmdiqo-agent --hub-url ws://192.168.1.10:8765 \
--token my-secret --name nas💡 Preferred: Use the single-command piped installer to auto-detect architecture, provision, and start the system service instantly! View Quick One-Liners ↓
Slack App & Channel Setup Guide
A complete, click-by-click walkthrough to provision your Slack Bot with Socket Mode, configure dedicated channels, invite the bot, and restrict command authorization.
Provisioning the Slack App & Socket Mode
Configure tokens and bot scopes in the Slack Developer Portal. No open ports or public URLs required.
Create the App from Scratch
Navigate to the Slack App Console at api.slack.com/apps and click Create New App.
- Select From scratch in the modal prompt.
- Set App Name to
cmdiqo-bot. - Pick your desired Slack workspace and click Create App.
Enable Socket Mode (App Token)
Socket Mode creates a secure, outbound TLS WebSocket connection to Slack's servers, traversing NAT and firewalls automatically.
- In the left sidebar, click Socket Mode (under Settings).
- Toggle Enable Socket Mode to On.
- In the popup, set Token Name to
socket-mode-tokenand verify scopeconnections:writeis selected. - Click Generate, copy the token starting with
xapp-..., and save asSLACK_APP_TOKEN.
Configure OAuth Bot Scopes
Grant the minimal bot permissions required for slash commands, notifications, and channel interactions:
| Bot Scope | Operational Purpose |
|---|---|
commands | Handles /help, /lan, /host, /home, /wol, and /restrict. |
chat:write | Posts command outputs and agent online alerts. |
channels:read | Discovers public channels for agent notifications. |
groups:read | Discovers private channels where bot is invited. |
channels:join | Enables bot to join public notification channels. |
channels:history | Processes channel messages without leading slash. |
im:history & im:write | Enables direct message interactions with the bot. |
📌 Located in OAuth & Permissions → Scopes → Bot Token Scopes.
Register Slash Commands
In the left sidebar, click Slash Commands → Create New Command for each command. (Leave Request URL blank — Socket Mode delivers commands automatically!)
/help— Interactive manual and command reference/lan— Manage local network, ARP scan, WoL & agents/host— Run host and remote agent commands/home— Shortcut alias to /host home/wol— Wake-on-LAN boot shortcut/restrict— Parental logon hours scheduling shortcut
Enable Message Event Subscriptions
Allows the bot to process plain messages in channels (e.g. typing lan devices list without slash):
- Click Event Subscriptions (under Features) → toggle Enable Events to On.
- Expand Subscribe to bot events → click Add Bot User Event.
- Add
message.channelsandmessage.im. - Click Save Changes at the bottom of the page.
App Home Messages Tab & Bot Token
Next, go to Install App → click Install to Workspace (or Reinstall to Workspace) → click Allow. Copy the Bot User OAuth Token (xoxb-...) and save as SLACK_BOT_TOKEN.
Slack Channel Setup & Access Lockdown
Set up dedicated channels for your home lab, invite the bot, and configure strict user/channel authorization.
Create a Dedicated Management Channel
Keeping bot notifications and remote execution organized in a dedicated channel ensures a clean audit log and prevents chat pollution.
- In Slack, click the + button next to Channels in the left sidebar → Create a channel.
- Name your channel (e.g.,
#homelab,#devops, or#admin-ops). - Channel Visibility Recommendation: Private Channel (Recommended)
Restricts visibility so only invited administrators can see system metrics, reboot servers, or view active container logs.
Public ChannelAllows anyone in the Slack workspace to see notifications and command results (subject to
ALLOWED_USERSauthorization).
Invite cmdiqo-bot to the Channel
Bots cannot listen to channel messages or slash command threads until they are explicitly invited as channel members:
# Inside your new channel (#homelab), type and send:
/invite @cmdiqo-botAlternatively, type @cmdiqo-bot into the message composer and press Enter. Slack will display a prompt asking: "cmdiqo-bot is not in this channel" — click Add to Channel.
💡 Once invited, the bot automatically broadcasts dynamic agent connection and disconnection alerts into this channel!
Retrieve Member ID & Channel ID
Cmdiqo implements zero-trust authorization. Any Slack user or channel not matching your allow-list is rejected immediately:
- Click your profile picture in Slack → Profile.
- Click the three dots (
...) button. - Click Copy member ID (format:
U0123ABCDEF).
- Right-click your channel name (e.g.
#homelab) in the sidebar. - Click Copy link.
- The Channel ID is the last segment of the URL (e.g.,
https://.../archives/C0123456789).
Deploy .env & Test Channel Execution
Add the retrieved IDs to your bot's .env file to lock down access:
# Primary Bot Server (.env)
SLACK_BOT_TOKEN=xoxb-your-bot-token
SLACK_APP_TOKEN=xapp-your-app-token
# Security Allow-Lists:
ALLOWED_USERS=U0123ABCDEF
ALLOWED_CHANNELS=C0123456789
# Shared Secret for Windows & Linux Agents:
AGENT_TOKEN=random-secure-secret-tokenStart the bot (docker compose up -d). Inside #homelab, type /lan or /help. The bot will respond in thread with active system tools!
YAML Command Engine & Environment Variables
Customize commands, aliases, timeouts, and authorization allow-lists using declarative YAML configuration.
# Define custom aliases
aliases:
- name: home
input: "/home"
output: "/host home"
description: "Shortcut alias targeting host 'home'"
# Define modular OS-agnostic commands
commands:
- name: host-uptime
trigger: "/host {host} uptime"
description: "Show system uptime"
command:
shell: "uptime"
ps1: "$b = (Get-CimInstance Win32_OperatingSystem).LastBootUpTime; $u = (Get-Date) - $b; 'Uptime: {0}d {1}h {2}m {3}s' -f [int]$u.TotalDays, $u.Hours, $u.Minutes, $u.Seconds"
- name: host-docker-restart
trigger: "/host {host} docker restart {service}"
description: "Restart docker compose service"
command:
shell: "docker compose -f /docker/{service}/docker-compose.yml restart"
timeout: 60
- name: host-parental
trigger: "/host {host} parental {action}"
description: "Toggle or inspect parental DNS guard"
command:
python: "commands.parental:manage_parental"
config:
domains:
- "youtube.com"
- "roblox.com"
- "discord.com"
- name: host-blockapp
trigger: "/host {host} blockapp {app} {action}"
description: "Low-level process execution blocker"
examples:
- "/host PC-KIDS blockapp roblox on"
- "/host PC-KIDS blockapp tlauncher on"
- "/host PC-KIDS blockapp all on"
command:
python: "commands.appblock:manage_appblock"
config:
apps:
roblox: ["RobloxPlayerBeta.exe", "Bloxstrap.exe"]
steam: ["steam.exe", "steamwebhelper.exe"]
tlauncher: ["TLauncher.exe", "tlauncher.exe"]
- name: host-blockapp-query
trigger: "/host {host} blockapp {app}"
description: "Check app execution status (defaults to status)"
examples:
- "/host PC-KIDS blockapp all"
- "/host PC-KIDS blockapp tlauncher"
command:
python: "commands.appblock:manage_appblock"
- name: direct-blockapp
trigger: "/blockapp {host} {app} {action}"
description: "Direct root shortcut without /host prefix"
examples:
- "/blockapp PC-KIDS tlauncher on"
- "/blockapp PC-KIDS all"
command:
python: "commands.appblock:manage_appblock"
- name: host-restrict-set
trigger: "/host {host} restrict {user} set {schedule}"
description: "Enforce allowed logon hours for {user} on {host}"
examples:
- "/host PC-KIDS restrict alex set M-F,07:00-18:00;Sa-Su,08:00-18:00"
command:
python: "commands.restrict:manage_restrict"Environment Variables Reference
Slack & Bot Credentials
SLACK_BOT_TOKENRequiredSLACK_APP_TOKENRequiredAccess Control & Security
ALLOWED_USERSOptional(empty: anyone with channel access)ALLOWED_CHANNELSOptional(empty: all invited channels)AGENT_TOKENOptional(empty: unauthenticated)Hub & WebGUI Server
HUB_PORTOptional8765WEB_PORTOptional(disabled)HUB_ENABLEDOptionaltrueAgent Configuration
HUB_URLRequiredws://127.0.0.1:8765AGENT_NAMEOptional(hostname)COMMAND_TIMEOUTOptional180SHELL_TIMEOUTOptional120