Files
omarchy/shell/plugins/panels/tailscale
David Heinemeier HanssonandClaude Opus 5.5 c231097df7 Answer omarchy-shell calls over the shell's own socket (#13435)
* Answer omarchy-shell calls over the shell's own socket

Every omarchy-shell call started a qs ipc client, ~45ms of startup for one
IPC call: a theme switch makes two, and every script-driven OSD, toggle
refresh and lock query paid it too.

The shell now serves a socket in XDG_RUNTIME_DIR, named from its config
path and Wayland display as qs ipc selects its instance, and omarchy-shell
tries it first through socat, which starts in ~5ms. First-party handlers
register as ShellIpc, an IpcHandler that qs ipc still reaches, and the
socket calls only the functions a handler declares with their exact
argument count, allowed by name so QObject methods such as destroy() stay
out of reach.

When the shell ran nothing it answers SKIP, and omarchy-shell asks qs ipc
for its exact answer, so errors, third-party plugins and an unreachable
socket behave as before. A call that may have run is never retried: a
timeout or a connection closed without an answer reports the shell as not
responding.

omarchy-shell shell ping takes ~13-18ms instead of ~61ms, and omarchy-osd
reaches the screen in ~36ms instead of ~77ms. Output and exit status match
the qs ipc path across 26 calls, errors and quiet mode included.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Only accept whole socket replies and retry only unmade connections

A reply cut off after its OK prefix passed for the whole answer, and an
empty reply with socat failing was retried through qs ipc although the
request might already have been delivered.

An answer now counts only once its record separator arrived. socat's own
errors join the reply, so only its connect error, a socket nothing
listens on, falls back to qs ipc beside an explicit SKIP; anything else
is reported as not responding rather than retried.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 20:46:00 +02:00
..

Tailscale Omarchy Widget

Native Omarchy bar widget for Tailscale.

Features

  • Shows Tailscale connection state in the bar
  • Left click opens a keyboard-friendly panel
  • Right click toggles Tailscale on/off
  • Switch between available Tailscale connections when multiple are available
  • Browse machines from tailscale status --json
  • Copy a machine's Tailscale IP, host name, or DNS name
  • Send files to a machine with Taildrop, when the tailnet allows file sharing

Keyboard shortcuts

Inside the panel:

  • j / k or arrows: move cursor
  • enter / space: activate current row
  • c: copy selected peer IP
  • n: copy selected peer name
  • d: copy selected peer DNS name
  • s: send files to selected peer
  • t: toggle Tailscale
  • r: refresh status
  • esc: close

Requirements

  • tailscale CLI on PATH
  • wl-copy for clipboard copy actions
  • Taildrop enabled for the tailnet, to send files

Receiving files

Incoming Taildrop files are saved to ~/Downloads by the omarchy-tailscale-receive service, which announces each one with a notification (an image preview when the file is an image, and a click to open it). The Tailscale service install enables it; omarchy tailscale receive runs the same loop by hand.

Icon

Renders the Tailscale mark natively as a theme-colored 3×3 dot grid, matching the official SVG silhouette while avoiding tiny-SVG rendering quirks in the bar.

Add to the bar

This widget ships as first-party plugin omarchy.tailscale. Add it with omarchy plugin enable omarchy.tailscale, then place it with omarchy bar move omarchy.tailscale if desired.