skharness
Sovereign "phone-drives-my-agent-swarm" harness.
Run many coding/work agents, each in an isolated session, and drive them from a phone over the tailnet — the feel of Claude Code's remote control, but self-hosted on SKWorld infra with no Big-Tech broker.
Why
Claude Code Remote Control has great UX but routes phone↔laptop through Anthropic's relay —
it fails the sovereignty test. skharness replicates the experience, not the foundation, over
Tailscale + capauth. (Design basis: the 2026-06-13 harness deep-research — pi / cmux /
OpenCode / web-shells / Claude Code Remote Control. Full spec in
docs/superpowers/specs/2026-06-13-skharness-design.md.)
Architecture
A capauth-gated FastAPI over a SessionManager:
| Module | Role |
|---|---|
gateway.py |
FastAPI app; bind to a Tailscale IP only (never a public port). verify_caller is the auth seam — a real capauth verifier in prod, a fake in tests. |
manager.py |
SessionManager — ties registry + spawner; spawn creates an isolated worker. |
spawner.py |
Spawner seam — FakeSpawner for CI, TmuxSpawner for real sessions. |
registry.py |
SessionRegistry — track/persist sessions (JSON now; coord-board / skmem-pg later). |
session.py |
Session model — one isolated agent worker. |
Mostly reuse: pi (MIT, multi-provider incl. local qwen) as orchestrator + the coord
board / skmem-pg as the session/task registry.
Run
pip install -e . # fastapi + pydantic
# build_app(manager=..., verify_caller=<capauth verifier>) -> FastAPI
# serve bound to the tailscale IP only; auth every call via capauth.
Status
v0.1.0, P0 session core (spec + plan under docs/superpowers/). Mirror: smilinTux (private).
skcode-hostd (P0, read-only)
skcode-hostd is the read-only remote-control daemon over the unified Harness
session plane. It owns ONE harness (the claude-code tmux adapter) and exposes
exactly three capauth-gated data routes plus a self-contained static client. There
is NO write surface: no spawn, inject, kill, dispatch, rename, archive, or model
switch. A test (tests/test_daemon.py::test_no_write_surface) proves POST/DELETE
return 405 and /inject / /dispatch return 404.
Routes:
| Method | Path | Purpose |
|---|---|---|
| GET | /api/v1/hosts/self |
host + harness identity |
| GET | /api/v1/sessions |
list live + historical sessions |
| GET | /api/v1/sessions/{sid} |
one session, or 404 |
| WS | /api/v1/sessions/{sid}/stream |
typed SessionEvent stream (?token=) |
| GET | / and /app |
the static read-only web client |
HTTP routes require a Bearer token; the WebSocket takes the token as a
?token= query param (browsers cannot set headers on a WS). The capauth verifier
in P0 is a fail-closed deny-all placeholder: real verification lands with the
pairing work (spec 7.6), so the daemon rejects every token until then by design.
Run (Tailscale IP only, never 0.0.0.0):
~/.skenv/bin/python -m skharness --host <your-tailscale-ip> --port 9394 --host-id .158
skcode-hostd defaults to :9394 (SKWorld platform spec R0.4). Port :9390 is
owned by skcomms.transports.broker_server (its honest, documented default), so
the two no longer collide on a shared host. Override with --port <free> and
record it in ~/.skcapstone/docs/PORTS.md if :9394 is taken.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file skharness-0.3.4.tar.gz.
File metadata
- Download URL: skharness-0.3.4.tar.gz
- Upload date:
- Size: 283.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4bffcfdff31234350262213cdd1f3f771e97babf45de51023c42d04152103733
|
|
| MD5 |
dd4a59631c619e18de2d0d7dd5a96a35
|
|
| BLAKE2b-256 |
0bc96154443308812f8afda426db863d4edcdf6592fa5a53a80e1684173e14e9
|
Provenance
The following attestation bundles were made for skharness-0.3.4.tar.gz:
Publisher:
publish.yml on smilinTux/skharness
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
skharness-0.3.4.tar.gz -
Subject digest:
4bffcfdff31234350262213cdd1f3f771e97babf45de51023c42d04152103733 - Sigstore transparency entry: 2387511029
- Sigstore integration time:
-
Permalink:
smilinTux/skharness@649dac61b3af266a6c1522e2c9b644673276c1c1 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/smilinTux
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@649dac61b3af266a6c1522e2c9b644673276c1c1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file skharness-0.3.4-py3-none-any.whl.
File metadata
- Download URL: skharness-0.3.4-py3-none-any.whl
- Upload date:
- Size: 154.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
38f816baea8a379d7202ff82c6e1ec46fe34a9fd4f2c4b5ee98ee3c8c2c620fb
|
|
| MD5 |
cb44ade9cbe71f7d2b3f67e05543bf5d
|
|
| BLAKE2b-256 |
f7919c4ac451a1f422508103d415795972cc945813b3ffc0c3f66ff88324442d
|
Provenance
The following attestation bundles were made for skharness-0.3.4-py3-none-any.whl:
Publisher:
publish.yml on smilinTux/skharness
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
skharness-0.3.4-py3-none-any.whl -
Subject digest:
38f816baea8a379d7202ff82c6e1ec46fe34a9fd4f2c4b5ee98ee3c8c2c620fb - Sigstore transparency entry: 2387511035
- Sigstore integration time:
-
Permalink:
smilinTux/skharness@649dac61b3af266a6c1522e2c9b644673276c1c1 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/smilinTux
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@649dac61b3af266a6c1522e2c9b644673276c1c1 -
Trigger Event:
push
-
Statement type: