Create shared organization databases that cohabit the user's LastDB Mini
node. Encryption material lives in LastSecrets; org membership and named DBs
are ordinary org/* records on the same node as Brain and Kanban.
βββββββββββββββββββββββββββββββββββββββββββββββ
β lastdbd (one node, one socket) β
β ββββββββββββ ββββββββββββ ββββββββββββββββ β
β β brain/* β β kanban/* β β org/* β β
β β personal β β personal β β orgs + dbs β β
β ββββββββββββ ββββββββββββ ββββββββββββββββ β
β lastsecrets/* β org-<slug>-e2e keys β
βββββββββββββββββββββββββββββββββββββββββββββββ
No second daemon. No separate data dir. Org identity is an Ed25519 keypair
(org_hash = sha256 of the public key); the shared AES-256 E2E key is stored
only as lastsecrets://org-<slug>-e2e.
git clone https://github.com/EdgeVector/org.git && cd org
# EdgeVector contributors may also use: lastdb:///org
bun install
bun linkRequires a running LastDB Mini node (brew services start lastdb) and
LastSecrets initialized (lastsecrets init).
org init
org create edgevector --name "Edge Vector"
# β e2e key stored as lastsecrets://org-edgevector-e2e
# β private key as lastsecrets://org-edgevector-private
org db create edgevector company --name "Company DB" \
--description "board minutes, projects, finances"
org list
org show edgevector
# Friend installs LastDB, then:
# org receive β sends you orgpk1:β¦
# You seal to their public key (clear-channel safe):
org invite edgevector --to 'orgpk1:β¦' --agent
# Friend:
org join --sealed 'orgseal1:β¦'Preferred: pubkey handshake (no Exemem account for the friend).
- Friend installs LastDB + org, runs
org receive, pastesorgpk1:β¦to you. - You run
org invite <slug> --to 'orgpk1:β¦' --agentand paste theorgseal1:β¦package back (email/Slack OK β encrypted to their key). - Friend runs
org join --sealed 'orgseal1:β¦'(same machine asorg receive).
Fallback: secret invite file (raw E2E key β transfer out of band only):
org invite edgevector --out /tmp/edgevector.invite.json --agent
org join --from /tmp/edgevector.invite.jsonFull write-up: docs/INVITE.md.
| Command | Purpose |
|---|---|
org init |
Declare org schemas (Organization, OrgDatabase, PathBinding) |
org create <slug> |
New org + LastSecrets E2E/private keys |
org list / org show <slug> |
Metadata only (no raw keys) |
org receive |
Print local orgpk1:β¦ public key (ready for invite) |
org invite <slug> --to orgpk1:β¦ [--agent] |
Encrypt invite to friend pubkey (clear-channel OK) |
org invite <slug> --out FILE [--agent] |
Secret-file fallback plus optional safe recipient instructions |
org join --sealed orgseal1:β¦ |
Decrypt pubkey-sealed package; store E2E via LastSecrets |
org join --from FILE |
Import fallback invite file; store E2E key via LastSecrets |
org join --claim TOKEN |
Legacy portable bearer claim |
org db create/list/show |
Named shared DBs under an org |
org bind <org> <db> --root PATH |
Place work under this tree β that DB |
org resolve |
Print lastdb://β¦ for cwd (or --cwd / --db) |
org use / unuse / current |
Session pin override |
org kanban β¦ / org run <app> β¦ |
Wrapper: resolve DB, then run app with --db + LASTDB_DB |
Apps take an explicit DB handle. Org fills it in from place (folder roots) or pin, then execs the app:
org bind edgevector company --root ~/code/edgevector
cd ~/code/edgevector/fold
org resolve # β lastdb://org/edgevector/company
org kanban list # injects --db + LASTDB_DB
org kanban add my-card --title "β¦"
org --db personal brain ask "β¦" # force personalResolution order: explicit --db β cwd under a bound root (longest
prefix) β session pin β personal. Same pure algorithm is SDK-shaped (no
SDKβorg dependency); org owns the path registry.
Design: brain design-org-context-resolve-from-cwd.
- Prefer
org invite --to β¦ --agent. The email/chat text contains only a non-secret claim id; Exemem messaging delivers the sealed org key. - Invite files are fallback secrets. They embed the raw E2E key so a peer can join
without sharing your LastSecrets store. Prefer
--out(mode 0600) over printing to stdout; delete after join. org invite --agentprints copy-paste recipient instructions only. The invite JSON is still separate secret material and should not be pasted into email or chat.- Org records store only
lastsecrets://β¦locators, never raw key material. - Agents must never paste E2E keys into Brain, Kanban, chat, or PRs.
| In | Out (later) |
|---|---|
| Local create/join/list | Automatic storage_prefix=org_hash on all org DB app writes |
| Sealed invite claim interface | Production membership/revoke UI |
| LastSecrets key custody | Full two-Mini kanban round-trip dogfood |
| Named shared DB registry | Per-field trust domains on org data |
| Cohabit same Mini node | Separate per-org processes |
Arm org cloud-sync on create/join (org sync status) |
β |
Create/join register the org with Mini (POST /api/org/sync/register) so the
node can append/pull an encrypted org log when cloud_sync.json is enabled.
Without cloud or a new enough Mini, membership still works locally (soft skip).
bun test
bun run typecheck- Public download (invitees / cold install):
https://github.com/EdgeVector/orgβ clone with normalgit; no LastDB node and no LastGit helper required to get the CLI source. - EdgeVector contributor review venue: LastGit
lastdb:///org(.last-stack/pr-venue=lastgit, gate.lastgit/ci.sh).
GitHub is the public install mirror so someone can receive an invite and run
org join after last-stack-install-apps. LastGit remains the internal CR
path for EdgeVector contributors.