The documentation, hoisted as code flags. Each flag carries one message. Pick one to read it.
Flag A · What it is
ported packs what your AI assistant knows about you into one file you own, and turns that file into a block you can
paste into whichever assistant you use next. It is one file with no dependencies, and it runs in Node and in this page.
The file holds your memories, each sorted into a kind: instructions, identity, preferences, projects
and other facts. It is sealed with SHA-256, so you can tell when it was changed.
Flag B · Get started
unzip ported-0.1.0.zip
cd ported
npm test # 12 tests
node bin/ported.js pack examples/chat.txt -o me.port.json
node bin/ported.js render me.port.json # paste this into the next one
In code: Ported.pack({ text, name, secrets: "mask", budget }) returns { port, report }, and
Ported.render(port, "prompt") gives you the block to paste.
Flag C · What it reads
- A memory list: one item per line, with or without bullets.
- Markdown notes: headings such as "About me", "Style" or "Projects" set the kind.
- A chat transcript (
User: and Assistant: lines): only your own turns. It keeps lasting statements and skips questions and things said in passing.
- A JSON transcript (
[{ role, content }] or { messages: [...] }), and port files.
Flag D · Secrets
Before anything moves, scan() looks for e-mail addresses, phone numbers, card numbers, IBANs, API keys, private keys,
passwords and wallet recovery phrases. Card numbers must pass the Luhn check and IBANs the mod-97 check, so an order number is not
mistaken for a card.
You choose what happens: mask keeps the memory and removes the secret, drop leaves the line behind, and keep
moves it and marks it as sensitive.
Flag E · The port file
A port file is plain JSON in the format ported/1: a name, standing instructions, the memories (each with an id, a kind,
its text and where it came from), counts, the size in characters, and a seal.
The seal is a SHA-256 of the file's canonical JSON. verify() says whether anything changed since it was packed. The
seal shows tampering; it does not hide anything.
Flag F · Merging
merge(a, b) folds memories that say the same thing. Memories that give different answers about the same thing (a name,
a home, a job, a language, a timezone, a favourite, or "X over Y") are reported as conflicts instead of being folded, because
"I prefer tea over coffee" and "I prefer coffee over tea" use the same words and mean opposite things.
Pass conflicts: "prefer-a" or "prefer-b" to settle them all one way, or settle each one yourself, as Bay 02 does.
Flag G · Fitting a size limit
Assistants limit how much memory or custom instruction text they take. fit(items, chars) fills the box in priority order:
instructions first, then identity, preferences, projects and facts. Whatever does not fit is listed, so nothing disappears quietly.
Flag H · The command line
ported pack <file> [--name N] [--secrets mask|drop|keep] [--budget N] [-o out.port.json]
ported scan <file> # exit code 2 when secrets are found
ported render <port.json> [--as prompt|markdown|list|json]
ported merge <a> <b> [--prefer a|b] [-o out.port.json]
ported verify <port.json>
Flag I · Honest limits
- Reading transcripts is a heuristic. It will miss some lasting statements, or keep one it should not. Read the manifest before you move anything.
- It does not log in anywhere or talk to any assistant. You export from one and paste into the next.
- Secret detection covers common formats, not every format in the world.
- A port file is plain JSON. Keep it somewhere you trust.