Foreman

Changelog

Foreman ships fast. Every release, straight from GitHub releases.

Foreman v1.7.4

v1.7.4
Turn a reply or a Markdown file into a visual page

Long replies and planning docs used to be text only. Hover a reply and choose Visualise, or open a .md file in the Editor, the file drawer or a session's Diff tab, and an agent writes a self-contained page that explains it as a diagram, flow, timeline or comparison. Pick a format first, or leave it on Auto, and add a note if you want something specific. The page opens beside the transcript, and its source line takes you back to the reply it came from. Regenerating keeps the earlier pages a step back, and every page is kept on this computer in a library under Load context, grouped by project, where you can rename, archive or delete it. Visualise is part of Pro, and its model is set under Settings → Session defaults → AI helpers.

See everything a session changed since a checkpoint

The Diff tab used to compare only against the last commit, so work spread across several turns was hard to review as one change. A picker in the Source Control sidebar now compares against any checkpoint or the start of the session. That view is read-only: you can comment and run an AI review, but staging, discarding and committing stay on the normal view.

Mention files with @

@ used to offer only other sessions. It now lists the project's files too, so you can point the agent at a file without typing its path. A message that names a file shows it as a card you can open.

Spot an integration that stopped working

An integration could show as connected while the service behind it refused every request, for example after its sign-in expired. When a session's call is refused for that reason, the integration now shows as rejected in Settings → Integrations and in the connect dialog, with when it happened, and its sign-in button resets the login so the next session uses a fresh one.

Put your projects in order on the canvas

Project boxes used to sit in a fixed order, so two projects you switch between could end up at opposite ends of the canvas. A project box's ⋯ menu, or a right-click on its header, now moves it earlier, later, to the start or to the end. The order is kept on this device.

Smaller changes

Starting a triaged task can now take handoffs and memories as background context, and the Context settings pane is now called Prompts. A schedule whose session's conversation was deleted from disk now pauses and says why, instead of failing on every run. Account settings now explains why the relay isn't connected. Clicking a notification opens its session, and opening a session from the palette or history search clears its alert. Idle sessions now show a neutral dot rather than a coloured one. In Codex sessions, a message starting with a skill's /name now runs that skill. Slow fetches and pulls get up to four minutes before they're stopped, and the git graph's hover highlight no longer flickers when you move across it.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.7.3

v1.7.3
Triage reads the ticket before you start

The Triage board used to be just a to-do list: you had to open each ticket to judge it. Each card now has a Triage button, and one click triages up to four untriaged cards at once. A read-only agent reads the ticket and the code and returns a verdict: Ready, Needs info, Already fixed?, Duplicate or Too big. The verdict comes with the size and risk of the change, the files it looked at, and any open questions. Starting the task shows the verdict and pre-fills the model, effort and worktree setting it suggests. You can pick the model it uses under Settings → Session defaults → AI helpers.

Codex sessions can message other sessions

Messaging between sessions used to work only from one Claude session to another. Codex sessions can now see the other sessions on the same machine and send them a message, and Claude and Codex sessions can message each other. Each session's inbox setting still applies: it can take messages as they arrive, hold every message until you click Deliver or Discard, or refuse them all. If two sessions exchange too many messages without you saying anything, they are paused until you step in.

Link session cards on the canvas

Dropping a connector on another card used to go straight to a handoff. It now asks whether to hand off or link. Linked cards in the same project stay together, stacked in one column with a "Linked" wire between them, and nothing is passed between the sessions. Right-click the wire to unlink them.

Git Insights counts your own work

Git Insights used to read trunk's merge commits, which credited every pull request to whoever merged it. It now counts the commits you authored, using your git email, and groups them under the merge that landed them. What everyone else landed over the same time is shown alongside for comparison. You can also pick which branch counts as trunk.

Pull & rebase when your branch has diverged

When your branch and its remote had both moved on, Pull used to stop with a git error. The Git page now offers Pull & rebase instead. Your uncommitted changes are set aside and put back afterwards. If the rebase hits a conflict, the usual rebase banner appears with Continue and Abort.

Smaller changes

A session whose history Claude Code deleted after 30 days used to open as a blank pane. It now says what happened, how to keep history longer, and lets you start a new conversation on the same card. Deleting a Codex session now also removes its conversation from Codex's own history. A finished task checklist can be cleared. Drawers and menus now animate open. On the Free plan, up to 2 schedules can be active at a time.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.7.2

v1.7.2
Reply to several parts of an answer at once

Answering a long reply used to mean retyping or pasting the bits you were responding to. Now select any text in an agent's answer and click Reply: a box opens right under that part, and you can quote as many passages as you like. Your replies wait above the message box and go out together in one message, drawn in the chat as quote-and-answer blocks. You can send them on their own or with a message of your own.

Session cards show what the agent is doing

Live status on the cards used to be an opt-in that sent every turn to a second model to summarise, at extra cost. Cards now read what the agent already reports, for free: what it is doing right now, how far it has got through its own task list (such as "2/5 · Running tests"), and the question it ended on when it is waiting for you. The task list also appears at the top of the session, ticking off as the agent works. To ask for one, turn on Checklist in the Send ▾ menu before sending. Settings → Appearance → Card status switches the lines on the cards off. The canvas now makes room for each card's real height, so cards no longer overlap as their status grows. Parallel left the Send menu; it lives in the project box's + New menu.

Choose the model for each AI helper

Most of Foreman's own background helpers used to run on fixed models you couldn't change. Settings → Session defaults now has an AI helpers section where btw, Explain, commit messages, handoff digests and the fan-out judge each get their own model and effort, separately for Claude and Codex. Picking a family such as Sonnet always uses the newest version the agent knows. Settings itself has a cleaner look, with each pane laid out as cards.

Triage takes tickets from any tracker

Adding work to the Triage board used to offer only the repo's GitHub issues. It now lists your connected Linear, Jira, ClickUp and Sentry tickets too, grouped by where they come from. Starting one hands the agent the ticket the same way a # mention in the message box does, so it reads the full ticket rather than just its title.

Search and archive saved handoffs and memories

The Load context window used to be one long list. Handoffs and memories now show as cards you can search by title or project. Archive the ones you're done with to hide them from every picker without deleting them, and restore them from the Archived view.

Turn times and working time

Each turn in a chat now shows the time it happened. Session cards and the session details also show how long the agent has spent working, turn by turn, including time waiting for your approval.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.7.1

v1.7.1
The project map moves into the Editor

The project map used to be a separate mode of the canvas, cut off from the files it showed. It now opens as a panel beside the editor, on the page formerly called Files and now called Editor. The file in your active tab is lit up on the map, with its imports. Click a file on the map to preview it, double-click to keep its tab open, and ⌥-click (Alt-click) to see just that file's dependencies. The map can take over the whole editor area while you explore. Opening a file brings the editor back. Right-click a folder in the file tree and pick "Show map of this folder" to start there, or open "Project map" from the command palette. Large maps no longer flash blank while you hover them.

Choose the editor's font size

The editor's text used to change only with the app-wide Text size. Settings → Appearance now has an Editor font size: Auto keeps following Text size, or set any size from 8 to 32px. In the editor, ⌘= and ⌘− (Ctrl on Windows and Linux) change it, and ⌘0 goes back to Auto. The same keys work in the view that compares your edit with the file on disk. Selected text in the editor is readable on dark themes again; the selection used to wash it out.

Finished tickets in the # picker, and look-up by key

Typing # in the message box used to list only open tickets, so a closed one couldn't be referenced. Recently finished Linear, Jira, ClickUp and Sentry tickets now appear after the open ones, dimmed and marked done. For a ticket that isn't in the list at all, type its key, such as #ENG-142, and pick "Look up" to fetch it from Linear, Jira or ClickUp.

Pick the microphone for dictation

Dictation used to always record from the system's default microphone. On a MacBook with the lid closed that mic is silent, and the transcript came out as a stray "you". A new ▾ beside the mic button lets you pick the input, and Foreman remembers your choice. A recording with no sound now tells you which mic was silent instead of transcribing it. If the mic you picked is unplugged, dictation uses the system default and says so.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.7.0

v1.7.0
A Files page to browse and edit your code

Reading or fixing a file used to mean leaving Foreman for your editor. The new Files page, next to Canvas in the header, shows a project's files in a tree with tabs, on any of your machines. You can edit and save a file right there, and create, rename or delete files from the right-click menu. While an agent works, a file you haven't touched follows its edits on its own, and the margin marks which lines differ from the last commit. Saving never overwrites an agent's change by accident: if the file changed after you opened it, Foreman shows you both versions and lets you choose. Line endings are kept as they were.

Jump to any file, search every file

Finding a file or a line used to take a trip through the tree. On the Files page, ⌘P (Ctrl+P on Windows and Linux) opens any file by typing part of its name, and recently opened files come first. ⌘⇧F switches the sidebar to a search across the whole project, with case, whole-word and regular-expression options and folders to include or skip. Clicking a result opens the file with the match selected. "Go to file…" in the command palette works from anywhere.

Talk to the agent about the lines you're looking at

Pointing an agent at a few lines used to mean copying them into the message box by hand. Select lines in the editor and a comment box opens right beside them. Queue the comment for a session working in that checkout, or Ask about the lines in a side window that can't change anything. Files opened from a session's diff or file view now have an Edit button too. After you save a file a session is working on, Foreman offers to tell that session, so it reads your version before changing the file again.

Move a session into its own worktree

A session started in your main checkout used to have to stay there. The new Isolate button in a session's details moves it into a fresh branch and worktree and resumes the same conversation there, for Claude Code and Codex alike. It works as long as the session hasn't changed any files yet, and it waits until the session is idle. Anything uncommitted in your main checkout stays where it is.

Smaller changes and fixes

Long pastes now turn into an attached file from 2,000 characters or 25 lines, instead of only from 20,000 characters, so a stack trace or a block of JSON no longer floods the conversation and gets re-sent on every turn. The context meter knows that Haiku 5.5 has a 1M-token window, and Codex costs include gpt-6.1-sol. When Codex asks to type into a command that is already running, the approval now says so and doesn't offer an "always allow" that would have applied to the wrong thing. A Claude subagent started as a fork shows its own instructions instead of a copy of the parent's request. The background Claude calls Foreman makes for summaries and reviews now always stay limited to the tools they were given, including on Bedrock, Vertex and gateway setups.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.6.8

v1.6.8
Search every session's history

Finding something an agent said last week used to mean opening sessions one by one. Press ⌘⇧F (Ctrl+Shift+F on Windows and Linux), or pick "Search session history" in the command palette, to search what you asked, what the agents replied, and the files and commands they touched, across every session on every machine. Results are grouped by session. Opening one takes you to that session with its own search already filled in and scrolled to the match. Turns undone by a checkpoint restore are left out, so a hit is always something you can find on screen.

Schedules can continue a session

A schedule used to start a fresh session every time it ran. It can now send its prompt into a session you already have, so a daily "check the build and pick up where you left off" keeps its whole conversation. A sleeping session is woken up first. If the session is busy when the schedule fires, that run is skipped rather than interrupting it. If the session has been deleted, the schedule pauses and asks you to pick another one. The canvas draws a line from the schedule to the session it feeds, and it works for sessions on your other machines too.

See what your skills can do

Skills and plugins used to be installed without any way to see what they contained. Settings → Skills now lists every skill on a machine, with separate tabs for Claude Code and Codex. Badges show what each one can do, such as run scripts, read credentials, reach the network, add hooks or hide text, with the file and line behind each badge. Foreman lets you know when a new or changed skill with red badges appears. Add from GitHub installs a skill from a public GitHub link: it is fetched at an exact commit, checked, and shown to you before anything is written, and a red skill needs an extra confirmation. Project Review has a new Agent config lens that checks a repository's committed Claude and Codex settings for hooks that run on their own, broad permissions, MCP servers and hidden text.

How long you worked

Foreman used to show what your sessions cost but not how much time they took. The usage badge now shows today's and this week's working time on this machine, and Analytics has a Working time panel covering the last 30 days. It separates the time you were actively driving an agent from the time agents spent working, and it adds up parallel sessions. It also shows how many agent hours you get per hour of your own time, and what an active hour costs. The time is worked out from your sessions' activity, so there is no timer to start, and time while the computer sleeps doesn't count.

Branch folders and labels on the Git page

A long list of branches used to be one flat column. Branches named with a prefix, such as feature/login, are now grouped into folders you can fold, and local, remote and tag branches are listed separately. Right-click a local branch to give it a colour and a note. Labels follow the branch when you rename it and disappear when you delete it. The branch list and the commit details beside the graph can now be resized by dragging their edges, and double-clicking an edge resets it.

Smaller changes and fixes

The MCP Servers and Plugins panes now show each server or plugin as a card with one Connect or Edit button. That button opens the same dialog the Tools section uses, where you tick Claude Code and Codex and it works through the sign-ins one at a time. A server that only one of them has can now be added to the other with the same settings. In the Schematic style, a schedule's card no longer runs over the bottom of its project's box. A terminal on the canvas can be resized from its corner again, which a terminal's own outline used to cover.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.6.7

v1.6.7
Type # to work from a tracker task

Starting work from a ticket used to mean copying it into the message by hand. Type # in the message box and Foreman now lists your repository's open issues together with your tasks from Linear, Jira, ClickUp, Sentry and Notion, with the ones assigned to you first. Pick one and its key goes into your message. If the session's agent can open that tracker itself, it gets a reference to the task. If it can't, Foreman reads the ticket, its description and its latest comments, and sends them along, and a note under the message box says which tool the agent is missing. Picked tasks, and Figma, tracker or GitHub links you paste into a message, show up in the session's list of what it was given. The # picker is part of Pro.

Connect tools in one place

Giving your agents a tool like Figma or Linear used to mean editing each command-line tool's settings and signing in from a terminal. Settings → Integrations now has a Tools section with Figma, Gmail, Google Calendar, Linear, Sentry, Notion, ClickUp and Jira, and each tile says where that tool is connected. Its dialog lets you tick Claude Code, Codex and, for trackers, Foreman's own read-only sign-in, then works through the sign-ins one at a time. Foreman's sign-in is what the # picker uses, and one sign-in covers every machine. For Jira, Sentry and ClickUp you choose which site, organization or workspace it reads. Gmail and Google Calendar come from your claude.ai connectors. A stuck sign-in on the MCP Servers or Plugins pane can now be reset, which clears the stored login and signs in again.

A schematic look

Foreman used to have a single look. Settings → Appearance now has a Style choice. Classic is the look you know. Schematic redraws the whole app and the canvas with square corners, flat one-pixel borders and small monospaced captions. The layout and behaviour stay the same, and it works with every theme, light ones included.

Smaller changes and fixes

A message from another session that arrived while the agent was replying used to be treated as a new turn, and could leave the reply stuck on "thinking". It now appears above the reply it joined, and stays there when you reopen the session. Dragging a card on the canvas no longer makes wires and their labels flicker. The + for chaining a follow-up now moves aside when a wire already leaves the bottom of a card, so it no longer sits on that wire's label. On the Git page, a local branch's right-click menu can force-push it, with lease and after you confirm, and the push menu no longer opens underneath the commit list's header. Authors with a single name now get two letters on their disc, so names starting with letters like Y and V no longer look alike.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.6.6

v1.6.6
A clearer canvas

A session card's border used to look the same whatever the session was doing, with a small dot in the corner to show it needed you. The card's frame now carries that colour itself. It's red when something is broken, amber when the session is waiting for your answer, and your accent colour when it has finished and it's your move. While a session is working, the frame breathes in its status colour. A card that has settled stays neutral, so colour on the canvas always means something is going on. Wires now have an arrow at their midpoint, so you can tell which way they run even when both ends are off screen, and a small dot marks each place a wire meets a card. Hover over a finished session and a + appears under it, so you can chain a follow-up without opening a menu.

Schedules live on the canvas

Scheduled tasks used to have a page of their own, away from the work they started. Each active schedule is now a trigger in its project's box on the canvas. It shows when it fires next, how its last run went, and buttons to run it now, pause it, edit it or delete it. A wire runs from the trigger to the session its latest run started, and sessions a schedule started carry a ◷ badge. You can create a schedule from a project's New menu. The Scheduled page is replaced by an Upcoming button in the header. It opens a drawer listing every schedule, soonest first, including paused ones and ones on a machine that's offline. A dot on the button warns you when a run failed or fired late.

See what a session was given

Once you'd loaded a handoff or a memory into a session, or attached a file to it, nothing on the canvas showed it. A session's card now shows a ◫ count of the files it was given, and clicking it lists them, with a note on any that were deleted or moved since. Hovering over or selecting that session draws a wire from its project's saved context and highlights the cards it read. Each saved card also says how many sessions have read it.

GitLab and Azure DevOps

The Git page's pull requests, CI and issues used to work only for repositories on GitHub. They now work for GitLab, including self-managed GitLab instances, and for Azure DevOps too. Foreman works out which service a project uses from its remotes, and uses that service's own words: merge requests and pipelines on GitLab, and work items on Azure DevOps. You can open a merge request, follow its pipeline, re-run failed jobs and put issues or work items on the Triage board, the same way as on GitHub. When you send a failing check to a session, the agent is told which command-line tool to use for that service. A merge request from a fork opens in the project it was forked from.

Integrations settings

Signing in to GitHub used to happen in a terminal on each machine. Settings now has an Integrations pane for each laptop, with a card for GitHub, GitLab and Azure DevOps. Each card shows whether that service's command-line tool is installed and which account it's signed in as. Sign in opens a terminal there. Foreman then opens the sign-in page and copies the code for you, and this works for remote laptops too. A switch turns a service off for one machine, so Foreman stops using it there without signing you out.

Smaller changes and fixes

A new session that hasn't run yet used to open on an empty page. It now suggests three read-only first tasks, and picking one fills in the message box without sending it. After setup, the cursor starts in the message box too. When a Pro trial ends, Foreman now says so once, with a reminder that your projects, sessions and history all stay, and the trial ends on time even if the app is offline. Skills synced from claude.ai now show up in the slash-command picker. The list also updates while a session runs, so a removed plugin's skills disappear without a restart. Background work that finished without Foreman being told used to leave a session stuck as working in the background. It now clears within a few seconds.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.6.5

v1.6.5
GitLab and Azure DevOps

The Git page's pull requests, CI and issues used to work only for repositories on GitHub. They now work for GitLab, including self-managed GitLab instances, and for Azure DevOps too. Foreman works out which service a project uses from its remotes, and uses that service's own words: merge requests and pipelines on GitLab, and work items on Azure DevOps. You can open a merge request, follow its pipeline, re-run failed jobs and put issues or work items on the Triage board, the same way as on GitHub. When you send a failing check to a session, the agent is told which command-line tool to use for that service. A merge request from a fork opens in the project it was forked from.

Integrations settings

Signing in to GitHub used to happen in a terminal on each machine. Settings now has an Integrations pane for each laptop, with a card for GitHub, GitLab and Azure DevOps. Each card shows whether that service's command-line tool is installed and which account it's signed in as. Sign in opens a terminal there. Foreman then opens the sign-in page and copies the code for you, and this works for remote laptops too. A switch turns a service off for one machine, so Foreman stops using it there without signing you out.

Clone a repository, and choose where pushes go

Adding a project used to mean the repository was already on the machine. "Add a project" now has a Clone tab. It lists the repositories your signed-in accounts can see, or takes a pasted URL, and clones the one you pick next to your other projects before adding it. On the Git page, a badge shows which service the project is on and opens a Remotes dialog. There you can add, edit or remove remotes and choose the default one. Push now picks a remote the same way git does in a terminal, so a branch in a fork pushes to your fork, not to the original repository.

Sharper agent browser

Agent browsers on a remote laptop always streamed at standard resolution, so text could look soft on a high-density screen. The browser node now has a resolution setting. Auto matches your screen and how far the canvas is zoomed in on this computer, and keeps remote browsers at standard resolution so their stream stays fast. Choose 1x to 4x to set a fixed resolution instead, for remote browsers too.

Preview is gone, and fixes

The Preview browser node has been removed. The agent browser does everything it did, including element comments, and is the one browser on the canvas now. A laptop that couldn't connect sometimes disappeared from the fleet while its sessions stayed on the canvas, in a row with nothing to reconnect or remove. It now stays listed as offline, with the reason it couldn't connect. Removing a laptop now also removes its sessions and projects from the canvas, and they no longer come back after a restart.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.6.4

v1.6.4
Tabs in the agent browser

When a page opened a popup or a new tab, the browser node could only show whichever tab had changed most recently, and a page that kept updating its own title pulled the view away from a popup the moment it opened. The node now shows a tab strip whenever more than one tab is open. Click a tab to pin the view to it, so other tabs loading pages no longer move you. New popups still open in front, and "Pinned" switches following back on. The new + button and ⌘T open a blank tab, and ⌘W or a tab's close button closes one. When you mention the browser to its session with more than one tab open, the agent is told which page you mean, so it switches to that tab first.

Use the agent browser like a normal browser

The browser node used to take only clicks, scrolling and typing. It now also passes through hover, drag and drop, and right-clicks, so menus that open on hover, sliders and drag-to-reorder lists all work. Back, forward and reload buttons sit next to the address bar, along with the usual shortcuts: ⌘[ and ⌘], ⌘R, ⌘L for the address bar, and ⌘A, ⌘Z and ⇧⌘Z. Copy, cut and paste now move text between the page and your own clipboard. Use Ctrl in place of ⌘ on Windows and Linux. A browser on this computer now streams at your screen's resolution, so text is sharp. Browsers on remote laptops stay at standard resolution to keep the stream fast.

Checking out remote branches

Checking out a remote branch on the Git page used to ask you to name a new local branch. Double-click a remote branch, or choose "Checkout branch" from its menu, to get a local branch with the same name that tracks the remote, and switch to it. If you already have a local branch tracking it, you're switched to that one. "Create local branch" makes the tracking branch without switching. Merge commits also used to show an empty diff when the merge was clean. They now show what the merge brought in, the same way GitHub does.

Sessions that sat idle before their first message

A Claude session takes a snapshot of the repository's git status when it starts. If you committed or edited files before sending its first message, the agent began from an out-of-date picture. Its first message now includes the current state when the repository has changed since the session started. The first turn's change count also used to include every commit and edit made while the session sat idle, so reading one file could show as 16 files changed. It now counts only what the turn itself did.

Fixes

