Files
llm-tools/tools/tailscale.llm.md
T

3.5 KiB

Tailscale Network Guide

All machines in Jacob Mathison's environment are connected via Tailscale. This is the backbone of cross-machine access — SSH, kittens WebSocket bridges, Gitea, and local services all route over it.


Tailscale Account

  • Account: silmaai2000@ (silmaai Tailscale account)
  • Network name: silmaai2000's tailnet

Machine Inventory

Hostname Tailscale IP OS Role Status
macbook-pro-3 (Tabitha) 100.76.192.116 macOS arm64 Silma AI primary — OCPlatform, k8s Online
orson 100.79.253.19 macOS arm64 Gitea host, CI runner (act_runner), Hagia attached Online
orson-macbook-pro 100.108.57.113 macOS arm64 Orson second interface Online
tabitha-macbook-pro 100.120.22.37 macOS arm64 Tabitha second interface
ozymandiass-macbook-pro (Ozymandias) 100.115.222.5 macOS x86_64 Travel laptop / coding box — Offline
hunter-wsl2 100.118.15.20 Linux (WSL2) Hunter Albert's dev machine — Offline
joseph-bro-windows 100.123.22.58 Windows Aaron Pressey's machine (GoatLord) — Offline
mimir-mme3l (Mimir) 100.100.117.5 Linux Mimir server (Hunter's AI bridge box) — Offline

Verify Connectivity

# Check your own Tailscale IP and status
tailscale ip
tailscale status

# Ping a machine
ping 100.79.253.19       # Orson/Hagia/Gitea host
ping 100.76.192.116      # Tabitha (Silma primary)

Connecting to Machines

Via kittens WebSocket bridge (preferred for remote exec)

All machines run silma-kittens — a WebSocket server that allows remote command execution without needing SSH keys.

import asyncio, json, websockets

async def remote(ip, cmd, token='silma-kittens-2026', timeout=20):
    url = f'ws://{ip}:8765/?token={token}'
    async with websockets.connect(url, open_timeout=5) as ws:
        await ws.recv()
        await ws.send(json.dumps({'type': 'exec', 'id': '1', 'cmd': cmd}))
        r = json.loads(await asyncio.wait_for(ws.recv(), timeout=timeout))
        return r.get('stdout', ''), r.get('stderr', '')

# Orson
out, err = asyncio.run(remote('192.168.12.138', 'hostname'))

# Or via Tailscale IP
out, err = asyncio.run(remote('100.79.253.19', 'whoami'))

Kittens token: silma-kittens-2026 (same on all machines) Port: 8765

Creon (Hunter's static ngrok tunnel)

Hunter's machine uses a permanent ngrok domain:

  • URL: wss://creon.ngrok.app/?token=3ClCIkJOCu1Gd5RO2PA4JHRD1ji_soHXcU4c3vMCbvEBFsKi
  • Requires ngrok-skip-browser-warning: true header

Key Service Endpoints (via Tailscale)

Service Address Notes
Gitea http://100.79.253.19:3000 Self-hosted git on Orson/Hagia
Tabitha k8s services localhost:* when port-forwarded See tools/k8s.llm.md

/etc/hosts Entries (Tabitha)

100.79.253.19  Theodora Orson Hagia

These aliases are set on Tabitha — Orson, Hagia, Theodora all resolve to 100.79.253.19.


Notes for AI Agents

  • If Tailscale is not connected, cross-machine operations will fail silently — verify with tailscale status first
  • Gitea and kittens are both reachable via LAN IP (192.168.12.x) or Tailscale IP (100.x.x.x) when on the same network
  • Offline machines have kittens installed but the tunnel won't be up — check tailscale status before trying
  • GoatLord (joseph-bro-windows) also has a static ngrok URL: exsufflicate-ineradicable-cortez.ngrok-free.app (port 8765)