Projects

One list of every project, each with an id that never changes. People and organizations point at the id, so a project's name lives in one place.

The people and projects below are made up to show the shape. Mapping an exchange to a project on its own, the Relate step, is not built yet.

The picture

A project is named intake note "projects": ["Tool shed"] processor new name, new prj_ id projects.json prj_3fa21c9e0b4d name: Tool shed the only place the name lives rename After a rename name: Tool library aliases: Tool shed id unchanged: one line People and organizations point at the id, never the name: affiliated, prj_3fa21c9e0b4d Sam Leeper_sam-lee Ana Ruizper_ana-ruiz Eastside Makersorg_eastside-makers On a rename, no person or organization file changes. Every record shows the new name.

The projects list, as a table

One row is one project in projects.json. A field is one column.

idnamealiasesfromcreated_at
prj_3fa21c9e0b4dTool libraryTool shedagent2026-10-08T21:30:00-05:00
prj_8c1e5a7d2f90Neighborhood Workshopintake:json
agent
2026-10-09T09:12:04-05:00
Tool library was first named Tool shed. A note that still says Tool shed lands on the same project, because the old name is an alias.

What each field holds

id
prj_ plus 12 random hex characters. Given once and never changed. Not made from the name, so a rename never breaks a link.
name
The name shown everywhere. Change it here to rename the project.
aliases
Earlier names. A store or note that still uses an old name lands on the same project.
from
The stores or routes that named it. A route that names it again is added here.
created_at
When it was first named.

In a person or organization file, the link is one entry in relationships, a Murmurations triple:

predicate_url
How they relate to the project, in your own word. affiliated unless the store or note says otherwise, such as collaborator.
object_url
The project's prj_ id. The same field can hold a person (per_) or an organization (org_).

What the file looks like inside

JSON, a plain text format. This is projects.json, one file for the whole folder.

{
  "about": "Every project people and organizations point at. Rename a project by changing its name here; its id never changes.",
  "projects": [
    {
      "id": "prj_3fa21c9e0b4d",
      "name": "Tool library",
      "aliases": ["Tool shed"],
      "from": ["agent"],
      "created_at": "2026-10-08T21:30:00-05:00"
    },
    {
      "id": "prj_8c1e5a7d2f90",
      "name": "Neighborhood Workshop",
      "from": ["intake:json", "agent"],
      "created_at": "2026-10-09T09:12:04-05:00"
    }
  ]
}

An intake note names a project by name. The processor looks the name up, ignoring case and checking aliases. A name it has never seen gets a new random id, and the report says to rename it in projects.json.

{
  "filed_by": "agent",
  "how_filed": "From a note the owner gave the agent.",
  "people": [
    { "name": "Sam Lee", "email": ["sam@example.org"], "projects": ["Tool shed"] }
  ]
}

Sam's person file then holds the id, not the name:

"relationships": [
  { "predicate_url": "affiliated", "object_url": "prj_3fa21c9e0b4d" }
]

How it connects

project, by idprojects.json person, organizationrelationships a want for a projectassociations: the prj_ id impact reportlists the projects it relates to

Your own want for a project is one file in offers-wants/. Its who is you, and its associations list holds the project's prj_ id. People and organizations who can meet it are named in the note's with list. Each gets a can-meet connection on their own record, pointing at the want's ow_ id.

What a contact is โ†’
Wants and offers โ†’
Impact report โ†’