NAOMS Devlog

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

NAOMS engineering update

Week 16

A nine-day window of sustained output, cresting mid-week. Commit figures are not reported for it and the counting rule says why. Everything the window touched is below, the largest threads first and every area at the end.

๐Ÿ“… Jul 7 โ€“ Jul 15 ยท Process
Window
2026-07-15
(nine days)
from 2026-07-07
Shape of the window
sustained output, cresting mid-week
Commit figures
not reported
the counting rule is below
Process Dispatch free July 15, 2026ยท16 min readยทmeta

Commits per day โ€” Week 16

Four things changed this week

Two of these are surfaces you land on. Two are refusals โ€” a screen declining to show you something it cannot stand behind, and a control declining to overstate what it did.

1

The app opens onto a canvas, not a screen

Your apps are now windows on an endless, zoomable surface you can drag things onto and draw around. It is what you land on when you sign in.

2

Chat starts honestly empty

The people and groups you talk to arrive in one list, each person folded into a single row. Outside networks appear only once you have genuinely connected one.

3

Photo search stays quiet rather than guess

Typing a place or a word narrows your whole library at once, worked out on your own machine. Lanes needing a model you have not installed stay silent.

4

The revoke button admits what revoking cannot undo

Cutting off someone's access now says plainly that it takes effect at the next key rotation, and that bytes already delivered to them stay readable.

One canvas instead of a dozen screens

One zoomable surface with your real apps open on it as windows โ€” Photos showing a timeline, Files listing its contents, Contacts, and Chat. The chat window carries the single conversation list: Friends, Hives with their channels, and Groups & Communities for external services, one row per person across every medium. A toast reads "Added to canvas". Dark theme, real capture.

The feature: a single spatial place to hold everything you own โ€” photos, files, notes, people โ€” arranged by you rather than filed by us.

Before: each app was a separate screen, and moving between them meant leaving one behind. Anything you wanted to consider side by side had to be held in your head.

Now: the browser app opens onto an endless, zoomable canvas. Your apps open as windows on it, and you can drag a photo, a file, a person or a note straight out of its app and drop it on the surface as a card.

This is the shell you land on the moment you sign in, not a mode you switch into. That distinction matters more than it sounds: a feature you have to go and find is used by the people who already know it exists, and a surface you arrive on is used by everyone.

A canvas is a claim about who does the arranging. Filing systems decide where a thing belongs and then ask you to remember the decision. A canvas has no opinion about where anything goes, which is worse for retrieval by name and better for the far more common case of working on several things at once.

The cost of that is real and worth naming. A canvas with a hundred things on it has no index, no folder tree and no name to type, so finding one card again depends on remembering roughly where you put it. What it buys is the ability to have four unrelated things in front of you at once, which no filing system has ever made easy.

What actually lands when you drop something

Photos and images, video, audio, contacts, devices, files, links, saved notes and your written policies each arrive as a purpose-built card that shows the real thing โ€” a dropped image is the image, resizable and clickable; a dropped voice clip plays where it sits.

Anything the surface has no rich card for still lands, as a clearly labelled reference to whatever it is. Nothing is dropped silently and nothing is dressed up as something it is not.

That is the difference between a surface you can trust with an unusual object and one you quietly learn to stop dropping things onto.

A fragment of a conversation can be pulled out of a chat window and pinned beside the rest. Searching your own material from the canvas returns results you can drag straight onto it, so finding a thing and placing a thing are one gesture rather than two.

Drawing is the other half of arranging

Once your things are on the surface you can treat the whole canvas as a sheet of paper. A small authoring toolbar, reachable by single keystrokes, draws rectangles, ellipses and lines, drops in text, and marks out regions.

Those shapes are real objects rather than ink on a background. You can select, copy, cut and paste them the way any drawing tool would let you.

So circling three photos and labelling the group produces something you can move later, rather than a mark you have to redraw the moment anything underneath it shifts.

The windows you opened, the cards you dropped and the shapes you drew are kept on your own personal record, so the canvas comes back arranged the way you left it. That is a convenience rather than the point, and the point is that the arrangement was yours to make at all.

What the canvas AI does not do

The AI on the canvas is a partner you call over. It answers about what is in front of you, and it does not move your cards, tidy your layout, or decide what belongs together.

That is a real limit and worth stating in the same breath as the feature. An assistant that rearranges a space you arranged is not a more capable version of this. It is a different product, and it would need your permission before it was worth building at all.

What it does instead is sit where you are working. The chat window opens on the canvas among your windows and cards rather than in a separate assistant panel, so the conversation happens beside the material instead of somewhere you have to describe the material to.

An inbox that cannot quietly lose a conversation

The feature: the list of conversations you belong to, and the surface that draws it.

Before: a conversation list was a thing that was kept โ€” a stored list, with code responsible for adding a row when you joined and removing one when you left. When that bookkeeping and reality drift apart, the list wins, because the list is what you see.

