Repository navigation
Conversation
Blip on Windows is a WinForms tray. collector.ts and thread.ts stay the message plane. A .NET shim stands in for blip-shim and publishes as imsg.exe and the other tool names. A second launch opens the running window and exits. The mutex Local\Nixfred.Blip is what keeps that second process out, and Local\Nixfred.Blip.Show is how it asks the first process to open. scripts/win/install.ps1 publishes the current-user build and adds the Start menu shortcut.
list_services stops Messages after 15 seconds, and run_applescript stops it after 30. An unanswered Automation prompt becomes a denial after about two minutes, so both calls have to wait at least 150 seconds and exit with one sentence.
run_osascript is the one AppleEvent wait for list_services and for the send. A timeout exits with the Automation sentence. The Windows tray already puts that sentence on the failed bubble. The old 15 second kill raised TimeoutExpired before a direct-message send could start.
|
Thank you, David, and welcome. A Windows client for Blip is a real piece of work, and the single-instance mutex and the honest tradeoff notes show care. I took the Mac-side fix: your two commits ( The Windows tray I would rather not carry in this repo. Blip is built and tested as an Omarchy plugin, I can't build or test C# here, and every Windows bug would land on a reviewer who can't reproduce it. It deserves an owner who runs Windows. If you publish it as its own repo ( One small ask: I thank contributors by name in a weekly post on X. Is there an account you'd like tagged? "Rather not be tagged" is an equally good answer. |
… they sat open (one-way doors) LR-T: blip, weekly-notes, change-log, roster, door-classifier, #127, #122, #83, #131 LR-D: blip Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BeRMdPWNC2myz9U8hEeeCi
Why
Blip on Windows had no pull request yet. The tray in this branch is that client. Two problems showed up once it was running.
A second Start-menu launch opened a second Blip. The tray now takes the mutex
Local\Nixfred.Blip. The second process setsLocal\Nixfred.Blip.Show, the first process opens its window, and the second process exits.A direct-message send died at 15 seconds in
list_services. That call asks Messages for its services before--yesis checked, and 15 seconds is shorter than the Automation prompt. macOS records an unanswered prompt as a denial after about two minutes.run_osascriptwaits 150 seconds. On timeout it exits with one sentence, and the Windows bubble already displays that sentence.Scope
windows/BlipTray,windows/BlipShim,windows/text-send.ts, andscripts/win/install.ps1are the tray, the shim, and the installer.Program.Instanceowns the mutex and the show event.planTextSendchooses--toor--chat-id. The body stays on stdin.bridge/mac/imsg-sendaddsrun_osascriptandOSASCRIPT_TIMEOUT.bridge/mac/test_imsg_send_wait.pyis the CI check for that wait.Tradeoffs
Waiting 150 seconds does not grant Automation. If the Mac shows no prompt, the send still fails, and it fails later. No real iMessage was sent. The only acceptable target is the sender's own number, and this change does not know that number.
Finding the running window by its title was the other option. A proof window can use the same title, so the mutex is the key.
Blast radius
imsg-sendis the Mac tool the Linux client already calls. A send that used to stop at 15 seconds now waits up to 150. Text sends and file sends share that wait. The Windows tray is new and installs for the current user. When the installer creates a config,push_readstays off. An existinghost=is left alone.Verification
py bridge/mac/test_imsg_send_wait.pyfailed whilelist_serviceswaited 15 seconds andrun_applescriptwaited 30. It passed afterrun_osascript.The installed Mac tool, with a fake
osascriptthat sleeps 20 seconds and prints one service line, printedRESULT timeout elapsed=15.03on the old script andRESULT ok elapsed=20.17on the new one. The installed file reportsOSASCRIPT_TIMEOUT150.Two launches of the installed
Blip.exeleft one process. The startup log addedup, thenshow, thenshown.No message was sent, no thread was marked read, and no conversation was opened.