{"full_name":"ZingerLittleBee/Heeler","owner":"ZingerLittleBee","name":"Heeler","url":"https://github.com/ZingerLittleBee/Heeler","description":"Native iPhone and iPad console for herdr: watch and drive coding agents on your machines over SSH, in Herdr TUI or the Herdr desktop app (herdr-core), with a real libghostty terminal, native Chat, QR pairing, and push notifications when an agent needs you","homepage":"https://heeler.bybee.dev","topics":[],"language":"Swift","license":"Apache-2.0","avatar":"https://avatars.githubusercontent.com/u/33377263?u=eb35195049d6b79d7e585b703d404e0cc1af126d&v=4","created_at":"2026-07-18T01:49:37Z","pushed_at":"2026-11-10T05:46:14Z","metrics":{"stars":855,"forks":94,"watchers":0,"issues":354,"prs":288,"releases":22,"issues_open":null,"issues_closed":null,"prs_open":null,"prs_closed":null,"prs_merged":null,"discussions":4},"growth":{"day":{"stars":18,"forks":2,"base_day":"2026-11-09"}},"history":{"dates":["2026-11-09","2026-11-10"],"stars":[837,855],"forks":[92,94],"watchers":[0,0],"issues_open":[null,null],"prs_open":[null,null]},"boards":{"daily_rate":86,"weekly_rate":191},"same_owner":[],"issues":[{"number":607,"title":"Usage Limits test can read a stale \"Usage Limits are off.\" label","comments":2,"created_at":"2026-11-02T10:12:43Z"},{"number":428,"title":"Agent Notifications only say \"Done\": add Host, Tab, task title and an optional result preview","comments":2,"created_at":"2026-10-08T23:04:29Z"},{"number":655,"title":"Would a Traditional Chinese (Taiwan) translation be welcome?","comments":1,"created_at":"2026-11-08T01:14:06Z"},{"number":629,"title":"Verify the signed Xcode 27.2 release path after build 40 stopped at the test gate","comments":1,"created_at":"2026-11-04T21:07:22Z"},{"number":606,"title":"PTY reads can miss a reset socket for 20 seconds in package E2E","comments":1,"created_at":"2026-11-02T10:12:41Z"},{"number":540,"title":"Chat can't find Claude Code's input box when prompt suggestions are enabled","comments":1,"created_at":"2026-10-30T04:06:00Z"},{"number":470,"title":"Support Heeler overlay networks: connect distributed herdr instances via cloudflared tunnels","comments":1,"created_at":"2026-10-18T04:58:47Z"},{"number":446,"title":"Keep the last screen visible while reconnecting after a foreground return","comments":1,"created_at":"2026-10-12T17:32:32Z"}],"discussions":[{"number":623,"title":"failing - “herdr server running” because it tries: ~/.config/herdr/herdr.sock","comments":0,"category":"General","created_at":"2026-11-04T11:16:38Z"},{"number":478,"title":"iPhone Duo","comments":3,"category":"General","created_at":"2026-10-19T01:21:55Z"},{"number":279,"title":"UI/UX","comments":2,"category":"Ideas","created_at":"2026-09-04T14:42:27Z"},{"number":274,"title":"Welcome to Heeler Discussions!","comments":0,"category":"Announcements","created_at":"2026-09-03T17:41:48Z"}],"latest_release":{"name":"0.1.18 (44)","tag":"builds/0.1.18/44","published_at":"2026-11-06T04:28:06Z","body":"<!-- heeler-build-record:v1 -->\n<details><summary>Build record</summary>\n\n```json\n{\n  \"candidate\": {\n    \"tag\": \"builds/0.1.18/44\",\n    \"version\": \"0.1.18\",\n    \"build\": 44,\n    \"source\": \"3af1066588eab5eb615a2f63aacc2acc1f6ba35e\",\n    \"plugin\": \"0.9.0\",\n    \"bundle_id\": \"dev.bybee.heeler\",\n    \"platform\": \"IOS\"\n  },\n  \"state\": \"valid\",\n  \"run_id\": \"42161415744\",\n  \"run_attempt\": \"1\",\n  \"observed_at\": \"2026-11-06T04:27:34.813192+00:00\",\n  \"ipa_sha256\": \"5544018ca21d605c658d673f68d5d0ed626a9642a37378c8b27af98f025a916a\",\n  \"toolchain\": \"Xcode 27.2\\nBuild version 27B52\",\n  \"apple_build_id\": \"3cacdfa4-b28e-447b-9d1f-f9240b4ecf65\",\n  \"apple_processing_state\": \"VALID\",\n  \"dsym_asset\": \"Heeler-0.1.18-44-dSYMs-9b9ef9d55da8cc581e57d31898cce2c822586adb10a0a8ebd0ea5ad0e7a21c22.zip\",\n  \"dsym_sha256\": \"9b9ef9d55da8cc581e57d31898cce2c822586adb10a0a8ebd0ea5ad0e7a21c22\",\n  \"dsym_uuids\": {\n    \"Heeler.app.dSYM/Contents/Resources/DWARF/Heeler\": [\n      \"BBCC8AD2-C5D8-393A-82DC-40B88EDEAA20 (arm64)\"\n    ],\n    \"HeelerNotificationService.appex.dSYM/Contents/Resources/DWARF/HeelerNotificationService\": [\n      \"5CA49E4C-59A0-3E4C-A118-96657D3E14EB (arm64)\"\n    ],\n    \"HeelerWidgets.appex.dSYM/Contents/Resources/DWARF/HeelerWidgets\": [\n      \"BA492DB6-591B-3A82-8B92-9896DC6832D4 (arm64)\"\n    ]\n  }\n}\n```\n\n</details>\n\n### Added\n\n- Connect to herdr-core Hosts over SSH. Adding a Host by hand detects what the machine runs and offers herdr-core to confirm, without starting anything; a Linux Host whose core is not running offers Start herdr-core after a confirmation. The Console follows the Herdr desktop app's spaces and tabs, read-only, and places other Terminals by launch directory. Known coding programs, also when `npx` or `npm exec` starts them, and programs that report a status are Agents with their Program Status, and Pins are kept per Host. Live terminals share one connection, reach any number of viewers and pass every key to the program. A kept Terminal that loses its program shows Restarting and reattaches to the restored shell by itself, a program that exits shows ended with its exit code and no reattach, New Agent stays open and says so when an agent's program has already ended, another core answering at the same socket ends an open terminal rather than joining its Terminal at the same address and refuses what a detail still open on the old core sends by address, through a reconnect until its row is opened again, and Host detail names variables leaked into the core. Staged Images and Files work on macOS and Linux core Hosts. Agents cannot be renamed on these Hosts. (#535; PR #538)\n- Agent List Fields on a herdr-core Host starts from the terminal's title, then its directory, and offers the Terminals' labels as fields, with no Sync from plugin. (#555; PR #538)\n- Read a Claude Code Agent's conversation in Chat on a Linux herdr-core Host. Heeler finds the conversation from the Agent's own process when Chat opens and when its status, turn or foreground program changes, never on a timer and never by guessing, follows `/clear` and `/resume`, and reads from the `CLAUDE_CONFIG_DIR` the Agent itself runs with. Without that evidence Chat says it can't tell, and an Agent that keeps no conversation says which variable stops it. A Chat open when its Agent ends or restarts stays on the conversation, says what became of the Agent, and follows the next Claude Code at that address. (#579; PR #538)\n- Open Chat for Codex and Grok Build on a Linux herdr-core Host, each of which passed its check there with a signed-in account (Codex 0.165.0 started with `--no-daemon` and Grok Build 1.0.70, on herdr-core 0.1.13). Heeler binds the conversation from the rollout a `--no-daemon` Codex holds open, Grok Build's one matching session row, or the id Heeler started OpenCode 2.1 or later with, reading under the Agent's own `CODEX_HOME` or `GROK_HOME`. A Codex on the shared daemon says to reopen it with `codex resume --no-daemon`, after `codex app-server daemon stop` if Codex say"},"readme":true,"readme_zh":true,"news":[{"title":"Heeler: Open-Source iOS App for Herdr","url":"https://github.com/ZingerLittleBee/Heeler","hn":"https://news.ycombinator.com/item?id=50022477","source":"Hacker News","lang":"en","date":"2026-10-09","points":3,"comments":0},{"title":"如何为 Heeler 贡献代码：iOS 智能体控制台开发环境、测试与 PR 完整教程","url":"https://blog.csdn.net/gitblog_00602/article/details/169819885","source":"blog.csdn","lang":"zh","date":"2026-11-02"}],"stale":false,"snapshot_at":"2026-11-10T09:35:25Z","history_start":"2026-09-06"}