Skip to content

LocalHarness — the mobile plugin

Mobile

← the plugins /mobile

Install the mobile extra, run localharness mobile, and scan the QR code with your phone.

  1. 1
    the phone posts a message bearer token + application/json, through your proxy
  2. 2
    the server hands it over localharness mobile — loopback only, a token on every request
  3. 3
    a turn on the bus a UserMessage on the session’s bus
  4. 4
    every event comes back the channel mirrors the bus, nothing filtered
  5. 5
    frames stream to the phone one SSE stream · web-tool frames carry untrusted_ingest
  6. 6
    the gate parks an ask a queue with a badge — no answer ends in a rejection
  7. 7
    push a long turn ended, or you’re needed — payloads encrypted per device
  8. ↺
    Pictures · Memory core’s artifact roots and the slot’s browse(), as /api routes
  9. ↺
    QR pairing the token rides the URL fragment — no log sees it
  10. ✕
    one live session sleeps when unused, wakes on your next message · switching between live chats — planned

in the CLI: localharness mobile · plugins disable mobile.

fig. 01 — PLATE MOBILE — your phone as a channel, and what it marks untrusted: one message

how it works

  • one command localharness mobile serves the page and its event API, and stops when the command does.
  • this machine only it listens on loopback unless you pass --allow-unsafe-bind; your own proxy publishes it.
  • a token on every request the pairing QR code carries it, out of every server log, so you never type it.
  • notifications on the lock screen when a long turn finishes or the gate needs you.
  • untrusted labels results from the built-in web tools are labeled untrusted on the phone, not filtered out.
  • always-allow takes two steps a second, single-use request confirms it, so one mis-tap cannot grant it.

Setup

Turn it on from the session, fill in its settings, and it checks they work; your coding agent can do the hardware part.

~/project — localharness start shipped
qwen3.6-27b ~/project
Plugins: mobile, memory, autoresearch
❯ /plugins enable mobile
Restarting with mobile on — your conversation is kept.
Phone address, the URL your phone opens (Enter: `localharness mobile` guesses it):
✓ mobile enabled in ~/.localharness/overrides.yaml
Checking it now:
i mobile: not enrolled yet
`localharness mobile` generates its app token on first run
Or paste this into your coding agent to set it up for your hardware:
Run `localharness mobile`, then scan its pairing QR with your phone.
Restarted with mobile on. Your conversation continues.
mobile: on, but not set up yet — not enrolled yet

in a session: /plugins enable mobile · from a shell: localharness plugins enable mobile

paste into your coding agent to set it up for your hardware
Set up the LocalHarness phone app on this machine. Install LocalHarness with its mobile extra, keeping the extras I already use. Run `localharness mobile` and leave it running: it serves the page on this machine only, so do not pass --allow-unsafe-bind. To reach it from my phone, put it behind a private network I already use, for example `tailscale serve --bg 8765`, rather than opening a port to the internet. You are done when `localharness doctor` shows web enrolled and my phone has scanned the pairing QR.

Surfaces

where you reach it

  • localharness mobile serves the phone app; --rotate-token cuts off every paired phone.
  • --incognito · --replay · --ui-dir pictures kept out of the phone’s cache, a recorded session, or your own page.
  • slash commands none; the phone page has no command menu.
  • mobile.public_url the address your phone opens, saved once, machine-level only; the port and bind address stay flags.
  • /plugins enable mobile inside a running session: until it is set up, asks what it needs and checks it; then restarts with your conversation kept.
  • localharness plugins disable mobile on once the mobile extra is installed; disable removes the channel and the command.

Get Involved