Relationships between items are first-class typed edges, not embedded references. An edge has a source item, a target item, an edge type, and an optionalDocumentation Index
Fetch the complete documentation index at: https://docs.myme.so/llms.txt
Use this file to discover all available pages before exploring further.
properties object. Edges are stored separately from items and queryable from both ends.
Edge shape
Querying edges
Edges are queryable from either direction, filtered by type.Listing edges by type
For taxonomy-style traversals — “every reply”, “every annotation”, “every parent-of edge” — list edges globally across the space:client.edges.list({ edge_type }).
Core edge types
Eight types ship in the core set. Each has documented constraints.| Type | Semantics | Cardinality |
|---|---|---|
about | Source is about the target. Topical link. | many-to-many |
parent-of | Source is the parent of the target. Each target has at most one parent. Also the membership relation for groups and folders. | one-to-many |
in-thread | Source is a member of the thread represented by the target. Carries a position property. Source is in at most one thread. | many-to-one |
attached-to | Source is an attachment (a file or media item) belonging to the target. | many-to-many |
references | Source explicitly references the target. Covers wikilink-style mentions and the highlight-on-a-passage case. | many-to-many |
authored-by | Source was authored by the target (usually a core.entity.person). | many-to-many |
derived-from | Source was produced from the target. Both items remain valid in parallel. | many-to-many |
supersedes | Source replaces target as the current version. Linear chains only. | one-to-one |
parent-of edge with the same target (child), or a second in-thread edge with the same source (member), is rejected with 400 edge_constraint_violation.
derived-from vs supersedes
Both point backward from a new item to an older one. They mean different things.
derived-from— “this came from that; both are still valid.” Multiple derivations from the same source coexist. Use for AI-generated alternatives, transformations, parallel takes.supersedes— “this replaces that as the current version.” Linear chain, no branching. Cycles are rejected at edge-creation time. Use when one version is meant to take over from another.
derived-from AND supersedes the original — it was produced from it and replaces it.
Cleanup, derivation, and replacement patterns
When one item produces another — an AI cleanup pass, a transcoder, a translator, a refinement — the choice of edge depends on the relationship being modeled. Four core edges apply, each capturing a different aspect:| Edge | Means | Use when |
|---|---|---|
derived-from | B was produced from A; both remain valid in parallel. | AI alternatives, transformations, or parallel takes that should coexist. |
supersedes | B replaces A as the current version; linear chain. | Cleanup or refinement where the new version is meant to take over from the old. |
in-thread | B is a member of the thread represented by A; carries position. | An ordered iteration history of cleanup passes you want to keep navigable. |
parent-of | B is grouped under A as a child. | Cleanup that produces grouped children under a host item. |
derived-from the raw (provenance), supersedes the raw (replaces as current), AND in-thread a series of cleanup attempts (iteration history). The combination expresses what the integration is actually modeling.
supersedes carries the cleanest semantic for replacement — the predecessor still exists (Marfa doesn’t delete A) but B is the “current” version. Use it when versions chain linearly with clear succession.
Cascade on delete
Each edge type declares acascade_on_delete behavior:
| Behaviour | Meaning |
|---|---|
cascade | Deleting the source or target cascades: connected items are also deleted. |
orphan | Deleting one endpoint leaves the other in place; the edge is removed. |
block | Deleting an endpoint with existing edges is rejected. |
parent-of cascades by default (deleting a parent deletes children). Other core edge types default to orphan.
Threads are implicit
There is no
core.thread type. A thread is whatever item is the target of a bunch of in-thread edges — its type gives the thread its semantics.- A chain of reply notes:
core.noteitemsin-threadto an openercore.note. - An ordered reading queue:
core.bookmarkitemsin-threadto an app-registeredapp.reading_list. - A timeline of a trip: various types
in-threadto acore.event(the trip).
in-thread edge is many-to-one on the source side: each item can be in at most one thread. Ordering uses the edge’s position property. Query a thread:
Grouping
Three grouping primitives, each with a narrow purpose.- Tags — flat labels for cross-cutting classification. See Metadata.
- Threads — ordered sequences via
in-threadedges. Single membership per source. parent-ofhierarchy — tree structure. Source is parent, target is child. Used both for natural hierarchy (folders, projects) and for app-registered group items (akarakeep.list, analbo.collection, auser.wine_cellar) — group is the parent, members are children.
parent-of edges to connect members. The core stays out of the opinionation business on “what is a collection” — apps answer that differently.
Custom edge types
Apps register their own edge types when the core set doesn’t fit:409 conflict. Custom edge types don’t inherit. See POST /edges/types for the full schema.
Atomic item + edges write
A singlePOST /items call creates the item and its edges in one transaction: