Concepts

Nodes

What a memory node is in HyperMemory

Nodes

A node is the atomic unit in HyperMemory. Every piece of knowledge — a fact, a person, a decision, a preference — is stored as a node with these fields:

FieldTypeDescription
keystrUnique identifier you choose and reuse (e.g. person_sarah_chen, decision_jwt_auth)
descriptionstrHuman-readable text that should stand alone — searched by BM25 and vector similarity
datadictOptional structured JSON for fields you want to filter or pattern-match
node_typestrClassification of the node (e.g. person, decision, concept)

Node types

Types are divided into two categories:

Axiom types (protected — cannot be removed from the system):

TypeUse for
userThe primary user (singleton user_profile)
personPeople — teammates, contacts
organizationCompanies, teams, departments
locationCities, offices, regions
groupGroups, committees
productProducts, services
assetFiles, images, resources
documentDocuments, reports, specs
URLWeb URLs, links

Extendable types (can be added to):

TypeUse for
componentSoftware components, services, libraries
eventMeetings, launches, incidents
conceptIdeas, patterns, abstract topics
projectProjects, initiatives
toolDevelopment tools, utilities
technologyLanguages, frameworks
preferenceUser preferences and settings
factVerified facts, data points
skillSkills, expertise, capabilities
decisionArchitecture choices, policy decisions
artifactConfigs, repos, outputs

New types are created on the fly by the server’s ontology canonicalizer — the system auto-manages an onto_type catalog.

Key format

Use the {type}_{name} convention: person_alice, decision_jwt_auth, tech_redis.

The user_profile singleton

A special user_profile node is auto-created on first hm_store call. It represents the graph owner and is updated automatically by the enrichment pipeline.

Example node

{
  "key": "decision_q3_api_perf",
  "description": "Q3 org priority: reduce API p95 latency under 100ms",
  "node_type": "decision",
  "data": {
    "quarter": "Q3-2026",
    "sponsor": "platform",
    "status": "in_progress"
  }
}

Creating nodes

Use hm_store:

{
  "key": "initiative_phoenix",
  "description": "API modernization for checkout service",
  "data": {"squad": "platform", "phase": 2}
}

After storing, the server triggers background enrichment — an LLM pass that expands the description, extracts structured data, creates new entities and edges, and updates the user_profile.

Updating and deleting

  • hm_update modifies fields on an existing node. Re-embeds the vector on description changes.
  • hm_forget deletes a node with optional cascade of connected edges.

Best practices

One idea per key — If a node’s data object grows past ~20 top-level keys, split satellite facts into new nodes and link them with relationships.

Keys are API surface — Treat them like stable IDs; they appear in hm_find_related, exports, and links.

Description vs data — Put narrative prose in description, machine fields in data. The search pipeline runs BM25 and vector similarity against description, so keep it readable.

Next steps