Skip to content

itscooleric/clidestable

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

12 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

clidestable

   β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•—     β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—
  β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β•β•β•
  β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—        ───
  β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β•          \
  β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—         \    β•±β–”β–”β–”β•²
   β•šβ•β•β•β•β•β•β•šβ•β•β•β•β•β•β•β•šβ•β•β•šβ•β•β•β•β•β• β•šβ•β•β•β•β•β•β•         β•²__β•± ● ● β•²
  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•—     β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β”‚  β–½  β”‚
  β–ˆβ–ˆβ•”β•β•β•β•β•β•šβ•β•β–ˆβ–ˆβ•”β•β•β•β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ•”β•β•β•β•β• ╲───╱
  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—   β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—   β•±   β•²
  β•šβ•β•β•β•β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ•”β•β•β•  β•± ┃ ┃ β•²
  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β•±  ┃ ┃  β•²
  β•šβ•β•β•β•β•β•β•   β•šβ•β•   β•šβ•β•  β•šβ•β•β•šβ•β•β•β•β•β• β•šβ•β•β•β•β•β•β•β•šβ•β•β•β•β•β•β•

  the stable where your dales live               v0.1
  ────────────────────────────────────────────────────
  dashboard Β· stalls Β· split view Β· activity logs
  ────────────────────────────────────────────────────

VPS-side session server for clidesdale.

A lightweight server that manages stalls (observable shell sessions) on a VPS. Each stall gets a web terminal (ttyd) and an activity log. One port, multiple sessions, zero complexity.

Quick Start

pip install -e .
clidestable serve                    # start on port 7690
clidestable serve --port 7690 --bind 100.x.x.x  # Tailscale only

Then open http://your-vps:7690 to see the dashboard.

What it does

  • Manages named stalls (observable agent sessions on the VPS)
  • Each stall gets a web terminal via ttyd that streams the activity log in real time
  • Activity logs from clidesdale agents are visible in the dashboard
  • Split view for watching multiple agents side-by-side
  • REST API for stall management

How it works

  1. clidesdale agents run commands on the VPS via sdale exec / sdale run
  2. Every command + output is appended to /opt/stacks/.sdale-<name>.log
  3. clidestable creates stalls β€” each stall spawns a ttyd instance that tail -f's the corresponding log file
  4. You see agent activity streaming in your browser in real time
  clidesdale (client)              clidestable (server)
  ─────────────────              ───────────────────────
  sdale exec edge "cmd"   ──>   .sdale-edge.log   ──>  ttyd (tail -f)  ──>  browser
  sdale exec edge2 "cmd"  ──>   .sdale-edge2.log  ──>  ttyd (tail -f)  ──>  browser

No tmux nesting, no SSH tunnels β€” just log files and ttyd.

Concepts

Term What
clidesdale The CLI client (sends commands to dales)
clidestable This server (where the dales live)
stall One session/shell (where one dale works)

API

GET    /api/stalls              # list stalls
POST   /api/stalls              # create stall {"name": "edge"}
DELETE /api/stalls/{name}       # destroy stall
GET    /api/stalls/{name}/log   # get activity log

Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  clidestable server (port 7690)          β”‚
β”‚                                          β”‚
β”‚  /              β†’ dashboard (stall list) β”‚
β”‚  /stall/edge    β†’ ttyd terminal          β”‚
β”‚  /stall/edge2   β†’ ttyd terminal          β”‚
β”‚  /log/edge      β†’ activity log viewer    β”‚
β”‚                                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”      β”‚
β”‚  β”‚ edge   β”‚  β”‚ edge2  β”‚  β”‚ edge3  β”‚      β”‚
β”‚  β”‚ :7701  β”‚  β”‚ :7702  β”‚  β”‚ :7703  β”‚      β”‚
β”‚  β”‚ (ttyd) β”‚  β”‚ (ttyd) β”‚  β”‚ (ttyd) β”‚      β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Docker

docker compose up -d --build

Configure in .env:

STABLE_BIND=100.x.x.x   # Tailscale IP (default: 0.0.0.0)
STABLE_PORT=7690         # Dashboard port
STABLE_DATA_DIR=/opt/stacks  # Shared with clidesdale agent logs

Web UI

Page What
/ Dashboard β€” create/destroy stalls, quick links
/view Split view β€” side-by-side terminals for all stalls
/stall/<name>/ Single stall terminal (live agent activity stream)
/log/<name> Activity log viewer (auto-refreshes every 3s)

Requirements

  • Python 3.10+
  • ttyd (included in Docker image)

Ecosystem

Project What
clide CLI Development Environment β€” sandboxed terminal for AI agents
clidesdale CLI client β€” SSH access to remote VPSes for agents
clidestable This server β€” dashboard, stall management, split terminal view

License

MIT

About

🐴 the stable where your dales live β€” VPS-side session server with dashboard, split terminal view, and activity logs

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors