Skip to content

Releases: Flexmark-Intl/maiterm

v1.25.0 — maiLink task boards, background shells & peer messages; Mattermost agent-opened threads

Choose a tag to compare

@flxmrk flxmrk released this 27 Jul 14:43
  • maiLink — see what your agent is actually doing, not just what it said. The phone gains three live views into a session that previously stopped at the chat transcript:
    • The task board. Claude Code's task list — the strip above the prompt — now mirrors to the phone and updates as tasks are checked off, so you can watch progress on a long job without reading every message. SSH sessions mirror their remote board too. (A board that fully completes deletes itself, which reads on the phone as the work being done.)
    • Background shells. A roster of what the session is running in the background, with a Stop button per shell. Liveness is confirmed against the operating system rather than trusted from the transcript — nothing is written when a background process exits, so a transcript-only view would have offered Stop buttons for processes that died long ago.
    • Agent-to-agent messages. Traffic between bridged and meshed agents now renders as its own kind of turn — who it came from, which topic, and the peer's actual words — instead of being dropped from the transcript or buried as an unreadable tool call.
  • Start a new conversation from the phone. A tab can now spawn a sibling session next to it in one tap: same host, same directory, fresh agent, no shared history. Useful when the current thread has drifted and you want a clean start without walking back to your desk.
  • Messages you send while the agent is busy no longer vanish. A message typed mid-turn is queued by Claude Code, which writes no transcript entry for it — so it was invisible in maiLink, and the phone's delivery indicator never settled. Queued messages now appear in the thread, the phone can see what's still waiting, and a message that hasn't been picked up yet can be cancelled.
  • Fix sending to a tab whose agent had exited typing into the shell. The message was injected at a bare bash prompt, which then ran it as a command. maiTerm now wakes the target first — choosing between initializing a live agent and resuming a dead one based on whether the agent process is actually alive — and a refusal is reported plainly instead of becoming a shell command. Per-tab Initialize now exists for any tab, not just meshed ones.
  • Fix consecutive phone messages merging into one. Sending a message, tapping Stop, then sending another produced a single run-on turn. Cancelling a turn makes Claude Code restore the cancelled prompt into the input, and the next message landed on top of it — the composer is now cleared once the restore is observed to have happened, and only when the interrupt genuinely stopped a running turn, so a draft you're typing at the desktop is never wiped.
  • Opus 5 sessions show their true 1M context. The model name in the transcript carries no 1M marker, so a 1M session was measured against a 200k limit — a full context gauge and no warning before a surprise compaction. Recognized explicitly now, with a backstop that promotes any session already past 200k.
  • Mattermost: agents can start a thread, not just answer one. An agent can now open a new thread in a channel it monitors — an incident it found, a heads-up, a question it needs a human to answer — and replies come back to it without anyone having to @mention a bot they didn't summon. Support-tier authority is clarified to read-vs-change: investigating, explaining, reproducing and answering are free, while anything that changes code, data, config or scope needs an authorized user's go-ahead.
  • Mattermost: an agent acknowledges a thread before working it. Picking up a report and going quiet for ten minutes left the humans who handed it over unsure anyone had taken it. An agent now replies immediately with what it understands the ask to be, so a misread surfaces at the start instead of after the wrong fix.
  • Mattermost: a screenshot posted with no caption is no longer lost. An attachment-only reply has an empty message body, which the thread watcher skipped as noise — and the cursor moved past it, so the images were gone for good.

v1.24.2

Choose a tag to compare

@flxmrk flxmrk released this 23 Jul 17:58
  • Copy an editor tab's file path from its right-click menu. Right-clicking an editor tab now offers Copy Full Path — the real remote path for a file opened over SSH, the local path otherwise. SSH files also get Copy Local Copy Path: because opening a remote file reads its bytes straight into the editor and cleans up the transfer temp, there was previously no local file to point tooling at. maiTerm now re-materializes the current remote-saved file on demand at a stable per-file location and copies that path — so repeat clicks reuse the same file and same-named files from different hosts don't collide.

v1.24.1

Choose a tag to compare

