The Console
The Console is loopkeep's web control plane. It manages accounts, paired devices, and the GitHub and Slack connections that let outside events trigger workflows on your machine. It is deliberately not a place your work goes — the architecture is built so the Console knows as little as possible.
How events reach your machine
GitHub / Slack ──webhook──▶ Console ──wake signal──▶ your daemon ──API fetch──▶ run
Your daemon keeps one outbound WebSocket connection to the Console — no inbound ports on your machine. When a GitHub or Slack event arrives, the Console verifies its signature and forwards only a wake signal: which installation, which repository, what kind of event. No payload, no content.
The daemon then fetches the real data — the issue body, the Slack thread — directly from the source API with its own credentials, and only fires a run if the event actually exists. The consequence is worth stating plainly: even a compromised Console could not forge a run, because a fabricated wake signal fails the daemon's verification against the source.
Signals are stored and forwarded: if your machine is offline, they're delivered on reconnect, and coalescing keeps a backlog from stampeding.
Devices
Pair with lk login or the desktop app's Sign in (see
Pair with the Console). Each device holds its own
token and signing key, listed under Devices in the Console, revocable
individually — the recovery path for a lost or stolen laptop.
GitHub
Install the loopkeep GitHub App on your account or organization from the
Console's Connections page. Repository events (issues, pull requests, …)
then flow as wake signals. Workflows bind to repositories implicitly: a
workspace whose origin remote points at a repository receives that
repository's events, with no configuration. To subscribe across repositories,
name them explicitly:
on:
issues:
repos: ["org/other-repo"]
Slack
Connect a Slack workspace from the Console with Add to Slack — one shared app, no tokens to create or paste. Workflows can then trigger on mentions and DMs:
on:
slack:
events: [app_mention]
channels: ["#ops"]
from_not: ["*bot*"] # default guard: don't re-fire on bot replies
Message bodies are fetched by your daemon from the Slack API, not carried in the wake signal.
The guarantees
- Content stays home. Wake signals are metadata. Nothing about your code, files, prompts, or run output is uploaded.
- The runtime is never gated. Signed out, offline, Console down — local triggers, runs, the inbox, and the desktop app keep working, indefinitely. There is no remote kill switch, by design.
- Revocation is real. Revoking a device cuts its Console access and its connector credentials.
What's ahead
Planned, in order: read-only event sync into the Console (metadata and summaries only — content stays home), remote approval with device-signed verdicts, and an iOS app for approving from your pocket. Docs will grow as these land.