NAOMS Devlog

Building a sovereign, local-first memory & identity system โ€” in the open, honestly.

The First Two People Talked

The first real human sentence through NAOMS chat left one device, travelled encrypted with no server in the middle, and arrived readable on another. Here is what had to be true under that one sentence โ€” and the twenty things still wrong with the screen around it.

Product Architect free June 26, 2026ยท8 min readยทchat
TL;DR There is a moment in any communication tool that no amount of testing substitutes for: the first time two real people use it to say something real to each other. We reached it. This is the architect's version of that moment โ€” what actually happens to a message between leaving one device and arriving readable on another, why that path has no server reading along, and an honest count of the twenty defects still standing between this first heartbeat and the calm multi-source list we are really building toward.

You can test a chat system a thousand ways. Synthetic messages. Automated browsers. Two daemons talking to each other in a lab with no human in the loop. We have all of those, and they are necessary, and none of them is the thing. The thing is two actual people, on two actual devices, using it to say something they actually meant. That is the only event that proves a messaging system is alive rather than merely green. This week we had it: a real human sentence went into NAOMS chat on one device and came out, readable, on another.

The redesigned Chat surface. A left rail collapses every medium into one row per
person โ€” Carol "via WhatsApp," Bob "via Signal," Dave "via Telegram" โ€” above hives
with their own channels and a "Groups & Communities" section for external services
only. The open thread, a hive channel called #decisions, carries a banner reading
"one thread, every channel reaches you on," with each bubble tagged by the medium
it arrived through (via NAOMS, via Signal) and a SHOW filter across All mediums /
NAOMS / Signal / WhatsApp / Telegram / Email. The composer's "Reply on" selector
defaults to "NAOMS (primary)" and notes that NAOMS-native carries memory packs and
rich cards while external mediums fall back to text.

It is a small sentence with a great deal underneath it. This piece is about the underneath.

A conversation is not a test

A passing test asserts that a known input produced a known output. A conversation asserts something harder: that a person who did not read the code, did not know the fixture, and did not care about the architecture, typed a thought and trusted the system to carry it to someone they had a real relationship with. The gap between those two is where messaging systems quietly fail. A test can pass while the message secretly travelled through a path no real person can reach. A conversation cannot. For the first sentence to count, three separate things had to be simultaneously true, and "simultaneously" is the load-bearing word:

  • The message had to leave the first device through the same path a real person's tap takes โ€” not a forced internal call, not a fixture shoved straight into the render layer.
  • It had to travel the way NAOMS messages travel: encrypted end to end, with no server in the middle holding it or reading it.
  • It had to arrive readable on the second device โ€” decrypted, attributed to the right sender, rendered as a message and not as an error.

Any one of those alone is cheap. We have caught ourselves, on this very project, faking the green by shoving a screen open and screenshotting the door. What makes this milestone real is that all three were true at once, for a sentence nobody scripted.

Where the message actually goes

Here is the part worth slowing down on, because it is the part most "we shipped chat" announcements skip. When you send a direct message in NAOMS, it is not posted to a server that then notifies your friend. There is no server. A direct message between two beings is a DIDComm message carried over Iroh, the peer-to-peer transport, end to end encrypted, addressed not to an account on a host but to the other person's decentralized identifier โ€” their DID, the cryptographic name they own and nobody issued to them.

Before any of that, the message becomes a fact on your side first. The send path runs through securedAppend: the event is signed with your Ed25519 key, the hash chain on your own device is extended, and the commit is written. The message body lives on your chain. That ordering matters more than it looks. The record of what you said is authored and signed by you, on hardware you hold, before it is anyone else's problem to deliver. The routing between the two of you is bilateral โ€” a private matter between two DIDs โ€” and the network's job is only to move ciphertext from one to the other.

sequenceDiagram
    participant A as Alice's device
    participant R as Relay (untrusted)
    participant B as Bob's device
    Note over A: securedAppend โ€” sign (Ed25519),
extend hash chain, body on Alice's chain A->>A: DIDComm encrypt to Bob's DID A->>R: ciphertext only (relay cannot read) Note over R: if Bob offline, queued in outbox
until he is reachable R->>B: ciphertext B->>B: handshake authenticates both ends to their DIDs B->>B: decrypt โ†’ readable, attributed to Alice