@flxmrk flxmrk released this 23 Jul 17:31
  • Mesh topics no longer pile up forever. The topic registry only ever grew — a busy mesh had accumulated 75 topics, most of them long-finished or abandoned. Topics now age out on their own: one left open with no activity for 7 days quietly completes, and a completed topic is removed 48 hours later. The Topics panel in the cockpit also gains manual control — an × to delete a single topic and a Clear done button to sweep out the finished ones.
  • Fix SSH features silently going dead when several tabs share one host. With more than one tab bridged to the same server — the normal state right after a restart — maiTerm kept only the last tab's registration, so everything keyed to that connection (Mattermost attachment staging, sending images to a remote agent from your phone) quietly behaved as though there were no bridge at all for every other tab. Registrations for a host are now merged rather than overwritten, and a staging attempt that finds no bridge warns instead of failing silently.
  • Fix a restart opening a redundant tunnel for every tab on the same host. Re-bridging dozens of tabs at once had each of them racing to create its own tunnel to the same server. Connections to a given host now establish once and are reused by the rest — and reuse is confirmed by asking the connection itself whether it's alive, rather than assuming it's dead because a helper process has exited.
  • Fix a remote agent announcing itself as the wrong tab. On a host where several maiTerm tabs connect to the same remote account, an agent started in a shell without maiTerm's environment (inside tmux, or after su) could pick up whichever tab connected most recently and register as that one — quietly rotating a live session onto an unrelated tab. Because all tabs on a host share a single connection, such an agent genuinely can't be told apart, so maiTerm now fails closed: the shared fallback file is written only when one tab is bridged to that host, and otherwise the agent shows a visible "needs init" rather than binding to the wrong tab.
  • Mattermost resolutions put the ask where you'll see it. Agents were posting the summary, then the technical details, and only then "please verify" — leaving the actual request buried under a wall of developer detail. The call to action now sits at the end of the summary, and technical details always come last.

v1.24.0

Choose a tag to compare

@flxmrk flxmrk released this 23 Jul 15:06
  • maiLink — manage your tabs and workspaces from the phone, not just chat with them. The phone app gains the tab-lifecycle actions you'd otherwise have to walk back to your desk for:
    • Rename a tab. The new name persists, survives a resume, and appears live on every desktop window's tab strip.
    • Close, archive, and restore. Archive a tab to tuck it away recoverably, restore it later (it respawns and resumes its agent), or close it outright. A new archived list shows what you've tucked away across all workspaces.
    • Wake a suspended workspace. The phone could see a suspended workspace's tabs but tapping Initialize dead-ended, because a suspended workspace has no terminals running. Suspended tabs now show a Resume workspace control instead, which respawns exactly the tabs that were live when you suspended and re-initializes their agents.
    • Mesh workspaces, with one-tap Initialize-all. Mesh workspaces are now badged in the inbox, and a single tap readies every member — each one triaged individually, so already-running agents are simply registered, exited ones are resumed, and live members are left alone.
  • maiLink is dramatically faster on big sessions and large tab counts. Opening a thread could take 10–25 seconds, and the app got slower the longer maiTerm ran. Several independent causes, all fixed:
    • Reading a conversation pulled in the entire session log — 155 MB on real machines — just to show the last few dozen turns; it now reads only the tail it needs.
    • The scrollback database walked every tab's full buffer to answer what looked like a trivial "when was this updated?" query, on every chat-list and every thread open. A covering index now answers it without touching the buffers, and metadata reads no longer queue behind buffer saves.
    • maiTerm's own background loops rebuilt the complete chat list every couple of seconds — phone connected or not — starving genuine requests. They now work from lightweight in-memory summaries, and per-tab conversation facts are cached and only re-read when a transcript actually changes.
  • maiLink shows the agent's reasoning effort (low/medium/high/xhigh/max) alongside the model and context gauge, for Claude agents that report it.
  • Fix a live, working agent showing as "dormant" on the phone. After a mesh or SSH resume, a fully running agent could be stuck reporting dormant forever — with an Initialize banner sitting over its live output. Two fixes: session registration no longer lets one tab claim a sibling tab's startup event (the root cause), and a tab with a live terminal that's actively producing output now corrects itself to "active" regardless.
  • Fix the phone's stop button leaving a tab stuck on "Working". Interrupting a turn from the phone stopped the agent but left the tab latched as active indefinitely, because Claude Code doesn't signal a turn ending on a user interrupt. The interrupt now settles the tab to idle itself — and self-corrects if the interrupt didn't actually land.
  • Mattermost threads: send and receive screenshots. Image attachments on a thread message are now staged where the agent can actually open and read them — including for agents running on a remote host over SSH — so a screenshot of the bug reaches the agent instead of being invisible to it. The agent can attach images to its own replies too, for before/after or visual proof of a fix.
  • Mattermost: editing a message no longer re-opens a resolved thread. Editing the original report of a just-closed thread re-served it as if it were brand new, and the whole thread got picked up again as fresh work. Edits can no longer summon.
  • Mattermost: a mention the bot already answered no longer re-summons. Confirming a fix could race the channel scan and re-bind the thread it had just closed — a zombie binding that consumed one of the tab's three thread slots and caused later, legitimate summons to draw spurious "at capacity" replies.
  • Mesh initialization now waits for each agent to settle instead of guessing. Sending the readiness command to a tab sitting at Claude Code's "restore as is / compact first" resume dialog answered the dialog and swallowed the command, leaving the row to time out. maiTerm now answers any startup dialog first, waits for the terminal to go quiet, then delivers the command exactly once — and the response window starts when it's actually delivered, so a long compaction no longer reads as a failure.
  • Fix duplicated tabs cross-rendering a single conversation. Two tabs sharing one session ID (from a duplicate or reload) could show each other's conversation in maiLink, and with auto-resume on, both could resume the same session — two live agents appending to one history. maiLink now renders a contested session only for the tab that actually hosted it last, and an auto-resume of a contested session branches into a fresh session instead: both tabs keep the full conversation and diverge cleanly from there.
  • Preferences: the Authorized and Pickup user fields use a two-column layout, matching the rest of the Integrations pane instead of stacking a full-width text box under the description.