Now: there is no such file. Your device builds the whole list from nothing each time you open it, by asking one question of the signed record it holds: which conversations hold an entry saying I belong, and that the belonging is still active?

The difference between keeping a list and asking a question looks academic until something goes wrong. A kept list with a bookkeeping bug is permanently wrong until someone notices and repairs it. A question asked against the record can only ever be asked wrongly, and the entry is still sitting there.

The day the question was asked wrongly

That is not a hypothetical. For a stretch, a freshly added member could open their app and find the new conversation simply absent โ€” the exact failure the design exists to make impossible.

A person can be named in the record in more than one form: an older way of writing who someone is, and newer ones, including the form a device uses to refer to itself. A newly added member's own entry naturally points back through that self-reference.

The question recognised only the older form and walked straight past the newer ones. The entry was there, valid and signed, and unread.

Notice what did not happen. Nothing invented a conversation to paper over the gap, and nothing showed a hopeful placeholder. It showed nothing, because the honest answer to a question asked wrongly is nothing.

Teaching the question to recognise a person by who the entry stands for rather than by how it was spelled put every missing conversation back at once. Nothing was restored from a backup and nothing was re-added by hand; they had never been lost, only unasked-for.

One list, whether a conversation stands alone or belongs to a community

The same question does not care which of those a conversation is. Either way it carries the same kind of belonging entry, and either way it comes back from the same ask.

The list is split for display afterwards โ€” the ones that stand on their own in one place, the ones inside a community in another โ€” but that split is presentation applied to a single honest answer rather than two sources being reconciled.

It is also why the member count beside each conversation can be trusted. It is not a number someone remembered to update; it is the active belonging entries, counted at the same moment, from the same well.

What that costs, and what the surface above it does

Asking every time costs more than trusting a cached answer, and re-counting each conversation's members as it goes costs more again. As one person's world of conversations grows, that is a real bill rather than a rounding error.

The surface drawn on top gathers your people and your hives into one calm list, with each person folded into a single row no matter how many ways they can reach you, and their messages interleaved in the order they were actually said.

Collapsing is about calm, not about pretending everything is the same pipe. A message keeps its honest tag of where it came from, permanently, and a channel that cannot confidently be tied to a known person stands as its own row rather than being merged into somebody else's.

Nothing in a channel is read by an AI unless you invite it, per channel rather than blanket. And the list starts genuinely empty: outside networks appear only once you have truly connected one, and Signal โ€” which cannot be connected at all today โ€” says so rather than showing a plausible row.

What this means, in plain terms

Five lessons this window's work paid for. Each came from a surface that could have claimed more than it could do, and did not.

The Files app states on the revoke button itself that access drops at the next rotation and that already-delivered bytes stay readable. Documentation is read by people who are not currently in a hurry, which is never the person clicking revoke. A caveat is only a caveat where the decision is made.

Silence is an answer; a confident wrong one is not

Photo search runs on your own machine, and the lanes that need a vision model you have not installed return nothing rather than a plausible guess. A wrong match is expensive precisely because it looks like a right one and ends the search. Where you cannot answer, say nothing โ€” never something shaped like an answer.

An empty state is the honest state

The rebuilt chat surface starts genuinely empty, and the stand-in photo library that once made the screens easy to demonstrate is gone. Where a network cannot be connected at all โ€” Signal, today โ€” the surface says so instead of showing a plausible row. A populated demo is a claim about the reader's own data, and it is false.

Derive what you must not lose; do not store it

Your conversation list is rebuilt from the signed record every time you open it, by asking which conversations you belong to. A stored list can silently forget a room you were added to while looking perfectly healthy. A cache of something you cannot afford to lose has to be rebuildable from the thing it caches.

Name what the assistant will not do

The canvas AI answers about what is in front of you and does not rearrange your cards. Saying so costs a line and prevents the reader assuming the larger, unbuilt version. State an assistant's boundaries in the same breath as its abilities, because people infer capability generously.

How much healthier is it than a week ago?

Commit figures are not reported for this window. The counting rule used in the other dispatches โ€” every commit in the window, split into merges and everything else โ€” was not applied here, and we would rather leave the row empty than publish a figure we cannot reproduce with a command we can name.

The chart at the top is the honest measure available: nine days of sustained output that crested in the middle of the window. It shows the shape of the work rather than its size, and shape is what it can support.

Where a count would have helped is in the areas below, which are named without numerals for the same reason. An invented number would make the section look more rigorous and would make it less true.

Stating the rule we could not apply is part of the point. It is every commit between two fixed positions in the window, split into merges and everything else, with the earlier position proven to come before the later one before anything is subtracted โ€” so a reader can see what is missing rather than only that something is.

In one line

