Skip to content

Releases

Parley 0.36.0

Choose a tag to compare

@github-actions github-actions released this 15 Nov 16:14
9eabc01

Added

  • Parley updates itself on a click. When the toast announces a new release, Update downloads the archive from GitHub, checks it against the release's SHA256SUMS.txt, unpacks it next to the app and offers Restart now; the same button is in Settings → Notifications. Restarting is an ordinary quit, so it asks about unsaved files and running sessions and stops the agents, and cancelling any question keeps the old version. A small script then swaps the app and opens the new one; the old app stays next to it as .Parley.app.old until the new version has started once, and after a failed swap Parley starts the previous version and says why. Where Parley cannot replace itself (a disk image, a folder you cannot write to) the toast keeps Download and the manual steps. macOS asks for the permissions again, as after any manual update. If an update stops half way and Parley is gone, run mv /Applications/.Parley.app.old /Applications/Parley.app. Not in this version: no update without a click, no resume of a download, and the release is verified by its published checksum only.

  • Autonomous mode for the assistant. A new switch in Settings → Assistant, Autonomous mode, is off by default. When it is on, an action you ask the assistant for on the island runs at once, without a confirmation card; the card is still recorded, and Settings → Assistant lists the Recent actions. Telegram and the phone still ask with a card, as before. The island shows an Auto badge, the progress of a multi-step plan and a Stop button (in the compact Live view too). The assistant now also reports the answer of a session it gave work to: by voice while Live is on, otherwise as a card on the island that is read aloud as usual. This needs a window and a host that both know the mode; with an older window the island has no badge and no Stop button, and the result is announced like any other result. The host database gets two schema migrations (15 and 16).

Changed

  • Closed sessions and archived rooms sit in their own blocks in the sidebar. A work card now ends with a Closed sessions block and an Archived rooms block, each under a header with a chevron and a count that opens and closes it. Closed sessions are no longer mixed into the card's tree or into the rooms: newest first, flat, and finished swarms come first. Under a block with more than 10 rows a second Hide closed / Hide archived rooms button closes it from the bottom. → and ← still open and close both blocks at once.

  • The assistant's voice prompt no longer promises a confirmation card for every action. The lines about actions in VOICE_PROMPT are worded the same whether autonomous mode is on or off.

  • Continuing a session on a provider where its role cannot run no longer leaves it stuck. A switch used to write the new provider into the session and then every launch failed with role-permissions-unavailable (for example a read-only Architect moved to Qwen Code). Now a built-in role the target does not accept becomes "no role", and Parley says so before it switches: the "Continue on another provider" dialog shows one sentence about the role change above the button, and an agent's request_agent_switch card shows the same sentence in the window, the island and Telegram (the phone shows it too). When the change lifts a read-only restriction, the switch needs that confirmation: a request without it is refused with the same sentence and nothing is changed. After a confirmed switch with a role change you get one notice instead of the dialog's own toast. A session already stuck by an earlier version is refused at launch with a message that names the provider to continue it on again. Not in this version: the phone's "Continue on another provider" sheet does not show the role change (a read-only loss is refused there with the sentence), and switching back does not restore the earlier role.

Fixed

  • The Claude limit follows a reset inside a window. After the vendor reset the Claude limits in the middle of a window, Parley kept showing the old, higher percentage until the window ended: in the status bar, on the provider card, in the number agents read and in the suggested switch target. It now follows the sessions that saw the new usage, and existing limit files need no cleanup.

  • A collapsed room counts the agents its expanded view shows. The provider badges under a collapsed room counted every participant, closed ones too, so a room could show six Claude agents while expanding it listed four. Closed participants are no longer counted: the expanded room does not list them either, they are in the Closed sessions block of the card.

Parley 0.35.0

Choose a tag to compare

@github-actions github-actions released this 12 Nov 16:16
2c69adc

Added

  • Delivered mail in the Chat view. When Parley delivers messages to an agent, the recipient's Chat shows them as a mail card with the sender, kind, room and text, for Claude Code (both the delivery that arrives with the next prompt and the check_inbox / wait_for results), Codex (including calls made inside exec), Qwen Code and OpenCode (results returned through its execute tool). The cards survive closing and reopening a session and restarting Parley, because Parley keeps a journal of delivered mail per session. They need a window and a host that both know the feed-mail feature, so the phone and older windows look the same as before.

  • Qwen Code sessions start in auto. Every new or resumed Qwen Code session starts with the approval mode auto; a mode you switch inside Qwen Code is not remembered, and --yolo is never used.

  • Qwen Code model list from the CLI. The model picker for Qwen Code is read from qwen --acp (at start, every six hours and after you sign in to Qwen Code) instead of a typed id only; it falls back to the typed id when the list is not available.

  • OpenCode 2.x as a built-in provider. Parley starts the official opencode CLI (2.0.0 or newer) in a terminal session attached to a private server that Parley runs for that session on 127.0.0.1, with Parley's tools, and shows it in the Chat view with its history (OpenCode 2.2.7 or newer). A sleeping session resumes the same conversation. OpenCode 1.x is never run: the card says "OpenCode 1.x found" and offers Install… for 2.x. Models come from opencode models (pick one when you start a session, or keep the default); read-only roles run with edit, shell, web and subagent tools denied. Settings → Providers → OpenCode shows how many providers opencode auth list reports as connected (sign in inside OpenCode with Connect provider, or run opencode auth login --standalone; the count is a hint and is never stored). Parley's tools are called from OpenCode's execute tool as tools.parley.<name>(). While a session runs, the unauthenticated /health and /doc pages of its local server answer on 127.0.0.1 (the web UI and the API description, no session data); every other route needs the session's password. OpenCode was verified against 2.2.7 with a mock model, not yet with a live model account.