v1.23.0

Choose a tag to compare

@flxmrk flxmrk released this 22 Jul 03:38

maiTerm can now watch your Mattermost channels and pick up threads on demand.

Building on v1.22.0's /maiterm resolve, you no longer have to paste a permalink for every bug report. Right-click a tab → Enable chat monitoring…, choose which channels to watch (the picker lists the channels your bot is a member of, grouped by team), and that tab becomes a dispatcher: whenever someone @mentions the bot in a thread, maiTerm binds that thread to the tab and hands the agent the request with the full conversation — automatically.

  • One tab, several threads. A monitoring tab works up to three threads at once; further summons queue — as they also do while it's busy or offline — with a one-time "at capacity" reply posted to the thread and a notification to you. The tab's @ indicator is dim while idle and turns green with a count once threads are bound.
  • A new "pickup" permission tier. Preferences → Integrations gains Pickup users — usernames allowed to summon the bot without carrying full operator authority. Their thread work is treated as investigate-and-report; authorized operators still carry your full authority, and an unauthorized summon simply notifies you.
  • Hand work to the right agent in a mesh. If the monitoring tab is part of a mesh workspace, it can route an investigation to the peer whose purpose and working directory match the issue — staying the dispatcher on the thread while the right agent does the work, with the sender's authority relayed verbatim.

Docs: https://maiterm.dev/features/comms/

v1.22.0

Choose a tag to compare

@flxmrk flxmrk released this 21 Jul 22:59

Work a Mattermost support thread to resolution from a maiTerm tab — the new /maiterm resolve integration.

Point an agent at a Mattermost thread (paste the message permalink) and it binds that tab to the thread: it reads the whole conversation as a bug report, investigates and fixes the issue in the tab's repository, and posts the resolution back to the thread — without you leaving maiTerm. Configure the bot once in Preferences → Integrations (Mattermost server URL + bot token); a bound tab shows a green @ indicator you can right-click to manage.

  • You stay in control of what the agent can act on. Only messages that @mention the bot are delivered into the session, and each one is tagged by the sender's authority: an authorized operator's message carries full authority, while support staff and other channel members are treated as information and requests only — the agent won't take destructive or scope-expanding actions on their say-so, it relays those to you instead. Authorized usernames are managed in Preferences → Integrations.
  • Operator kill switch. End a thread binding yourself at any time from the tab's right-click menu — severing it never depends on the agent cooperating, and it posts nothing to the thread.
  • Configurable response style. A free-text "Response Instructions" field lets you set how the agent communicates on threads (tone, formatting, what to include) without touching its safety and authority rules.
  • A fix stays open until a human confirms it. Posting a resolution no longer auto-closes the thread — the agent asks support to test and confirm, keeps working if it's still broken, and only closes out on a human's confirmation.
  • You're told when a reply can't be delivered. If someone replies to a bound thread while its agent session isn't running, maiTerm raises a notification (deep-linking to the tab) instead of silently holding the message; the backlog is delivered when you resume the session.