everything you own moved onto one surface you arrange yourself, the list of your conversations stopped being a list and became a question asked against your own record, and three separate surfaces were each made stricter about the difference between what they do and what they look like they do.

Four honest notes

  1. The canvas AI does not arrange the canvas. It answers about what is in front of you when you call it over. The version that moves your cards for you is not built, and it would need your permission before it should be.

  2. Signal cannot be connected. The chat surface says so rather than showing an empty row that implies it is coming. Every other outside network appears only once you have genuinely connected it.

  3. Revocation is not instant and not retroactive. Access drops at the next key rotation, and anything already delivered to that person stays readable by them. Both facts are printed on the button.

  4. Rebuilding the conversation list is not free. Asking the question every time costs more than trusting a stored answer, and it re-counts each conversation's members as it goes. That cost grows with the number of conversations you are in, and it is watched rather than waved away.

What changed, area by area

Every area that moved in this window. Per-area file counts are not available under a rule we can reproduce, so these are named without a numeral rather than given an invented one.

The canvas.

The browser app now opens onto an endless, zoomable canvas rather than a screen โ€” the shell you land on the moment you sign in.

Your apps open as windows on it; drag a photo, a file, a person or a note out of its app and it drops onto the surface as a card, with a purpose-built card for the kinds it knows and an honest labelled one for everything else.

You can draw and arrange freely with real, selectable objects, search your own material from the surface and drag the results straight onto it, and pull an AI chat window over to talk through what you are looking at.

Your layout is kept on your own record, so the canvas comes back as you left it. That AI is a partner you call over, not one that rearranges your canvas. ( Your whole world on one infinite canvas .)

Chat.

The rebuilt chat surface gathers the people and groups you talk to into one calm list, each person folded into a single row no matter how many ways they can reach you, with their messages interleaved in the order they were actually said.

A message never has its origin rewritten to make the list tidier, and a channel that cannot be confidently tied to a known person stands as its own row rather than being merged into someone else's.

A hive is not a separate place you leave chat to visit โ€” it sits in the same list and opens up to show its channels inline. Nothing is read by an AI unless you invite it, per channel rather than blanket.

It starts honestly empty, and where a network cannot be connected yet โ€” Signal โ€” it says so out loud. ( One calm home for the conversations you keep close .)

The conversation list.

Underneath the chat surface, your conversation list is no longer a stored list that can drift out of sync with reality.

It is rebuilt from the signed record every time you open it, by asking one question: which conversations do you belong to? The member count beside each one is counted the same way at the same moment, so the count and the conversation cannot disagree.

That design paid for itself when the question was once asked wrongly โ€” it recognised only one of the several forms a member can be named in, so newly added people saw nothing.

The entries had been there the whole time, and fixing the question restored every one of them at once, for everyone, with nothing to repair. ( The inbox that can't quietly lose a conversation .)

Photo search.

Typing a place or a word now narrows your whole photo library at once, with the river, the map and the timeline all responding together, and the whole search worked out on your own machine with nothing uploaded.

Your device reads the coordinates your camera wrote, resolves them to a real place name from a table that ships with the app, and plots the results on a map you can pan and zoom, the pins clustering as you pull back.

You can narrow by place, by a slice of time, or by whether you captured a picture or brought it in โ€” and when nothing fits, it says so in words rather than showing a random grid. The searches that need a model to read your pixels stay inert until you install that model.

The stand-in sample library the screens once carried is gone: under a real sign-in there is your genuine library or an honest empty space. ( Search your own photos on your own machine .)

Files.

Your files live encrypted on your own machines, each one chopped into pieces that are encrypted before they touch the disk and addressed by a fingerprint of the file's own contents rather than by a name on a server.

A large file therefore streams in from every reachable machine you trust at once, each piece checked against that fingerprint as it lands, so no single device carries the load and nothing arrives that was not what you asked for.

Bringing someone into a file's circle moves only the small key, carried inside a sealed message, and a missing key is a refusal rather than an all-zero stand-in dressed up as protection.

When you cut off a person's access, the app refuses the comforting version: their access drops at the next key rotation rather than the instant you click, and bytes already delivered stay readable.

Both limits are printed on the control itself, and a file stored exactly as it arrived is labelled as stored as-is rather than badged encrypted. ( Your files stay on your own machines .)

Named, not claimed

An AI that arranges your canvas

NOT CLAIMED โ€” it answers when called over; it does not move your things.

A connected Signal network

NOT CLAIMED โ€” the surface says plainly that it cannot be connected yet.

Instant or retroactive revocation

NOT CLAIMED โ€” next rotation, and delivered bytes stay readable.

Photo search that reads your pixels

NOT CLAIMED โ€” the lanes needing an installed model stay inert.

Handing a file to one named person from the Files app

NOT CLAIMED โ€” sharing today is bringing someone into a file's circle.

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