{"id":50877678,"url":"https://github.com/jonmagic/tri-state-relay-service","last_synced_at":"2026-06-15T11:32:41.300Z","repository":{"id":364826523,"uuid":"1254876606","full_name":"jonmagic/tri-state-relay-service","owner":"jonmagic","description":"Local macOS relay inbox for coding-agent status updates","archived":false,"fork":false,"pushed_at":"2026-06-14T16:21:39.000Z","size":11226,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-14T18:07:16.565Z","etag":null,"topics":["agents","cli","developer-tools","local-first","macos","menu-bar","swift","text-to-speech"],"latest_commit_sha":null,"homepage":"https://jonmagic.com/tsrs/","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jonmagic.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":"SUPPORT.md","governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-31T05:29:09.000Z","updated_at":"2026-06-14T16:21:42.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jonmagic/tri-state-relay-service","commit_stats":null,"previous_names":["jonmagic/tri-state-relay-service"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/jonmagic/tri-state-relay-service","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonmagic%2Ftri-state-relay-service","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonmagic%2Ftri-state-relay-service/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonmagic%2Ftri-state-relay-service/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonmagic%2Ftri-state-relay-service/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jonmagic","download_url":"https://codeload.github.com/jonmagic/tri-state-relay-service/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonmagic%2Ftri-state-relay-service/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34358777,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-15T02:00:07.085Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agents","cli","developer-tools","local-first","macos","menu-bar","swift","text-to-speech"],"created_at":"2026-06-15T11:32:39.903Z","updated_at":"2026-06-15T11:32:41.286Z","avatar_url":"https://github.com/jonmagic.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Tri-State Relay Service\n\nTri-State Relay Service is a local macOS agent relay inbox. Agents submit short status messages with the `relay` CLI, TSRS stores them as relays in a local SQLite queue, and the Swift app-owned playback path speaks one relay at a time.\n\nProduct page: https://jonmagic.com/tsrs/\n\nBackground: https://jonmagic.com/posts/the-feedback-loop-i-was-missing/\n\nThe core CLI contract is intentionally small:\n\n```sh\nrelay --line \"Brain\" --message \"The daily line note is ready.\"\nrelay --line \"Brain\" --type complete --priority normal --message \"The plan is ready to review.\"\nrelay list\nrelay ready\nrelay live\nrelay focus\nrelay mute\nrelay unmute\nrelay clear\nrelay clear-delivered\nrelay skip-next\nrelay acknowledge\nrelay replay-last\nrelay line\nrelay line \"Tri-State Relay Service\"\nrelay combiner\nrelay settings\nrelay status\n```\n\n## Line shape\n\nThe invariant is more important than the surface: many producers can enqueue relays, but only the app-owned playback path may speak.\n\n1. The CLI never calls `/usr/bin/say` directly.\n2. The app owns relay playback. Direct builds currently use Swift-launched `/usr/bin/say` for Siri voice fidelity; the legacy App Store-safe profile uses AVFoundation.\n3. The SQLite store owns message state and persistent mode.\n4. Focus, Ready, and Live are the three playback states.\n5. Focus mode is the safe default. Ready releases exactly one relay, then returns to Focus. Live keeps playing relays automatically, grouped by line.\n6. Mute is a separate safety override that blocks playback in any state.\n7. Messages stay short and intentionally authored.\n\n## Getting started\n\nInstall or run the macOS app, then install the bundled `relay` CLI from Settings. Point agents at one short instruction: send brief, human-authored relays for meaningful progress changes, blockers, and completion.\n\nA line is a named work stream. TSRS uses the active line when deciding what to play next:\n\n```sh\nrelay line\nrelay line \"Tri-State Relay Service\"\n```\n\nRelays queue quietly in Focus mode. When you are ready, play exactly one relay:\n\n```sh\nrelay ready\n```\n\nThe app then returns to Focus mode. Left click the menu bar item for the fastest Play Next path, or use the command palette for search-driven relay actions. The default command-palette shortcut is `Control` + `Option` + `Command` + `Space`.\n\nWhen you want TSRS to keep playing new relays automatically, use Live mode:\n\n```sh\nrelay live\n```\n\nLive drains the relays that were available for one line, switches to the next queued line, and then returns to earlier lines if more relays arrived there. Use Stop Live in the menu bar app or `relay focus` to go quiet again.\n\nThe first accepted relay becomes the active line when no active line is set. Messages from other lines remain queued until you switch lines or pull from them manually. Line-scoped source actions use the selected line's latest source context, not the newest source from another line.\n\nFor the full walkthrough, see [the user guide](docs/user-guide.md).\n\n## More\n\n- [Development guide](docs/development.md)\n- [Command-palette guide](docs/command-palette.md)\n- [Distribution notes](docs/distribution.md)\n- [Roadmap](ROADMAP.md)\n- [Security policy](SECURITY.md)\n\nTSRS is licensed under the ISC License. See [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonmagic%2Ftri-state-relay-service","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjonmagic%2Ftri-state-relay-service","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonmagic%2Ftri-state-relay-service/lists"}