Docs: https://maiterm.dev/features/comms/

v1.21.0

Choose a tag to compare

@flxmrk flxmrk released this 21 Jul 16:53

maiLink — SSH-hosted Claude agents are now first-class in the phone app.

  • Real per-turn transcripts for remote Claude tabs. A Claude agent running on a remote host over SSH used to appear in the phone inbox as a flat terminal-screen snapshot, because its conversation log lives on the remote machine. maiTerm now mirrors that remote log to your computer as the agent works — so SSH agents get the same streamed, per-turn conversation, context-window gauge, and last-turn view as local agents, with the terminal snapshot kept only as a fallback when the connection is unavailable.
  • Send images to remote agents. Attaching an image to a remote Claude tab used to fail as unsupported, because the image only existed on your computer. maiTerm now streams the image to the remote host before referencing it, so image sends to SSH agents work the same as local ones — all-or-nothing, so a failed transfer never leaves a half-filled prompt.
  • Fix larger image batches failing with a generic error. Sending several images — or a couple of large screenshots — at once could fail with only "Failed to send" and nothing injected, because the message endpoint capped the request body well below the size the images require. The limit is raised so realistic multi-image sends go through.

Other

  • Pinned tabs always show the pin. The pin glyph shared a single slot with a tab's status/type indicator, so a pinned terminal with any activity could hide its pin — several pinned tabs could show only one pin — while a pinned editor tab hid its file-type icon. The pin now shows alongside the indicator, so it stays visible.
  • Reloading a pinned tab keeps it pinned. Cmd+Shift+R on a pinned tab produced an unpinned replacement; the reloaded tab now keeps its pin and its exact position in the pin cluster. (A plain duplicate is still intentionally unpinned — a copy is a new tab, not a replacement.)

v1.20.6

Choose a tag to compare

@flxmrk flxmrk released this 16 Jul 17:38
  • Fix agents resuming with a phantom tab ID. A resumed agent could come up greeted with a maiTerm tab ID that no longer exists — failing its session registration and falling into a recovery dance. Two long-standing gaps in how maiTerm manages its SessionStart hook in ~/.claude/settings.json were to blame: re-installs appended identical duplicate hooks unbounded, and stale pre-rename hooks were never swept — so an old hook could echo a dead tab ID from a stale fallback file. maiTerm now keeps exactly one current copy of its hook, and the 30-second self-heal removes duplicates and outdated variants — while leaving a live dev/prod sibling instance's hook alone (both share the same settings file and would otherwise sweep each other forever).
  • Workspaces you suspend stay suspended across a restart. With session restore set to "all", a workspace you explicitly suspended right before quitting (or installing an update) came back live on relaunch. An explicit suspension now survives a full restore; the only automatic wake left is a workspace whose terminals are genuinely still running after a reload.

v1.20.5

Choose a tag to compare

@flxmrk flxmrk released this 15 Jul 16:48
  • The agent environment variables are now named MAITERM_* instead of AITERM_*. The tab-ID and port variables injected into your shells — including the export MAITERM_TAB_ID=… line you see when connecting to an SSH host — carried the old aiterm name. They're renamed everywhere (local and remote shells, hooks, and the Codex shim) to match the maiTerm branding.
  • Fix the SSH env-var injection lagging behind your first keystrokes again. On connecting to a remote host, the tab-ID/port export had crept back to landing at the prompt after the remote setup work kicked off, so a fast typist's first characters could race in front of it. The export now fires immediately once the tunnel is up — before any setup — restoring the snappy behavior.

v1.20.4

Choose a tag to compare

@flxmrk flxmrk released this 13 Jul 14:23
  • Fix secondary windows coming back empty or with stale scrollback after an update or restart. Two fixes: a window whose active workspace had been suspended now un-suspends and respawns its tabs on load instead of returning blank, and an update relaunch now flushes every window's terminal scrollback before restarting — previously only the window you triggered the update from was saved, so other windows lost their buffers.
  • Older "limbo" terminal tabs — ones whose PTY had ended without going through a normal suspend — are now normalized to suspended, so they show a proper "suspended Xd ago" age and are counted correctly in diagnostics instead of as uninitialized.