Conversation
Send control requests, including credentials and source resets, over DoubleTake's Unix socket. Remove CLI subprocesses and the credential-file helper, validate daemon settings, and cover protocol cleanup with Node and Quickshell fixtures. Co-authored-by: minpeter <minpeterx@gmail.com> Generated with [OpenAI Codex](https://openai.com/codex/)
Use a fresh Quickshell Socket for every daemon request so an initial ServerNotFoundError cannot poison later retries. Add a deterministic real-Quickshell regression harness that starts the socket after the first failure. Co-authored-by: minpeter <minpeterx@gmail.com> Generated with [OpenAI Codex](https://openai.com/codex/)
minpeter
marked this pull request as ready for review
August 28, 2026 10:53
minpeter
marked this pull request as draft
August 28, 2026 12:28
Ultraworked with [omo](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: sisyphus-dev-ai <sisyphus-dev-ai@users.noreply.github.com>
Ultraworked with [omo](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: sisyphus-dev-ai <sisyphus-dev-ai@users.noreply.github.com>
Ultraworked with [omo](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: sisyphus-dev-ai <sisyphus-dev-ai@users.noreply.github.com>
minpeter
marked this pull request as ready for review
August 28, 2026 18:30
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
doubletake-ctlcontrol subprocess with one-request/one-response JSON over doubletake's Unix socketflush()and on every terminal pathreshare.shand credential-file surgery with the targetedreset-restore-tokendaemon commandhwacceland a newportRangesetting before constructing daemon argvServerNotFoundErrorcannot poison retries after lazy daemon startup/tmp/doubletake.sockand lexical aliases before every writestatusanddevicesatomically, classify sanitized failures, and clear errors only after a complete verified refreshText.PlainTextand strip angle brackets before receiver text enters shell-owned hero/tooltipsDepends on omarroth/doubletake#36.
Security model
The plugin writes control requests only to the protected
$XDG_RUNTIME_DIR/doubletake.sock. It rejects the globally claimable/tmp/doubletake.sockplus equivalent./..and repeated-separator spellings before every initial or alternate-path write, so pairing credentials cannot cross that boundary. Each accepted action emits exactly one newline-terminated JSON request, accepts one validated response, and disposes that request's transport without duplicating a payload. Unknown commands, malformed targets, missing reset targets, malformed responses, and unknown credential kinds fail closed. Daemon error text is mapped to a fixed sanitized vocabulary. Receiver-controlled text cannot trigger QML rich-text resource loading. JavaScript cleanup drops credential references; it does not claim physical string zeroization.Verification
node --test tests/*.test.js: 99/99 pass/tmp/./doubletake.sockis rejected and receives no credential payloadServerNotFoundError, fixture starts on exactREADY, second request succeeds through a fresh Socket and settles cleanlystreams, forward-compatible response parsing, seven failure categories, persistent error recovery, and rich-text guardsomarchy plugin validate: passqmllint airplay/Controller.qml: 0 warningsgit diff --check: passeeef1ba1d1372f1f81a5c4a8bddf6c1c143fd2f5: bar icon remains immediately beforeomarchy.monitor; lazy daemon argv is exactlydoubletake -daemonize -hwaccel vaapi -port-range 60000-60010; cold daemon startup recovers automatically and the panel settles to six receiver rows without stale startup/error statestreaming→reset-restore-token→ Hyprland source picker → source selection → resumedstreaming→ targeted disconnect back toidlestreamsanddevicesrender the normal no-receivers empty state, not a protocol errorBinding loopwarningsAttribution
The one-request lifecycle, bounded cleanup, fallback, atomic-refresh and recovery approach builds on implementation concepts from Mathias Ringhof's
mathiasringhof/omarchy-airplay. The wire contract and targeted restore-token semantics come from Omar Roth's LGPL-3.0-or-laterdoubletake.