agentsclimarketplace

Surface

Skill cjpitzi/office-presence/skills/surface

Put the right live view of X on the office wall display (pve2 HDMI) via the `surface` CLI. Use when the user says "surface <X>", "show me <X> on the display", or invokes /surface <X>. X is a natural request ("last 30 days of firewall blocks", "host throughput", "that gh actions run") — you pick the source and build the URL. LAN-only: needs a local (LAN-connected) session.From its SKILL.md

Install
npx -y skills add cjpitzi/office-presence --skill surface

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

5.7 KB, ~1.4k tokens by cl100k_base, as published. Nobody here has run it

Surface — drive the office wall display

Chris has a permanent, interactive office display (KVM-attached, on pve2 HDMI-2) driven by the surface command (on PATH; private repo at ~/repos/office-presence). surface <X> means: put the right live view of X on that display. You pick the source and build the URL. This is additive — still answer in chat / trigger other skills.

Plain text/code ("surface foo.py") stays in chat unless the user says "on the display".

The display is a persistent, full browser (tabs + address bar), not a locked kiosk. surface page/url/show each open a new focused tab — they never replace what's up or restart the browser, so Chris's own tabs and earlier surfaced views stay open and he can flip between them. surface home refocuses the household dashboard tab; surface stop closes just the tabs surface page opened. Tabs accumulate over a session — that's expected; close them from the browser UI or leave them.

Preconditions

  • LAN-only. surface SSHes directly to pve2. A network-isolated cloud/cowork session cannot reach it — say so rather than pretending. Confirm reachability with surface state if unsure.
  • Authed services (Grafana ✓ already logged in, Axiom, private HA) need the display logged in once at the KVM. Public GitHub / public-dashboard URLs just work.

Workflow: identify → show → file

1. Identify the source + scope

Pick what fits X; compose multiple into panes if it spans sources.

SourceUse forHow to build the URL
Grafana Cloud (pitzilabs.grafana.net, display logged in)metrics & Loki logs: throughput, host/NAS stats, the Claude runner fleetgrafana MCP search_dashboards → find dashboard/panel → …/d/<uid>/<slug>?viewPanel=<id>&from=now-30d&to=now&refresh=10s
AxiomFirewalla logs (ACL/blocks, Zeek) — event/log-shaped XAxiom dataset/query URL (one-time KVM login)
GitHub (public PitziLabs repos render with no login)repos, PRs, Actions runsgithub.com/<org>/<repo>/actions/runs/<id> — find via github MCP / gh
Home Assistanthome/device statea Lovelace view URL
Firewalla MCPwhen X isn't in Grafana/Axiom (get_alarms, search_flows, get_wan_usage, get_network_stats, get_top_talkers)use the data to decide which dashboard/view to surface

homelab-observability maps what's measured where. Prefer a real, navigable link over a constructed static page; build a page only for something with no URL (a diagram) or to compose several sources into panes.

2. Show it

surface url   NAME          # a saved favorite (fastest — check `surface list` first) → new tab
surface show  URL [opts]    # any http(s) URL → new focused tab
surface page  NAME          # a built library page (offline Mermaid) → new tab
surface push-site DIR       # publish a static site dir to pve2 (durable, http://web.lan/)
surface home                # focus the household dashboard (home) tab

Options: --open (xdg-open the snapshot), --no-snap, --settle SECS, --port N. For anchor deep-links into a long page, add --settle 4 so the scroll lands before the snapshot.

3. Verify (always) — vision check

surface verify        # lists the open tabs + grabs a frame of the frontmost

Then Read the PNG it wrote (./surface-<UTC>.png) and confirm the frontmost tab shows the expected content — not a login wall, blank, or error. The tab landing frontmost is the one surface just opened, so the frame is your check that it rendered. Use surface snap for an extra frame.

4. File it for fast recall

For anything worth seeing again:

surface save-url NAME URL "Title"     # writes urls.json

Then commit office-presence so it persists, and tell Chris the short name:

cd ~/repos/office-presence && git add urls.json && git commit -m "Add '<name>' URL favorite — <what>"

For multi-source composites, add a page under pages/ + a library.json entry instead. End commit messages with the Co-Authored-By trailer.

State & recovery

surface state    # open tabs + page-server state (and a reachability check)
surface list     # library pages + URL favorites
surface stop     # stop the page server, close its tabs, focus home

The persistent browser launches on the household dashboard across pve2 reboots; systemd Restart=always recovers crashes, and dashboard-refresh.timer reloads just the dashboard tab every 6h to clear its heap leak. The pve2 plumbing (display-tab for tab control, display-show to (re)launch, snapshot-server on :9999, dashboard-display.service) is deployed from this repo's host/ by the gitops loop — if surface fails on the SSH/display-tab step, check that plumbing. If display-tab reports "no DevTools endpoint", the screen is in fullscreen kiosk mode (no debug port) — surface home relaunches the interactive browser.

Example

"surface the last 30 days of host throughput" → grafana MCP search_dashboards for the throughput panel → surface show '…/d/<uid>/…?viewPanel=<id>&from=now-30d&to=now&refresh=10s'surface verify + Read the PNG → surface save-url host-throughput-30d <url> "Host throughput 30d" → commit. Next time: surface url host-throughput-30d.

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 326,499. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.