lwis docs

Capture / Install lwis on your machine

Install lwis on your machine

lwis is a single binary: the command line and the daemon that delivers captures into your agent sessions. Releases are published for Linux x86_64.

Run the installer

curl -fsSL https://lookwhatisee.xyz/install.sh | sh

The script downloads the release for your machine and refuses to install unless every check passes:

  1. Signature. The binary's minisign signature must verify with the release key embedded in the script. It uses minisign if installed, otherwise OpenSSL 3 (openssl). With neither, it stops.
  2. Release key in DNS. The embedded key must equal the key published in the TXT record _lwis-release.lookwhatisee.xyz, read over DNS-over-HTTPS from two independent resolvers (Cloudflare and Google) that must agree. A compromised web server alone can't swap the key.
  3. Checksum. When the TXT record _latest._lwis-release.lookwhatisee.xyz names the same version, the binary's SHA-256 must match it too.

It then installs lwis into ~/.local/bin (set LWIS_BIN_DIR to choose another directory) and tells you if that directory isn't on your PATH.

Offline or air-gapped? LWIS_INSTALL_SKIP_DNS=1 skips the DNS check. The script then prints a warning, and you must compare the printed key with the one in Verifying releases yourself.

Start the daemon

The daemon is lwis up. Run it as a service so it keeps running across logins:

lwis install-service --enable

On Linux this writes a systemd user unit, ~/.config/systemd/user/lwisd.service, then runs systemctl --user daemon-reload and systemctl --user enable --now lwisd. Without --enable it only writes the unit and prints the command to enable it. On macOS it writes a launchd agent instead.

To run it by hand instead:

lwis up                    # in the foreground
lwis up --idle-exit 60     # exit after an hour with nothing attached or pending
lwis down                  # stop it

lwis pair, lwis setup claude and a few other commands start the daemon in the background if it isn't running. The Claude Code hooks and MCP servers never start it: with the daemon down, they only say so. A daemon started in the background logs to ~/.local/state/lwis/lwisd.log.

Update

lwis self-update --check   # only say whether an update is available
lwis self-update           # download, verify and replace this binary

self-update verifies the download with the release key built into your installed binary, never with a key the server hands out. It also checks that key against DNS through the same two resolvers, refuses anything older than your version, and checks the SHA-256 from DNS when it names the same version. The previous binary is kept as lwis.old next to the new one.

If the daemon was running, self-update stops it: start it again with systemctl --user restart lwisd or lwis up. Other flags: --force reinstalls the current version (it never downgrades), and --skip-dns skips the DNS check when you're offline.

Root shells, containers and remote machines

In a root shell, a container or on a server you reach over SSH, see Remote machines and containers: the runtime directory, keeping the daemon running after you log out, and pairing a machine with no screen.

Where lwis keeps things

WhatWhere
Configuration, keys, pairings~/.config/lwis (mode 0700; LWIS_CONFIG_DIR overrides)
Optional defaults~/.config/lwis/config.json
Hosted agent profiles~/.config/lwis/agents/*.toml
Audit log~/.config/lwis/audit.jsonl (lwis log)
Socket$XDG_RUNTIME_DIR/lwis/lwisd.sock

Check the installation

lwis doctor

It checks the directories, the socket, the service, the pairings, the browsers, and how captures reach each session. Next: 201 · Pair your agent.