Coding

Netstatus

Try it

Combined network + gateway status with VPN info, IP location, and system health

What it does

Show combined network and gateway status including VPN state, public IP location, local network details, Tailscale, and system health.

The skill document

netstatus — Network + Gateway Status

Show combined network and gateway status including VPN state, public IP location, local network details, Tailscale, and system health.

When to Use

Use /netstatus or /net when you want a quick overview of:

  • Current VPN connection (country, IP, provider)
  • Local network interfaces and private IPs
  • Tailscale / mesh network status
  • Gateway health and uptime
  • System status
  • Whether traffic is routed through VPN or direct

Commands

CommandDescription
/netstatusFull network + gateway status
/netAlias for /netstatus

Output Format

🌐 Network Status
━━━━━━━━━━━━━━━━━━━━━
🛡️ VPN: ProtonVPN 🇸🇪 (Stockholm)
    Public IP: 159.26.108.93
    Provider: AS208172 Proton AG
    Interface: utun2 (mtu 1380)

🏠 Local Network
    WiFi (en0): 192.168.1.42
    Gateway: 192.168.1.1

🔗 Tailscale
    Interface: utun3
    IPs: 100.92.54.38, fd7a:115c:a1e0::1
    Status: running

🌍 Public IP: 159.26.108.93 (same as VPN — no leak)

🖥️ Gateway: Running (14h 29m)
    Model: kimi/k2.7
    Context: 27k/131k (20%)

⏱️ System: 19h 44m uptime
    Load: 2.32 1.82 1.62

Or compact mode:

🌐 SE 159.26.108.93 | 🏠 192.168.1.42 | 🖥️ k2.7 20% | ⏱️ 19h 44m

Implementation

The skill runs these checks in sequence:

1. All Network Interfaces

# macOS: list all interfaces with their IPv4/IPv6 addresses
ifconfig | awk '/^[a-zA-Z0-9]+:/ { iface=$1 } /inet / { print iface, $2 }'

# Alternative: get specific interface IPs
ipconfig getifaddr en0  # WiFi
ipconfig getifaddr en1  # Ethernet / Thunderbolt

Interface categories to detect:

PatternTypeExample
en0, en1Physical (WiFi/Ethernet)192.168.x.x
utun[0-9]+, tun[0-9]+VPN / tunnel10.x.x.x, public IP
utun[0-9]+ with 100.xTailscale100.x.y.z
lo0Loopback127.0.0.1
awdl0Apple Wireless Direct Linklink-local
bridge0Bridgeusually no IP

2. VPN Detection

# Check for tunnel interfaces
ifconfig | grep -E "^(utun|tun|ppp)"

# Get public IP via VPN
curl -s --connect-timeout 5 https://ipinfo.io/json

3. Tailscale Detection

# Check if tailscaled is running
pgrep -x tailscaled >/dev/null && echo "running" || echo "stopped"

# Tailscale IPs (if interface exists)
ifconfig utun3 2>/dev/null | grep inet

# Or use tailscale CLI
tailscale status --json 2>/dev/null | jq -r '.Self.TailscaleIPs[]'

4. Default Gateway

# macOS
netstat -rn | grep default | head -3

# Linux
ip route | grep default

5. IP Location

curl -s --connect-timeout 5 https://ipinfo.io/json

6. Gateway Status

Read from runtime or openclaw gateway status.

7. System Uptime

# macOS
uptime

# Linux
uptime -p

Interface Categorization Rules

  1. Physical: en*, eth*, wlan* → "Local Network"
  2. VPN tunnel: utun*, tun*, ppp* with public IP or non-local range → "VPN"
  3. Tailscale: utun* with 100.64.0.0/10 range → "Tailscale"
  4. Loopback: lo* → skip or show as "Loopback"
  5. Other: awdl*, bridge* → "Other" or skip

IP Leak Detection

Compare VPN state against public IP reachability:

  • If VPN interfaces exist AND public IP is reachable → traffic routed through VPN ✅
  • If no VPN interfaces but public IP exists → direct connection (no VPN)

Note: The public IP will NOT match the VPN tunnel interface IP (e.g., ProtonVPN uses 10.x.x.x on the tunnel while the exit IP is public). Checking for IP equality is incorrect — instead, check if VPN is up and internet is reachable.

macOS vs Linux

CheckLinuxmacOS
List interfacesip -4 addr showifconfig
Get interface IPip addr show dev eth0ipconfig getifaddr en0
VPN interfaceip addr show tun0ifconfig | grep utun
Default gatewayip route | grep defaultnetstat -rn | grep default
Uptime parsinguptime -puptime (raw output)
Tailscale checktailscale statustailscale status

Error States

StateDisplay
VPN down🛡️ VPN: DISCONNECTED
IP mismatch⚠️ IP leak detected: VPN=SE but public=IN
Can't reach ipinfo🌍 Public IP: unreachable
Tailscale down🔗 Tailscale: not running
No local network🏠 Local Network: no active interface

Notes

  • Uses ipinfo.io for geolocation (free tier, no auth needed)
  • Caches result for 30 seconds to avoid rate limits
  • Requires curl, jq, ifconfig (macOS) or ip (Linux)
  • VPN detection uses utun on macOS, tun on Linux
  • Tailscale uses 100.64.0.0/10 (CGNAT range) for mesh IPs

Related skills

Join a video meeting as an AI bot with voice, avatar, and screenshare across four operating modes.

by johnpatternai22 installs8 stars

Fetch raw ad creative, app, ranking, and revenue data from AdMapix as structured JSON.

by fly0pants4.3k installs296 stars

Find why your productivity system keeps failing, then apply the smallest fix — capacity math, bottleneck routing, durable local notes.

by Iván855 installs69 stars

Stores durable facts in a categorized, plain-markdown vault on disk, alongside your agent's built-in memory.

by Iván559 installs18 stars

Generate and edit Draw.io, Mermaid, and Excalidraw diagrams from natural language using a structured JSON spec.

by nssa.io1.0k installs47 stars

More from space-cadet

Browse all skills

Memory Bank Update Workflow — v6.12 compliant with project-repo awareness. Use when the user invokes $mem-update or asks for this workflow by name. Triggers on "update memory bank", "create edit chunk", "update tasks.md", "update session cache", "memory bank update workflow". NOT for database-native workflows (use mb-db-workflow instead).

by space-cadet2 installs

Memory Bank Template Compliance Cleaner Workflow Use when the user invokes $mem-format or asks for this workflow by name.

by space-cadet1 installs

Global Memory Bank Deep Scan and Task Analysis Workflow — Multi-repo aware. Use when the user invokes $mem-scan or asks for this workflow by name.

by space-cadet1 installs

Track, aggregate, and report OpenClaw token usage and costs across sessions.

by space-cadet1 installs

Initialize a memory bank for a new or existing project following the v6.12 protocol. Use when starting work on a project that lacks memory-bank documentation...

by space-cadet

Global workflow for loading memory bank files based on recent activity and context Use when the user invokes $mem-load or asks for this workflow by name.

by space-cadet1 installs