What the manifest is

One file on your computer. One row per top-level folder you name, and one per thing you make to share.

The rows below are made up to show the shape. Paths are shortened. The ids came from a real run of the tool on a test folder.

The picture

From Houston Bloom PACKET.md Folders you name contacts/ notes/ projects/ Journal/ (not named) Nothing inside a folder gets a row. Nothing in it is read or changed. receive /map add once, on the folders you name /share things you make to send manifest.json row 1 the packet row 2 contacts/ row 3 notes/ row 4 projects/ row 5 something you made row 6 a reply to it You keep it. It stays private. manifest.log.jsonl one line per change: mapped, made, sent, received, moved projects-2026/ renamed folder, same id f4a67013 moved sets the path

The manifest, as a table

One row is one folder or one shareable. A field is one column. Ids are shown by their first 8 characters; the tool accepts that too.

idvisibilitykindpathlastActivefromsentrelates_to
3b0e0bea…Houston BloomshareablePACKET.md2026-10-08Houston Bloom
71fca610…privatefolderDocuments/contacts2026-10-08
0e5ee6fb…privatefolderDocuments/notes2026-10-08
f4a67013…Robin ParkfolderDocuments/projects-20262026-10-08
25097f4c…Sam Lee + publicshareableLocal Brain/03_outbox/frames/local-assembly.html2026-10-082026-10-08 to Sam Lee, published
f130a5e4…Sam LeeshareableDownloads/sam-notes.md2026-10-09Sam Lee25097f4c…
The first row: the packet, received from Houston Bloom on the day you install.Row 4 was projects until it was renamed. It kept its id. Row 6 answers row 5.

What each field holds

id
64 random hex characters, given once, never changed. It is not made from the name, the path or the contents, so it gives nothing away.
kind
folder, for a top-level folder you named, or shareable, for something made to send or something that came back.
path
Where it sits on your computer. In the manifest only, never in a redacted copy.
visibility
Who may see the row, as a list. ["private"] stands alone. Otherwise any of public and people's names, read as public + Sam Lee. Every folder starts private.
lastActive
The day it last changed, from its modified time. Checked at session end.
mappedAt
Folders: the day it was mapped.
madeAt
Shareables: the day it was made or received.
sent
Shareables: each send, with the day, who, and whether it was published.
from
A shareable that came back: who sent it.
relates_to
The id of the shareable this one answers.
project
The project a shareable belongs to, when it has one.
hash
A fingerprint of a shareable's contents, to tell an edit from a touch. Never shared.
notes
Transformation notes attached to a shareable: the day and the note's path.
missing
The day session end could not find the row. Nothing is deleted.

What the file looks like inside

JSON, a plain text format. This is manifest/manifest.json, rows 1, 4 and 5. The real file holds the full path; it is shortened here.

{
  "schema": "cls-manifest/v1",
  "createdAt": "2026-10-08",
  "rows": [
    { "id": "3b0e0bea147116e94f01dab371c678c233371b5b0dbefdc65d3123bbf722913a", "kind": "shareable",
      "path": "PACKET.md",
      "visibility": ["Houston Bloom"], "madeAt": "2026-10-08", "lastActive": "2026-10-08",
      "hash": "3d5d45cf8e17", "from": ["Houston Bloom"], "sent": [] },
    { "id": "f4a6701333975e386d67d9a0fe2706a71a2d6118e5cbf68edd3c0410ac478d97", "kind": "folder",
      "path": "Documents/projects-2026",
      "visibility": ["Robin Park"], "mappedAt": "2026-10-08", "lastActive": "2026-10-08" },
    { "id": "25097f4ce5d30f94c088f824e14bd1c9792b2e07256b26d9e7d19bfbaf797b9c", "kind": "shareable",
      "path": "Local Brain/03_outbox/frames/local-assembly.html",
      "visibility": ["Sam Lee", "public"], "madeAt": "2026-10-08", "lastActive": "2026-10-08",
      "hash": "b18105d0da7c", "project": "Relational Spaces",
      "sent": [{ "on": "2026-10-08", "to": ["Sam Lee"], "public": true }] }
  ],
  "updatedAt": "2026-10-09"
}

Beside it, manifest/manifest.log.jsonl: one line per change. These are the lines for row 4.

{"at":"2026-10-08T13:43:04.039Z","change":"mapped","id":"f4a6701333975e386d67d9a0fe2706a71a2d6118e5cbf68edd3c0410ac478d97"}
{"at":"2026-10-08T13:43:04.279Z","change":"visibility","id":"f4a6701333975e386d67d9a0fe2706a71a2d6118e5cbf68edd3c0410ac478d97","visibility":["Robin Park"]}
{"at":"2026-10-09T13:43:05.663Z","change":"missing","id":"f4a6701333975e386d67d9a0fe2706a71a2d6118e5cbf68edd3c0410ac478d97"}
{"at":"2026-10-09T13:43:06.763Z","change":"moved","id":"f4a6701333975e386d67d9a0fe2706a71a2d6118e5cbf68edd3c0410ac478d97"}

The commands that wrote them, and what each printed:

node map.mjs receive PACKET.md --from "Houston Bloom"
received from Houston Bloom: id 3b0e0bea
node map.mjs add Documents/contacts Documents/notes Documents/projects
mapped contacts: private, id 71fca610
mapped notes: private, id 0e5ee6fb
mapped projects: private, id f4a67013
node map.mjs set Documents/projects --visibility "Robin Park"
projects: Robin Park
node map.mjs update
checked 5 · changed 0 · missing 1
node map.mjs moved f4a67013 Documents/projects-2026
moved: projects is now projects-2026, id f4a67013 kept

The manifest must sit outside every mapped folder; the tool refuses otherwise. These lines show in your activity view, 00_contacts/activity.html, built by activity.mjs. Session start reading the manifest: not built yet

How it connects

manifest.jsonevery row, every field sharingmake, share, receive redacted copyid and lastActive, one person contacteach person a send went to
Sharing something →
What a person gets →
What a contact is →