Opening the agent browser failed about half the time with a "did not answer" error. It now opens reliably. Typing into the agent browser also works better. A full stop used to type nothing and delete the next character, and some brackets and quotes moved the cursor instead of typing. Shortcuts on AZERTY and other non-QWERTY layouts now reach the right key. On Windows, characters typed with AltGr, like @, € and { on a German keyboard, can now be typed at all.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.6.3

v1.6.3
Send a failing PR or CI run to an agent

A red check or a review asking for changes used to mean copying the PR link into a session by hand. Pull requests and CI runs on the Git page now have a send button. It opens a short dialog that suggests what to ask for: fix the failing checks, address the review comments, review the PR, or look into a run. You can edit the message before sending it to an existing session or to a new one. The message links to the PR and its failing checks rather than pasting logs, and tells the agent which gh commands to read them with. If you're asking for code changes and the session is on a different branch, the dialog warns you but still lets you send.

Five new themes, and a tidier theme menu

The theme menu now has Cobalt2, Noctis, GitHub Light, Atom One Light and Solarized Light, and lists every theme under Dark and Light headings. Buttons and highlights on the accent colour now use a text colour picked for that theme, so the bright yellow and cyan accents stay readable. In Settings → Appearance, themes and text size are dropdowns, and each text-size option is shown at the size it sets.

Insight notes you can fold away

Claude's Explanatory and Learning output styles add "★ Insight" notes to their replies, which used to show up as raw text between two rules of dashes. They now appear as a card that starts collapsed to its first line, and you can open it to read the rest. Settings → Appearance has a new Insights option to have them start expanded. A note the model quotes inside a code block stays as code, and one that is never closed stays plain text, so the reply after it is never hidden inside a collapsed card.

Plugin changes reach running sessions

Installing, removing, enabling or disabling a Claude plugin used to leave running sessions on the old set until you restarted them. Changes made in Foreman now reload into running Claude sessions straight away, and the skill picker picks up the new skills. Codex sessions still need a restart, and the panel says so. When the CLI refuses a plugin change, the panel now shows the CLI's own reason instead of a generic failure.

Handoff errors that say what went wrong

A failed handoff used to say only that it had failed. It now shows the CLI's own reason along with what to do about it. For example: log in again, pick a model with a larger context window, check your plan or credits, the session's folder was moved or its worktree removed, or the CLI isn't installed on that machine.

Fixes

Resuming, forking or rewinding a Claude session counted everything the session had already spent a second time, because newer Claude Code versions carry the running total into the resumed process. Cost now counts only what the new process spends. Codex pricing now covers the GPT-6 models and the current gpt-5.6-sol rate, and a Codex session on an API key that uses the default model is priced correctly instead of showing $0. When the agent withdraws a permission request, for example because the turn was interrupted, its approval card now goes away instead of waiting for an answer. A message from another session that this session's inbound policy holds back now shows as a card saying who sent it and why it was held, or why it was dropped, instead of disappearing. The desktop app now renews its sign-in in the background, so it stays signed in after the server starts expiring old logins.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.6.2

v1.6.2
Git Insights: what your agents actually shipped

Cost and Insights could tell you what the agents spent and how busy they were, but nothing said whether any of it reached your main branch. Analytics has a third tab now, Git Insights, which follows the code instead of the sessions. Each agent turn records the files it wrote, only on this machine, and those records are matched against trunk history. So for a project you can see how much of what landed was written by an agent and how much by hand, what share of agent-written files made it through untouched, edited first, or never landed, how long code took to go from a turn to trunk, and what each landing cost. Weekly charts split this by Claude, Codex and hand-written code, and every landing lists the sessions behind it. Tracking starts with this release, so history from before it is left out rather than counted as hand-written.

Race Claude against Codex

A fan-out used to send every lane to the same agent, so there was no way to put Claude and Codex on the same task and compare them. The fan-out dialog now has a Multiple option that sets the agent for each lane separately. Lane names never mention the agent, so the AI judge doesn't know which agent wrote which lane. Each decision you make is recorded, and Git Insights keeps a scoreboard of who got picked and whether the pick then landed. It names a leader only after ten mixed races, and it compares picks against each agent's share of the lanes, because an agent holding two of three lanes would otherwise win most races by chance. The Run on choice between subscription and API key now applies to each agent separately, and the dialog shows one status row per agent instead of two full warnings.

The project map shows what's heavy, busy and flagged

The map showed how files depend on each other but not which of them deserve attention. Files now show uncommitted line counts, a flame for files changed often in the last six months, an amber or red dot for medium or high complexity, and a count of findings from your latest Project Review. Hovering a file lists all of its numbers. Right-clicking a folder offers "Review this folder…", which opens Project Review already scoped to it, and nothing runs until you start it. Files open in a side drawer from the map, the Git page's working-tree list and the findings in a review, with syntax colouring for every language the map reads. Two map fixes: the "both ways" dependency view no longer spreads across most of the repo after two hops, and a project inside a larger repo now places review findings on its own files rather than same-named files at the repo root.

Cost charts that don't double-count or spike

The same model could appear under several names in the cost tables (with and without the long-context suffix, dated builds, older aliases), which split its spend across rows. They now merge into one row, for past history as well as new. Cost has a new chart of daily spend split by model. The top four models keep the same colour on every chart and the rest are grouped as "Other", instead of cycling through colours that were hard to tell apart. Model colours also follow the day-by-day spend history, so a model that paid for most of the month no longer turns grey because its sessions were deleted. Insights gained a day-by-day "Work by agent" chart comparing Claude and Codex by turns, lines or cost.

A commit list you can size

The commit list had no column headers, and each row sized itself to its own text, so a long author name pushed that row's change bar out of line with the others. The list now has a header with Graph, Message, Change and Author columns you can drag to resize (double-click to reset), and every row uses the same widths, so the bars line up. When a repo has more branch lanes than fit, the graph column scrolls sideways with the trackpad or its own scrollbar instead of squeezing the lanes together.

Fixes

The subscription or API key choice used to be based on how your last session was launched, so running one session on your API key hid the toggle that switched back, and deleting the key was the only way out. The choice now reads each CLI's own login, for Claude and Codex alike. MCP servers that failed to connect are now listed as failed again. A newer Claude Code release changed the icon it prints for them, and the app had stopped listing those servers at all.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.6.1

v1.6.1
A git graph you can read at a glance

The graph drew every commit as the same small dot on a thin coloured line, so working out who did what, on which branch, meant reading three columns of text per row. Commits are author discs now — initials derived locally, no avatar fetched from anywhere — sitting in lanes wide enough not to collide, and each branch prints its name once, in a gutter to the left, with a leader line to the commit it names rather than the same chip repeated down every row. A Changes column gives each commit a green/red bar scaled against the rest of the window, so a one-line fix and a four-hundred-line rewrite stop looking alike; the exact counts are on hover. The lane palette follows the theme instead of being tuned for a dark background and going to pastel mush on a light one. Hovering a branch's CI dot now lists the jobs behind the number — and if the list is too long to show, the passing ones are what get dropped, never the failures. The pull-request list gained state chips that default to open work, the branch drawer's error messages can be dismissed instead of waiting for something else to clear them, and pulling a branch you already have checked out just pulls it rather than relaying git's refusal to fetch into a checked-out ref.

The CI runs that no pull request carries

Every CI surface in the app read the checks hanging off a pull request, which structurally cannot show a run that has no pull request — so a broken nightly, a failed deploy or a manual dispatch was invisible here. The branch drawer has a CI/CD section now, listing the repo's recent Actions runs whatever triggered them, with a badge on the ones worth noticing and a header that counts only the workflows failing now rather than every failure still in the window. A failed run offers Re-run, which re-runs its failed jobs and not the ones that already passed. It loads when you expand it and never on a timer, so it costs nothing on a repo you don't open.

Insights counts what your tools actually did

The permission table was the only record of tool activity, which meant it described your permission settings rather than your work: under accept-edits or bypass, most calls never stop to ask and so never appeared at all. There is a second ledger now — every call the agent made, and the ones that came back an error — with a Tool failure rate card beside it, counting a call you refused as a denial and never as a failure. The per-session figures also stopped being erased by tidying up: they used to divide by the sessions that still existed, so closing a few could put an install with seventy launches into "too few to read as a pattern" while the cost above it stayed real. They now count launches, which can only go up. Each card carries a thirty-day trend line scaled to its own range, the window splits by agent and by project so Claude and Codex can be compared directly, and metrics that have never recorded anything collapse into one line naming them instead of taking four card slots to say nothing.

Codex file edits show up in the transcript

A Codex session's edits were missing from its transcript entirely — the shell commands were there, the git diff next door showed the changes, and nothing in between said where they came from. Codex stopped reporting a patch as a shell command a while ago and reports it as its own kind of event, which the app didn't read, live or on reload. Both paths read it now, and the edit is drawn as a diff card with the file it touched, the same as Claude's. The approval that goes with it used to arrive as a contentless "Allow Bash?" pointing at a card that was never drawn; it now names the edit and shows you the change you are being asked about.

The project map goes deeper than one level

The map drew only leaf folders, which gave it no altitude: a monorepo came out as hundreds of identical boxes with their whole path squeezed into the label, and no arrow ever said "core depends on shared". Folders now contain folders. A closed one stands for everything beneath it and carries its subtree's arrows, levels that neither branch nor hold files fold into a single header, and the folders with the most files in scope open first until the budget runs out — so the structure is readable before you touch anything. Hovering lights a whole subtree rather than one box, a pin stays lit while you look around and the pointer lights its own at half strength, and the import counts on the arrows are placed so that several feeding one box no longer print on top of each other.

A review lens that reads your history

Every review lens described the repository at one commit, so none of them could see which parts are moving. Change hotspots is a new lens that reads the recorded history instead: which files churn, which of those have nothing testing them, which keep appearing in the same commits as each other, and which have a history of repair rather than growth. Its window is anchored to the commit under review rather than to today, so the same commit gives the same numbers next week, and a comparison against an earlier run says so if the window's length moved. Two existing lenses also stopped reporting "none available" for tooling that exists: outside JavaScript the audit and dead-code analyzers are usually not installed, and they can now be fetched into a throwaway environment for the run — picking the lens is the consent for that, and nothing is added to your machine.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.6.0

v1.6.0
A map of the whole project, not just the diff

The change map could only draw the files a diff touched, so it was no help before you had changed anything. The canvas has a second mode now: Map draws a project's files as folder boxes with an arrow for every import between them, thick where a folder leans on another. Because a whole project is noise, every view is a scope — the files your sessions have touched, one folder plus a hop out, or one file's dependency cone up to six hops in either direction. Hover a file or a folder to light what it reaches and dim the rest, click to pin that, and type in the filter box to narrow to a name and whatever hangs off it. It is built on the machine that owns the checkout, so a remote laptop's project maps as fast as a local one.

Read and explain any file, with no session running

Reading a file used to mean a session open on that checkout. Clicking a file on the map now opens it read-only and syntax-highlighted in the drawer, session or no session — and "Open in session" is still there when you want to comment on lines and send them. Beside it is Explain: a read-only side chat that can tell you what a file does, how it is wired into the rest of the project, what a folder-to-folder arrow is standing for, or what a few lines you have selected mean. It runs on its own throwaway session that can't write anything, keeps its answers while you move around the app, and goes away when you close it.

Rename, move and delete files from the map

Housekeeping meant leaving for a terminal. Right-clicking a file on the map now offers rename or move — one box holding the whole path, so changing the folder part moves it — as well as delete, which asks first, and Send to session, which drops the path into that session's composer for you to finish the sentence. Everything lands in the working tree and nothing is staged or committed, so it shows up as an ordinary change you can review or throw away.

The version number checks for updates

The app checked for updates hourly and had nowhere to say so once the fleet sidebar went away, so a waiting update could sit unnoticed and there was no way to ask. The version badge in the header is now the control: click it to check the release feed right away, and it carries the rest itself — the download percentage while one arrives, then a Restart & Install button. Downloads are still automatic, so the button never stands between you and an update you already have.

Import arrows that point where they should

The maps quietly missed edges. A /* inside a tsconfig.json string opened a comment that swallowed the whole paths block, so every alias in a project could go missing at once; a baseUrl with no paths beside it was ignored entirely; and in a monorepo one app's @/* could answer for another app's. Aliases are now read from jsconfig.json and the named variants too, followed through extends and references, and scoped to the directory that declared them. A Go import now reaches every file in the package it names rather than one stand-in, and a regular expression full of escaped slashes no longer hides the imports sitting beside it.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.5.12

v1.5.12
Read any file, not just the diff

The Diff tab could only show you the lines that changed, so understanding why a change was right meant leaving the app. You can now open any file in the checkout, read-only and syntax-highlighted, with its own diff marked in place. A file path in backticks in the transcript is a link, and so are the paths on Read and Edit cards, on review findings, and on the Git page. Selecting lines works the same as on a diff: comment on them, or hit "Explain this" to ask. There's a "Walk me through" button on the review bar for the whole change.

A map of how the change hangs together

A long diff gives you no sense of which file leads and which follows. The new Map button draws the changed files as a graph, with an arrow for every import, plus one hop of unchanged neighbours around them — so you can see what the change is wired into before you start reading. Click any file to go to it. It understands TypeScript, JavaScript, Python and Go, and falls back to a name-based guess elsewhere.

One file tree instead of two lists

Staged and Changes were separate lists, so a file edited in both showed up twice and nothing told you where it lived. There's now one tree grouped by directory, with a dot for staged and stage, unstage and discard on the row itself. A search box finds any file in the checkout, and a toggle shows the unchanged files sitting beside the changed ones. The commit message box drags to the height you want.

Branches start where they actually started

A branch's line could be drawn running forty commits down the shared spine, which read as work that was never yours — worst on a branch cut from a release branch, or on a laptop with no local main checked out. Each run now ends where its branch's own history ends, using the same answer the drawer's commit count gives. A stretch of history no ref points at is named after the branch that made it rather than "Unnamed branch", and a branch split across two lines keeps one colour.

See which browsers are using your pairing code

Regenerating the pairing code was a button next to Copy with nothing saying what it would break, and there was no way to tell whether anyone else was holding your code. Settings › Account now lists every browser that has connected with it, and which are connected right now. Regenerating asks first, and clears the list along with the code.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.5.11

v1.5.11
Buy Pro without leaving the app

Upgrading meant finding the website yourself, and nothing in the app ever told you which plan you were on. The Account pane now names it, with the renewal date and a Manage button that opens the billing portal if you're a subscriber. Every Pro lock is also a way to buy: the "included in Pro" notices and the small Pro chips are buttons now, and there's an Upgrade action in the command palette.

New accounts start with 14 days of Pro

Signing in used to be buried in Settings, so you could use Foreman for months without ever being offered anything. Setup now ends with an optional account step — skippable, and it never blocks you — and a new account gets 14 days of Pro free, no card. A badge in the header counts the days down, and you get one heads-up before it ends. When it does, everything on this machine stays; you just move to Free.

Free plan limits, and a removal that keeps your work

Free runs two turns at once, races two fan-out lanes, and holds three projects. A turn waiting its turn now says so above the composer instead of looking stuck, and lanes past the cap are greyed out in the Fan Out dialog rather than failing at launch. Removing a project is no longer destructive either: its setup and run scripts, saved commands and canvas layout are kept under the folder's path and come back if you add it again — so making room costs you nothing.

Bulk launches no longer stall behind the turn cap

Launching ten sessions at once sat on "Launching…" for the length of a whole turn, and sessions four onwards weren't even created until earlier ones finished. Every session is now created up front and its first turn queues on its own, so the dialog closes immediately. If a turn fails to dispatch, a toast says how many and why.

Read a saved handoff, and pick a skill for a scheduled task

A saved handoff showed you a title and a date and nothing else — the only way to read one back was to load it into a session. Handoffs now have the same view/edit modal memories have, rendered as markdown. Scheduled tasks got the skill picker the composer has, listing the skills that exist in the directory the schedule will actually run in.

Fixes

A second account signing in on a machine another account had already used would never connect — the app now takes a fresh device identity for it, leaving the first account untouched. The sign-in window went from five minutes to fifteen, since creating an account on the way could quietly outlast it. Messages from other sessions and dispatched review batches render as markdown again, including after a restart. New installs open in Light, matching the website.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.5.10

v1.5.10
The session drawer opens as far as you drag it

The canvas drawer stopped with a whole 360px of canvas still showing, which on a wide window capped it at about 58% — so the moment you actually wanted to read a long transcript you were fighting the divider instead of reading. It now goes to 95%, and there is an expand button beside the dock toggle so you don't have to drag there at all: one click fills the window, another restores the exact width you had set, which is kept untouched the whole time. As the canvas gives way the toolbars fold rather than break up. Past the point where the two bars stop fitting side by side the left one becomes a single ⋯ menu holding everything it used to show — the stage lens and Saved context included — instead of wrapping into a pile; past the point where even that won't fit, both bars go. If a stage filter or a search is still dimming the canvas when they do, a small ✕ stays behind to clear it, so the strip can never end up filtered with nothing on screen saying why.

Share and Connect to browser are switches you can see

Both used to live inside a session's gear menu, nine items deep, which is a poor home for the two controls in there that turn something on rather than doing something once — you could not tell at a glance whether a session was shared without opening a menu. They are now buttons in the session header, lit when on. "Manage this laptop's sessions from the dashboard" moved too, in the other direction: it was two dialogs deep, so a user who had never opened Share Laptop had no way to learn that the feature existed, even though nothing on your phone works until it is on. It now has its own button in the app header, beside your account. It is still a separate consent from Share Laptop and still grants only what it says — the dashboard can list and start sessions, never run commands or browse files.

A btw window you can put away

Closing a btw side chat ended it: the process, its transcript and its fork all went, and reopening paid to replay the whole parent conversation from scratch. That was the only exit, and Escape took it — which is a bad thing for the reflex key to do to something you just paid for. Closing is now two separate actions. The — button, and Escape, minimise: the panel goes, the side conversation stays, and reopening it from the composer lands back in the same one. The ✕ ends it, as before, and says so. A minimised btw leaves a dot on the composer's btw button, since that is the only thing on screen that would otherwise tell you a fork is still alive.

Terminals fold, and you can find a script by typing

A canvas terminal's only exit was the ✕, which kills the shell — so a dev server you merely wanted out of the way had nowhere to go, and you either kept a large rectangle on the canvas or restarted the server later. A terminal now collapses to its title bar like the preview and browser nodes do, keeping the process running with Stop and Restart still in reach, and double-clicking the bar brings it back. The Run… list learned to filter at the same time: on a repo with a long scripts list, start typing and it narrows to the matches, with ↑/↓ and Enter walking them and the saved commands still grouped under their own heading, so "saved" as a query narrows to those. Every filter box of this kind in the app now works that way — it takes focus when the list opens, and the arrows move over what you filtered to rather than over the whole list.

A session that refuses messages says so before you type

A session launched to refuse peer messages drops every one it is sent, while the sending tool answers "delivered" regardless — so one session could report handing work to another, and the model relaying it could repeat that, with nothing anywhere having happened. Foreman sets that gate itself, so it is knowable up front. The @ picker now marks such a session refuses and will not let you insert it, by click or by Enter; a session that parks messages for approval is marked holds. Both are stated flatly, unlike the older may hold, which stays hedged because it is inferred from permission modes rather than known. The "talks to" wires between sessions were redrawn as well: they used to leave the top and bottom of a card, which for two sessions in the same column meant a straight line down through every box and card in between. They now leave whichever side faces where they are going and run in a clear lane beside the column, and they no longer cross a node they were only passing.

Clearer icons, and other fixes

Four different actions — refresh, restart, restore and reconnect — had drifted into five interchangeable circular arrows that read as the same glyph at 11px, most visibly on the canvas toolbar where two of them sat side by side. Each is now named by what it acts on or what it does: the toolbar's two refreshes are a branch and a laptop rather than two arrows, and the rest use one consistent icon per verb. Their busy state lasts long enough to register, too — both canvas refreshes usually finish inside a frame or two, so the button used to look inert whether or not you had hit it. Elsewhere: routing those session-to-session wires no longer costs a stutter when you drag a node around a busy canvas, the @ picker's keyboard cursor steps over a session it won't let you pick instead of resting invisibly on it, and a failed change to one of the two sharing consents no longer hides an error about the other.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.5.9

v1.5.9
The canvas is where sessions live now

Foreman had two places to work on a session — the Sessions page and the canvas — and they had quietly stopped being equals. The canvas drawer had grown into the real thing months ago, the same transcript, composer and Diff panel, so the Sessions page was a second route to the same surface that had to be kept in step and sometimes wasn't. It is gone. The canvas is the only session view, the header calls it Canvas, and anything that used to send you to the Sessions page — a schedule's finished run, a review finding's "Fix this", a session picked from the command palette — now opens that session on the canvas with the right tab already showing. Clicking a session node also selects its project, which is what the Git page and the fan-out, bulk and issue dialogs read, so those stop asking you to go and pick a project you were plainly already looking at. The docked preview pane and the terminal rail retired with the page; both have been canvas nodes for a while. Project Review, which used to be labelled just Review, now says what it is.

Drive a laptop's sessions from your phone

The dashboard could only ever show sessions you had shared one at a time from the desktop, which meant deciding at the desk what you might want later. Turn on "Manage this laptop's sessions from the dashboard" — a new switch in the Share dialog, separate from Share Laptop and deliberately not implied by it — and foremanapps.com lists everything running on that machine, live status included, over a single encrypted connection rather than one per row. From there you can open any of them, start a new session in a project you already have, and read your saved handoffs. It cannot run commands, browse files or delete anything: a new session names a project id and the laptop resolves the directory from its own records, so a browser can only start work somewhere you already added, and detaching a session is the strongest thing it can undo. You can also stop a running turn from the phone now, and cancel a background task individually — a turn interrupt cannot reach one of those by definition. Your phone can be notified too, on the same per-event preferences your desktop already uses: a notification names which session wants you and never what it wants, because the wording is composed from the label the server already holds rather than sent from your laptop.

Saved context, on the canvas

The ✦ Memory shelf above each project box held two unrelated things — memories you had saved and Claude Code's own internal memory files — and offered to delete either. It is now ✦ Saved context and holds what you actually own: your saved memories and your handoff digests, newest first. Clicking a handoff opens the load composer straight from the canvas, with a picker for which session to load it into, so continuing yesterday's work no longer starts by hunting for the session that owns the file. Claude's own memory files are no longer listed or deletable from here; they are the CLI's to manage, and offering a delete button for a format we only read was the wrong side of that line.

The context meter says how many turns you have left

A percentage tells you how full the window is but not whether that matters in the next five minutes or the next hour. The meter now learns how fast a session is filling and turns it into "≈N more turns", on the button's tooltip and above the bar, with the measured growth per turn in the breakdown. It appears once there is a real rate to report and stays away when there isn't, rather than turning a single reading into a forecast. The rate is measured per turn rather than per message from the agent, which matters more than it sounds: a turn with six tool calls reports its usage six times, and counting those as six turns would have promised roughly six times the headroom you have. Two figures got more honest alongside it. The window Codex reports is now explained as the effective one — its input limit minus the slice held back for the reply — because a 258k sitting next to a model advertised at 400k reads as a bug when it isn't. And a learned window can now be corrected downward: a direct reading used to lose to whatever larger number had been inferred earlier, so one bad guess stuck forever.

Claude and Codex keep their own session defaults

Session defaults held one record, so it had to be wiped every time you changed which agent starts new sessions — a Claude model id means nothing to Codex, and an effort level like max is not one Codex has. Switching agent therefore threw away the model and effort you had set. The pane now has a tab for each agent, each with its own model, effort, permission mode and credential, and picking the default agent just moves which one is in front. Switch back and forth as often as you like; neither side forgets. Claude-only settings — output style, and whether other sessions may message this one — no longer appear on the Codex tab, where they were controls that did nothing. The handoff digest picker follows the same rule, defaulting to the cheap summarising model on Claude and to the source session's own model on Codex.

Fixes

An AI review's toolbar used to keep its agent, model and file pickers live while the review ran, so changing one mid-run — or the diff simply moving underneath it — left the bar describing a run that wasn't happening; it now states what the running review was actually given, and the file count and line total are frozen from launch. Context loaded into a session that was parked on an approval was sent straight at a CLI that could not read it and was lost; it is queued now, the same as text typed into a session mid-turn. The canvas layout menu gained a "Check laptop connections" button, for when you have just noticed a stale rail and would rather not wait out the heartbeat. A subagent's token usage no longer counts toward its parent session's context meter — it is a separate conversation with its own window, and it made the reading jump and settle back for the length of every Task call. "View this session's changes" in the command palette no longer sits there enabled with no session selected, doing nothing when picked. And the light theme's accent is the same clay as the dark themes', instead of a blue that belonged to no other part of the app.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.5.8

v1.5.8
Foreman stops paying for a login shell on every command

Every command Foreman ran on your machine — resolving where claude lives, reading a git status, starting a session — opened a fresh interactive login shell first, because that is the only way to see the PATH your own terminal sees. On a fast Mac that costs about four tenths of a second; on a base M1 it is closer to three and a half, and starting one session runs five of them. Foreman now reads your login shell once and remembers what it contributed, so the commands themselves run through a shell that is roughly forty times cheaper. Nothing about which binary gets picked has changed: your profile is still read, just not from scratch every time. It is re-read whenever you come back to the window and whenever a CLI is installed, updated or removed, so a brew install you ran in your own terminal still counts without restarting the app. Removing a session got quicker too, by doing its cleanup at once rather than one round trip after another.

MCP servers and plugins, for both agents

The MCP pane only ever described Claude. A server you connected there did nothing for a Codex session, and the pane didn't say so — a green "Connected" read as a fact about the machine. Servers are now mirrored into both CLIs when you add one, each row names each agent and shows that agent's own verdict, and Connect signs in per CLI, because the two hold separate tokens and authorizing one genuinely leaves the other signed out. Plugins gained a Codex tab beside the Claude one, with its marketplaces, installs and — through the same config write Codex's own interface uses — its enable and disable switches, which its command line has no equivalent for. Plugins are listed per agent rather than merged: unlike a server, a plugin id names a marketplace the other CLI has never heard of. Adding a server on a machine that only has one of the two CLIs no longer reports a failure for the one that isn't there, a removal that doesn't land keeps its row instead of vanishing optimistically, and a schedule now warns about a sign-in only when it is the agent that schedule will actually run.

Codex sessions have skills

The skill picker was hidden for Codex sessions, on the reasoning that skills were a Claude idea. They aren't: Codex has its own full skills system, sharing the same on-disk shape and the same plugin:skill naming. The picker now offers them, read from Codex itself rather than guessed at from disk — which matters, because the enabled state lives in its config file and several versions of the same plugin can sit side by side with nothing on disk naming the live one. Skills from either agent are still never offered to the other; naming one at the wrong CLI just reaches the model as literal text.

The AI commit message runs on the agent you use

The "Generate commit message" button in both commit composers ran claude, hardcoded — so on a machine that only has Codex it failed with a command-not-found, from a control that looked perfectly available. It now runs the session's own agent, or on the Git page the one your session defaults name. The button's tooltip also says who is about to write it and on which model, rather than leaving you to find out from the result.

See which agent a session is running, and change it where you start work

A session card marked Codex and left Claude unmarked, which only answers the question if you already know the convention — and on the canvas the agent picker didn't exist at all, so anyone working there concluded the Settings pane was the only way to switch. Every session now names its agent, on the sidebar row, on the canvas node and in the session info popover, and the picker moved into the New session menu that the sidebar and the canvas share. The agent menus also mark a CLI that isn't installed on the machine you're pointing at — marked, not blocked, since an unreachable laptop hasn't established anything either way, and a laptop that simply didn't answer is no longer reported as having nothing installed. Session cards on the canvas grew wider to fit all of that without truncating the name after a few characters, and a project box now defaults to four of them per row instead of five, so the box keeps the footprint it had.

Fixes

The Codex model picker in Session defaults sat on "Checking for installed Codex models…" forever on any install where you hadn't yet clicked a machine in the fleet list — it was asking a laptop it had never been given. It now uses the same machine every other settings pane does, and says so plainly when there genuinely isn't one. Uninstalling or updating a CLI also used to leave its model catalog on offer for the rest of the app run, listing models from a binary that was no longer there; the pickers now ask again. And $FOREMAN_PORT is exported in every session rather than only in isolated ones, so the run command we suggest in project settings — npm run dev -- --port "$FOREMAN_PORT" — no longer expands to a bare --port and fails to start in an ordinary session. $PORT is still overridden only in isolated sessions, so a plain npm run dev keeps whatever default your dev server picks.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.5.7

v1.5.7
Codex sessions come back with their history

Reload Foreman, reopen a Codex session, and its conversation was simply gone — an empty transcript above a session that was still very much alive. The cause was that Codex refuses to replay a thread another process is already holding, and the session's own process is exactly that, so the replay could only ever fail for the sessions you'd want it for. Foreman now reads the thread's own record off disk, the same way it has always done for Claude, so history comes back whether the session is running or not. It also comes back complete: the old path replayed messages and dropped every command and tool call between them, and those are now there too.

Context and cost figures you can believe

Several numbers were wrong in ways that pointed in opposite directions. A Codex session's context meter was fed the thread's running total rather than the conversation's current size, and counted the cached prefix twice on top of that, so a session with 31k in context could read as over its window; Codex states its real window per model, and the meter now uses it, which makes it the more exact of the two agents. On the Claude side the window was matched against a hardcoded list of the models that existed when it was written — so a Sonnet 5 session was told it had 200k when it has 1M, while every Opus before 4.6 was told the reverse; a pinned build with a date in its id, and Bedrock and Vertex model ids, are all read correctly now. Per-turn footers gained the token counts they always had room for, and stopped printing "$0.00" for Codex turns, which are reported in tokens and no money at all. And a healthy ChatGPT subscription no longer shows a red "No credits remaining" under every usage reading — that line described a pay-as-you-go balance a subscription simply doesn't have.

Choose which agent does the work, wherever you start it

Starting several sessions at once had no agent picker at all, so it quietly launched Claude however your defaults were set — on a Codex-only machine that meant a batch of sessions that couldn't run. The AI review on a session's Diff tab had the same problem for the same reason. Both now let you pick, and the review's picker is worth having on its own: reviewing a diff with the other agent is a genuinely useful second opinion. Switching agent also stopped leaving pieces of the old one behind — a model id or an effort level from Claude means nothing to Codex, and the launch surfaces disagreed with each other about which of the two to clear, so a Claude reasoning level could survive onto a Codex session that has no such setting. The one place that stays Claude-only is the whole-project Review, and it now says so, with the reason, instead of leaving you to discover it.

Install and remove the agent CLIs from inside Foreman

An install had two minutes to finish or Foreman gave up on it and said "check again shortly" — but a large download over a slow link routinely runs past that while working perfectly, and when it landed there was nothing left watching to notice, so the row sat on "Installing…" forever. Installs are now judged on whether they've gone silent rather than on a stopwatch, they show a progress bar and the installer's own latest line while they run, and they're confirmed against the machine at the end rather than trusted to report honestly. Each CLI also gained an Uninstall button, which removes the real binary the way it arrived — Homebrew, npm or the vendor's own installer — while deliberately leaving your sign-in and session history alone. It won't run while a session on that machine is mid-work, it asks first, and where removal would genuinely need administrator rights it hands you the exact command rather than taking them.

Project boxes that fit on the screen, and can be renamed

A project box grew one column per session with no ceiling, so seven unrelated sessions made a box about fifteen hundred pixels wide with the vertical space beside it left empty. Sessions now wrap into a grid, packed so a short one drops into the gap beside a tall one instead of starting a new row below everything, and lineage and fan-out groups stay intact as units. Drag the box's right edge to set how many fit per row; the width is remembered. Projects can also be renamed now — click the name on the box, or use the Name field in project settings. It's a label and only a label: nothing on disk is touched, so two checkouts can share a name and a long directory can have a short one.

Terminals stop leaving dev servers running

Closing a terminal only ever reached the shell, not what the shell was running — so a npm run dev you'd started survived, kept its port, and was reachable only from Activity Monitor. Worse, a terminal's identity lived only in the window, so reloading the app or closing the window orphaned every running command at once with no way back to any of them. All four exits — closing a terminal, reloading, closing the window, quitting — now take the running command with them, on this machine and on any laptop connected to it. Elsewhere: settings that take effect the moment you click them are drawn as switches rather than checkboxes, so they stop looking like something waiting for a Save button that was never there; the Privacy pane's nine-event list folds away while keeping the guarantee that makes it believable on screen; the "New sessions" pane is now "Session defaults" (the old name still finds it); each laptop card shows how many sessions it's carrying and which build it's on; and the session menu's Share and browser toggles no longer slam the menu shut on the first click, which is what had been hiding the new "Show it on the canvas" for an agent browser that was otherwise running invisibly.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.5.6

v1.5.6
Point at what's wrong, several things at a time

Commenting on a running page meant one element per turn: you clicked something, wrote a note, sent it, and the agent started work on that while the other four things you'd spotted waited behind it — which is the wrong shape for looking at a screen and finding a list. You can now keep picking. "Add another" stages a comment instead of sending it, a tray at the bottom counts what's waiting and lets you drop any of them, and one Send delivers the lot as a single turn with an optional note framing the whole set. The composer also stopped covering the thing it's about: it now opens anchored under the element you picked, with that element outlined, instead of docking across the bottom half of the frame — flipping above only when there's no room below. Two silent failures went with it. A comment aimed at a session that was mid-turn used to be dropped on the floor, and one aimed at a dormant session went nowhere at all; both now queue and resume the way every other composer in Foreman does, and a send that genuinely can't get through says so and leaves your comments staged rather than eating them. And when several comments carried screenshots, every one of them pointed at the last picture written — each now keeps its own.

Comment on the page your agent is actually driving

The agent browser on the canvas was something you could watch and click, but not talk about: to ask about a specific button you described it in words and hoped the agent found the same one. You can now pick an element straight out of the live view. Hovering highlights what's under the pointer, clicking captures it — tag, CSS path, size, rendered HTML and the computed styles that explain how it looks — and the message tells the agent it's already on that page, so it answers instead of navigating somewhere else and losing what you were pointing at. The pick is a pure read: nothing is injected into the page and nothing is drawn in it, so an agent working in the same tab never sees that it happened and no outline turns up in its own screenshots. If it picked something up while you were typing and navigated away, the message names the page the element actually came from rather than quietly implying otherwise.

The page's console, where the agent can read it

A page an agent was driving could throw on every render with nothing anywhere saying so — the errors were real, in a browser with no DevTools you'd think to open, and the agent had no way to read them either, because a snapshot reports the DOM and not the log. Warnings and errors from the page now collect behind a badge in the browser node's title bar, count up as they arrive, and travel with any comment you send about that page, source location included. Only warnings and errors are kept — the rest is the bulk of a dev server's output and none of it answers "is something broken here" — and a new page starts clean, whether you navigated or the agent opened a tab of its own.

Pin the size the agent measures the page against

The agent browser followed the node it was drawn in, so "check this at mobile" was a hope rather than an instruction — the agent looked at whatever width you happened to have dragged the node to. The node's header now has a viewport control: Fit still follows the node and is still the default, and Mobile, Tablet, Laptop and Desktop pin a real device size, with a second click on the one already pinned turning it on its side. The point is that the agent inherits it — its snapshots and its screenshots are taken at whatever is set here, which is what the browser's own device mode can't do for you, since that resizes what you see. A pinned size letterboxes the view here, and clicks still land where you aim them.

Reuse a commit message you've already written

The messages you write again and again are, by definition, already in the log — but reaching one meant scrolling the graph and retyping it. Both commit boxes, on the session's Diff tab and on the Git page, now have a history button that offers the repo's own recent subjects, filtered live by whatever you've typed. It matches anywhere in the line rather than just the start, since the repeated part is often in the middle; merge, revert and squash commits are left out because git wrote those, not you; and picking one drops it in the box to edit rather than committing anything. Separately, a half-written commit message no longer disappears when you glance at the Chat tab and come back — it's kept per session, and survives a restart.

Conversations that have ended stop looking live

When two sessions messaged each other the canvas drew a blue wire between them for half an hour, which meant a blue wire only ever told you "these two talked at some point recently" — not what a live-looking canvas appears to be saying. A wire that's been quiet for three minutes now cools to grey and fades, and its label says how long ago the last message landed, so a finished exchange reads as finished long before it disappears. The arrival dot stopped replaying, too: it used to travel the wire again every time you left the canvas and came back, so a conversation that ended half an hour ago animated as if it were happening. It now plays for messages that are actually new. Elsewhere, a failure in Foreman's own background work — a failed update check most often — could raise a toast carrying an entire HTTP response body and stretch it down the height of the window; those are now trimmed to something readable, and a routine update check that can't reach GitHub no longer announces itself at all.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.5.5

v1.5.5
Every branch shows its CI

The Git page could tell you what your branches were, but nothing about whether they built — you found that out by opening GitHub. The checked-out branch now carries its CI next to its name in the sync bar, every local branch in the drawer carries the same verdict as a dot, and the pull-request list shows each PR's rollup and expands to the named checks behind it, because "1 failed" without saying which job sends you to the browser anyway. Branches that have a PR get this for free, on the same call that lists the PRs; a branch with no PR is asked about when you select it, and there's a "Check CI status" in its right-click menu when you want to re-read one. Worst state wins, so a mostly-green rollup with one red job reads as red, and a check we can't classify counts as pending rather than being quietly dropped — a failure hiding behind a green badge is the one thing this surface must never do. A repo with no CI configured shows nothing at all instead of a reassuring dot it hasn't earned.

Choose what Foreman interrupts you for

Foreman fired six different desktop notifications and there was no way to change any of them short of silencing the whole app in your OS. There's now a Notifications pane in Settings listing each one — a session needing approval, background work finishing, a session erroring, a scheduled run, a chain step, a review settling — with a switch each and a master switch above them. Everything stays on by default, exactly as it behaved before the pane existed; a settings screen isn't a licence to quietly stop telling people things they never asked to stop hearing. Two of those events are new: a session that hits an error used to be the one outcome you most needed to hear about and the only one that waited silently until you came back, and a finished review now says how many findings it came back with. Notifications still stay quiet while Foreman is in front of you, but that's now a toggle too — on a second monitor the window is often focused and nobody is looking at it.

Stop one background task without stopping the session

A Workflow or background Agent outlives the turn that dispatched it, so the Stop button — which interrupts a turn — never reached one. A dispatch that hung could only be cleared by spending a fresh turn asking the agent to kill it, or by killing the session and losing everything else with it. Each running task in the background list now has its own Stop, with a "Stop all" once there's more than one, and stopping one leaves the session and every other task alone. The task closes the same way one that finished on its own does, so the row moves itself from Running to Finished; if nothing happens, the row says so rather than sitting disabled forever claiming it's stopping.

Errors stop taking the app down with them

Anything that went wrong deep in Foreman's own machinery — a stream, a timer, a background poll — arrived as the operating system's own "A JavaScript error occurred" dialog, with a stack trace in it, and the app exited when you dismissed it. Those now surface as a toast in the app's own voice, with the message available to copy for a bug report, and Foreman keeps running. Two specific crashes are fixed outright. Asking for a diff too large to hold in memory — which a checkout onto the wrong branch will produce — used to take the whole app down; the output is now capped, and any view showing a diff that got cut says so instead of presenting a fraction of the change as if it were all of it, which matters most if you were about to send it for review. And closing Foreman while a terminal was still producing output could throw on the way out and show that same dialog as the last thing you saw.

Send several handoffs at once, and get told when to

Loading a handoff into a session sent exactly one, so picking up work that spanned two sessions meant loading one and pasting the other. The load composer now has an "Also send" picker for other saved handoffs and memories to ride along, previewed exactly as it will be sent, with the handoff you clicked Load on kept as the current state and the extras framed as background — two handoffs both claiming to describe the present is worse than one. Separately, a session filling up used to be something you noticed by watching a meter: Foreman now offers a handoff once a session crosses a share of its context window, defaulting to 75%, adjustable or switchable off under Settings › New sessions. It's a share rather than a token count because the window differs by model and by CLI, and it asks once per crossing rather than on every turn afterwards.

Smaller fixes

If your project pointed at a package inside a monorepo, or at a linked worktree, Foreman couldn't tell you were halfway through a merge or a rebase — it looked in the wrong place for the marker files git leaves behind, found nothing, and showed you a clean tree with no conflict banner and no way to continue or abort, on the one checkout where you were actually stuck. Switching projects while the Git page was still fetching pull requests left it blank for up to a minute; it now loads the repo you switched to immediately. And a scheduled run that failed announced itself twice, once as the schedule and once as a generic session error — you now get the one that names the schedule, and turning schedule notifications off actually silences it.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.5.4

v1.5.4
The agent browser works on Codex

"Connect to browser" was a Claude-only switch — on a Codex session the control wasn't there at all, because the browser was handed to the agent through a flag only Claude has. Codex takes the same server a different way, so the toggle now means the same thing on either agent, and the browser itself never learns which one is driving it. Approving what the agent does with it works properly too: Codex asks permission for a browser action in a shape nothing was answering, so before this it only ran at all if you had already given the session blanket permission — those prompts now arrive as ordinary approval cards, naming the tool rather than just the server, with "Always allow" offered only where Codex will honour it. Connecting the browser restarts the session, and a Codex session restarted before it had ever taken a turn used to come back unable to run anything; that no longer happens.

Codex transcripts stop hiding MCP tool calls

If you ran a Codex session with any MCP server configured, every call it made to that server was missing from the transcript — no request, no result, no error, just a gap where the agent had done work you couldn't see. Codex reports those calls in a shape of their own that nothing was reading. They now appear like any other tool call, with the arguments the agent sent, whatever the server returned, and failures marked as failures. The agent browser is what made this obvious, but it was true of every MCP server on Codex.

Insights runs on the agent you actually use

The Insights analysis always ran Claude, whichever CLI you had set up — so a Codex user pressed a button that quietly reached for an agent they'd never signed into. It now follows the agent you've chosen as your default. Codex reports what a run spent in tokens rather than dollars, and rather than invent a price for them, the run and the estimate beside the button are shown in tokens too; a run that has never been priced no longer gets quoted a stale dollar figure left over from an earlier Claude run. Those runs also count toward the token totals on the Cost lens now, instead of being spent invisibly.

Insights says what has changed since last time

Running the analysis twice gave you two snapshots and no relationship between them. A second run now shows a line above the findings comparing itself with the previous one — interrupt rate 18% → 12%, and which way that counts — using the numbers each run actually reasoned over rather than recomputing a window that has since moved. It only reports a metric that moved by more than the noise between two overlapping 30-day windows, it stays quiet about readings too thin to mean anything, and if nothing has genuinely moved the line isn't there at all.

Usage analytics is on by default

Product analytics used to be off until you switched it on, and almost nobody did, which meant no way to tell whether people who install Foreman ever get an agent running. It now defaults to on, and the app tells you so once — after your first successful session, not at launch — with a different sentence if you're upgrading, because you were previously told it was off. What can be sent is a fixed list of nine events, enumerated in full under Settings › Privacy, every value a number, a yes/no or one option from a fixed list: there is no free-text field in the format, so your code, paths, prompts and output cannot travel even by accident. One event is new — how far the first-run setup wizard got, so a setup that defeats people can be found rather than guessed at. Turning it off deletes the anonymous install id and discards anything not yet sent. Separately, if you have the cross-device session-detail option on under Account, it now also uploads the daily Insights counters — interrupts, permission answers by tool category, rewinds, fan-out lanes, launch timings, lines changed — which are counts only, with tool names reduced to fixed categories before they are ever written down. That one is still off unless you turn it on.

Smaller fixes

Prompts sent to Claude for a review, an Insights analysis or a fan-out judgement were being flattened to a single line on the way out, so the section breaks and indentation the prompt was built with arrived as ordinary spaces — they now reach the agent intact, which is a quiet improvement to anything those runs produce. The Privacy pane no longer shows the analytics checkbox in the wrong position for a moment while it looks up the real setting, which mattered most to exactly the people who had gone there to check that an opt-out had stuck.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.5.3

v1.5.3
Reviews can now go deep

A project review measured your codebase and reported what the numbers showed — and since proving a pinned number takes most of a run, the findings underneath it were often the thin end of the work. There is now a Depth choice on the setup screen. Standard is exactly what you had. Deep treats the metrics as where the review starts: each lens reads the files its own numbers point at, end to end, and reports up to eight findings rather than five. Two further kinds of agent then run once the lenses have settled — one per lens asking the question a lens cannot ask itself, "what did I miss?", and a last one that reads every lens together and reports only what shows up across them, like the file that is both the biggest hub and the one with no test. It costs roughly twice as much, so it is chosen per run.

Tell a review what to pay attention to

Every review graded your project by textbook, because it had never read the project's own documentation. Lenses now read your CLAUDE.md, AGENTS.md, README and any architecture notes before they begin, so a convention you set on purpose isn't reported as a finding and a deviation from a rule you set for yourself counts for more. There is also a Focus box for a sentence of your own — "the daemon boundary, anything crossing it untrusted". It steers what gets examined and how severely it's rated; it never narrows the review, and it can't change how anything is measured.

See what you fixed since the last review

Running a review twice gave you two reports and no relationship between them. A second review of the same checkout now compares itself against the previous one by default. Each finding is marked New or Still open, resolved ones are listed struck through with what was checked to confirm them, the header reads "3 of 7 fixed, 2 new", and every metric shows what it was last time and which way it moved. Only runs of the same checkout at the same scope are comparable, and where the two runs differed in a way that shifts numbers on its own — a different depth, a different set of lenses, a dead-code analyzer that resolved one time and not the other — the report says so instead of presenting it as progress. The exported HTML carries all of it.

Review numbers stop wobbling between identical runs

Two reviews of an unchanged repository could disagree with each other: 30 test files against 50, a busiest module with 85 dependents against 76. Neither run was lying — each had quietly drawn its own population, one counting only the unit-test folder while the other counted every tracked spec, one searching the folders it happened to think of while the other searched wider. Every fixed metric now pins the set of files it runs over as tightly as the command itself, always the whole tracked repository filtered by name, and a review comparing itself to an earlier one is shown the exact pipeline behind each earlier number. A count now moves when the code moved.

Pull-request signals sit on the project, not on a session

A failed build, or a review waiting on you, is news about a repository and a branch — but the dot announcing it had to live on a session, so one got picked, and a session that had never run a turn would light up the moment someone else's push broke the build. Those signals now mark the project itself: the project box on the canvas, and the project's name in the needs-attention list. Dismissing something sticks properly too. The canvas and the fleet list share one set of acknowledgements instead of each keeping its own, so opening an item from the list puts its mark out everywhere, and it stays out across a restart rather than greeting you again the next morning. The counts rolled up onto the sidebar tree now take the colour of the worst thing underneath them, so a red build can't hide behind three finished turns.

A handoff that comes back empty says so

Generating a handoff digest occasionally produced a dialog with no sections in it, no error, and a Send button that did nothing — and pressing Regenerate usually "fixed" it. The digest runs in plan mode, where a model asked for structured prose sometimes files it away as a plan and replies with a one-line note saying where it put it; nothing downstream could tell that from a real answer. The digest is now told not to write files at all, and a reply with no sections in it is reported as a failure, with the Retry button right there, instead of a dialog that looks broken.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.5.2

v1.5.2
Sessions stop insisting your login failed

A session that hit an expired CLI login was marked "Auth failed", and that mark was only ever reconsidered when the session next finished a turn. A session you had left idle never produces one — so signing back in fixed the CLI, the app kept saying otherwise, and the warning returned on every launch no matter how often you dismissed it. Verifying a sign-in now clears the mark from that machine's idle sessions too. It stays scoped: verifying Claude says nothing about a Codex session, and a session using its own API key is left alone, since no CLI sign-in would fix that one.

The attention dot lands on the session you were actually working in

When several sessions share one checkout, a pull-request signal — failed CI, a review, a branch ready to merge — is about the checkout rather than any one session, so Foreman marks a single session to carry it. It was picking the oldest record for that folder, which is restore order, not activity: a red CI run would light up a session nobody had opened in weeks while the one doing the work sat unmarked. It now marks the most recently active session instead, and skips sessions with nothing running behind them, where a dot read as "something happened here" when nothing had.

A project's MCP config can no longer run commands on your machine

Foreman's "log in" button for an MCP server built a small script from the server's name. A name is not necessarily yours — claude mcp list includes servers defined by a project's own .mcp.json, so opening a cloned repository could contribute one — and a name containing the right punctuation could break out of that script and run whatever it liked, on macOS, the moment you clicked to sign in to it. Server names are now quoted everywhere they are used, so a hostile one is inert text rather than a command. Nothing about signing in to your own MCP servers changes.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.5.1

v1.5.1
Sessions stop insisting your login failed

A session that hit an expired CLI login was marked "Auth failed", and that mark was only ever reconsidered when the session next finished a turn. A session you had left idle never produces one — so signing back in fixed the CLI, the app kept saying otherwise, and the warning returned on every launch no matter how often you dismissed it. Verifying a sign-in now clears the mark from that machine's idle sessions too. It stays scoped: verifying Claude says nothing about a Codex session, and a session using its own API key is left alone, since no CLI sign-in would fix that one.

The attention dot lands on the session you were actually working in

When several sessions share one checkout, a pull-request signal — failed CI, a review, a branch ready to merge — is about the checkout rather than any one session, so Foreman marks a single session to carry it. It was picking the oldest record for that folder, which is restore order, not activity: a red CI run would light up a session nobody had opened in weeks while the one doing the work sat unmarked. It now marks the most recently active session instead, and skips sessions with nothing running behind them, where a dot read as "something happened here" when nothing had.

A project's MCP config can no longer run commands on your machine

Foreman's "log in" button for an MCP server built a small script from the server's name. A name is not necessarily yours — claude mcp list includes servers defined by a project's own .mcp.json, so opening a cloned repository could contribute one — and a name containing the right punctuation could break out of that script and run whatever it liked, on macOS, the moment you clicked to sign in to it. Server names are now quoted everywhere they are used, so a hostile one is inert text rather than a command. Nothing about signing in to your own MCP servers changes.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.5.0

v1.5.0
Sessions stop insisting your login failed

A session that hit an expired CLI login was marked "Auth failed", and that mark was only ever reconsidered when the session next finished a turn. A session you had left idle never produces one — so signing back in fixed the CLI, the app kept saying otherwise, and the warning returned on every launch no matter how often you dismissed it. Verifying a sign-in now clears the mark from that machine's idle sessions too. It stays scoped: verifying Claude says nothing about a Codex session, and a session using its own API key is left alone, since no CLI sign-in would fix that one.

The attention dot lands on the session you were actually working in

When several sessions share one checkout, a pull-request signal — failed CI, a review, a branch ready to merge — is about the checkout rather than any one session, so Foreman marks a single session to carry it. It was picking the oldest record for that folder, which is restore order, not activity: a red CI run would light up a session nobody had opened in weeks while the one doing the work sat unmarked. It now marks the most recently active session instead, and skips sessions with nothing running behind them, where a dot read as "something happened here" when nothing had.

A project's MCP config can no longer run commands on your machine

Foreman's "log in" button for an MCP server built a small script from the server's name. A name is not necessarily yours — claude mcp list includes servers defined by a project's own .mcp.json, so opening a cloned repository could contribute one — and a name containing the right punctuation could break out of that script and run whatever it liked, on macOS, the moment you clicked to sign in to it. Server names are now quoted everywhere they are used, so a hostile one is inert text rather than a command. Nothing about signing in to your own MCP servers changes.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.4.8

v1.4.8
Sessions stop insisting your login failed

A session that hit an expired CLI login was marked "Auth failed", and that mark was only ever reconsidered when the session next finished a turn. A session you had left idle never produces one — so signing back in fixed the CLI, the app kept saying otherwise, and the warning returned on every launch no matter how often you dismissed it. Verifying a sign-in now clears the mark from that machine's idle sessions too. It stays scoped: verifying Claude says nothing about a Codex session, and a session using its own API key is left alone, since no CLI sign-in would fix that one.

The attention dot lands on the session you were actually working in

When several sessions share one checkout, a pull-request signal — failed CI, a review, a branch ready to merge — is about the checkout rather than any one session, so Foreman marks a single session to carry it. It was picking the oldest record for that folder, which is restore order, not activity: a red CI run would light up a session nobody had opened in weeks while the one doing the work sat unmarked. It now marks the most recently active session instead, and skips sessions with nothing running behind them, where a dot read as "something happened here" when nothing had.

A project's MCP config can no longer run commands on your machine

Foreman's "log in" button for an MCP server built a small script from the server's name. A name is not necessarily yours — claude mcp list includes servers defined by a project's own .mcp.json, so opening a cloned repository could contribute one — and a name containing the right punctuation could break out of that script and run whatever it liked, on macOS, the moment you clicked to sign in to it. Server names are now quoted everywhere they are used, so a hostile one is inert text rather than a command. Nothing about signing in to your own MCP servers changes.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.4.7

v1.4.7
Foreman runs on Windows

There is a Windows installer. It carries the same app the Mac and Linux builds do — sessions, the canvas, terminals, the Git page, schedules — with nothing held back or stubbed out. Install it, sign in, add the machine, and a Claude Code or Codex session runs the way it does anywhere else, including the setup wizard installing the CLI for you and walking you through signing in if you don't have one yet.

Underneath, every command Foreman runs on Windows goes through Git for Windows' bash rather than PowerShell, which is what lets one implementation serve all three platforms instead of three that drift apart. Your agent's own tool calls still use whatever shell it prefers — Claude Code reaches for PowerShell on Windows — so nothing about how you work changes.

What a Windows machine needs

Git for Windows, which supplies that bash. If it isn't installed, setup now says so plainly and points you at the download instead of reporting an unrecognised machine with no agents on it, which is what a missing shell used to look like.

The installer is not yet code-signed, so Windows SmartScreen will warn you the first time: choose More info → Run anyway. It installs for your user only, so it never asks for an administrator prompt, and uninstalling leaves your sessions and settings alone.

Windows on ARM is supported through the x64 build, which Windows runs under emulation — there is no separate ARM64 download to choose between.

Linux, one release on

The Linux builds that landed last release have now been run end to end on real hardware rather than just in CI: installing the CLI from scratch, signing in, and running sessions. A handful of things that only a real Linux machine could have surfaced were fixed along the way — a shell command that assumed bash where Debian and Ubuntu use dash, and a global npm install that failed on distro-packaged Node without saying why.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Foreman v1.4.6

v1.4.6
Foreman runs on Windows

There is a Windows installer. It carries the same app the Mac and Linux builds do — sessions, the canvas, terminals, the Git page, schedules — with nothing held back or stubbed out. Install it, sign in, add the machine, and a Claude Code or Codex session runs the way it does anywhere else, including the setup wizard installing the CLI for you and walking you through signing in if you don't have one yet.

Underneath, every command Foreman runs on Windows goes through Git for Windows' bash rather than PowerShell, which is what lets one implementation serve all three platforms instead of three that drift apart. Your agent's own tool calls still use whatever shell it prefers — Claude Code reaches for PowerShell on Windows — so nothing about how you work changes.

What a Windows machine needs

Git for Windows, which supplies that bash. If it isn't installed, setup now says so plainly and points you at the download instead of reporting an unrecognised machine with no agents on it, which is what a missing shell used to look like.

The installer is not yet code-signed, so Windows SmartScreen will warn you the first time: choose More info → Run anyway. It installs for your user only, so it never asks for an administrator prompt, and uninstalling leaves your sessions and settings alone.

Windows on ARM is supported through the x64 build, which Windows runs under emulation — there is no separate ARM64 download to choose between.

Linux, one release on

The Linux builds that landed last release have now been run end to end on real hardware rather than just in CI: installing the CLI from scratch, signing in, and running sessions. A handful of things that only a real Linux machine could have surfaced were fixed along the way — a shell command that assumed bash where Debian and Ubuntu use dash, and a global npm install that failed on distro-packaged Node without saying why.


macOS, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple — opens normally with no Gatekeeper warning, and in-app silent auto-update is enabled.

Changelog — Foreman for Claude Code and Codex