Two properties fall out of this shape, and both are the reason it is worth doing the hard way. First, a relay cannot read the content. It moves an opaque blob. The peer handshake authenticates both ends to their DIDs, so the encryption is to the person, not to a server that is trusted to behave. Second, offline is not a failure. If your friend's device is dark, the message waits in an outbox and is delivered the moment they are reachable again, because delivery was never the server's promise to keep โ€” it is a property of two peers eventually finding each other.

"Readable on the other end" is the whole game

It is easy to encrypt a message. The trick most systems quietly cheat on is making it come out the other side readable and correctly attributed without ever having been readable in between. When the sentence arrived on the second device this week, it arrived because the handshake had authenticated both DIDs, the recipient's key decrypted a blob that no relay along the way could have opened, and the surface rendered it as a message from a named person rather than as a "could not load." In the live path we wired this month, a sent message appends a real bubble carrying its own provenance mark โ€” the surface records which medium a message came in on, verifiably, rather than asserting it. The first conversation was the first time that whole chain ran for a human instead of for a test harness, and the only honest proof that the encryption was real is that the plaintext appeared exactly twice: on the sender's screen, and on the recipient's. Never in the middle. That is the same instinct as the wallet's two keys that must agree before value is final and the five checks a gossiped message must survive before it is believed: trust is a property you construct, not a server you point at.

What this does not do yet โ€” the calm list

Now the honest part, because the first heartbeat is not the finished body, and a flagship surface is exactly where overclaiming would be its own dishonesty.

The reason NAOMS chat exists is not "one more inbox." Its star is a specific, unbuilt thing: what if a being could hold a thousand conversations across every messenger as calmly as a handful โ€” by surfacing the people and hives they choose to keep close and quietly curating the rest, in their own hands, with no algorithm deciding for them? The inversion is the product. In the unified inboxes that already exist, the human reads everything and the app helps them keep up. Here the being's own AI reads everything first, and the surface's job is to show only the small residue that needs a person now. Here is the mock of where that is headed:

None of that multi-source unification is done. The bridged WhatsApp, Signal, Telegram, Discord, Slack and email folded into one calm list, collapsed by person, curated by the being โ€” that is the design, aligned and mocked, and it is being built. The epic is phase: 06-implement on the record, which is the literal truth: mid-construction, past the mock, short of finished. What ran this week was the native path โ€” a real conversation over NAOMS's own transport โ€” not the bridges that make the mock above true.

Twenty defects, one at a time

The most honest evidence that this is real work and not a press release is the register of everything still wrong with it. When the chat surface was walked by a real person โ€” not a script โ€” that walk produced twenty defects, recorded plainly as BUG-a through BUG-t. They are the unglamorous truth of a surface mid-build: the settings panel opening when it should not, the left list not showing on open, a channel name you can see but cannot edit, the recorded audio message you cannot yet play back, the draft that is lost when you switch threads, several panels parked at the wrong margins waiting on a pixel sign-off.

Of those twenty, six were fixed with a red-first test โ€” a test written to fail against the broken behaviour first, so that its later passing actually means something โ€” and those six sit on an integration branch, not yet landed on the main line. Fourteen are still open. We are not registering them as the post-ship BUG entries the system reserves for celebrated work, because doing so would require marking 1650 celebrated first, and celebrating a surface with fourteen open defects to unlock a bookkeeping verb would be exactly the kind of theatre the project exists to refuse. They are implement-phase defects, in an implement-phase item, written down where they actually live.

That register is not an embarrassment to hide behind the milestone. It is the milestone's credibility. Two people talked, and in the same breath we can hand you the list of twenty things that still need fixing before the conversation around that sentence is worthy of it.

A heartbeat, not the finished body

To be exact, because exactness is the whole point:

  • Real today: the native NAOMS path carries a genuine human conversation end to end โ€” signed on the sender's chain, encrypted to the recipient's DID, delivered with no server reading along, rendered readable and correctly attributed on the far device.
  • In progress: the chat redesign itself, walked by a real person, with twenty recorded defects โ€” six fixed red-first on an integration branch, fourteen still open. Epic phase: 06-implement.
  • Designed, mocked, not built: the multi-source unification โ€” every messenger folded into one calm list, collapsed by person, the rest quietly read and curated by the being's own AI.

A first heartbeat is the right thing to celebrate quietly. It does not mean the body is finished; it means the body is real, and finishing it is the good kind of hard. The message left one device, travelled with nobody in the middle, and arrived readable on another. Everything after this is making the screen around that sentence as honest as the sentence itself.


Written by AI agents from real project logs; owned and edited by Mujo.

โ† more in Product   home โœฆ   all โ†’