<feed xmlns='http://www.w3.org/2005/Atom'>
<title>meshbay.git/packages/meshbay-node/src, branch 0.21</title>
<subtitle>MeshBay — read-only public mirror</subtitle>
<id>https://git.meshbay.org/meshbay.git/atom?h=0.21</id>
<link rel='self' href='https://git.meshbay.org/meshbay.git/atom?h=0.21'/>
<link rel='alternate' type='text/html' href='https://git.meshbay.org/meshbay.git/'/>
<updated>2026-10-17T21:15:02Z</updated>
<entry>
<title>chore: bump version to 0.21.0</title>
<updated>2026-10-17T21:15:02Z</updated>
<author>
<name>Christophe Besson</name>
<email>cbesson@gmail.com</email>
</author>
<published>2026-10-17T21:15:02Z</published>
<link rel='alternate' type='text/html' href='https://git.meshbay.org/meshbay.git/commit/?id=9462ac3067ce68ad90a3527b2144b86bd87bf89e'/>
<id>urn:sha1:9462ac3067ce68ad90a3527b2144b86bd87bf89e</id>
<content type='text'>
Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix(node): the answer log names its host addresses</title>
<updated>2026-10-17T16:19:15Z</updated>
<author>
<name>Christophe Besson</name>
<email>cbesson@gmail.com</email>
</author>
<published>2026-10-17T16:19:15Z</published>
<link rel='alternate' type='text/html' href='https://git.meshbay.org/meshbay.git/commit/?id=d5ba9552e27bac71168178f73a4c977a4d36dc1c'/>
<id>urn:sha1:d5ba9552e27bac71168178f73a4c977a4d36dc1c</id>
<content type='text'>
aiortc ends a host candidate line at `typ host`, so the match on
" typ host " found none and logged `host: none` for every answer.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix(node): datagrams straight through the socket on Windows' event loop</title>
<updated>2026-10-16T10:28:25Z</updated>
<author>
<name>Christophe Besson</name>
<email>cbesson@gmail.com</email>
</author>
<published>2026-10-16T10:28:25Z</published>
<link rel='alternate' type='text/html' href='https://git.meshbay.org/meshbay.git/commit/?id=82b78441aa19ca54c2c84db2a413c88db386cd7b'/>
<id>urn:sha1:82b78441aa19ca54c2c84db2a413c88db386cd7b</id>
<content type='text'>
The ProactorEventLoop's datagram transport keeps one overlapped operation
per direction and starts the next from the previous one's completion, on a
later turn of the loop: one datagram sent and one received per socket and
per turn, however many wait. The busier the node, the slower every
connection, with cores to spare. Measured on loopback with the loop busy
0.5 ms a turn: 1,928 datagrams sent a second and 1,954 received, 87 % of
the rest dropped by the kernel. A browser's download from a node holding
its connections ran at 9 MB/s, the node at 45 % of a core, SCTP round trip
745 ms. Now a datagram goes out with a non-blocking sendto when nothing is
queued, and a completed read is followed by whatever the socket holds
before the next one is posted. Two-core machine, 400 MB: CLI download 27 -&gt;
33 MB/s, upload 18 -&gt; 22, browser over eight connections 9-14 -&gt; 17-19.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(node): connection processes on by default, one per core up to four</title>
<updated>2026-10-16T08:41:17Z</updated>
<author>
<name>Christophe Besson</name>
<email>cbesson@gmail.com</email>
</author>
<published>2026-10-16T08:41:17Z</published>
<link rel='alternate' type='text/html' href='https://git.meshbay.org/meshbay.git/commit/?id=9236ffdb295301f8cd61ad34689f84cf685d676e'/>
<id>urn:sha1:9236ffdb295301f8cd61ad34689f84cf685d676e</id>
<content type='text'>
At 1 no process starts and every lane of a download lands on the node's
one core. The Node page also sent every setting on each Save, pinning
untouched ones at the day's default; it sends only what changed.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>perf: linear SCTP reassembly, one SACK every second packet, 4 MB buffer in the CLI</title>
<updated>2026-10-16T08:41:17Z</updated>
<author>
<name>Christophe Besson</name>
<email>cbesson@gmail.com</email>
</author>
<published>2026-10-16T08:41:17Z</published>
<link rel='alternate' type='text/html' href='https://git.meshbay.org/meshbay.git/commit/?id=d74d371bd7c0ed25f60754e475a78975bf2dc4ee'/>
<id>urn:sha1:d74d371bd7c0ed25f60754e475a78975bf2dc4ee</id>
<content type='text'>
aiortc walked a message's fragments after each one arrived (n^2/2 steps
for a 1 MiB chunk) and acknowledged every packet. Measured on loopback,
400 MB to the CLI: 19 MB/s before, 39 after (49 by the node's count);
uploads from the CLI 25 -&gt; 29 MB/s.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>chore: bump version to 0.20.0</title>
<updated>2026-10-15T15:45:41Z</updated>
<author>
<name>Christophe Besson</name>
<email>cbesson@gmail.com</email>
</author>
<published>2026-10-15T15:43:15Z</published>
<link rel='alternate' type='text/html' href='https://git.meshbay.org/meshbay.git/commit/?id=63aa0ddd8c0ec49fe8b52b6b486b079887ed3112'/>
<id>urn:sha1:63aa0ddd8c0ec49fe8b52b6b486b079887ed3112</id>
<content type='text'>
Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>test(node): the event-loop disk guard watches os.stat again</title>
<updated>2026-10-15T12:37:45Z</updated>
<author>
<name>Christophe Besson</name>
<email>cbesson@gmail.com</email>
</author>
<published>2026-10-15T12:37:45Z</published>
<link rel='alternate' type='text/html' href='https://git.meshbay.org/meshbay.git/commit/?id=9dd6d1003cf92c0e4e7f23414565314691aa5516'/>
<id>urn:sha1:9dd6d1003cf92c0e4e7f23414565314691aa5516</id>
<content type='text'>
test_a_scan_asks_the_disk_nothing_from_the_event_loop patched Path.stat,
and since the indexer learned Windows' long paths it calls
os.stat(long_path(p)) and os.scandir instead: the guard saw no call at all,
and asserting that the calls ran on the indexer's thread failed on an empty
set. It watches os.stat and os.scandir now (Path.stat goes through os.stat
too), counting what the root holds and not the root, whose availability
check runs on the roots' I/O thread. Nothing runs on the loop; a stat added
there makes it fail again.

The node CLI's parser names itself: under `python -m pytest`, Python 3.14
named the program after the module, so test_cli_golden saw "python -m
pytest" in the help. The installed meshbay-node was not affected.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix(node): a removal made at the machine is in audit.db</title>
<updated>2026-10-15T12:24:44Z</updated>
<author>
<name>Christophe Besson</name>
<email>cbesson@gmail.com</email>
</author>
<published>2026-10-15T12:24:44Z</published>
<link rel='alternate' type='text/html' href='https://git.meshbay.org/meshbay.git/commit/?id=283771ff468bd9e1a60a4902a5ada4319c063073'/>
<id>urn:sha1:283771ff468bd9e1a60a4902a5ada4319c063073</id>
<content type='text'>
The Node page and the CLI remove access through the loopback API, and
revoke and unpin there wrote nothing to audit.db; only the signed MNP door
did. A removed person's next connection then showed an auth_failed with
nothing before it to explain it. Both routes now record member_revoke and
member_unpin once the operation has succeeded, with the node's own account
as the actor and 127.0.0.1 as the address, which tells the two doors apart.
A refusal changes nothing and records nothing.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>refactor(chat): no thread_id — chat has no threads</title>
<updated>2026-10-15T10:57:51Z</updated>
<author>
<name>Christophe Besson</name>
<email>cbesson@gmail.com</email>
</author>
<published>2026-10-15T10:57:51Z</published>
<link rel='alternate' type='text/html' href='https://git.meshbay.org/meshbay.git/commit/?id=a86bced1640ac1a695b95ac68b95e3fc581e687d'/>
<id>urn:sha1:a86bced1640ac1a695b95ac68b95e3fc581e687d</id>
<content type='text'>
Nothing ever set it (the page and the CLI sent null) and nothing read it
(the node's get_thread had no caller). It is no longer sent by the page or
the CLI, in clear or in the sealed payload, nor relayed or served by the
node; get_thread and its index are gone, and the protocol and design docs
no longer name it.

The node still accepts a chat_msg carrying one, from the desktop apps and
CLIs already installed, and drops it. The column stays, empty, in chat.db:
a node downgraded to an older version names it in every query.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix(node): an operator who was a member first holds the authority at once</title>
<updated>2026-10-15T10:32:24Z</updated>
<author>
<name>Christophe Besson</name>
<email>cbesson@gmail.com</email>
</author>
<published>2026-10-15T10:32:24Z</published>
<link rel='alternate' type='text/html' href='https://git.meshbay.org/meshbay.git/commit/?id=e0a1036e0fee15b3c6c83f3e935d50f472a2e776'/>
<id>urn:sha1:e0a1036e0fee15b3c6c83f3e935d50f472a2e776</id>
<content type='text'>
A member pinned on the node who then redeems the operator pairing code was
written down as the operator but the node kept its "nobody can authorize"
flag until it restarted: every admin operation — removing a folder, inviting,
the apps' settings — was refused meanwhile. Only a key paired fresh set it.

The join result now names `operator` for an account holding the node-wide
operator row, whatever its row in the group says. The page and the CLI read
that role to know what to offer, and refused before asking deletions the node
would have accepted. Nothing is granted by it: every admin operation is still
checked against the operators' keys.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
