* ui: what's new in v7.1.4, security audit by Trail of Bits; blog placeholder
* ci: iOS and desktop references of v7.1.4 what's new
* blog: placeholder moved to its own PR
* ui: shorter v7.1.4 what's new texts
* ui: v7.1.4 audit item: ask contacts to upgrade, report soon
* android, desktop: crowdfunding image says you own your identity
* android, desktop: crowdfunding image sizes from the 1200x400 source
* ci: desktop references of v7.1.4 what's new with the new image and texts
* ui: crowdfunding caption as before, page headline Own a part of SimpleX Chat, report on its own line
* android, desktop: phone corner as in the original crowdfunding image
* blog: Trail of Bits security audit permalink
* blog: fixes in previous versions, no section placeholders
* blog: Anthropic OSS Scanner program
* blog: using frontier models
* blog: OSS Scanner program that uses frontier models
* blog: upgrade to v7.1.4+
* blog: fixes in SimpleX Chat apps
* blog: fixes in SimpleX Chat app
* blog: fixes first
* blog: security process line
* blog: OSS Scanner in the security process line only
* blog: links to Trail of Bits and OSS Scanner
* website: gold text holds its colour to the end
* website: gold text ends in the original colour
* website: stretch the gold gradient instead of extra stops
* mcp: step lines end with their duration in small print, without the check mark
* mcp: the whole step line in small print
* mcp: a ! in a step line shows as ǃ, so the whole line stays in small print
* plan: mcp-activity
* plan: mcp-activity list format
* plan: mcp-activity answers and live step lines
* mcp: a silent line per step of Claude's work, completed at its end
* plan: mcp-activity as implemented
* mcp: finalize step lines within a day and load only the hook's modules
* plan: mcp-activity review decisions as implemented
* plan: mcp-session-usage
* plan: mcp-live-answers
* plan: mcp-live-answers answers and the end line with the usage
* plan: mcp-session-usage, plan usage by the status line, one end line
* plan: mcp-session-usage, the end line settled with live-answers
* plan: mcp-live-answers end line with the plan usage, shared fast request
* plan: mcp-live-answers keeps tokens in context
* plan: mcp-session-usage, status line through postToService
* mcp: end live step lines by the wall clock
* mcp: exact spec ranges and measured hook load time
* mcp: Claude's answers live as Claude writes them, and one end line per turn
A prompt that starts a turn gets an empty silent live message, which the turn's first text, step or answer fills. The MessageDisplay hook, dist/display.js, passes each batch of Claude's text to the service, and the hub streams each text into a silent live message, updated at most every 3 s and finalized at its end. At Stop the streamed answer is claimed, or the answer is posted silent, and the end line !- ✅ Done in DURATION! follows as the turn's only alert.
* plan: mcp-live-answers as implemented
* mcp: usage of each turn in its end line, model and effort switch lines
* plan: mcp-session-usage as implemented
* mcp: one refusal post for a refused answer, in the turn's opening message
A text that a group preference refuses counts as the answer at Stop, so the answer is not posted again. A refused post that would fill the opening message fills it with its refusal text. A refused text ends at once, also when it outgrows a message, and an update scheduled before its end is skipped. Plan decision 37.
* mcp: live posts survive a lost opening message and end within a day
A failed update of the opening message drops it, and the post is sent as a new message; a text that was never posted no longer stands for the answer. Texts and opening messages end 23 hours after their send by the wall clock, as steps do. When the update with a refusal fails too, the opening message gets ⏹️ Stopped and the end line follows. The opening message is kept before User's post and sent after it.
* docs: the status line step of the plugin README
* mcp: a dropped opening message ends with ⏹️ Stopped
When the update of the opening message fails without a refusal, the hub finalizes it, so after a transient failure it does not stay live.
* mcp: effort level only from the status line once it reports
Hooks report the turn's level, xhigh after ultrathink, while the status line reports the session's level; docs: effort updated at each tool step, data folder writable only by the user.
* mcp: end line without the check mark, small print only
* mcp: one token format, the compaction line's, in the end line
* mcp: append the end line to the last message of the answer
* mcp: keep a finished text live until Stop adds the end line, docs
* mcp: priority 1 in the update that adds the end line, quotes of answers without it
* mcp: an answer without a turn record quotes no prompt pushed before the latest answer
* core: lock delivery and relay request work items on PostgreSQL
* core: retry store transactions aborted by PostgreSQL deadlocks
* core: show skipped messages followed by agent messages
* core: read delivery and relay request work items in one snapshot
* core: use the conflict retry of the store transaction for work item reads
* core: show integrity errors of agent messages from MSG without body
* core: show integrity errors from MSGERR, log MSGERR without an error
* core: update simplexmq, set server forward workers in tests
* core: update simplexmq
* plan: mcp-activity
* plan: mcp-activity list format
* plan: mcp-activity answers and live step lines
* mcp: a silent line per step of Claude's work, completed at its end
* plan: mcp-activity as implemented
* mcp: finalize step lines within a day and load only the hook's modules
* plan: mcp-activity review decisions as implemented
* plan: mcp-live-answers
* plan: mcp-live-answers answers and the end line with the usage
* plan: mcp-live-answers end line with the plan usage, shared fast request
* plan: mcp-live-answers keeps tokens in context
* mcp: end live step lines by the wall clock
* mcp: exact spec ranges and measured hook load time
* mcp: Claude's answers live as Claude writes them, and one end line per turn
A prompt that starts a turn gets an empty silent live message, which the turn's first text, step or answer fills. The MessageDisplay hook, dist/display.js, passes each batch of Claude's text to the service, and the hub streams each text into a silent live message, updated at most every 3 s and finalized at its end. At Stop the streamed answer is claimed, or the answer is posted silent, and the end line !- ✅ Done in DURATION! follows as the turn's only alert.
* plan: mcp-live-answers as implemented
* mcp: one refusal post for a refused answer, in the turn's opening message
A text that a group preference refuses counts as the answer at Stop, so the answer is not posted again. A refused post that would fill the opening message fills it with its refusal text. A refused text ends at once, also when it outgrows a message, and an update scheduled before its end is skipped. Plan decision 37.
* mcp: live posts survive a lost opening message and end within a day
A failed update of the opening message drops it, and the post is sent as a new message; a text that was never posted no longer stands for the answer. Texts and opening messages end 23 hours after their send by the wall clock, as steps do. When the update with a refusal fails too, the opening message gets ⏹️ Stopped and the end line follows. The opening message is kept before User's post and sent after it.
* mcp: a dropped opening message ends with ⏹️ Stopped
When the update of the opening message fails without a refusal, the hub finalizes it, so after a transient failure it does not stay live.
* plan: mcp-agent-profile
* plan: mcp-agent-profile, answers Q1 (b) and Q2 (b)
* plan: mcp-agent-profile, lists render on GitHub
* mcp: User has the peer type of a person
* ui: show the peer type placeholder of members and contacts
* plan: mcp-agent-profile, answers to the user's notes
* ui: compare link icons with peerTypeIcon in the desktop test
* ui: snapshot references of the peer type placeholders
* android: peer type placeholder of a caller on the lock screen
* ios: agent icon of a link in the compose context at text size
* plan: mcp-agent-profile, review fixes
* ios: snapshot references with the compose context line of a link
* core: send a change of the peer type alone to groups
* mcp: User's peer type reaches existing session groups
* plan: mcp-agent-profile, Q1 (a)
* mcp: mark the agent profile item delivered in the roadmap
* plan: mcp-activity
* plan: mcp-activity list format
* plan: mcp-activity answers and live step lines
* mcp: a silent line per step of Claude's work, completed at its end
* plan: mcp-activity as implemented
* mcp: finalize step lines within a day and load only the hook's modules
* plan: mcp-activity review decisions as implemented
* plan: mcp-session-list
* plan: mcp-session-list, every session in one message (Q2 B)
* mcp: end live step lines by the wall clock
* mcp: exact spec ranges and measured hook load time
* mcp: a list of every session and its state in the Main group
* plan: mcp-session-list as implemented
* mcp: list of sessions: unknown states count cards, bounded record reads, stop edit before the card wait
* plan: mcp-session-list merged with master
* mcp: ROADMAP marks the items delivered since 0.3.0 with ✅
* plan: mcp-context-summary
* plan: mcp-context-summary answers and gear emoji
* mcp: a line when a session's context is summarised
* mcp: take only a compaction boundary created before the hook started
* plan: mcp-activity
* plan: mcp-activity list format
* plan: mcp-activity answers and live step lines
* mcp: a silent line per step of Claude's work, completed at its end
* plan: mcp-activity as implemented
* mcp: finalize step lines within a day and load only the hook's modules
* plan: mcp-activity review decisions as implemented
* plan: mcp-allow-tool
* mcp: approve a tool for the rest of a session with one tap
* plan: mcp-allow-tool as implemented
* mcp: docs of the approval of a tool for the rest of a session
* mcp: record the checks of the PreToolUse hook with Claude Code
* plan: mcp-allow-tool citations of the new code
* mcp: keep the approvals of tools while the session's process re-attaches
* plan: mcp-allow-tool review round 1
* mcp: end the approvals of tools when the session's group is lost
* mcp: tool approvals end when the session's group is lost, docs and tests
* mcp: tool approvals follow the process that opened the session last
A process is identified by its ID and its start time, read from /proc/PID/stat on Linux and from ps on macOS. A registration from a process with the same ID and another start time ends the approvals.
/attach has the session server's parent process ID. While two processes have the session attached, only the attachments of the process of the last /session get the approved tools; the others get an empty list.
Tests cover the end of the approvals at a load of a lost group.
* plan: mcp-allow-tool decisions 36 and 37, the group's loss in the rules and the design
* mcp: a process whose start time is unknown counts as another process
A registration of the session's process ends the tool approvals when its start time can't be read, on systems other than Linux and macOS and after a failed read. The start time is read only for a process ID that is a positive integer; on macOS, /bin/ps runs with a 2 s timeout.
* docs: MCP specs link files and name functions, without line numbers
* mcp: spec pointers above the functions, checked by a unit test
* mcp: spec pointers to API sections first, for every declaration described
* mcp: spec test reports malformed pointers and those not above a declaration
* plan: mcp-reactions
* plan: mcp-replies
* plan: mcp-replies, one vocabulary with reactions
* plan: mcp-reactions, quote vocabulary of mcp-replies
* plan: mcp-reactions, ReplyTo names of mcp-replies
* plan: mcp-replies, replyTo from callers, file name in quotes
* plan: mcp-replies, itemSender stays private, quoted file names
* plan: mcp-reactions, Claude named by the hub's profile name
* plan: mcp-replies, Q1 decided: serve returns the new reply_to
* plan: mcp-reactions, Q1 decided, Q2 with a receipt reaction
* plan: mcp-replies, quote line before the reply, as the user asked
* plan: mcp-reactions, Q2 decided, reply form with a quote line
* plan: mcp-reactions, quote line cut at 200 characters
* plan: mcp-replies, quote of 200 characters, ellipsis when cut
* plan: mcp-replies, one quote line of 200 characters with media type
* plan: mcp-reactions, quote line with the media type
* plan: mcp-reactions, blank lines before continued decision lists
* plan: mcp-replies, blank lines before the numbered lists
* mcp: tests of the quoted message of a reply
* mcp: Claude gets the message a reply quotes
* docs: line links of protocol types in the MCP architecture
* mcp: quote lines end at every line break and keep emoji whole
* mcp: tests of reactions passed to Claude
* mcp: spec links of the reply change cite the queue and push lines, labels equal their anchors
* plan: mcp-replies, tests of the review fixes, test names as in the code, the closing-tag escape of Claude Code
* mcp: quotes for Claude drop bidi controls
* mcp: Claude gets reactions as emoji replies to the reacted message
* plan: mcp-reactions, decisions on the merged replies code
* mcp: reaction tests use the hub's Main group and the typed unknown reaction
* mcp: reactions reach Claude as the apps show them
* mcp: only known reactions reach Claude, others get a reply
* mcp: one reply per member and message for reactions Claude does not receive
* ui: show "Why SimpleX is built." in About opened from Settings
* docs: "Why SimpleX is built." in About opened from Settings
* android, desktop: keep About and its text clear of the bottom bar
* android, desktop: no blank bar above the text with the bottom bar
* android, desktop: About and why-built references
* ios: About from Settings references
* ui: revert About's iOS spacer and preview, the text's pane and top space
* docs: revert the About link notes in the apps' settings docs
* android, desktop: update the why-built page's preview references
* android, desktop: scroll the why-built page's text under the toolbar
* ios: keep the About link at the bottom of the screen, as in onboarding
---------
Co-authored-by: spaced4ndy-agents <342056592+spaced4ndy-agents@users.noreply.github.com>
* android, desktop: readable error when a server test fails
* android, desktop: network and proxy details in server test errors
* android, desktop: test the text of server test errors
* android, desktop: set the server error test's locale and case name
* android, desktop: narrow the server test error text fix
---------
Co-authored-by: spaced4ndy-agents <342056592+spaced4ndy-agents@users.noreply.github.com>
* plan: mcp-activity
* plan: mcp-activity list format
* plan: mcp-activity answers and live step lines
* mcp: a silent line per step of Claude's work, completed at its end
* plan: mcp-activity as implemented
* mcp: finalize step lines within a day and load only the hook's modules
* plan: mcp-activity review decisions as implemented
* mcp: end live step lines by the wall clock
* mcp: exact spec ranges and measured hook load time
* mcp: cite the hook's skip of tool uses exactly
* core: show the latest item in chat previews
* core: update query plans
* tests: pass values to badge test queries as parameters
* core: update query plans
* plan: mcp-replies
* plan: mcp-replies, one vocabulary with reactions
* plan: mcp-replies, replyTo from callers, file name in quotes
* plan: mcp-replies, itemSender stays private, quoted file names
* plan: mcp-replies, Q1 decided: serve returns the new reply_to
* plan: mcp-replies, quote line before the reply, as the user asked
* plan: mcp-replies, quote of 200 characters, ellipsis when cut
* plan: mcp-replies, one quote line of 200 characters with media type
* plan: mcp-replies, blank lines before the numbered lists
* mcp: tests of the quoted message of a reply
* mcp: Claude gets the message a reply quotes
* docs: line links of protocol types in the MCP architecture
* mcp: quote lines end at every line break and keep emoji whole
* mcp: spec links of the reply change cite the queue and push lines, labels equal their anchors
* plan: mcp-replies, tests of the review fixes, test names as in the code, the closing-tag escape of Claude Code
* mcp: quotes for Claude drop bidi controls
* plan: mcp-fixes
* plan: mcp-fixes reproduction at master
* plan: mcp-fixes list formatting
* mcp: link after an ended session start, Main group name Claude Control
* mcp: test the ready line after a start, the hook's machine error; docs
* plan: mcp-harness-notes
* mcp: tests for one-line notes of Claude Code's own prompts
* mcp: one-line notes of Claude Code's own prompts in the session group
* mcp: classify a repeated typed prompt by its own entry
* mcp: document the notes of Claude Code's own prompts
* plan: mcp-harness-notes as implemented
* mcp: notes of teammate messages and of prompts in long turns
* mcp: document teammate notes and the record rules of review round 1
* mcp: teammate note emoji, repeated events and idle notifications
* mcp: one-line sender names in notes, and docs that match the code
* mcp: docs state which prompts end tool-use cards and add turn records
* plan: mcp-harness-notes example lines from Claude Code 2.1.281
* mcp: remove HTTP serve and register modes
* mcp: read plugin options
* mcp: add daemon data root layout
* mcp: keep actions per session
* mcp: serve tools for one session profile
* mcp: add plain QR code text
* mcp: share the Main group across sessions
* mcp: promote only the first joiner to owner
* mcp: add the daemon socket protocol
* mcp: fix socket UTF-8 and late error handling
* mcp: open session agents and the hub
* mcp: order hub control work on one chain
* mcp: add the daemon
* mcp: fix daemon disconnects, stop and idle calls
* mcp: create the socket token atomically
* mcp: add the daemon client
* mcp: handle spawn errors and a stopped daemon
* mcp: add the stdio session server
* mcp: retry session calls after a daemon restart
* mcp: add the SessionStart hook and link commands
* mcp: remove unused shell quoting
* mcp: wire session, daemon and hook commands
* mcp: reject inherited names as commands
* mcp: add the Claude Code plugin
* mcp: add the plugin marketplace
* mcp: test the daemon end to end
* mcp: say Main group in tool descriptions
* mcp: document the plugin and the daemon
* mcp: record session titles from the hook
* mcp: allow long tool calls
* mcp: name the SimpleX daemon in texts
* mcp: quote no-owner texts and cite hook docs
* mcp: drop the project from title requests
* mcp: record Claude Code plugin checks
* mcp: qualify Claude Code check evidence
* mcp: start new profiles without preset contact
* mcp: remove unit test temp folders
* mcp: fix preset contact review findings
* mcp: expire each action with its own timer
* mcp: wait for decisions without a tick
* mcp: expire actions on core events and requests
* mcp: document the delivery poll at stop
* mcp: assert the socket handler error log
* mcp: complete only the session's own connects
* mcp: move closeServer to the test fixtures
* mcp: drop the name from session requests
* mcp: listen before the hub opens
* mcp: keep the approval mode per session
* mcp: pre-approve the skill commands
* mcp: a group per session under one Claude profile, approved by owners
* mcp: prompts, answers and tool-use approval in the session group, 0.3.0
* mcp: reply to prompts of stopped sessions, skip prompts echoed in a tag
* mcp: document the Claude Code plugin of 0.3.0
* mcp: name one-line commands in the plugin reference
* mcp: real-session checks without a channel command
* mcp: specify the Claude Code plugin, and serve as built in 0.3.0
* mcp: run the plugin from its own build and shrinkwrap, without npx
* mcp: start with a torn session file, and on file systems without links
* mcp: start the daemon with only the environment variables it uses
* mcp: one group per Claude Code process, re-attach, late contacts
* mcp: document one session per process, re-attach and the plugin launch
* mcp: hold prompts after a daemon start until the session attaches
* mcp: document prompts held after a daemon start
* mcp: pack production dependencies only, for a faster plugin install
* mcp: keep resumed sessions' groups, quote by hook start, order prompts
* mcp: document resumed sessions, turn records and ordered prompts
* mcp: quote each prompt once, post without refused quotes, answer first
* mcp: wait for a stopping daemon to release the lock
* mcp: double the re-attach delay once per attempt
* mcp: read a token file of another user as serve 0.2 did
* mcp: cut long prompts and answers to fit the daemon's body limit
* mcp: document quotes, refused quotes, the lock wait and long prompts
* mcp: open a titled new session only after its process registers
* mcp: document titles held until the session server registers
* mcp: skip late turn records and tag-only prompts, describe after failures
* mcp: take over the lock atomically, keep held titles across stops
* mcp: document turn records, tag-only prompts, the lock and held titles
* mcp: delete groups of sessions closed 7 days; no group for claude -p
* mcp: keep the approved mode in the session group, the link off /status
* mcp: apply leaving, removal and demotion in the Main group to sessions
* mcp: reply sends a file after an owner's approval when non-owners see it
* mcp: spec of closed groups, -p runs, mode, membership and reply cards
* mcp: resume after a running group deletion, continue past failed ones
* mcp: post terminal prompts in the current group of a resumed session
* mcp: show only the file's name and size on a reply card
* mcp: the hooks of a run Claude Code marks unattended post nothing
* mcp: serve lists its tools with the metadata of 0.2
* mcp: list leaves out the session's tool-use and mode cards
* mcp: one starter takes over a stale lock also without hard links
* mcp: test a resume after deletion, reply cards and demotion end to end
* mcp: document resumes after deletion, unattended runs and reply cards
* mcp: spec of round 5 fixes, with source links at their lines
* mcp: no permission relay in a run without a group or with invalid options
* mcp: spec of the permission relay of a run without a group
* mcp: every session keeps its group, claude -p runs included
* mcp: changes of the Main group's members leave session groups as they are
* mcp: every member who joins from the Main group prompts and approves
* mcp: reply cards match send cards; /approve N all sends later files too
While a session group has a guest, a member added without the Main group, the card of a reply shows its caption, the file's type, path and size, and an image's or a video's preview, as a card of send does. /approve N all approves that file, the other pending reply files and every later one of the group, until /revoke; the approval is kept in the group's custom data and counts while its approver joined from the Main group and stays in the group.
* mcp: the Main group says everyone in it is trusted with all sessions
The short description and the welcome message of the Main group, also of an existing one at the daemon's start, and a message at each member's join say that everyone in the group is trusted with all Claude Code sessions of the hub: they can join each session's group by /join N, prompt Claude and approve its actions.
* mcp: a session group says whether each joiner came from the Main group
When a member joins a session's group, Claude posts there that the member joined from the Main group, and their messages are prompts and they can approve actions, or that the member joined as a guest, whose messages are not prompts and who gets Claude's files only after an approval. The welcome message of a new session group says that members who join from the Main group prompt the session and approve its actions.
* mcp: test Main group members, guests and reply approvals end to end
A member who joins the Main group by an owner's link and a session's group by /join prompts and approves there, also after removal from the Main group; a guest added by a group link gets reply files after an approval, /approve N all sends later files at once, and /revoke ends it. The Main group and the session group post the join statements.
* mcp: document the trust of the Main group, guests and kept session groups
REFERENCE, README and TESTING describe that every member of the Main group prompts and approves in the sessions' groups, that changes in the Main group leave the sessions' groups as they are, the join statements, guests and the reply card with /approve N all and /revoke. The texts about deleted groups of closed sessions, runs without a group and the cascade of Main group changes are removed, as their behaviour was reverted.
* mcp: spec of the trust of the Main group, guests and kept session groups
The spec describes approvers as the members invited through the Main group, the statements of trust and standing, the reply card with /approve N all and /revoke, and Main group changes that leave the session groups as they are. The sections on deleted groups of closed sessions, runs without a group and the cascade are removed, flow 30 among them, and the source links point at the lines of this commit.
* mcp: claude -p and unattended runs get no session and no group again
A run whose CLAUDE_CODE_ENTRYPOINT is sdk-cli, sdk-ts or sdk-py, or whose CLAUDE_CODE_SESSION_ATTENDED is 0, gets no session and no group: its hooks post nothing, and its session server answers every call with the text of a run that is not interactive, without the daemon. Only the deletion of the groups of closed sessions stays removed.
* mcp: no group for the server of a claude -p run under a VS Code session
A claude -p run started by a command of a session of the VS Code extension or the desktop app keeps that session's entrypoint, and its MCP server gets the session's CLAUDE_CODE_SESSION_ATTENDED 1; only its hooks get 0. Its SessionStart hook now sends /title with unattended for its Claude Code process, and the daemon refuses /session from that process with status 403 for 10 seconds, before or after the title; the session server then answers every call with the text of a run that is not interactive and registers no more. The tests take the environments of a recorded run of Claude Code 2.1.319.
* mcp: Claude's channel and reply texts name members from the Main group
The channel instructions and the description of reply say that prompts come from the members who joined the session's group from the Main group, and that one of them approves a file while the group has a guest, in place of the owners.
* mcp: test that the session server stays out of the modern MCP era
Claude Code 2.1.319 registers no channel for a server that negotiates the modern protocol revision 2026-07-28. The test sends Claude Code's server/discover probe and its initialize, and expects Method not found and the revision 2025-11-25, so that an SDK upgrade that turns the modern era on fails the tests.
* mcp: document runs without a group and the refused server of claude -p
REFERENCE describes again the runs that are not interactive, and the refusal of the session server of a claude -p run under a VS Code session; TESTING restores the real-session checks of such runs, adds the one under a VS Code session, and names the recorded environments and the protocol era test.
* mcp: spec of runs without a group, the unattended mark and the MCP era
The spec describes again the runs that are not interactive, in flow 30 and the tables, with the mark of the process of a claude -p run under a VS Code session, the 403 of its session server and the end of its retries; it states the revision 2025-11-25 and the server/discover answer that keep the channel registered, and the channel instructions in their new words. Source links point at the lines of this commit.
* mcp: // passes a / command to Claude, /! an owner's ! command
In a session's group, every one-line message that starts with / is a command of the group. A message that starts with // reaches Claude without its first /, so //model sonnet arrives as /model sonnet. A message that starts with /! from a member whose member in the Main group is an owner reaches Claude as !...; from another member it gets the reply Only owners of the Main group can send ! commands to Claude. A message that starts with ! is not passed, and gets the reply Messages starting with ! reach Claude only from owners, as /!command.
* mcp: an unknown command in a session's group gets Unknown command.
The reply to a one-line / message that is not a command of a session's group no longer lists the commands, which the group's menu and the cards show; its text Unknown command. waits for the user's wording. The agent control chat of serve keeps its commands reply.
* mcp: guests' messages reach Claude as prompts
Every member of a session's group but User prompts the session, a guest added to the group directly too; approvals and tool-use verdicts still count only from members who joined from the Main group. Claude's channel instructions and the description of reply name the members of the group.
* mcp: split answers and terminal prompts at the size of a message
Answers and terminal prompts are posted in parts that each fit one message by the size check of send, fitsMessage, with the quote in the first part of an answer, in place of parts of 12000 encoded bytes: a Latin part holds 14962 characters, a Cyrillic part 7481 and a CJK part 4987. An answer quotes its prompt when the quote fits with an empty text.
* mcp: the option approve_guest_files turns the guests' file cards off
The plugin option approve_guest_files, a boolean on by default, passed to the session server as CLAUDE_PLUGIN_OPTION_APPROVE_GUEST_FILES: on, a file of reply waits for its card while the group has a guest, and /approve N all works as before; off, reply sends the file at once. The daemon applies the option of each /session and /title to all sessions, as the expiry, and refuses a config without it.
* mcp: test end to end that a guest prompts and each join is posted once
The trust test checks that the guest's message reaches the session as a prompt, and that the Main group and the session's group hold one join post for each member: the core raises joinedGroupMember for a member the hub hosts and connectedToGroupMember for one another member hosts, one of the two for each connection, in the same case of its CON handler.
* mcp: document //, /!, Unknown command., guest prompts, parts and the option
REFERENCE describes the commands and prompts of a session's group with // and /!, the reply Unknown command., the guests' prompts, the parts of a message's size, and the option approve_guest_files; README states the guests' prompts; TESTING adds a real-session check of // and /! and the e2e checks of guest prompts and single join posts.
* mcp: a space in the prompt queue of a session
Formatting of the line that queues a prompt.
* mcp: an answer drops the quote that leaves no room for its first character
The quote of an answer is kept when it fits with the answer's first character, so that the first part fits one message.
* mcp: spec of //, /!, guest prompts, parts and approve_guest_files
The spec describes the commands and prompts of a session's group with // and /!, the reply Unknown command., the guests' prompts, the parts that each fit one message with a quote that fits the first character, the option approve_guest_files, and one post for each join.
* mcp: document an answer without the quote that leaves it no room
REFERENCE states that an answer is posted without the quote when the quote leaves no room for its first character.
* mcp: a reply too large with its quote is posted without it
Claude's posts with a quote are sent again without it also when the core refuses them with largeMsg, as replies that quote a message near the size limit are.
* mcp: no command reply to a one-line / part that User posts
The control of a session's group drops the commands of User, the member of the hub's contact marked simplexMcpUser, in the order of the other commands, so a part of a terminal prompt that starts with / gets no reply.
* mcp: a part of a long text is searched within one message size
textParts searches each part among the next 15602 characters, the most a message holds, in place of the whole rest of the text; the parts stay the same.
* mcp: reply refuses a caption too long for a message with its file
reply checks the file's message with its caption as send does, before the post and before the card: text: too long for a message with this TYPE; shorten it.
* mcp: the daemon forgets the unattended marks older than 10 s
Each new mark of an unattended run removes the marks of 10 seconds ago and older, which no longer refuse a session server.
* mcp: test end to end the reply to a prompt as long as a message
The mirroring test sends the longest text the member's core sends to a session without Claude Code and waits for Session 1 is not running. without the quote; before 193f03f6c the core refused the reply with largeMsg and nothing was posted.
* mcp: document large replies, User's / parts, reply size, check 6
REFERENCE states that a reply too large with its quote is posted without it, that User's posts are never commands, and that reply refuses a caption too long for its message; TESTING records check 6 with Claude Code 2.1.319, which runs no command or shell command from a channel prompt, and the e2e reply to a long prompt.
* mcp: spec of large replies, User's commands, reply size, the marks
The spec describes replies sent again without the quote on largeMsg, User's commands dropped, the search of a part within one message size, the reply's message size check and the removal of old unattended marks; the source links follow the new lines.
* mcp: send and reply share the text of a message too long
tooLongText gives the refusal of send and reply: the text too long for the message with its quote, or for a message with the file.
* mcp: spec links of the shared refusal text
The spec names tooLongText and follows the lines of tools.ts after it.
* mcp: a reset of the owners leaves the session groups as they are
A replaced Main group keeps every session group and its invited records, so the members who joined from the old Main group keep prompting and approving there, as rule 4 of the trust model states for every change in the Main group.
* mcp: test end to end that the members stay after a reset of owners
The trust test approves a reset of the owners and checks that Alice and Bob, who joined from the old Main group, stay in the session's group, prompt there and get No pending actions. for /pending.
* mcp: document the reset of the owners and a hand-edited approve
REFERENCE states that a reset of the owners keeps the sessions' groups and the standing of their members, with /! from owners of the new Main group, and that a hand-edited approve outside requests and host is shown only at the session start while the tools run in mode requests; TESTING lists the reset in the trust test.
* mcp: spec of a reset of the owners that keeps the session groups
The spec describes the replacement of the Main group without changes to the session groups and their invited lists, with /! from owners of the new Main group, drops removeOwners and its log context, and follows the new lines of hub.ts and main-group.ts.
* mcp: every member controls a session; Main group owners approve files
Every member of a session group but User and observers prompts the session and approves its actions and tool use, whatever way they joined; each joiner gets the post NAME can send prompts to Claude and approve tool use, with the command that makes them an observer. A file of reply waits for an owner of the Main group in every session group, while the option is on; other members' approvals of files are refused, and a group without such an owner refuses the reply. The hub keeps the contact of User from its start.
* mcp: the option approve_files turns the file cards off
The plugin option approve_guest_files is renamed approve_files, variable CLAUDE_PLUGIN_OPTION_APPROVE_FILES and config field approveFiles, on by default; its title and description name the owner of the Main group who approves Claude's files.
* mcp: the reply to an unknown command names // for Claude's commands
A one-line / text outside the requests of a session group gets Unknown command. To send a command to Claude, start it with //.
* mcp: /observer #G ID makes a member of a session group an observer
The command is accepted from a member whose role lets them change that member's role in SimpleX: admin or owner, and not below the member's role; the member, Claude, the sender, a relay and a pending member are refused, and so is another group. The end-to-end test makes Carol an observer by the command of her join post, and her app then refuses to send.
* mcp: a session without an approver names members who can approve
The refusal of a new action in a session group without an approver says it has no member who can approve actions, a proposed text.
* mcp: document that every member of a session group controls it
REFERENCE and README state that every member but User and observers prompts and approves, the join post with /observer, the files approved by owners of the Main group, the option approve_files and the reply to an unknown command; TESTING lists the trust test as it now runs.
* mcp: spec of session groups that every member controls
The spec describes approvers as every member but User and observers, the join post with /observer and the command, files decided by owners of the Main group, the option approve_files, the reply to an unknown command and the refusal texts, and follows the new lines of the source.
* mcp: Claude's files reach a session group without approval
reply sends its file at once, and the core refuses it when the group's preference for files and media forbids it; the option approve_files, the reply cards, /approve N all and the bare /revoke of a session group are removed.
* mcp: rights in a session group follow the member's role there
Admins and owners of a session group approve actions and tool use and send // and /! commands to Claude; members, moderators and authors send prompts, and their // and /! commands get a reply. /join N invites a member of the Main group as admin, and an owner of the Main group as owner.
* mcp: Claude posts a member's rights at each join and role change
At each join and each change of a member's role in a session group, User excepted, Claude posts the rights of that role: admins and owners send prompts and // and /! commands and approve tool use; members, moderators and authors send prompts; observers can't send. The posts of sending roles end with the /observer command for that member, and the reply to /observer states the observer's rights.
* mcp: session groups keep no record of their invited members
Rights follow the role in the session group, so the invitations through the Main group are no longer recorded in the group's custom data.
* mcp: session groups keep the profile their owners changed
A session group's Control takes the group's profile from each groupUpdated event, so the updates of the model, the effort level and the name keep what owners changed, the preference for files and media included.
* mcp: document rights by role in session groups and files without cards
REFERENCE and README state the rights of each role in a session group, /join N as admin, the rights posts at joins and role changes, the replies to // and /! and to approvals from other roles, files of reply sent at once under the group's preference for files and media, and the removed option approve_files; TESTING lists the trust test as it now runs.
* mcp: spec of rights by role in session groups
The spec describes approvers as admins and owners of the session group, the replies to // and /! from other roles, /join N as admin, the rights posts at joins and role changes and the /observer reply, files of reply sent at once under the group's preference for files and media, the profile kept from groupUpdated, the session group's data without invited members and the options without approve_files, and follows the new lines of the source.
* mcp: spec flow 28 messages without semicolons
Mermaid ends a sequence message at a semicolon, so the join and rights messages of flow 28 use commas and a shortened post.
* mcp: group profile updates start from the group's current profile
Control and the Main group read the group's profile from the chat database before each update, and change only their own fields: the name, the short description, the Main group's description and the commands. The preferences owners set, files and media included, stay. This replaces the profile taken from groupUpdated events, which covered session groups only.
* mcp: / commands in a session group come from admins and owners
A one-line / text, a // text or a /! text from a moderator, member or author gets one reply, Only admins and owners of this group can send / commands., and reaches neither Control nor Claude. The check is Session.refusesCommand in Session.onMessage; without it, the replies of Control and Session.prompt apply as before.
* mcp: document / commands from admins and owners and profile updates
REFERENCE and README state that every message of a member who can send is a prompt except / commands, // and /!, that the / commands of moderators, members and authors get one refusal, and that Claude changes only its own fields of a group's profile, from the profile as it stands; TESTING lists the trust test as it now runs.
* mcp: spec of / commands from admins and owners and profile updates
The spec describes the one refusal of the / commands, // and /! of moderators, members and authors before Control and the prompt, the profile updates of Control and the Main group from the group's current profile, the removal of the groupUpdated handling, and follows the new lines of the source.
* mcp: spec summary of / commands from admins and owners
* mcp: spec diagrams render whole on GitHub
Mermaid ends a sequence message, a note and a block label at a semicolon and treats # as the start of a comment; the diagrams write them as #59; and #35;, which render as ; and #. All 36 diagrams of the spec render with GitHub's Mermaid viewer, each message, note and label in full.
* mcp: /observer ends the observer's standing approvals at once
Control reads the group's members again after /observer sets the role, as after a role change in the app, so the approvals of all messages to a chat and of all files from it that the new observer gave count no more.
* mcp: /observer answers that a member who has not joined is no member
A member invited to a session group who has not joined yet is neither current nor pending, so /observer #G ID answers No member ID in this group. and changes nothing; the member joins with the role of the invitation, and its role can change after the join.
* mcp: a session's rename and model change keep both in the group
Control makes its profile updates of a group one at a time, each from the profile the one before it wrote, so a rename and a change of the model or effort that overlap both stay in the group's profile.
* mcp: test the mode host card after a role change to the first admin
A session that requested mode host while its group had no admin or owner posts the mode card once a member becomes the group's first admin by a role change, after the post of the member's rights.
* mcp: no code comments
The code and tests carry no comments; the facts they stated are in the spec: an expiry timer that fires before the expiry time, the listener before the hub opens, the exit after the /stop reply, the stop timer cleared by a new entry, the socket path limit, the repeated call of an unknown session, and the request without a connection pool.
* mcp: document /observer and the Main group observer
REFERENCE states that a Main group observer can't send /join N, that /observer ends the observer's standing approvals at once, and the reply for a member who has not joined yet; TESTING lists the /observer test.
* mcp: spec of /observer, profile updates one at a time, removed comments
The spec describes the members read again after /observer, the reply for a member who is neither current nor pending, Control's profile updates one at a time, and the facts the removed code comments stated, and follows the new lines of the source.
* mcp: rights posts name / commands, without the observer hint for owners
The rights of admins and owners read can send prompts and / commands to Claude, and approve tool use; those of moderators, members and authors read can send prompts to Claude; / commands and approvals need the role admin or owner. The post for an owner ends without the /observer command, as an admin can't change an owner's role.
* mcp: session group description names prompts, / commands and approvals
A new session group's description reads The Claude Code session N. Members send it prompts; admins and owners also send / commands and approve tool use. Existing groups keep theirs, as Control sets only the name and the commands.
* mcp: Main group welcome and join post state what members can do
* mcp: Main group short description states what members can do
* mcp: Main group replies Unknown command. to an unknown command
* mcp: architecture names the Main group's texts as they now stand
* mcp: reply answers that files and media are off in the session group
* mcp: Main group texts are set at its creation, so owners' edits stay
* mcp: plugin texts name admins and owners where they decide
* mcp: commands of members past the one refusal get no reply
* mcp: overview link labels of the architecture match their lines
* mcp: actions expire within 60 s after a sleep past their expiry time
* mcp: cards of image and video actions are text while media are off
* mcp: /forward answers that files and media are off in the session group
* mcp: docs say an observer's standing approvals count again as admin
* mcp: serve passes the 0.2 tests unchanged
* mcp: serve answers /give with the list of commands, as 0.2
* mcp: maxTimer is private to messages.ts again, as 0.2
* mcp: docs state what text cards and serve's kept expired actions do
* mcp: the e2e test checks the bot receives the image with its file
* mcp: Claude names the group preference that refuses a post
* mcp: spec drops the reply file approvals that decision 87 removed
* mcp: docs say a refused outcome card leaves a performed action done
* mcp: a refused outcome card of a done action says it was performed
* mcp: a refused terminal prompt says the feature is not allowed for User
* mcp: test the cards refused for a preset server's SimpleX link
* mcp: docs name the text that reply returns for a refused file
* mcp: refused cards name the outcome; failure logs end with one period
* mcp: test the notice of a card edit refused after an expiry
* mcp: serve logs a failure with the period of 0.2
* mcp: reset-owners replaces the Main group at once, without an approval
* mcp: the plugin install links the marketplace on master
* mcp: docs state which Main group texts Claude keeps
* mcp: the plugin leaves serve agents named token and lock as they are
* mcp: rename the plugin's daemon to the service
* mcp: remove // and /!; a message starting with ! is a prompt
* mcp: docs say one-line / messages are the group's commands
* mcp: spec drops // and /!, which decision 117 removed
* mcp: remove the plugin's link and reset-owners skills
* mcp: test an admin's multi-line // and /! text reaches Claude as sent
* mcp: docs say the PreToolUse hook runs plugin/allow.js
* mcp: publish the plugin with its production dependencies bundled
* mcp, docs: the package bundles its dependencies; nothing installs them
* mcp: spec of the bundled dependencies and the package without a lockfile
* mcp: test the packed plugin has no link, which Claude Code refuses
* mcp, docs: plugin-only README; serve and shared settings in REFERENCE
* mcp, docs: shared settings name channels and process IDs precisely
* mcp: the description shows the model from the first answer
* mcp, docs: the Stop hook reads the model of its answer
* mcp, docs: README names a roadmap of what comes next
* mcp, docs: README and REFERENCE in short sentences
* mcp, docs: plain sentences in TESTING, spec and plugin texts
* mcp: the marketplace description names its one plugin
* mcp, docs: README shows a session group; serve images move to REFERENCE
* mcp: simplex-chat 7.1.3 and @simplex-chat/types 7.1.3, core 7.1.3.0
* mcp, docs: the package is a 4 MB download
* mcp: an older turn request no longer replaces a newer model or effort
* mcp: a held title's model keeps the start time of its hook
* mcp: User posts only prompts a person typed, not Claude Code's own
* mcp: User posts a typed prompt behind a slow hook or a new transcript
* mcp, docs: shorter Safety section in README
* mcp, docs: README says how to use the plugin without the channel
* plan: decisions 121 and 122 are decided by judgement on 2026-11-12
---------
Co-authored-by: shum <github.shum@liber.li>
* docs: plan the Claude Code plugin and SimpleX channel of the MCP server
* docs: MCP plan, adopting #7810 from its branch
* docs: MCP plan, one pull request from the branch of #7810
* docs: MCP plan, a group per session
* docs: MCP plan, mirroring the terminal conversation
* docs: MCP plan, Claude and User profiles, model and effort
* docs: MCP plan, sessions inside one group
* docs: MCP plan, sessions as subgroups
* docs: MCP plan, one Claude profile, decisions D8-D10
* docs: MCP plan, implementation goal
* docs: MCP plan, decisions 27-35 on mirroring and tool use
* docs: MCP plan, model and effort change outside the group
* plans: plugin launch from its own build, one session per process
* plans: hold prompts after a daemon start until the session attaches
* plans: publish the plugin with production dependencies only
* plan: resumed sessions, turn records, ordered prompts, lock check
* plan: quote once, refused quotes, lock wait, cut prompts
* plan: hold a new session's title until its server registers
* plan: late turn records, tag-only prompts, lock claims, held titles
* plan: delete groups of sessions closed 7 days; no group for claude -p
* plan: keep the approved mode in the session group, the link off /status
* plan: apply leaving, removal and demotion in the Main group to sessions
* plan: reply sends a file after an owner's approval when non-owners see it
* plan: the line count is an estimate; done is complete and tested
* plan: resumes after deletion, User's group, unattended runs, reply cards
* plan: trust model of the Main group; review-driven changes removed
Adds the Trust model section set by the user, rewrites decision 17, and marks decisions 60, 62, 63 and 64-66 as removed by the user's rule on reviews; the sections on closed sessions, runs without a group, the cascade of Main group changes and User's newest group are removed, and the reply section follows rule 5.
* plan: no group for claude -p kept, the unattended mark, the MCP era test
Decision 60 keeps the runs without a group, by the user's answer R1 B, with the amendment of the unattended mark; only the deletion of closed groups stays removed, with decisions 64 and 65. Decision 66 is restored, decision 69 records the test of the protocol revision, the section on runs that are not interactive returns with its diagrams, and the channel instructions follow the trust model.
* plan: //, /!, guest prompts, parts of a message, approve_guest_files
Decisions 70-73 record the user's answers: // and /! with the approved texts, Unknown command. as a placeholder, guests' prompts with approvals kept, the option approve_guest_files; decisions 17, 33, 41 and 53 are rewritten; the trust model, the mechanics, the diagrams and the pending texts follow.
* plan: large replies, User's commands, part search, reply size, marks
Decision 50 covers a post refused as largeMsg; decisions 74-77 record User's dropped commands, the search of a part within one message size, the reply's message size check and the removal of old unattended marks; the mechanics and diagrams follow.
* plan: a reset of the owners leaves the session groups as they are
Decision 78 records the user's decision by rule 4 of the trust model; the Groups section and its diagram follow.
* plan: the corrected trust model: every session member controls it
The trust model is replaced by the user's corrected one; decisions 79-83 record every member's control, the join post with /observer, the /observer command, files approved by owners of the Main group with approve_files, and the start notice pending; decision 71 takes the user's text; the mechanics, diagrams and the pending texts follow.
* plan: the role model of session groups
Rights in a session group follow the member's role there: admins and owners prompt, approve and send // and /!; moderators, members and authors prompt; /join N invites as admin; Claude posts the member's rights at each join and role change; files of reply are sent at once under the group's preference for files and media; session groups keep no invited records. Decisions 84-89, and proposal 90 for the profile kept from groupUpdated.
* plan: / commands from admins and owners, profile updates from the current profile
Decision 92 records that every message of a member who sends is a prompt except / commands, // and /!. Proposals 90, profile updates from the group's current profile, and 91, one refusal of the / commands of moderators, members and authors, wait for the user.
* plan: diagrams render whole on GitHub
Semicolons and # in sequence messages, notes and state transitions are written as #59; and #35;, and the second colon of a state note as #58;. All 26 diagrams of the plan render with GitHub's Mermaid viewer, each text in full.
* plan: /observer and profile updates after review round 7
Decisions 93-96: /observer reads the members again after the role change; it answers that a member who has not joined yet is no member; profile updates of a session group run one at a time; the code has no comments.
* plan: rights texts of the UX page's recommended branch
Decision 97: the rights texts name / commands, and the owner's post has no /observer command.
* plan: session group description of the UX page's recommended branch
Decision 98: the session group's description, set at its creation.
* plan: Main group welcome and join post, approved as B1 and B2
* plan: Main group short description, T3 of the UX page
* plan: Main group reply to an unknown command, G6 of the UX page
* plan: reply answers the files refusal with its own text
* plan: Main group texts set at its creation, UX-F3 a
* plan: admins and owners in the texts outside the group, rule 3
* plan: no reply to commands of members past the one refusal, U2 a
* plan: expiry timers wait at most 60 s, review round 8 F1
* plan: text cards while media are off, review round 8 question 2 a
* plan: /forward while media are off, review round 8 question 3 a
* plan: decision 93 names when an observer's approvals count again
* plan: serve passes the 0.2 tests unchanged, review round 8 question 1 b
* plan: the UX page's new address
* plan: premises, and open decisions decided by judgement but UX-I1
* plan: decision 31 reads the effort level from every turn hook, as the code
* plan: decisions 107 and 109 state the behaviour exactly, round 9 N2 N3
* plan: one text names a refusing group preference; serve /give as 0.2
* plan: decision 76 without the card reply no longer has
* plan: decision 114, a refused outcome card leaves the action done
* plan: decision 114, a refused outcome card says the action was performed
* plan: decision 114, a refused prompt of User says it is not allowed for User
* plan: decision 114, a card refused after the decision names the outcome
* plan: decision 114, the one-period log line is the plugin's; serve keeps 0.2's
* plan: decision 113 b, the user's answer: reset-owners needs no approval
* plan: decision 116, the service, and root files no agent name can take
* plan: decision 117, the user's answer: // and /! are removed
* plan: decision 118, the user's answer: the plugin's skills are removed
* plan: decision 21 names the PreToolUse hook's plugin/allow.js
* plan: decision 119, the user's answer: bundled dependencies, no lockfile
* plan: decision 120, the user's answer: plugin-only README, shared settings
* plan: decision 31, the Stop hook sends the model of its answer
* docs: the MCP server's PLAN.md moves to plans/2026-10-19-mcp-server.md
* plan: decisions 121 and 122, typed prompts and the newest model
* support bot light: check config and database with --dry-run
* ci: test the light support bot
---------
Co-authored-by: sh-agents <350651734+sh-agents@users.noreply.github.com>
* android, desktop: show the SimpleX Lock notice at the next start
* android, desktop: keep the SimpleX Lock notice from covering other alerts
* android, desktop: name the condition of the SimpleX Lock notice
* android, desktop: state the SimpleX Lock notice conditions in the spec
* android, desktop: don't show the SimpleX Lock notice over a dialog
* android, desktop: narrow the SimpleX Lock notice fix
---------
Co-authored-by: spaced4ndy-agents <342056592+spaced4ndy-agents@users.noreply.github.com>
* android, desktop: keep the channel name after Configure relays
* android, desktop: prevent a second channel after Configure relays
* android, desktop: keep the relays state after Configure relays
* android, desktop: keep only the channel name and the running creation
---------
Co-authored-by: spaced4ndy-agents <342056592+spaced4ndy-agents@users.noreply.github.com>
* ios: show verified shield in channel members list at once
* ios: channel member row at file scope, named as on Kotlin
* ios: remove a blank line in the channel members view
---------
Co-authored-by: spaced4ndy-agents <342056592+spaced4ndy-agents@users.noreply.github.com>
* ui: update list filters when a chat is added
* ui: count list filters on the main thread and after chat list reloads
* android, desktop: check and add a known chat on the main thread
* docs: list filter counts in the apps' specs
* docs: correct the list filter gaps in the apps' specs
* ui: revert the recounts, replaceChat change and main-thread moves
* docs: revert the list filter notes in the apps' specs
---------
Co-authored-by: spaced4ndy-agents <342056592+spaced4ndy-agents@users.noreply.github.com>
* core: fix chat rows showing the date 01/01/70
* ios: show favourite, mute and unread icons on chat rows without items
* core: remove an outdated comment from a chat list test
* ios: add a preview of a chat row without items marked unread
* ios: place the icons of a chat row without items at the row's end
* ios: references of the chat row without items
* core, ios: undo leaving the chat banner out of chat list previews
* ui: fix chat rows showing the date 01/01/70
---------
Co-authored-by: spaced4ndy-agents <342056592+spaced4ndy-agents@users.noreply.github.com>
* ui: keep default contact preferences when allowing a feature
* ui: take the time to disappear only from the contact's preferences
---------
Co-authored-by: spaced4ndy-agents <342056592+spaced4ndy-agents@users.noreply.github.com>