Fixed

  • Cancelling the quit question (⌘Q, then Cancel) no longer cuts the window off from the host: the host connection and the workspace sync are closed only when the app really exits, and the quit question always gets the real session count. (#226)
  • A swarm check is no longer skipped when it is requested just as the previous one is finishing. (#227)

Parley 0.34.0

Choose a tag to compare

@github-actions github-actions released this 12 Nov 09:14
f5c32eb

Qwen Code is now a built-in provider that runs the official qwen CLI, and the CLIs can be installed and updated from Settings → Providers. Qwen Code was verified against qwen 0.27.2 with a mock model, not yet with a live Qwen account.

Added

  • Qwen Code as a built-in provider. Parley starts the official qwen CLI (0.27.2 or newer) in a terminal session with Parley's tools, and shows it in the Chat view with its history. A sleeping session resumes the same conversation. Settings → Providers → Qwen Code shows a sign-in hint (sign in inside qwen with /auth; the hint is not a check) and has Install… and Update. Built-in roles run on Qwen Code except the read-only ones. Not in this version: several accounts, keys held by Parley, usage limits, autonomous rooms, the assistant, and starting from the phone. The custom preset for Alibaba keys is renamed "Qwen models in Claude Code (Alibaba key)"; its id and existing providers do not change.

  • Install and update CLIs from Settings → Providers. Claude Code, Codex and Qwen Code can be installed with Install… (macOS and Linux; a confirmation shows the exact command, the source and what is trusted), the CLI version is always shown with Check now or Up to date, and Update now also works for Qwen Code. Parley downloads and runs only the vendor's installer, only when you confirm.

Parley 0.33.0

Choose a tag to compare

@github-actions github-actions released this 11 Nov 13:27
8048054

The first three waves of a full review of 0.32.0: agents reliably hear each other, silent endings and stuck plans are reported, and the host stays responsive with many sessions. Agents also spend fewer model responses on mail, and new session worktrees get their dependencies.

Added

  • New session worktrees get their dependencies without an install: Parley clones the ignored folders listed in the project's .worktreeinclude (for example node_modules) from the main checkout — copy-on-write on APFS, so it takes seconds and almost no disk — and the brief tells the agent whether the lock files match.

Fixed

  • Parley no longer stalls when many sessions resume or the assistant is asked for an overview: chat feeds load from the end of the log, two at a time with the visible tab first, idle feeds leave memory, and a window that stops reading is reconnected instead of growing the host's memory. (#217)
  • Large workspaces stay responsive while agents exchange messages: a message is saved without rebuilding the workspace map, Parley no longer freezes while an agent's write holds the database, only the room that received a message has its history file rebuilt, and get_map list pages keep working while the workspace changes. (#213)
  • Plans no longer get stuck: a submitted item can still be verified after its owner closes, a closed verifier's review goes to the room lead, assignments are sent again when a workspace is reopened, Resume retries blocked items of an autonomous plan, plan letters no longer wait behind other Parley messages, and old delivery records are pruned. Cancelling an autonomous plan or quitting no longer waits for a running check, and the host recalculates plans only for workspaces that changed. (#210)
  • Continuing a session on another provider no longer leaves it unable to start when its role belongs to the old provider: Parley picks the matching role (or none) and tells you which one it took. (#207)
  • A session that failed to start twice in a row is no longer resumed on every new letter: you get one notice, and the room lead and the senders of its unread mail get one letter saying the session cannot be woken. (#207)
  • send_message now warns when the recipient cannot be woken, so the sender knows the message will be read only after you resume the session. (#207)
  • A message pointer that gets no answer is typed again after 30 seconds and after 2 minutes, and a session that is resumed gets a pointer for the mail that was waiting for it. (#207)
  • Unsent text left in a terminal that holds back mail now produces a notice after 5 minutes instead of waiting silently. (#207)
  • Parley's background host no longer dies when a connected program sends a malformed message, when an internal error slips through, or when a log write fails, so running agents keep working; stopping the host now always finishes within 15 seconds and releases its lock. (#204)
  • Room titles can no longer carry line breaks or terminal control codes into other agents' terminals; the phone can no longer send shell commands (!…) to a session. (#200)
  • When a room member hands in its result with report, the room lead now gets a letter, and a room lead's result reaches the room owner; the session that created the reporter is told too. The report answer names who was told, and the same result repeated within a minute does not wake them again. (#202)
  • An agent is no longer put to sleep in the middle of its turn. (#203) A Claude turn that stayed silent during a long command or tool call counted as finished after 30 seconds, and when memory was tight Parley could stop the agent 5 minutes later, killing the command. Sleep now follows the window: a silent open turn counts as working for up to 15 minutes of silence.
  • The host log no longer reports "invalid transition sleeping → sleeping" when an agent falls asleep. (#203)
  • A session added to a room now gets a short note instead of the room's whole history, and a large inbox arrives in pages instead of one answer the agent could not read. Closed sessions no longer collect unread messages. (#206)
  • The Changes and Diff tabs no longer pile up overlapping requests or re-read every file when nothing changed, huge untracked files no longer stall the review, the island and the room usage chip poll far less, and Merge and Discard ignore double clicks and always refresh. (#215)
  • When an agent with a task stops, crashes or is stopped or closed by you without a result, or ends its turn without reporting, the session that gave the task and the room lead now get a letter. Stuck notices also reach the task giver, and a swarm no longer waits for a crashed drone until its time limit. (#209)
  • The host stays responsive with many sessions. (#212) A change in one workspace no longer makes the host recompute every session of every workspace, and archived or idle workspaces no longer hold file watchers. A session whose log is written without pause now gets its token numbers refreshed at least every few seconds.
  • After a restart, the background host no longer re-reads your whole Claude Code and Codex history: it keeps an index of the logs it has already read and reads only the ones that changed (the first start after an update still reads everything once). The 30-second limits check now looks only at recent and running Codex logs, putting a session to sleep no longer scans all your logs, and hook journals of stopped sessions are trimmed at start instead of growing forever. (#218)

Changed

  • An agent can create at most five rooms per hour and can no longer take a session out of a room you set up unless it leads that room. (#202)
  • Idle agents are put to sleep for memory less eagerly. (#203) "Sleep idle agents sooner when the machine is busy" now defaults to 15 minutes (was 5) and applies when memory is critical or a queued launch needs a slot; on a memory warning agents fall asleep after at least 30 minutes. An agent woken by a letter or Resume stays awake at least 15 minutes after its last turn before memory can put it to sleep. A value you set yourself still applies.
  • Parley starts fewer duplicate helper processes when many agents share a project: Codex role lookups, CLI version checks, binary verification, the Codex skill catalog read at launch and git queries are cached or shared, the window asks for role summaries once per project, and the backlog panel ignores unrelated file changes. The window should stay more responsive with dozens of sessions. (#214)
  • Wakes after a Parley sleep count toward "Session wake-ups per hour". (#203) Two agents writing to each other can no longer wake each other without limit: a session put to sleep by Parley is woken by mail at most that many times per hour (6 by default); further mail waits and the window says so.
  • Claude Code no longer moves Parley's wait_for to the background after two minutes: Parley raises the client's threshold above the longest wait, so a waiting agent gets its mail at once instead of spending a turn on "still running" and answering late.
  • When Parley wakes a Claude-family agent for new mail, the letters now arrive together with the wake line, so the agent no longer spends a separate turn on check_inbox. If the letters do not fit, the rest stays unread and the agent is told to call check_inbox.
  • Agents are told to put wait_for in the same message as the call it follows, and Codex agents to wait in one script. In our measurement a waiting Claude agent went from 10 model responses to 7 and a Codex agent from 22 to 7 (one Codex run each); the numbers come from two designed scenarios, not from everyday use, see docs/research/2026-11-11-mail-turns/README.md.

Updating

  • The first start after the update reads the whole Claude Code and Codex history once and then keeps an index, so later starts are faster.
  • At start Parley trims hook journals larger than 1 MiB of sleeping and closed sessions. The cut part is not kept and cannot be restored.
  • "Sleep idle agents sooner when the machine is busy" now defaults to 15 minutes instead of 5; a value you set yourself still applies.
  • A window from an older version keeps working with the new host.

What is not proven yet

  • None of these changes was checked in the packaged app on a real workload: chat feed loading with a long log and feed eviction, a reconnect with several chats open, host start time with a real history, the hook journal trimming on real data, and the letters about silent endings with real CLIs.

Parley 0.32.0

Choose a tag to compare

@github-actions github-actions released this 09 Nov 20:34
d0b45bc

Impact

  • Goal: See which shell commands a session is running, and stop showing a session that is still in its turn as finished.
  • Behaviour: The session toolbar gets a "N shell" chip with the running commands of the open session's terminal: executable name, elapsed time, CPU and memory, never arguments, paths or environment. A Claude turn that stays silent for more than 30 seconds is shown as working everywhere (window, island, phone, assistant, Telegram) for up to 15 minutes of silence, and one finished turn gives one Done. The phone still cannot call processes.*. The protocol schema does not change for the activity fix.
  • Numbers: Shell chip (PR #196): ps median 21.8 ms and maximum 25.3 ms at 993 rows (10 runs); a full poll median 25 ms and maximum 97 ms at 988 rows (162 polls); on 16 real terminals the 13 idle ones gave an empty list; a rewritten argv[0] carrying a fake token left no trace in 323 snapshots. Activity fix (PR #198): before it, one workspace had 2145 idle reminders right after a Stop against 3354 Stop, and 1099 pauses longer than 30 s inside 334 of 2246 turns (14.9%, an upper bound); live check 7 of 7 passed with one Claude Code 2.1.319 session on haiku. CI on master at 041f20a passed.
  • Screens: The chip with its list open, from the E2E run of PR #196: The "2 shell" chip with zsh and sleep listed. The activity fix has no new UI.
  • For the human: Update the Mac app. Open a session with a long command running and click the "N shell" chip. The chip counts processes, not commands, so one test run can show 17 shell.
  • Risk: Low to medium. For Codex the process list is approximate: startup git stays visible for 39–68 s, and a command run directly under node is hidden. Long executable names are cut to 16 characters on macOS. A turn that ends with neither Stop nor an interrupt record stays working for up to 15 minutes, and a command silent for more than 15 minutes shows one false Done before returning to working. host.diagnostics and agent tools still read the raw state, so they can say unseen while the window says working.
  • Cost: About 25 ms of ps every 2 seconds, only while a live session tab is displayed. The activity fix adds no polling. CPU share and tokens not measured.
  • Verdict: Ready to release.

Added

  • Running shell commands in the session toolbar (#196). A "N shell" chip appears next to "N agents running" while the session's terminal has running commands; click it for a list with each command's executable name, elapsed time, CPU and memory. Only the executable name is shown, never arguments, paths or environment. The host reads the process tree of each subscribed session with one shared ps every 2 seconds and only while the tab is open. Known limitation: for Codex the list is approximate. It may include Codex helper processes (for example git at startup) and miss a command that Codex runs directly under node, and the list says so.

Fixed

  • A running session no longer looks finished (#198). A Claude session in the middle of a turn that stays silent for more than 30 seconds (a long tool call or a slow reply) is shown as working in the window, on the island, on the phone, by the assistant and in Telegram, instead of as done, for up to 15 minutes of silence; after that it counts as finished. A turn interrupted with Esc is shown as done about 30 seconds later. The idle reminder after a finished turn no longer creates a second Done or returns a viewed session to unseen.

Parley 0.31.0

Choose a tag to compare

@github-actions github-actions released this 06 Nov 15:02
488e252

Impact

  • Goal: Talk to the Parley assistant from the iPhone in a live voice dialogue with the island swarm on screen, decide assistant cards on the phone, let phone voice jobs resolve follow-up requests, and stop long dictated tasks from being cut.
  • Behaviour: The app opens on a new Voice screen that shows the 700-point island swarm (drawn with Skia) instead of the orb; Inbox moves to /inbox. The phone holds a live GPT-Live conversation and delegates requests to the host assistant as jobs, and the answers are spoken. Assistant cards appear over the Voice screen with Send, Cancel and Later; dangerous cards need Face ID, and cards.decide is refused while "Allow launching from the phone" (remoteCreate) is off. Phone voice now follows "Speak answers" plus a stored OpenAI key; the remoteVoice setting is removed and a stored value is ignored. Phone jobs carry up to 6 recent conversation turns (300 characters each, 4 KiB in total) plus up to 5 earlier phone requests from the last 30 minutes. A long dictated task with pauses now reaches the assistant whole and no longer comes back as a partial request.
  • Numbers: Dictation fix (PR #192): in a real 0.30.0 session (316 s of voice, 7 Requests), 4 of 7 Request texts started mid-sentence and the 2 long ones waited about 1.5 s and were partial; on the fixed code the same shapes give the full text, not partial; core src/voice-live tests 96 → 105. Phone voice (PR #193): mobile 737, host 4160 (7 skipped), protocol 548, remote-client 167 tests passed at its head; swarm engine step for 700 souls 0.06 ms with JIT and 0.6 ms without on the Mac, not measured on the iPhone; latency, audio quality, battery and binary size not measured. Job context (PR #194): core 6058, host 4166, mobile 744, protocol 549 passed; prompt growth up to about 3.3 K characters by construction, not measured on real jobs, latency not measured.
  • Screens: None captured. The Voice screen, the swarm and the card sheet were not seen on the device in this work.
  • For the human: Update the Mac first, then open the app on the iPhone → Voice and tap Start. Phone voice works when "Speak answers" is on and an OpenAI key is stored on the Mac. Say "create a room Alpha", then "add one more agent there". The iPhone app is built separately and run on a device; it is not part of the desktop release artifacts.
  • Risk: Medium. The remote surface grows by cards.list, the cards.changed event and an optional bounded context on jobs.submit (independent Opus critic: ship). Existing setups change: anyone with "Speak answers" on and remoteVoice off now has phone voice, and anyone with "Speak answers" off loses it; deep links to / now land on Voice. New native dependency @shopify/react-native-skia 2.14.0 needs an iOS rebuild. Swarm drawing runs on the JS thread (critic estimate 10–20% at 30 fps, not measured). If the model does not reply between two utterances, earlier speech since the previous delegation is part of the task text. A Mac on 0.30.0 or older costs the phone one extra round trip per delegation.
  • Cost: Phone voice bills OpenAI GPT-Live minutes on the Mac's key, bounded by the daily limit, the 30-minute session cap, background close and a 3-minute idle close. Emotions add about $0.0007/min against $0.05/min for Live (+1.4%, from the V0 spike, not measured on the phone). Job context adds no OpenAI spend: it goes to the host's CLI job. App binary size with Skia not measured.
  • Verdict: Ready to release for the desktop; the phone checks listed in "What is not proven yet" are still open.

Added

  • Voice screen on the iPhone (#193): the app opens on Voice, holds a live GPT-Live dialogue and delegates requests to the host assistant as jobs, speaking verified results. Cancelled jobs and stale results are never spoken. A text field takes over when voice is not possible (no microphone, daily limit, no OpenAI key on the Mac, "Speak answers" off, Mac unreachable).
  • The island swarm on the phone (#193): the swarm moved to the shared @parley/core/swarm subpath, the island draws it through a Canvas2D sink (pixel-equivalent, covered by a test) and the phone draws it with Skia. It shows the sphere only, supports every swarm state and island emotion, and pulses with loudness read from WebRTC audioLevel every 100 ms. Phone Live sessions get the same emotion trigger as the island.
  • Assistant cards on the phone (#193): cards.list and the cards.changed event with an explicit-field projection, a card sheet with Send, Cancel and Later, and Face ID for dangerous cards. Cards are never shown or decided under the app lock or off the Voice tab.
  • Phone jobs carry recent conversation context (#194): an optional strict context.recentTurns on jobs.submit, stored in the new nullable assistant_jobs.context_json column (migration 14). The prompt adds the turns and the earlier phone requests as a data block. A Mac on 0.30.0 or older answers bad_request and the phone retries once without context.

Changed

  • Phone voice follows "Speak answers" plus an OpenAI key on the Mac (#193). The remoteVoice setting, its REMOTE_VOICE variable and the Remote settings switch are removed, and a stored value is ignored. Changing "Speak answers" reconnects remote connections, and turning it off ends an active phone voice session. Without a key the phone shows "No OpenAI key on the Mac".
  • cards.decide follows the remoteCreate switch; with it off the phone shows "Confirm on Mac" (#193).
  • Phone voice sessions close when the app goes to the background and after 3 minutes of idle; prepare timeouts are ordered host 51.25 s < bridge 60 s < phone 75 s, so a slow prepare cannot leave an ownerless billed session (#193).
  • The bottom text field sits above the floating tab bar and the keyboard (#193); the microphone permission text says live voice audio goes through the Mac to OpenAI.
  • Desktop tsconfig.web.json pins React types, because pnpm hoisted @types/react 19 after the Skia install (#193); this affects typecheck only.

Fixed

  • A long dictated task sent through island voice is no longer cut: the text starts after a model reply of at least 3 words or after the previous delegation, not after a human pause, and silence before the delegation no longer marks the Request partial, so the host prepares actions instead of asking to repeat (#192).
  • The first device build crashed on opening the voice screen (Cannot read property 'c1' of undefined); the fix was superseded when the orb was removed (#193).
  • Phone Live sessions close reliably and a phone session can idle-close while a card waits (#193).
  • CI test fix: packages/core/src/mcp/server.test.ts is green and hermetic again; it no longer reads PARLEY_* variables from the process environment and expects the current wait_for description (#194).

What is not proven yet

  • Nothing was checked end to end from the iPhone: the swarm rendering, emotions, the sphere pulsing with the voices, frame rate and JS-thread load, the text field position, audio, echo, latency, barge-in, Face ID, the app lock over the card sheet and background behaviour. Release builds were installed on an iPhone 17 Pro but nothing on screen was checked.
  • Delegation, cards and the "Speak answers" gate were not exercised against a host built from this release, and a spoken follow-up through a real CLI job was not run.
  • The Hermes behaviour of the phone's context mapping is covered by vitest only; jobs are not re-read after a bridge reconnect mid-session (backlog b-029).
  • A live run of the dictation fix with a real voice was not done. The Whisper path still stops recording after 1.2 s of silence (backlog b-028).

Parley 0.30.0

Choose a tag to compare

@github-actions github-actions released this 05 Nov 10:41
404596d

Impact

  • Goal: Talk to the assistant in a live voice dialogue that keeps going while work runs in the background, open sites behind HTTP basic auth in the built-in browser, keep the phone in step with the Mac after an update and in large projects, and let a lead that re-tasks a finished session wake when it reports.
  • Behaviour: With "Speak answers" on, the assistant hotkey starts a live GPT-Live dialogue; requests go to background assistant jobs and their answers are spoken in a pause, while the island shows a compact face that follows the voice and picks an emotion. With it off, the hotkey keeps starting Whisper dictation. The built-in browser signs in to basic-auth sites from user:pass@ in the address or from a sign-in card on the tab. After an app update the phone bridge of the old version is restarted by itself. The phone gets a much smaller workspace snapshot, its room Reply also addresses the quoted author, and it can no longer create a room that pulls a session out of an autonomous run. An agent that reports done or failed now sends a letter to the session that gave it its latest task.
  • Numbers: Live voice (PR #183): tests touched by the last tasks pass (desktop 10,111, host 4,148, protocol 543); GPT-Live emotion decisions median 154.5 ms, p95 496 ms (n = 22); a full run on the final tip was not measured. Basic auth (PR #184): browser_open on a page waiting for sign-in returns in 605 ms instead of the 15 s load wait. Bridge restart (PR #182): 11 new tests, desktop 9,961 passed. Phone snapshot (PR #186): 3,507,193 B → 33,961 B on a synthetic large map (1.0% of the 5 MiB frame cap); the live project was not measured. Report letter (PR #189): 157 of 157 in the touched test files.
  • Screens: The live dialogue was checked by the human in a test window, without saved screenshots. The basic-auth card was captured locally at 800×500, not attached. The phone Reply change was not run on a device or simulator.
  • For the human: Turn "Speak answers" on and press the assistant hotkey to try the live dialogue. Open a basic-auth stand once with user:pass@ and once without. After updating, check that the phone's Diagnostics shows the new bridge version.
  • Risk: Medium. The live dialogue is new and its phone and Telegram paths were not verified. The bridge restart drops the phone connection for a few seconds once. The agent guidance line changed, so every session's system prompt text is different from 0.29.0.
  • Cost: Live dialogue minutes are billed to the person's OpenAI key; emotion decisions add under $0.001 per minute of talk (estimate). Runtime cost on the Mac is not measured.
  • Verdict: Ready to release; the live checks listed in "What is not proven yet" are still open.

Added

  • Live voice dialogue on the island (#183): with "Speak answers" on, the assistant hotkey starts a GPT-Live dialogue and a second press ends it. The voice acknowledges a request, hands it to a background assistant job, keeps talking and speaks the answer in a pause; stale answers are not spoken. During the dialogue the island shows only a face: the mouth follows the voice, a cloud shows while you speak, a sphere while a request runs, and GPT-Live picks calm, joy, sad, surprise or anger. Esc ends the dialogue, collapsing the island keeps it running. If Live is refused, the hotkey falls back to Whisper dictation and says why.
  • HTTP basic auth in the built-in browser (#184): https://user:pass@host works from the address bar and from agent browser_open / browser_navigate, and a page that asks for sign-in shows a card with Username and Password over the tab. Credentials stay in memory only and are removed from the visible URL, saved layouts and agent results. A sign-in is shared by all tabs until restart, as in Chrome. Only the Basic scheme is handled.
  • An agent that reports done or failed sends a letter to the session that gave it its latest task, so a lead waiting on its inbox wakes (#189). Inside a room or a swarm nothing extra is sent; a repeated report replaces the unread letter.

Changed

  • Reply in a phone room also addresses the author of the quoted letter while they are still a member, as the window does (#188).
  • The phone bridge gets its own workspace snapshot with only what the phone shows: the snapshot of a large project dropped from 97.5% of the frame cap to about 1%, and the host log warns when it passes 80% (#186). Windows get the same snapshot as before.

Fixed

  • After an app update the phone no longer talks to the bridge of the old version: Parley restarts a running bridge whose version differs from the app, once per launch (#182). Paired devices and relay settings are kept, and the phone reconnects by itself.
  • The phone can no longer create a room that takes a session out of an autonomous run; it gets "the phone does not change sessions of an autonomous run" instead (#187).
  • An agent waiting on a page that asks for basic-auth sign-in no longer hangs on the 15 s load wait; it gets a short hint and never sees the typed password (#184).

What is not proven yet

  • The live dialogue was accepted in a test window only; phone and Telegram channels, the anger emotion, mixed emotions and Russian speech for emotion decisions were not checked.
  • Basic auth was not tried through a real proxy or on a real stand.
  • A real update of the packaged app with the phone reconnecting to the restarted bridge was not run; quitting the app during the restart can leave no bridge until the next launch.
  • The phone snapshot size was not measured on a live project, and the phone Reply change was not run on a device.
  • The report letter was not run through a live host with real sessions.

Parley 0.29.0

Choose a tag to compare

@github-actions github-actions released this 04 Nov 13:53
6611833

Impact

  • Goal: Let the assistant speak through the person's own OpenAI key instead of a local voice, give it durable conversations, jobs and notifications that the window and Telegram share, make the relay setup wizard install next to the person's own web server, and stop finished session worktrees from piling up on disk.
  • Behaviour: Answers are spoken through OpenAI when a key is saved and "Speak answers" is on; without a key they stay text and the speaker icon says why. The local Qwen3-TTS voice is removed and its old weights are deleted on the first launch. Assistant history is stored in the database, so the island and Telegram share it and it survives a host restart. Telegram notifications go through a new notification store, and an event is not sent twice after a restart. A phone voice backend exists on the host and is off by default ("Allow paid voice from the phone"). The relay wizard reads the server, picks a layout (its own Caddy, a site added to your Caddy, or its own Caddy behind nginx) and shows every file it will change before Run. Parley removes the worktree folder of a closed session or archived room by itself when nothing in it is uncommitted. Stopping the host during a CLI update no longer throws on macOS.
  • Numbers: Voice and assistant core (PR #179): 16 commits, 154 files, +16,043 / −4,432 against master; the full suite was not run locally, CI runs it. Relay wizard (PR #175): desktop 10,068 tests passed, 22 skipped, 0 failed (515 files); Docker stands 15 of 15 in 156 s; end-to-end wizard test 1 of 1 in 18.5 s; 71 files, +7,543 / −306. Worktree cleanup (PR #174): one workspace had 80 session worktrees, 35 folders were on disk at 47 GB, and removing 27 by hand freed 17.4 GiB; its tests were not run locally. EPERM fix (PR #178): host tests 197 files, 3,843 passed, 7 skipped; update-run.test.ts passed 20 of 20 runs in a row. Install time on a real server, the cost of spoken answers and runtime cost on the Mac are not measured.
  • Screens: The relay wizard has five screens of the real window with a scripted SSH connection (PR #175). The Voice provider section was checked by hand in a dev window, without screenshots. Worktree cleanup and its Settings list were not checked in the built app.
  • For the human: Save the OpenAI key in Settings → Assistant → Voice provider, run Check, and turn "Speak answers" on again after the update. Watch whether Telegram notifications still arrive. Run "Install or update" in the relay wizard on a real server to see the plan. Look at Settings → Projects → Worktrees after the first start.
  • Risk: Medium. The Telegram notification path is new and was not run against a real bot. Deleting the Qwen weights cannot be undone. GPT-Live voice sessions were not run against real OpenAI, and the notification outbox is at-least-once. The relay wizard now edits files of the person's web server; it was exercised on real Caddy and nginx in test stands, never on a real server. Worktree removal was not run in the built app.
  • Cost: Spoken answers and voice minutes are billed to the person's OpenAI key; the daily limit caps phone voice. Runtime cost on the Mac is not measured.
  • Verdict: Ready to release; whether voice, Telegram notifications, the wizard and worktree cleanup work for real is shown only by the checks listed in "What is not proven yet".

Added

  • The island speaks answers through OpenAI: pick a voice and save an OpenAI API key in Settings → Assistant → Voice provider (API). Without a key answers stay text and the speaker icon says why. The text of every spoken answer is sent to OpenAI and billed to your key. OpenAI removes the model used for speech (gpt-4o-mini-tts) on January 6, 2027; the voice will need a move to another OpenAI API before then.
  • Voice provider has a daily limit in minutes, set next to the key in Settings → Assistant.
  • Assistant conversations are stored in the database: the island and Telegram share one history, and it survives a host restart.
  • "Allow paid voice from the phone" in Settings → Remote access lets a paired phone open a paid voice session within the daily limit. It is off by default; a session closes when the device is revoked or disconnects, when Parley quits, or when the setting is turned off.
  • Parley removes the worktree folder of a session by itself once the session is closed, or its room or workspace is archived, and nothing in the copy is uncommitted. A branch already merged into its base goes too; an unmerged branch stays. A session that wakes up after its copy was removed gets the copy back from its branch.
  • Settings → Projects → Worktrees lists the copies Parley could not remove (uncommitted files, git refused, unsaved tab, still running) with their size, and offers Remove copy and Remove all.
  • One-button install next to your own web server: the wizard adds a site to your Caddy (in Docker or under systemd) or, for nginx, runs its own Caddy on port 8443 behind one server block in nginx. It changes only its own file or its own marked block, shows every file, the backup in /var/backups/parley-relay/, the check and the reload before you press Run, and restores the file when the check or the reload fails (nginx is checked with nginx -t before the reload). Servers it cannot change keep the manual snippet.

Changed

  • Telegram notifications (needs you, finished, room decisions, letters) now go through the new notification store, and an event is not sent twice after a restart.
  • "Speak answers" is switched off once on update, because each spoken answer is now billed to your key; turn it on again in Settings → Assistant.
  • A worktree copy is never removed while its agent runs, while a window tab of its files has unsaved edits, or while no up-to-date window is connected. Changes of a closed session keeps working without the folder: its commits, the diff, Merge and Discard are all there.
  • Repeating the wizard, rolling back and removing follow what the server shows now; a working manual proxy install keeps its layout.
  • The image download shows its progress (megabytes when the server's Docker API is reachable, layers otherwise) and can be stopped; a download may still finish on the server.
  • Esc and a click outside no longer close the wizard. Closing it during a run only hides it: the run goes on, and Settings → Set up on my server… reopens the same run or its result, also after the window is reloaded. Quitting Parley ends the record; commands already started on the server finish on their own.

Fixed

  • Stopping the host during a CLI update no longer throws on macOS: an EPERM from the group kill of the installer is treated as "the group is already gone".
  • The relay setup wizard no longer mistakes a foreign container for its own earlier install: who holds port 80 and 443 is read from the listeners and the running containers, not guessed from the process name or from an old .env, and a stopped container that will take the ports back stops the wizard from installing its own Caddy. On a server whose Caddy owns both ports the wizard no longer plans a second Caddy.
  • Commands the wizard starts on the server keep running when the SSH connection drops, and a new run does not start while a command of the previous one is still running.
  • Removing the relay also removes the containers an earlier layout left behind and, with "Also delete the relay data", its leftover volumes; it takes its own site out of your web server first.
  • The Relay field accepts an https:// address; http:// is refused with a reason.

Removed

  • The local Qwen3-TTS voice is gone: the speech engine, the voice picker and the weight downloads in Settings → Assistant are removed. On the first launch of this version Parley deletes the old weights from ~/.parley/desktop/voice/tts, which frees up to 3.5 GB; Whisper dictation models are not touched. The assistant keeps speaking about itself in the same gender (it is carried over from the old voice choice).

What is not proven yet

  • Telegram notifications on the new path were not run against a real bot. Spoken answers and the phone voice session were not run against real OpenAI, and billing totals were not compared with the OpenAI usage page.
  • Automatic worktree removal and the Settings → Projects → Worktrees list were not checked in the built app.
  • The kernel EPERM was reproduced only with a mock locally; the real check is CI on macOS.
  • Nothing in the relay wizard was run against a real server.
  • Certificate issuance by the person's Caddy for the wizard's site, and the HTTP-01 check through nginx to the wizard's own Caddy, were not run end to end.
  • Caddy under systemd and nginx in Docker were covered by unit tests only, with no test stand; the nginx blocks were checked with a real nginx -t.
  • The image download progress was parsed from a stream captured from Docker Desktop, not from Docker CE with overlay2; the test stands preload images, so their download step is skipped. Whether Docker stops a download after the window is closed or cancelled is not verified, and the window does not promise it.
  • In a packaged app, the test-only SSH seam is closed by code and a unit test only; keeping the run when quitting is cancelled was checked by code only; the end-to-end wizard test ran on macOS only.
  • How fast a silent network loss is detected (SSH keepalive) is not measured.

Parley 0.28.1

Choose a tag to compare

@github-actions github-actions released this 03 Nov 17:41
8875924

Impact

  • Goal: Let the Settings → Remote access wizard ("Set up on my server…") install the relay on a real server, which 0.28.0 refused because the release never published the relay image.
  • Behaviour: The release now builds the relay image for amd64 and arm64, pushes it to GHCR (ghcr.io/kalmbik61/parley-relay) and the app pins its digest at build time. A release without a valid digest is not built, and the release is not published while the image cannot be pulled without a login. Nothing else changes for users.
  • Numbers: From the runs on this branch: 5,732 core tests passed and 2 failed (the two contextFromEnv failures that also fail on master), 3,813 host, 525 protocol, 9,830 desktop and the other packages' tests passed; pnpm build, root typecheck and pnpm lint were clean; the frame tests (62) passed. A desktop build with a fake digest in the environment has it in the main bundle, and without it the bundle keeps the all-zero placeholder. Image size and build time are not measured: the image was not built.
  • Screens: None; no screen changed. The wizard was not opened.
  • For the human: If the first release push leaves the parley-relay package private in GitHub, make it public once (Packages → parley-relay → Package settings → Change visibility); the publish step stops with that instruction and "Re-run failed jobs" continues. Then run the wizard on a real server.
  • Risk: Medium for the release itself: the new job and its anonymous-pull gate have not run on GitHub yet (no dry run of this workflow exists before it is on master). The app and the host are unchanged.
  • Cost: Release time grows by one Linux job that builds two architectures (QEMU); not measured.
  • Verdict: Ready to release; whether the wizard now works end to end is shown only by the check on a real server listed in "What is not proven yet".

Fixed

  • The relay setup wizard can install the relay: the release publishes the relay image to GHCR for amd64 and arm64 and the app pins its digest, instead of the placeholder that made the wizard refuse every real server.
  • A CI-only fix: the source frame scan no longer flags an agent config path in a mobile dev fixture.

What is not proven yet

  • The wizard on a real server with a real certificate (A18b) has not been run by us, and neither has the new release job on GitHub.

Parley 0.28.0

Choose a tag to compare

@github-actions github-actions released this 03 Nov 16:12
59a401a

Impact

  • Goal: Make the iPhone app usable on a real phone, let Parley keep the agent CLIs from stopping a session at a startup prompt, and bring the Board and a tidier status bar into the window.
  • Behaviour: The phone can wake, stop, put to sleep, close and move sessions to another provider, manage a whole room and show chat Markdown like the window, behind an app lock with Face ID. Codex no longer shows its update picker; Parley checks Codex and Claude versions daily and offers an update; Claude's "new MCP servers found" prompt becomes a Parley card, off by default. The Board collects tasks of all projects. The status bar shows connected providers only and folds the rest into an ellipsis popover.
  • Numbers: From the PR checks: the iPhone work ran at 3,802 host, 9,659 desktop, 523 protocol, 207 remote, 150 remote-client and 236 mobile tests passed, with pnpm lint and root typecheck clean; the CLI-update work ran at 5,651 core, 3,780 host, 516 protocol and 9,642 desktop tests passed; two contextFromEnv failures in core also fail on master. The iPhone PR changed 317 files (+19,803 / −1,689) and the CLI-update PR 59 files (+4,325 / −58). The Claude startup picker appeared once without the MCP decision and 0 times with it. The final run of this release is in the release PR.
  • Screens: iPhone screens were captured in the iOS 27.2 simulator (light and dark); the MCP card, the Settings row and the status-bar mark were captured in a test harness, not in the real window. The Board was not checked in a live window at 800×500.
  • For the human: Install the iPhone build and check the room menu, the session menu, the MCP card, Resume and Face ID on a real device. Press Update on the first CLI update yourself. The Board needs a host restart after the update to show card states.
  • Risk: Medium. The project MCP card is a trust decision about code execution (every unclear case enables nothing). Several phone actions raise a Mac notification, and some paths were checked only against the code (for example "Resume and send" on a Codex session). iOS 17–25 was not tested.
  • Cost: Runtime cost is not measured.
  • Verdict: Ready to release as a beta of the phone features; the checks on a real iPhone listed in "What is not proven yet" remain open.

Added

  • Board. One board for all projects: Backlog, In progress, Review and Done. Write a task by text or voice, send a card to a session or room with a button or by dragging it (Undo for 5 seconds), accept or return the result. The Backlog tab of the project panel moved to the board.
  • Board groundwork. Backlog cards get a Review state and timestamps, kept in .parley/board.json next to the backlog. Agents can take a card when you ask (backlog_take) and hand it into Review with report(..., backlog). The host serves card states and moves cards between columns and projects.
  • CLI updates from Parley. The host checks the latest Codex and Claude versions once a day in the background (from GitHub, brew and npm), stays silent offline and detects how each CLI was installed: standalone, npm or brew. Settings → Providers shows a row such as "Codex 0.162.0 → 0.166.0 · standalone · Update · Skip this version", and the status bar shows a "↑" mark. Update runs the binary's own update command with no shell, a scrubbed environment and a 5-minute timeout, in its own process group that is killed on timeout and when the host stops. Running sessions keep the old binary; new launches use the new one.
  • Project MCP card. Claude's "N new MCP servers found in this project" prompt no longer stops a session at the terminal. Parley shows a card in the window, the island and the phone with one switch per server, and holds the launch or resume until you decide. It is off by default and anything unclear enables nothing. The decision is tied to each server's name and a fingerprint of its whole entry, covers every worktree of the repository and writes nothing into the project.
  • iPhone app on a real device. A Wi-Fi run script builds a Release app with an embedded bundle; the app has an icon. From the phone you can:
    • wake a sleeping session with Resume, or "Resume and send" for a message to a sleeping agent;
    • stop a turn, put a session to sleep, continue it on another provider or close it from its menu;
    • open the project MCP card and enable servers;
    • message agents and see the session feed; a launch from a trusted folder no longer stops at Claude's trust screen;
    • use the room ⋯ menu: Put all to sleep, Wake all, Copy room ID, Archive room and Delete room. Archive and Delete ask for Face ID (or the passcode); Delete keeps the room's sessions and Archive stops its agents, as in the window.
  • App lock on the iPhone. The app asks for Face ID on open and after 5 minutes in the background, locks again after 5 minutes idle, covers its content in the app switcher, locks above open sheets and does not lock while no Mac is paired.
  • Mac notification with "Revoke this phone". Weighty phone actions raise a notification on the Mac that can revoke the phone at once: trusting a folder, Allow "Always", plan auto-accept, a provider switch, starting a session, enabling MCP servers and closing a session.
  • Chat Markdown on the phone. Agent replies render natively like the window's chat: GFM tables (scrolling sideways), fenced code with a Copy button, nested and task lists, quotes and strikethrough, with the window's reveal, line-break and mention rules. Unusual input may show as plain text instead of formatted.

Changed

  • Codex starts without its own update picker: every Codex launch and resume passes -c check_for_update_on_startup=false. Your ~/.codex/config.toml is untouched.
  • Face ID on approvals is replaced by the app lock. The 0.27.0 note "Face ID on approvals" no longer applies: the phone does not ask for Face ID per Allow, Accept or plan approval. It asks when the app opens or comes back, and for Archive and Delete of a room.
  • Phone actions that start, message or manage agents sit behind the window switch "Allow starting and messaging agents from the phone", have strict parameter rules on the bridge and the host, and are rate-limited and recorded in Activity.
  • The phone does not touch sessions of a running autonomous engine, or its rooms. Stop, sleep, close, provider switch and the room menu actions are refused for them, on the phone and on the host. Deleting, renaming, model, mode and compact stay closed to the phone.
  • The status bar shows only connected providers and no longer has "Add provider" (providers are set up in Settings). Providers that do not fit move into an ellipsis popover that opens on click and recalculates when the window, the providers or the limits change.
  • iPhone layout: rooms and swarms nobody owns open as containers, bar buttons have no capsules, one bar palette in light and dark, the footer rides above the keyboard and large titles are drawn in the content.
  • The window sync methods works.sync and works.mailState are not opened to the phone; the phone keeps using the works list and its change events.

Fixed

  • The macOS release build raises the system limits on open files before packaging and logs the limits it started from, which fixes "too many open files" failures at packaging.
  • The status bar no longer shows disconnected providers or squeezes its segments when the window is narrow (checked at 800, 1100 and 1400 px).

What is not proven yet

  • On a real iPhone, not yet run: Resume and "Resume and send", the session menu actions, the MCP card, the lock above sheets, the edge swipe, the large-title fix, the keyboard, Face ID for Archive and Delete, the Markdown rendering and the room menu. The Mac notifications for close, provider switch and MCP enable were not checked against a real host and bridge. iOS 17–25 was not tested.
  • The last fixes to Markdown rendering on pathological input were merged without a second independent review.
  • A real codex update or claude update has never been run, and it is not shown live that the Codex picker is suppressed (the control launch without the flag did not show it either).
  • The relay on a real server and live push are still open, as in 0.27.0.