Releases: ZingerLittleBee/Heeler
Release list
v0.1.8
Added
- iPad is a first-class target again. App Store builds include iPhone and
iPad, iPad supports all four interface orientations, andmake sim-ipad/
make test-ipadrun against the iPad simulator. (PR #323) - Drag text and images into the Composer on iPad. Send stays disabled, with
a visible "Waiting for image…" hint next to the button, until dropped
images finish staging. (PR #323) - Hardware keyboard shortcuts: ⌘1–9 selects visible Agents, ⌘[ / ⌘] switches
Agents, ⌘F searches, ⌘N starts an Agent, ⌘, opens Settings, ⌘⇧H opens Hosts,
⌘E switches Direct Input / Composer, ⌘Return sends the focused Composer draft,
and ⌘W closes the Agent view. (PR #323) - On iPad, Heeler opens in more than one window and resizes freely under Stage
Manager. Long-press an Agent and choose Open in New Window, or drag its row
out; each window restores its own Agent after a relaunch. Windows on Agents
of different Hosts are all live at once. A Host has one live terminal, so
windows on the same Host hand it to the one you last touched or typed in,
or to a window you just opened; the others show Live in Another Window
with Take Over Here (not while that Host's Shell Terminal is open), and
returning to the app leaves it where it was. A notification for an Agent
already on screen brings that window forward instead of opening another,
and a live window resize sends the Host one terminal resize once the
window settles. (PR #323)
Changed
- Direct Input's More button matches the arrow key size and shortcut spacing,
with equal padding at the strip's outer edges. (PR #323) - The Terminal keyboard fills its dock width on iPhone and iPad without
increasing its height. Character keys share one width across staggered
rows, with wider Shift, Backspace, and Space keys. Agent and Skills
keyboard wells remain centered on wide screens. (PR #323) - On iPad the Composer's tools dock, Direct Input's Keys dock, and the
Shell terminal's Keys dock no longer leave the system keyboard's floating
candidate and prediction bar over the dock. (PR #323) - iPad adapts its two-column Console to landscape and portrait, with a Show Agents
action in empty detail, form sheets for Hosts, Settings, New Agent, Skills,
Rename, Snippets, and Worktree, plus Attach Links popovers. (PR #323)
Fixed
- The pairing popup keeps startup errors on screen until a keypress, instead
of exiting immediately and closing the Herdr pane. Missing SSH host keys
now tell the user to enable Remote Login or runsudo ssh-keygen -A.
(#319) - Agent List Fields no longer refuses every edit after a build with a
different field set saved on the same device: field names this build does
not know are dropped on load instead of making the whole saved catalog
unreadable. When the saved fields truly cannot be read, both Agent List
Fields screens say so before any edit, keep the fields read-only, and offer
Reset Saved Fields. (#320; PR #321)
v0.1.7
Added
- Muse appears in Start Agent when the Host has
museon PATH. Notifications
and Live Activities name it Muse, and the Heeler plugin acceptsmuse
sidebar row overrides. (#297) - Direct Input's shortcut row gains a Paste key after ⇧Enter, so pasting into
an Agent no longer needs a hardware keyboard. The text goes through the
same paste review as ⌘V. (#307) - The Agents list has a search field. Typing filters Agents by working
directory or title text, combines with the Host filter, and hides empty
Host sections in grouped mode only while their Host is nominal; a
reconnecting or failed Host keeps its section. (#292) - In Compose, swipe between Agent controls and a full Terminal keyboard with
letters, numbers, symbols, Ctrl/Alt/Shift, and F1–F12. The same keyboard is
available in Open Terminal's Keys mode. Both pages match the iOS keyboard
height and preserve the Composer draft. Tap a modifier to apply it to the
next key; tap it again to cancel. (#270; PR #302) - Skills and Snippets are available in Direct Input as well as Compose.
Selecting one inserts it into the active input without pressing Enter.
(PR #302) - Hold Backspace for 0.3 seconds to keep deleting; release to stop. This works
in the Agent controls, Direct Input shortcut row, and full Terminal keyboard.
(PR #302)
Changed
- Custom keyboards now use Ghostty's key encoding, which distinguishes more
Ctrl/Shift combinations and supports enhanced keyboard reporting. Layouts
and controls stay the same. (PR #298) - Terminal character keys use larger labels and uppercase letter keycaps.
Function key labels keep their existing size. (PR #302) - Direct Input's tools dock opens the full Terminal keyboard without the
Agent controls page, since those keys are already in the toolbar. (PR #302) - Agent, Terminal, and Direct Input toolbar keys use a soft gray highlight
and light haptic feedback when tapped. Agent controls put Backspace at the
top right and Shift+Tab at the bottom left. The Direct Input shortcut row
no longer duplicates the Terminal keyboard's Ctrl/Alt buttons. (PR #302)
Fixed
- Switching Agents keeps the Terminal tools keyboard selected instead of opening
the iOS keyboard over the controls. Returning from the Agent list no longer
restores stale keyboard focus, and keyboard height tracking resumes correctly.
(PR #302) - Backspace keeps its full touch area while pressed and tolerates small finger
movements, so holding near an edge no longer cancels deletion. (PR #302) - Backspace highlights and repeats while held, even when surrounding gestures
delay button events until release. This applies to Agent controls, the
Direct Input shortcut row, and the Terminal keyboard. (PR #302) - Modifier and keyboard layer keys keep their selection color while pressed,
without flashing gray or shrinking. (PR #302) - Fixed missed taps on terminal controls near the left edge, where the
swipe-back gesture could intercept them. (PR #302) - New Agent now discovers agents installed through mise. The discovery PATH
includes mise's shims directory, resolved fromMISE_DATA_DIRor
XDG_DATA_HOMEwhen either reaches the non-interactive SSH environment,
otherwise~/.local/share/mise/shims. (#293) - The Lock Screen Live Activity shows three Agents with three-row Agent List
Fields instead of two before "+N more". The row budget overestimated card
height and its test measured only frame minimums, not the rendered text.
Four three-row cards exceed ActivityKit's 160 pt limit, so four rows remain
only for two-row layouts. (#281)
v0.1.6
Added
-
Agent cards and the keyboard switcher use herdr's sidebar fields and Agent
order. Customize each Host's card layout in Settings > Agent List Fields:
add, style, move, or remove herdr, Heeler, and plugin fields across up to
three rows, with a Console preview and automatic saving. Sync from plugin
refreshes the first two rows; the third defaults todirectoryand keeps
your edits when syncing. (#277, #281) -
Live Activities follow each Host's Agent List Fields, including directory
and plugin fields, on the Lock Screen and expanded Dynamic Island. Update
the Heeler plugin on each Host to use these fields in background updates.
(#281)
Changed
- Relicensed the Heeler suite from AGPL-3.0 to Apache License 2.0. (#282)
Fixed
-
Hiding Composer keeps terminal links available through a floating link button
above the latency indicator. It matches the scroll controls, opens the same
link list, and does not reduce the terminal's height. (PR #284) -
Secondary field styles now render correctly in Agent cards and previews. (#281)
-
Agent List Fields groups each Host's controls in one card, wraps field
chips, and uses the Console card for its preview, including the status
badge and Host name. (#281) -
Connecting to a Host whose login shell is nushell or another non-POSIX shell
no longer fails with "The remote home directory could not be resolved". The
home probe now runs under POSIX sh, matching the other setup probes. (#275;
PR #276)
v0.1.5
Added
- Agent detail now has up/down buttons for jumping between your messages and
returning to the latest output. You can use them while the Agent is working,
and manual scrolling stops a jump. (#268; PR #272)
Fixed
-
Pasting text with Windows-style line breaks now opens the paste review sheet
instead of submitting each line separately. (#268) -
Terminal layout now updates immediately when the keyboard cannot open. (#263)
-
New Agent now finds Agent CLIs installed with Bun, Cargo, Homebrew, or
Linuxbrew, as well as standard user-local installs. (#254)
v0.1.4
Changed
- When no size has been saved, Terminal Text Size now defaults to 8 pt instead
of 14 pt. Existing saved sizes do not change. (#256; PR #257)
Added
-
HeelerSSH connections negotiate post-quantum hybrid key exchange
(mlkem768x25519-sha256) against servers that offer it, via a libssh2
snapshot that carries upstream ML-KEM support; servers without it keep
usingcurve25519-sha256. (#261) -
Agent detail now offers Direct Input, which hides the Composer and routes iOS
keyboard input directly to the live Attach PTY. A persistent row above the
Agent switcher provides Esc, Tab, Shift-Tab, arrow keys, Backspace,
Shift-Enter, and Enter; keyboard show/hide controls remain in the switcher.
Composer remains the default. Switching modes preserves the draft and keeps
a visible iOS keyboard in place. (#251; PR #253)
Fixed
v0.1.3
Changed
- Live Activity Lock Screen uses system semantic colors and shares the Console
status palette; it shows up to four Agents in a dense hierarchy, stale
updates retain an out-of-date caption, and each visible Agent opens its
detail while the surrounding activity opens the Console. An iOS 27
ActivityKit regression can still force the Dark appearance and prevent an
existing activity from refreshing after a system appearance change. (#247)
Added
- Console can switch between the flat status-sorted Agent list and a by-Host
grouped list with collapsible sections; collapsed Hosts show Live
Activity-style Blocked, Working, and Done count pills, and both the
presentation choice and per-Host collapse state persist across launches.
(#245)
v0.1.2
Added
-
Cursor (2.4+) Agents get a Skills catalogue, probed from
.cursor/skills
and.agents/skillsat the project root and home. -
Skills catalogues for thirteen more kinds, each probing its CLI's
documented directories — Antigravity, Cline, GitHub Copilot CLI, Devin
CLI, Droid, Grok Build, Hermes Agent, Kilo Code, Kimi CLI, OMP, Kiro CLI,
Qoder CLI, Qwen Code; Gemini CLI, Amp, Mastra Code, and Maki stay out by
design. -
Agent detail shows the Host's latest SSH API latency next to Agent status,
on a status row that now follows the terminal theme's luminance. (#236) -
The Composer suggests discovered Skills inline while an invocation prefix
is typed, and the More menu gains a searchable Skill picker — both insert
the command into the draft without sending. (#234) -
Open Terminal in Agent detail's More menu: an interactive shell in the
Agent's launch directory, one reused tab per Workspace, an IME-safe fixed
input row, Back for desktop handoff, Close Terminal to reclaim the
tab. (#231) -
New Agent can start in a new Workspace at a remote directory, with an
optional label, even when the Host reports none. (#230) -
Console cards mark linked worktrees, whose repository, branch, and
checkout path show in Agent detail alongside a confirmed remove that keeps
the local branch. (#99)
Changed
-
Hosts get a distinct Connecting state, separate from automatic
Reconnecting, a paused connection, and loading Agents on a live events
path. (#155) -
Failures show a short summary, optional detail, and a recovery suggestion
only when the error supports one. (#163) -
GhosttyTerminal 1.3.1 → 1.4.0 (Ghostty v1.3.1): surfaces survive window
detaches, draws pace on a display link, and keyboard input rides the
upstream key encoder with better IME handling. (#242)
Fixed
v0.1.1
Added
-
Qwen Code appears in Start Agent when the Host has
qwenon PATH. (#216) -
Pairing Codes can be copied from the Host popup with
cand pasted in the
app, so pairing no longer depends on scanning a QR that may overflow a
small terminal. A failed copy prints the code for manual selection. (#204)
Changed
- When the Agent is Blocked at an approval or question dialog, Composer Send
types the draft into the live Attach terminal without pressing Enter, then
shows the tools keyboard so Enter or Esc is one tap. If the Host rejects
agent.promptwithagent_blockedafter status lagged, Send takes the
same path instead of showing a rejection. Idle, Working, Done, and Unknown
still deliver throughagent.prompt. (#217)
Fixed
- Connecting to a herdr 0.8.2 Host no longer shows the "newer than this app
was built against" notice. The committed schema snapshot now matches
protocol 20. (#218)
v0.1.0
Fixed
- Opening an Agent no longer dies with
exec: herdr: not found(exit 127) on a
Host that installed herdr via Homebrew or linuxbrew. The API socket never
neededherdronPATH, so the Console could already list Agents; Attach
and the other CLI execs now append the usual install prefixes after the
sessionPATH(~/.local/bin,/opt/homebrew/bin,
/home/linuxbrew/.linuxbrew/bin). (#206)
Added
-
Pin agents from the Console list with a long-press toggle. Pinned agents
stay at the top, most recently pinned first. Long-press a chip in the Agent
switcher on the detail screen to pin or unpin it there too. Lock-screen Live
Activities show each Host's active agents: status counts plus the top
agents (pinned eligible first, then blocked, done, working), updating in
near real time while the app is open and via push after it suspends, ending
when every agent goes idle. Agent names, titles, and host names stay
end-to-end encrypted and are decrypted on device at render time; the relay
sees only the counts. Opt in per Host from Notification Settings; requires
the updated herdr plugin. (#212) -
Agent detail now places a plus menu to the left of Send. It can add an image
from Photos or a file up to 64 MiB from Files, stages the selection privately
on the Host over SFTP, and inserts the resulting path into the local draft
without submitting it. Discovered Links appear beside the plus menu, while
the former title-bar Agent actions live in a separate More menu immediately
to its right. Agent detail omits the visible title bar so terminal output uses
the full area below the system status bar, while preserving edge-swipe
navigation and matching status-bar contrast to the terminal theme. (#182) -
Agent detail now combines the complete live libghostty terminal with a local
Composer. The terminal preserves TUI rendering, scrollback, and PTY resize,
including touch scrolling in alternate-screen TUIs, but no longer accepts
direct keyboard, paste, or pointer-click input.
Drafting makes no network requests;
Send delivers the complete message once and shows delivery, Agent work, and
Done states from acknowledgments and status pushes. Failed messages can be
retried or returned to the draft without losing text, and drafts survive
terminal recovery, backgrounding, and Host reconnects. The Agent switcher
sits at the bottom of the Composer, keeping session changes and the keyboard
toggle within reach without reopening the Console. While the keyboard is
visible, a neighbouring control switches between the iOS keyboard and a
tabbed tools keyboard. Its Agent controls send Esc, Tab, Shift-Tab, arrows,
Enter, and Backspace directly to the Agent without changing the draft. The
The tools dock stays positioned behind the system keyboard and replaces it
without exposing the disappearing native candidate row as an empty frame.
Both modes share the same complete measured height, including the native iOS
candidate and paste area and the Home Indicator area, so switching does not
move the Composer or change the terminal's root geometry, grid size, or
rendered frame.
(#182) -
Settings > About now has Acknowledgements: every redistributed third-party
component ships with its exact upstream licence notice, including libssh2
and its secondary sources, OpenSSL, Ghostty and its stack, the monospaced
fonts, and the rest of the audited inventory. The catalogue fails loudly
when a notice is missing or malformed. (#161; PR #170)
Changed
-
Lock-screen Live Activities now headline the most urgent agent's task
title and show no Host identity. Each agent row is a tap target that
opens that agent's detail in the app; a tap outside the rows opens the
Console. A reconnect no longer treats a transient empty Agent list as
"all idle" and dismisses the activity. -
Live Activity agent lines now lead with the herdr agent name (e.g.
reviewer) ahead of the task title. Unnamed agents and updates from
older plugins render exactly as before. -
App Store builds now target iPhone only. The notification service uses the
same device family, so App Store Connect no longer treats iPad screenshots as
part of the release requirements. -
Heeler once again supports iOS 18 and later. The removed Dictation feature no
longer holds the app at iOS 26, and the bundled OpenSSL/libssh2 artifacts now
share the restored iOS 18 deployment target. (#35) -
Notification setup now distinguishes device registration from per-Host
configuration, accurately describes relay-visible metadata and Notification
Key custody, warns when a custom relay uses cleartext HTTP, and uses
Heeler-branded generic fallback alerts. (PR #195) -
Opening an Agent now gives Heeler priority over an existing terminal client.
Attach and Reattach use herdr's takeover mode, so a stale mobile connection
or a desktop client can no longer prevent the Agent detail terminal from
opening. The displaced client is disconnected. -
A Host whose SSH server has stream-local forwarding turned off now says so
even when herdr isn't on the SSH session'sPATH. Heeler tries to start
herdr once before giving up; when that attempt itself failed, the checks
used to report "the herdr server is not running" and drop the forwarding
half of the diagnosis. Since a typical macOS Host keeps herdr at
~/.local/binor/opt/homebrew/bin— neither on the defaultPATHof an
SSH command — that hit exactly the Hosts most likely to need the forwarding
advice. (#125) -
Hosts no longer need
socat. Heeler now reaches herdr's socket over an SSH
stream-local forward instead of launching a remote helper per request, so
SSH access and a running herdr server are the whole prerequisite. The socat
path field is gone from Add/Edit Host, the onboarding checklist has dropped
its "socat installed" row, and existing Hosts carry over untouched — nothing
to reconfigure. If a Host's SSH server has stream-local forwarding turned
off (it is on by default), the checks now say so. (#122) -
The app is now named Heeler: the home-screen name, the microphone and
camera permission prompts, and the notification extension's display name
all say Heeler instead of Herdr. herdr remains the name of the server it
connects to; the App Store listing will be "Heeler for herdr". The GitHub
repository moved to ZingerLittleBee/Heeler and the in-app repository and
privacy-policy links follow (the old URLs redirect). -
The pairing plugin's id and display name are now both
heeler(the id was
herdr-mobile.pairing, the display nameHeeler Pairing). Hosts still
running the plugin under an old id keep working: Notification Registration
matches the installed id — current first, then legacy — and writes into
that plugin's own config directory, so updating the plugin
(herdr plugin install ZingerLittleBee/Heeler/plugin --ref main --yes) can
happen whenever convenient. After updating it, redo Notification
Registration from the app once; pairing and SSH access are unaffected
throughout. -
The pair popup now opens full-screen so the Pairing Code QR has the whole
terminal to render in. The QR itself is unchanged, so every released app
version keeps scanning it. -
The pair popup's address checklist now pre-selects a single default address
instead of every likely one: the address on the platform's primary interface
(en0on macOS,eth0on Linux), falling back to the best-ranked private
LAN, Tailscale, or ULA candidate when that interface is absent. -
The pair popup's QR screen now renders the code starting at the top row and
trims trailing text to the pane height, so the QR can no longer be clipped
into scrollback on short terminals.
Fixed
-
Malformed herdr API error responses that carry an empty id now fail the
originating request immediately with the server's error instead of hanging
until the request deadline. herdr answers unparseable requests with
id: ""; because each API connection serves one request, that empty id is
attributable to the sole in-flight request on the connection. (#177) -
On iPad, one window's keyboard no longer ends another window's keyboard
handoff. Keyboard notifications are process-wide and each window can hold
a live terminal, so a frame event from one window's keyboard transition
could unfreeze the other terminal's grid before the keyboard had settled
for it. A terminal now heeds a transition only for its own keyboard: it
must be first responder, and a frame event must leave the keyboard
covering its own window. Process-wide show/hide broadcasts no longer end a
handoff. (#157; PR #175) -
Attach again withholds generic remote startup and SSH rc chatter until the
attach command begins. The attach exec prints a short handshake marker
immediately beforeherdr agent attach, and the client drops everything
before it. A channel that dies before the handshake still emits the withheld
text once as the diagnosis. (#166) -
An open Agent terminal no longer stays blank after the app may have suspended.
Returning at or beyond the Background Grace Period, or after an observed
suspension, now shows Connecting while the old PTY stops, then opens a new PTY
Attach with a new terminal surface while preserving links, image actions, and
pending Paste review. While the Host's replacement snapshot is still loading,
the session screen also stays on Connecting instead of briefly claiming the
Agent is gone. Brief trips out of the app keep the existing Attach and do not
show Connecting. (#141) -
A Host that is reconnecting no longer tells you its Agent has gone. The
session screen said "This Agent's pane is no longer reported" whenever the
Agent list emptied, which a dropped connection does exactly as a closed
pane does — so the app reported a permanent loss at the moment it was
successfully recovering. It now...