Monorepo for Aesthetic.Computer aesthetic.computer
README.md

fleet #

A single source of truth for "what machines do I have access to, their capabilities, designations, and live status." Code is public-safe; the machine DATA (IPs, ssh keys, roles) stays in the private vault.

Three moving parts:

  1. machines.json (vault, canonical) → the source of truth @jeffrey edits.
  2. normalize-machines.mjs → enriches it into the fleet schema (adds designation, capabilities[], status, tailnet cross-refs) and writes machines.normalized.json to the vault for review — it never overwrites the canonical file.
  3. fleet-mcp.mjs → a stdio MCP server that merges the (normalized) static registry with live tailscale status, so any agent can discover the fleet.
vault/machines.json  ──normalize-machines.mjs──▶  vault/machines.normalized.json
                                                          │
                          tailscale status --json  ──────▶ fleet-mcp.mjs  ──▶ agents

Schema (proposed) #

Each machine gains, on top of its existing fields:

field meaning
name canonical registry key (often == tailnet short name)
designation ONE primary fleet role (see below)
capabilities[] composable tags: gpu, cuda, mlx, unreal, docker, macos-automation, screen-capture, chromium-pool, ffmpeg-render, always-on, git-remote, mongodb, redis, mail, web-host, build-macos, build-ios, tailnet-api, art-display
tailscale { name, ip } — magic-DNS short name for live-status matching
status { source, key } — how liveness resolves (tailscale / http / lan / none)
hardware { model, chip, cores, memory, gpu }
fleetRole one-line human summary

Designations: agent-endpoint (hosts a hermes gateway + identity) · compute-node (headless capability provider over HTTP MCP on the tailnet) · control (human/agent-driven author box, holds git auth) · build (build/CI) · service (db/session/mail/web) · display · legacy.

The full vocabulary with descriptions lives in the _schema block of the normalized file and is queryable via the fleet_designations MCP tool.

Usage #

# regenerate the review file after editing the vault registry
node toolchain/fleet/normalize-machines.mjs

# CLI smoke test (same code the MCP runs)
node toolchain/fleet/fleet-mcp.mjs list
node toolchain/fleet/fleet-mcp.mjs find gpu
node toolchain/fleet/fleet-mcp.mjs machine macbook-pro-clam

Data path is resolved in order: $FLEET_MACHINES → vault machines.normalized.json → vault machines.json. Tailscale binary: $TAILSCALE_BIN → /Applications/Tailscale.app/... → tailscale on PATH.

Register as an MCP #

Claude Code (~/aesthetic-computer/.mcp.json, alongside frame/puppet):

"fleet": {
  "type": "stdio",
  "command": "node",
  "args": ["toolchain/fleet/fleet-mcp.mjs"]
}

hermes (config.yaml), same stdio contract:

mcpServers:
  fleet:
    command: node
    args: ["toolchain/fleet/fleet-mcp.mjs"]
    # env:
    #   FLEET_MACHINES: /path/to/machines.normalized.json

Dashboard design note #

See DASHBOARD.md for the fleet/auth dashboard design + recommendation.