Skip to main content
The Reflecto CLI (reflecto) is a paired device, like the Chrome extension or web app. It mirrors your phone’s notifications into your terminal in real time and lets you dismiss or reply to them. Everything is end-to-end encrypted — the server only routes opaque blobs and never sees plaintext.
The CLI is a receiver, not a sender. It is unrelated to the /v1/send API (see the Quickstart) and does not use rfk_live_… tokens — it pairs with your phone using a 6-digit code and derives its own encryption keys locally.

Install

Windows users can download reflecto-windows-x64.exe directly from the releases page. Verify the install:

Pair with your phone

This generates a 6-digit code and waits. On your phone, open Reflecto, tap Add a device, and enter the code. The code expires after 5 minutes — re-run reflecto pair if it does. Once confirmed, the CLI stores its credentials in ~/.config/reflecto/cli.json (created chmod 600). The two devices compute a shared secret via Diffie–Hellman locally; the server cannot derive it.
You can only pair one phone at a time. Run reflecto unpair before pairing again — silently overwriting the config would orphan the old device on the server.

Stream notifications

tail opens a live stream and renders each notification as a boxed card with its sender, full body, category glyph, and available actions:
Press 19 to invoke the corresponding numbered action on the most recent card with actions; a reply action opens an inline prompt. d dismisses that card without leaving the stream, r prints a one-time hint (in card view) pointing you at the numbered keys, and q (or Ctrl-C) quits. Conversation-style notifications (WhatsApp, Telegram, Messages) cluster: follow-up messages within 60s of the same thread render as ╰─ continuations rather than fresh cards.

tail options

tail auto-switches to the single-line format when stdout is not a TTY, so piping to grep, jq, or a file stays readable. Pass --no-oneline to keep card view even when piped.

Dismiss and reply

Both take the full message id (a UUID). The #a3f2c1d tag in a card header is only the last 7 characters, shown to disambiguate scrolled-past cards — it is not a valid argument. Get the full id from the id field of reflecto tail --json:
Replies are encrypted to your phone, which executes the action on your behalf. A reply only lands if the original notification exposed a reply slot — reflecto reply always prints a note on stderr reminding you of that requirement, and a reply to a button-only notification has no effect on the phone.

Status and unpair

unpair removes only this CLI; any sibling devices (extension, web) paired with the same phone stay connected.

Configuration

The CLI always connects to the production server — there is no server override. Behavior is controlled entirely through these environment variables: Glyphs also fall back to ASCII automatically when stdout is not a TTY (e.g. piped to jq or a file) or when the locale isn’t UTF-8.