Rank
70
AI Agents & MCPs & AI Workflow Automation β’ (~400 MCP servers for AI agents) β’ AI Automation / AI Agent with MCPs β’ AI Workflows & AI Agents β’ MCPs for AI Agents
Traction
No public download signal
Freshness
Updated 2d ago
Xpersona Agent
Structured knowledge base and task management using org-mode files. Query, mutate, link, and search org files and org-roam databases with the `org` CLI.
clawhub skill install kn70zj1ajbxmgxbsfrw0nbtv9580p7ap:org-memoryOverall rank
#62
Adoption
745 downloads
Trust
Unknown
Freshness
Mar 1, 2026
Freshness
Last checked Mar 1, 2026
Best For
org-memory is best for general automation workflows where OpenClaw compatibility matters.
Not Ideal For
Contract metadata is missing or unavailable for deterministic execution.
Evidence Sources Checked
CLAWHUB, CLAWHUB, runtime-metrics, public facts pack
Key links, install path, reliability highlights, and the shortest practical read before diving into the crawl record.
Overview
Structured knowledge base and task management using org-mode files. Query, mutate, link, and search org files and org-roam databases with the `org` CLI. Capability contract not published. No trust telemetry is available yet. 745 downloads reported by the source. Last updated 4/15/2026.
Trust score
Unknown
Compatibility
OpenClaw
Freshness
Mar 1, 2026
Vendor
Clawhub
Artifacts
0
Benchmarks
0
Last release
0.3.1
Install & run
clawhub skill install kn70zj1ajbxmgxbsfrw0nbtv9580p7ap:org-memoryInstall using `clawhub skill install kn70zj1ajbxmgxbsfrw0nbtv9580p7ap:org-memory` in an isolated environment before connecting it to live workloads.
No published capability contract is available yet, so validate auth and request/response behavior manually.
Review the upstream CLAWHUB listing at https://clawhub.ai/DCPRevere/org-memory before using production credentials.
Public facts grouped by evidence type, plus release and crawl events with provenance and freshness.
Public facts
Vendor
Clawhub
Protocol compatibility
OpenClaw
Latest release
0.3.1
Adoption signal
745 downloads
Handshake status
UNKNOWN
Parameters, dependencies, examples, extracted files, editorial overview, and the complete README when available.
Captured outputs
Extracted files
5
Examples
6
Snippets
0
Languages
Unknown
text
org-memory: <action> <file-path>
bash
# Correct org add "$ORG_MEMORY_HUMAN_DIR/inbox.org" 'User provided text' --todo TODO -f json # Wrong β double quotes allow shell injection org add "$ORG_MEMORY_HUMAN_DIR/inbox.org" "User provided text" --todo TODO -f json
bash
org add "$ORG_MEMORY_HUMAN_DIR/inbox.org" 'Don'\''t forget' --todo TODO -f json
bash
printf '%s' 'Long text here' | org append k4t --stdin -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
bash
# Sync existing files into the roam database (skip if starting fresh) org roam sync -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" org roam sync -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" # Create a seed node for the agent's knowledge base (skip if files already exist) org roam node create 'Index' -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json # Build the headline index (enables CUSTOM_ID auto-assignment and file-less commands) org index -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" org index -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION"
bash
org todo k4t DONE -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json org schedule k4t 2026-03-15 -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json org note k4t 'Pushed back per manager request' -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json org append k4t 'Updated scope per review.' -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
SKILL.md
---
name: org-memory
version: 0.3.0
description: "Structured knowledge base and task management using org-mode files. Query, mutate, link, and search org files and org-roam databases with the `org` CLI."
metadata: {"openclaw":{"emoji":"π¦","homepage":"https://github.com/dcprevere/org-cli","requires":{"bins":["org"],"env":["ORG_MEMORY_AGENT_DIR","ORG_MEMORY_HUMAN_DIR","ORG_MEMORY_AGENT_DATABASE_LOCATION","ORG_MEMORY_HUMAN_DATABASE_LOCATION"]},"install":[{"kind":"download","label":"Download from GitHub releases: https://github.com/dcprevere/org-cli/releases"}]}}
---
# org-memory
Use the `org` CLI to maintain structured, linked, human-readable knowledge in org-mode files. Org files are plain text with rich structure: headlines, TODO states, tags, properties, timestamps, and links. Combined with org-roam, they form a knowledge graph backed by a SQLite database.
## Shortcuts
When your human uses these patterns, act on them directly.
| Keyword | Meaning | Target |
|---|---|---|
| `Todo:` | Create a task with a date | `$ORG_MEMORY_HUMAN_DIR` |
| `Note:` | Write this down for me | `$ORG_MEMORY_HUMAN_DIR` |
| `Done:` / `Finished:` | Mark a task complete | `$ORG_MEMORY_HUMAN_DIR` |
| `Know:` | Store this for agent recall | `$ORG_MEMORY_AGENT_DIR` |
### Todo β create a task
`Todo: <text>` means "create a task." Extract any date or timeframe from the text and schedule it. If the text contains a relative date ("in 3 weeks", "by Friday", "next month"), compute the actual date and add `--scheduled <date>` or `--deadline <date>`.
Action: `org add "$ORG_MEMORY_HUMAN_DIR/inbox.org" '<title>' --todo TODO --scheduled <date> --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json`
Use `--deadline` instead of `--scheduled` when the text implies a hard due date ("by Friday", "due March 1st"). Use `--scheduled` for softer timing ("in 3 weeks", "next month", "tomorrow").
Examples:
- "Todo: submit taxes in 3 weeks" β `org add .../inbox.org 'Submit taxes' --todo TODO --scheduled 2026-03-18`
- "Todo: renew passport by June" β `org add .../inbox.org 'Renew passport' --todo TODO --deadline 2026-06-01`
- "Todo: call dentist tomorrow" β `org add .../inbox.org 'Call dentist' --todo TODO --scheduled 2026-02-26`
- "Todo: book flights" β `org add .../inbox.org 'Book flights' --todo TODO` (no date mentioned)
### Note β for the human
`Note: <text>` means "add this to MY org files." It is always a task or reminder for the *human*, not for the agent.
Action: `org add "$ORG_MEMORY_HUMAN_DIR/inbox.org" '<text>' --todo TODO -f json`
If the note includes a date or deadline, add `--scheduled <date>` or `--deadline <date>`. If there's no date, add it without one (the human will schedule it themselves, or ask you to).
Examples:
- "Note: Buy groceries" β `org add .../inbox.org 'Buy groceries' --todo TODO`
- "Note: Review PR #42 by Friday" β `org add .../inbox.org 'Review PR #42' --todo TODO --deadline 2026-02-28`
- "Note: we could add feature X to the app" β `org add .../inbox.org 'A_meta.json
{
"ownerId": "kn70zj1ajbxmgxbsfrw0nbtv9580p7ap",
"slug": "org-memory",
"version": "0.3.1",
"publishedAt": 1772112963448
}references/knowledge-management.md
# Knowledge management
This section applies when `ORG_MEMORY_USE_FOR_AGENT` is `true`. All commands operate against `$ORG_MEMORY_AGENT_DIR` and `$ORG_MEMORY_AGENT_DATABASE_LOCATION`.
## Always search before creating
Before creating a node or link, check if the entity already exists:
```bash
org roam node find 'Sarah' -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
```
- If found: use the existing node's ID and file path
- If not found (`headline_not_found` error): create a new node
**Never create a node without searching first.** Duplicates fragment your knowledge graph.
## Record an entity
Only after confirming no existing node:
```bash
org roam node create 'Sarah' -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -t person -t work -f json
```
## Add structure to a node
Use the file path returned by create/find commands:
```bash
# Add a headline to the node (response includes auto-assigned custom_id)
org add <file> 'Unavailable March 2026' --tag scheduling --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
# β {"ok":true,"data":{"custom_id":"k4t","title":"Unavailable March 2026",...}}
# Use the custom_id for follow-up commands
org note k4t 'Out all of March per human.' -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
# Append body text to an existing headline
org append k4t 'Confirmed by email on 2026-02-20.' -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
# Append multi-line text via stdin
printf '%s' 'First paragraph.
Second paragraph.' | org append k4t --stdin -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
```
**`org note` vs `org append`:** `note` adds a timestamped entry to the LOGBOOK drawer (metadata). `append` adds text to the headline body (visible content). Use `note` for audit trail, `append` for building up content.
**Note:** Both commands attach to *headlines*, not file-level nodes. If a roam node is file-level (no headlines yet), first add a headline with `org add`, then use `note` or `append` on it.
## Link two nodes
**Always search for both nodes first** to get their IDs:
```bash
# Find source node
org roam node find 'Bob' -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
# β Returns {"ok":true,"data":{"id":"e5f6a7b8-...","file":"/path/to/bob.org",...}}
# Find target node
org roam node find 'Alice' -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
# β Returns {"ok":true,"data":{"id":"a1b2c3d4-...",...}}
```
If either node doesn't exist, create it first. Then link using the IDs from the responses:
```bash
org roam link add <source-file> '<source-id>' '<target-id>' -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" --description 'manages' -f json
```
The `--description` is optional metadata about the relationship.
## Query your knowledge
```bash
# Find a node by name
org roam node find 'Sarah' references/memory-architecture.md
# Memory architecture
`$ORG_MEMORY_AGENT_DIR` is the agent's primary long-term memory. It replaces flat memory files (like MEMORY.md) with a structured, searchable knowledge graph.
**When org-memory is the primary memory system** (i.e. the user said yes during migration and `plugins.slots.memory` is `"none"`): do not read or write `MEMORY.md`, and do not call `memory_search` or `memory_get`. All long-term memory goes through org files β `memory.org`, daily files, and entity nodes.
## Memory migration
On first use, check whether the user wants org-memory to replace OpenClaw's default memory system.
1. **Ask the user:** "Would you like org-memory to be your primary memory system? This replaces MEMORY.md and daily files with org-mode equivalents."
2. **If yes:**
a. **Migrate MEMORY.md.** Read `~/.openclaw/workspace/MEMORY.md`. Convert markdown headings to org headings (`# ` β `* `, `## ` β `** `, etc.) and write the result to `$ORG_MEMORY_AGENT_DIR/memory.org`. If the file is empty or missing, create a minimal `memory.org` with a single top-level heading.
b. **Migrate daily files.** For each `~/.openclaw/workspace/memory/YYYY-MM-DD.md`, convert headings the same way and write to `$ORG_MEMORY_AGENT_DIR/daily/YYYY-MM-DD.org`. Create the `daily/` directory if needed.
c. **Disable default memory plugin.** Update `~/.openclaw/openclaw.json` β set `plugins.slots.memory` to `"none"`. This stops OpenClaw from loading `memory_search`/`memory_get` and prevents auto-flush to MEMORY.md during compaction.
```json
{
"plugins": {
"slots": {
"memory": "none"
}
}
}
```
Merge this into the existing JSON β don't overwrite other keys.
d. **Sync.** Run `org roam sync` and `org index` against `$ORG_MEMORY_AGENT_DIR` so the new files are in the database.
3. **If no:** Leave the default memory system active. The skill still provides knowledge graph (roam nodes, entity linking) and task management, but MEMORY.md remains the agent's primary curated memory. Do not write to `memory.org` or daily org files β those sections of the skill only apply when org-memory is the primary memory system.
## File structure
```
$ORG_MEMORY_AGENT_DIR/
βββ memory.org # Curated long-term memory (read every session)
βββ daily/
β βββ 2026-02-21.org # Today's raw log
β βββ 2026-02-20.org # Yesterday's raw log
β βββ ...
βββ *.org # Entity nodes (people, projects, etc.)
```
**`memory.org`** β the agent's permanent memory. Curated, concise, always loaded. Contains who the human is, active projects, lessons learned, conventions, and anything needed every session. Keep it tight β move detail into entity nodes and keep memory.org as a summary with links.
**`daily/YYYY-MM-DD.org`** β raw daily logs. What happened, decisions made, ambient facts captured, things learned. Working notes, not curated. Write freely.
**Entity nodes** (`*.org`) β structured roam nodes for people, projects, concepts. Tagged, lreferences/task-management.md
# Task management This section applies when `ORG_MEMORY_USE_FOR_HUMAN` is `true`. All commands operate against `$ORG_MEMORY_HUMAN_DIR` and `$ORG_MEMORY_HUMAN_DATABASE_LOCATION`. ## Read the human's state **Start here.** `org today` is the most useful query β it returns all non-done TODOs that are scheduled for today or overdue: ```bash org today -d "$ORG_MEMORY_HUMAN_DIR" -f json ``` For broader views: ```bash org agenda today -d "$ORG_MEMORY_HUMAN_DIR" -f json # all scheduled + deadlines for today org agenda week -d "$ORG_MEMORY_HUMAN_DIR" -f json # next 7 days org agenda todo -d "$ORG_MEMORY_HUMAN_DIR" -f json # all TODOs with scheduled dates org agenda todo --tag work -d "$ORG_MEMORY_HUMAN_DIR" -f json ``` For rich filtering across all TODOs (scheduled or not): ```bash org todos --state TODO -d "$ORG_MEMORY_HUMAN_DIR" -f json # all open TODOs org todos --state TODO --unscheduled -d "$ORG_MEMORY_HUMAN_DIR" -f json # unscheduled only org todos --state TODO --overdue -d "$ORG_MEMORY_HUMAN_DIR" -f json # overdue items org todos --state TODO --due-before 2026-03-01 -d "$ORG_MEMORY_HUMAN_DIR" -f json # due before date org todos --search 'meeting' -d "$ORG_MEMORY_HUMAN_DIR" -f json # search by title org todos --state TODO --file 'work' -d "$ORG_MEMORY_HUMAN_DIR" -f json # filter by file org todos --state TODO --tag urgent -d "$ORG_MEMORY_HUMAN_DIR" -f json # filter by tag org todos --state TODO --priority A -d "$ORG_MEMORY_HUMAN_DIR" -f json # filter by priority org todos --state TODO --sort priority -d "$ORG_MEMORY_HUMAN_DIR" -f json # sort by priority org todos --state TODO --sort scheduled --reverse -d "$ORG_MEMORY_HUMAN_DIR" -f json # reverse sort ``` The `todos` command returns full data in JSON: title, todo state, priority, tags, file, pos, scheduled, deadline, level, path (parent headlines), and custom_id. All filters are combinable. ## Make changes ```bash # Add a headline (response includes the auto-assigned custom_id) org add "$ORG_MEMORY_HUMAN_DIR/inbox.org" 'Review PR #42' --todo TODO --tag work --deadline 2026-02-10 --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json # Subsequent commands use the custom_id β no file path needed org todo k4t DONE -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json org schedule a1b 2026-03-15 -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json org note a1b 'Pushed back per manager request' -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" org append a1b 'Meeting notes from standup.' -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json # Refile still requires explicit file paths org refile "$ORG_MEMORY_HUMAN_DIR/inbox.org" 'Review PR #42' "$ORG_MEMORY_HUMAN_DIR/work.org" 'Code reviews' --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json ``` ## Preview before writing Use `--dry-run` to see what a mutation would produce withou
Editorial read
Docs source
CLAWHUB
Editorial quality
thin
Skill: org-memory Owner: DCPRevere Summary: Structured knowledge base and task management using org-mode files. Query, mutate, link, and search org files and org-roam databases with the org CLI. Tags: latest:0.3.1 Version history: v0.3.1 | 2026-02-26T13:36:03.448Z | auto org-memory 0.3.1 changelog: - Added in-depth reference documentation: knowledge-management.md, memory-architecture.md, task-management.md. - Clarifi
Skill: org-memory
Owner: DCPRevere
Summary: Structured knowledge base and task management using org-mode files. Query, mutate, link, and search org files and org-roam databases with the org CLI.
Tags: latest:0.3.1
Version history:
v0.3.1 | 2026-02-26T13:36:03.448Z | auto
org-memory 0.3.1 changelog:
v0.2.1 | 2026-02-20T15:11:02.202Z | auto
org-memory 0.2.1
org index after initializing org directories for proper CUSTOM_ID auto-assignment and support for file-less commands.custom_id on creation; follow-up commands referencing headlines should use this custom_id.org note (for LOGBOOK metadata) and org append (for headline body content), with usage examples.org today query for actionable tasks.v0.1.4 | 2026-02-16T11:08:49.322Z | auto
org-memory 0.1.4 changelog:
org-memory: <action> <file-path> after every write.v0.1.3 | 2026-02-11T16:19:19.261Z | auto
org-memory 0.1.3
v0.1.2 | 2026-02-11T16:15:48.072Z | auto
No user-visible changes in this release (version 0.1.2).
v0.1.1 | 2026-02-11T15:00:12.650Z | auto
No changes detected in this version.
v0.1.0 | 2026-02-11T14:17:18.562Z | auto
Initial release of org-memory skill.
org CLI.Archive index:
Archive v0.3.1: 5 files, 10816 bytes
Files: references/knowledge-management.md (4662b), references/memory-architecture.md (5208b), references/task-management.md (5109b), SKILL.md (11233b), _meta.json (129b)
File v0.3.1:SKILL.md
org CLI."
metadata: {"openclaw":{"emoji":"π¦","homepage":"https://github.com/dcprevere/org-cli","requires":{"bins":["org"],"env":["ORG_MEMORY_AGENT_DIR","ORG_MEMORY_HUMAN_DIR","ORG_MEMORY_AGENT_DATABASE_LOCATION","ORG_MEMORY_HUMAN_DATABASE_LOCATION"]},"install":[{"kind":"download","label":"Download from GitHub releases: https://github.com/dcprevere/org-cli/releases"}]}}Use the org CLI to maintain structured, linked, human-readable knowledge in org-mode files. Org files are plain text with rich structure: headlines, TODO states, tags, properties, timestamps, and links. Combined with org-roam, they form a knowledge graph backed by a SQLite database.
When your human uses these patterns, act on them directly.
| Keyword | Meaning | Target |
|---|---|---|
| Todo: | Create a task with a date | $ORG_MEMORY_HUMAN_DIR |
| Note: | Write this down for me | $ORG_MEMORY_HUMAN_DIR |
| Done: / Finished: | Mark a task complete | $ORG_MEMORY_HUMAN_DIR |
| Know: | Store this for agent recall | $ORG_MEMORY_AGENT_DIR |
Todo: <text> means "create a task." Extract any date or timeframe from the text and schedule it. If the text contains a relative date ("in 3 weeks", "by Friday", "next month"), compute the actual date and add --scheduled <date> or --deadline <date>.
Action: org add "$ORG_MEMORY_HUMAN_DIR/inbox.org" '<title>' --todo TODO --scheduled <date> --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
Use --deadline instead of --scheduled when the text implies a hard due date ("by Friday", "due March 1st"). Use --scheduled for softer timing ("in 3 weeks", "next month", "tomorrow").
Examples:
org add .../inbox.org 'Submit taxes' --todo TODO --scheduled 2026-03-18org add .../inbox.org 'Renew passport' --todo TODO --deadline 2026-06-01org add .../inbox.org 'Call dentist' --todo TODO --scheduled 2026-02-26org add .../inbox.org 'Book flights' --todo TODO (no date mentioned)Note: <text> means "add this to MY org files." It is always a task or reminder for the human, not for the agent.
Action: org add "$ORG_MEMORY_HUMAN_DIR/inbox.org" '<text>' --todo TODO -f json
If the note includes a date or deadline, add --scheduled <date> or --deadline <date>. If there's no date, add it without one (the human will schedule it themselves, or ask you to).
Examples:
org add .../inbox.org 'Buy groceries' --todo TODOorg add .../inbox.org 'Review PR #42' --todo TODO --deadline 2026-02-28org add .../inbox.org 'Add feature X to the app' --todo TODOorg add .../inbox.org 'Send email to Donna about safeguarding' --todo TODONote vs Todo: Both create TODO headings. The difference is intent β Todo: signals a concrete task (always try to extract a date), while Note: is broader (ideas, reminders, observations). When there's no date, add it without one.
Edge case β ideas and observations: If the human says "Note: we could do X" or "Note: idea for Y", it's still a Note. They're telling you to write it down for them. Add it as a TODO. Don't create a roam node, don't put it in the agent's knowledge base.
Done: <text> or Finished: <text> means "mark this task as DONE." Search for the matching TODO and set its state.
Action:
org todos --state TODO --search '<text>' -d "$ORG_MEMORY_HUMAN_DIR" -f jsonorg todo <file> '<title>' DONE -f jsonExamples:
Know: <info> means "store this in YOUR knowledge base for future recall." This is information the agent should retain across sessions.
Action: Search for an existing node first (org roam node find), then create or update.
Examples:
$ORG_MEMORY_AGENT_DIR$ORG_MEMORY_AGENT_DIRAfter every mutation to either directory, print a line in this exact format:
org-memory: <action> <file-path>
Examples: org-memory: added TODO to ~/org/human/inbox.org, org-memory: created node ~/org/agent/sarah.org, org-memory: updated ~/org/agent/sarah.org.
This is mandatory. Never silently write to either directory. The human should always see what you did and where.
All commands accept -f json for structured output with {"ok":true,"data":...} envelopes. Errors return {"ok":false,"error":{"type":"...","message":"..."}}. Always use -f json.
User-provided text (task titles, note content, search terms) must be single-quoted to prevent shell expansion. Double quotes allow $(β¦), backticks, and variable interpolation β single quotes do not.
# Correct
org add "$ORG_MEMORY_HUMAN_DIR/inbox.org" 'User provided text' --todo TODO -f json
# Wrong β double quotes allow shell injection
org add "$ORG_MEMORY_HUMAN_DIR/inbox.org" "User provided text" --todo TODO -f json
If the text contains a literal single quote, escape it with '\'':
org add "$ORG_MEMORY_HUMAN_DIR/inbox.org" 'Don'\''t forget' --todo TODO -f json
For multi-line content, pipe via stdin instead of interpolating:
printf '%s' 'Long text here' | org append k4t --stdin -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
Environment variable paths ($ORG_MEMORY_HUMAN_DIR, etc.) must always be double-quoted to handle spaces, but never place user text inside double quotes.
Run org schema once to get a machine-readable description of all commands, arguments, and flags. Use this to construct valid commands without memorizing the interface.
Configuration is via environment variables. Set them in openclaw.json so they are injected into every command automatically.
| Variable | Default | Purpose |
|---|---|---|
| ORG_MEMORY_USE_FOR_AGENT | true | Enable the agent's own knowledge base |
| ORG_MEMORY_AGENT_DIR | ~/org/agent | Agent's org directory |
| ORG_MEMORY_AGENT_DATABASE_LOCATION | ~/.local/share/org-memory/agent/.org.db | Agent's database |
| ORG_MEMORY_USE_FOR_HUMAN | true | Enable task management in the human's org files |
| ORG_MEMORY_HUMAN_DIR | ~/org/human | Human's org directory |
| ORG_MEMORY_HUMAN_DATABASE_LOCATION | ~/.local/share/org-memory/human/.org.db | Human's database |
If ORG_MEMORY_USE_FOR_AGENT is not true, skip the Knowledge management section. If ORG_MEMORY_USE_FOR_HUMAN is not true, skip the Task management and Batch operations sections.
Always pass --db to point at the correct database. The CLI auto-syncs the roam database after every mutation using the --db value. Without --db, the CLI defaults to the emacs org-roam database (~/.emacs.d/org-roam.db), which is not what you want.
Initialize each enabled directory. If the directories already contain org files, sync them first:
# Sync existing files into the roam database (skip if starting fresh)
org roam sync -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION"
org roam sync -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION"
# Create a seed node for the agent's knowledge base (skip if files already exist)
org roam node create 'Index' -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
# Build the headline index (enables CUSTOM_ID auto-assignment and file-less commands)
org index -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION"
org index -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION"
The roam response includes the node's ID, file path, title, and tags.
Every headline created with org add is auto-assigned a short CUSTOM_ID (e.g. k4t) when an index database exists. This ID appears in the custom_id field of all JSON responses and as a column in text output.
Use CUSTOM_IDs to refer to headlines in subsequent commands β they are stable across edits and don't require a file path:
org todo k4t DONE -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
org schedule k4t 2026-03-15 -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
org note k4t 'Pushed back per manager request' -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
org append k4t 'Updated scope per review.' -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
To backfill CUSTOM_IDs on existing headlines that don't have them:
org custom-id assign -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION"
Never address headlines by position number (pos). Positions change when files are edited β a mutation on one headline shifts the byte positions of everything after it.
Safe identifiers (in order of preference):
k4t) β stable, short, uniqueIf you need to mutate multiple headlines in the same file, either:
org batch for atomic multi-step operations (recommended)pospos, re-query after each mutation to get fresh positionsBranch on the ok field. Handle errors by type:
file_not_found: wrong path or deleted fileheadline_not_found: identifier doesn't match; re-query to get current stateparse_error: file has syntax the parser can't handle; don't retryinvalid_args: check org schema or org <command> --helpRead these on demand when the conversation requires them:
{baseDir}/references/knowledge-management.md): Read when ORG_MEMORY_USE_FOR_AGENT=true and you need to create/query/link roam nodes in the agent's knowledge base.{baseDir}/references/task-management.md): Read when ORG_MEMORY_USE_FOR_HUMAN=true and you need to query or mutate the human's tasks, use batch operations, or map natural-language queries to commands.{baseDir}/references/memory-architecture.md): Read on first use (memory migration) and at session start (file structure, session routine, ambient capture guidelines).File v0.3.1:_meta.json
{ "ownerId": "kn70zj1ajbxmgxbsfrw0nbtv9580p7ap", "slug": "org-memory", "version": "0.3.1", "publishedAt": 1772112963448 }
File v0.3.1:references/knowledge-management.md
This section applies when ORG_MEMORY_USE_FOR_AGENT is true. All commands operate against $ORG_MEMORY_AGENT_DIR and $ORG_MEMORY_AGENT_DATABASE_LOCATION.
Before creating a node or link, check if the entity already exists:
org roam node find 'Sarah' -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
headline_not_found error): create a new nodeNever create a node without searching first. Duplicates fragment your knowledge graph.
Only after confirming no existing node:
org roam node create 'Sarah' -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -t person -t work -f json
Use the file path returned by create/find commands:
# Add a headline to the node (response includes auto-assigned custom_id)
org add <file> 'Unavailable March 2026' --tag scheduling --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
# β {"ok":true,"data":{"custom_id":"k4t","title":"Unavailable March 2026",...}}
# Use the custom_id for follow-up commands
org note k4t 'Out all of March per human.' -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
# Append body text to an existing headline
org append k4t 'Confirmed by email on 2026-02-20.' -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
# Append multi-line text via stdin
printf '%s' 'First paragraph.
Second paragraph.' | org append k4t --stdin -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
org note vs org append: note adds a timestamped entry to the LOGBOOK drawer (metadata). append adds text to the headline body (visible content). Use note for audit trail, append for building up content.
Note: Both commands attach to headlines, not file-level nodes. If a roam node is file-level (no headlines yet), first add a headline with org add, then use note or append on it.
Always search for both nodes first to get their IDs:
# Find source node
org roam node find 'Bob' -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
# β Returns {"ok":true,"data":{"id":"e5f6a7b8-...","file":"/path/to/bob.org",...}}
# Find target node
org roam node find 'Alice' -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
# β Returns {"ok":true,"data":{"id":"a1b2c3d4-...",...}}
If either node doesn't exist, create it first. Then link using the IDs from the responses:
org roam link add <source-file> '<source-id>' '<target-id>' -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" --description 'manages' -f json
The --description is optional metadata about the relationship.
# Find a node by name
org roam node find 'Sarah' -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
# Read a headline's full content (body, properties, logbook)
org read <file> 'Unavailable March 2026' -d "$ORG_MEMORY_AGENT_DIR" -f json
# Full-text search across all indexed headlines (fast, supports boolean/prefix/phrase)
org fts 'sarah AND march' -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
# Regex search (slower, use when FTS isn't precise enough)
org search 'Sarah.*March' -d "$ORG_MEMORY_AGENT_DIR" -f json
# Browse by graph structure
org roam backlinks 'a1b2c3d4-...' -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
org roam tag find person -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
org fts vs org search: Use fts by default β it's faster and handles natural language well. Use search when you need regex patterns (e.g. matching across fields or partial words that aren't prefixes).
Aliases let a node be found by multiple names. Refs associate URLs or external identifiers.
org roam alias add <file> 'a1b2c3d4-...' 'Sarah Chen' --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION"
org roam ref add <file> 'a1b2c3d4-...' 'https://github.com/sarahchen' --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION"
Use consistent tags for easy querying:
person β people the human knows or works withproject β software projects, initiativeslesson β things the agent learned the hard waypreference β how the human likes things donefact β technical details, configuration, reference dataFile v0.3.1:references/memory-architecture.md
$ORG_MEMORY_AGENT_DIR is the agent's primary long-term memory. It replaces flat memory files (like MEMORY.md) with a structured, searchable knowledge graph.
When org-memory is the primary memory system (i.e. the user said yes during migration and plugins.slots.memory is "none"): do not read or write MEMORY.md, and do not call memory_search or memory_get. All long-term memory goes through org files β memory.org, daily files, and entity nodes.
On first use, check whether the user wants org-memory to replace OpenClaw's default memory system.
Ask the user: "Would you like org-memory to be your primary memory system? This replaces MEMORY.md and daily files with org-mode equivalents."
If yes:
a. Migrate MEMORY.md. Read ~/.openclaw/workspace/MEMORY.md. Convert markdown headings to org headings (# β * , ## β ** , etc.) and write the result to $ORG_MEMORY_AGENT_DIR/memory.org. If the file is empty or missing, create a minimal memory.org with a single top-level heading.
b. Migrate daily files. For each ~/.openclaw/workspace/memory/YYYY-MM-DD.md, convert headings the same way and write to $ORG_MEMORY_AGENT_DIR/daily/YYYY-MM-DD.org. Create the daily/ directory if needed.
c. Disable default memory plugin. Update ~/.openclaw/openclaw.json β set plugins.slots.memory to "none". This stops OpenClaw from loading memory_search/memory_get and prevents auto-flush to MEMORY.md during compaction.
{
"plugins": {
"slots": {
"memory": "none"
}
}
}
Merge this into the existing JSON β don't overwrite other keys.
d. Sync. Run org roam sync and org index against $ORG_MEMORY_AGENT_DIR so the new files are in the database.
If no: Leave the default memory system active. The skill still provides knowledge graph (roam nodes, entity linking) and task management, but MEMORY.md remains the agent's primary curated memory. Do not write to memory.org or daily org files β those sections of the skill only apply when org-memory is the primary memory system.
$ORG_MEMORY_AGENT_DIR/
βββ memory.org # Curated long-term memory (read every session)
βββ daily/
β βββ 2026-02-21.org # Today's raw log
β βββ 2026-02-20.org # Yesterday's raw log
β βββ ...
βββ *.org # Entity nodes (people, projects, etc.)
memory.org β the agent's permanent memory. Curated, concise, always loaded. Contains who the human is, active projects, lessons learned, conventions, and anything needed every session. Keep it tight β move detail into entity nodes and keep memory.org as a summary with links.
daily/YYYY-MM-DD.org β raw daily logs. What happened, decisions made, ambient facts captured, things learned. Working notes, not curated. Write freely.
Entity nodes (*.org) β structured roam nodes for people, projects, concepts. Tagged, linked, and queryable on demand.
At the start of every session:
memory.org β your permanent memory, always relevantdaily/YYYY-MM-DD.org) β recent contextorg today -d "$ORG_MEMORY_HUMAN_DIR" -f jsonThat's it. Don't load everything. Query entity nodes on demand when the conversation needs them.
daily/YYYY-MM-DD.org)org roam node find, then org append to the nodememory.orgNot everything the human tells you is a command. Sometimes they mention facts in passing β a person's preference, a date, a technical detail, a relationship. Capture these in $ORG_MEMORY_AGENT_DIR without being asked, but only when the information has lasting value (people, decisions, technical details, preferences). Don't capture routine operational chatter.
Process: Complete the human's explicit request first. Then silently search for an existing node and update it (or create one if new). Always print org-memory: <action> <file-path> afterward.
Example: "Cancel my Thursday meeting with Sarah and reschedule the API migration review to next week. Sarah is going to be out all of March."
$ORG_MEMORY_HUMAN_DIR$ORG_MEMORY_AGENT_DIRPeriodically (every few days, during a quiet moment):
memory.orgmemory.orgorg ftsThis is like reviewing a journal and updating your mental model. Daily files are raw notes; memory.org is curated wisdom; entity nodes are structured knowledge.
File v0.3.1:references/task-management.md
This section applies when ORG_MEMORY_USE_FOR_HUMAN is true. All commands operate against $ORG_MEMORY_HUMAN_DIR and $ORG_MEMORY_HUMAN_DATABASE_LOCATION.
Start here. org today is the most useful query β it returns all non-done TODOs that are scheduled for today or overdue:
org today -d "$ORG_MEMORY_HUMAN_DIR" -f json
For broader views:
org agenda today -d "$ORG_MEMORY_HUMAN_DIR" -f json # all scheduled + deadlines for today
org agenda week -d "$ORG_MEMORY_HUMAN_DIR" -f json # next 7 days
org agenda todo -d "$ORG_MEMORY_HUMAN_DIR" -f json # all TODOs with scheduled dates
org agenda todo --tag work -d "$ORG_MEMORY_HUMAN_DIR" -f json
For rich filtering across all TODOs (scheduled or not):
org todos --state TODO -d "$ORG_MEMORY_HUMAN_DIR" -f json # all open TODOs
org todos --state TODO --unscheduled -d "$ORG_MEMORY_HUMAN_DIR" -f json # unscheduled only
org todos --state TODO --overdue -d "$ORG_MEMORY_HUMAN_DIR" -f json # overdue items
org todos --state TODO --due-before 2026-03-01 -d "$ORG_MEMORY_HUMAN_DIR" -f json # due before date
org todos --search 'meeting' -d "$ORG_MEMORY_HUMAN_DIR" -f json # search by title
org todos --state TODO --file 'work' -d "$ORG_MEMORY_HUMAN_DIR" -f json # filter by file
org todos --state TODO --tag urgent -d "$ORG_MEMORY_HUMAN_DIR" -f json # filter by tag
org todos --state TODO --priority A -d "$ORG_MEMORY_HUMAN_DIR" -f json # filter by priority
org todos --state TODO --sort priority -d "$ORG_MEMORY_HUMAN_DIR" -f json # sort by priority
org todos --state TODO --sort scheduled --reverse -d "$ORG_MEMORY_HUMAN_DIR" -f json # reverse sort
The todos command returns full data in JSON: title, todo state, priority, tags, file, pos, scheduled, deadline, level, path (parent headlines), and custom_id. All filters are combinable.
# Add a headline (response includes the auto-assigned custom_id)
org add "$ORG_MEMORY_HUMAN_DIR/inbox.org" 'Review PR #42' --todo TODO --tag work --deadline 2026-02-10 --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
# Subsequent commands use the custom_id β no file path needed
org todo k4t DONE -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
org schedule a1b 2026-03-15 -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
org note a1b 'Pushed back per manager request' -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION"
org append a1b 'Meeting notes from standup.' -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
# Refile still requires explicit file paths
org refile "$ORG_MEMORY_HUMAN_DIR/inbox.org" 'Review PR #42' "$ORG_MEMORY_HUMAN_DIR/work.org" 'Code reviews' --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
Use --dry-run to see what a mutation would produce without modifying the file:
org todo tasks.org 'Buy groceries' DONE --dry-run -f json
Apply multiple mutations atomically. Commands execute sequentially against in-memory state. Files are written only if all succeed.
echo '{"commands":[
{"command":"todo","file":"tasks.org","identifier":"Buy groceries","args":{"state":"DONE"}},
{"command":"tag-add","file":"tasks.org","identifier":"Write report","args":{"tag":"urgent"}},
{"command":"schedule","file":"tasks.org","identifier":"Write report","args":{"date":"2026-03-01"}},
{"command":"append","file":"tasks.org","identifier":"Write report","args":{"text":"Include Q1 metrics."}}
]}' | org batch -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
When the human asks about their tasks or your knowledge, map natural language to the right query. Don't ask "what do you mean?" β just run the query.
| Human says | Action |
|---|---|
| "What do I need to do?" / "What's on my plate?" | org today -d "$ORG_MEMORY_HUMAN_DIR" -f json (today + overdue) |
| "What's overdue?" | org todos --state TODO --overdue -d "$ORG_MEMORY_HUMAN_DIR" -f json |
| "What's coming up this week?" | org agenda week -d "$ORG_MEMORY_HUMAN_DIR" -f json |
| "Show me everything tagged work" | org todos --state TODO --tag work -d "$ORG_MEMORY_HUMAN_DIR" -f json |
| "What do I have unscheduled?" | org todos --state TODO --unscheduled -d "$ORG_MEMORY_HUMAN_DIR" -f json |
| "Find all tasks about X" | org todos --search 'X' -d "$ORG_MEMORY_HUMAN_DIR" -f json |
| "What do you know about Sarah?" | org roam node find 'Sarah' β org read <file> 'Sarah' β org roam backlinks <id> (all with agent dir/db flags) |
| "What's the status of project X?" | org fts 'X' -d "$ORG_MEMORY_AGENT_DIR" + org todos --search 'X' -d "$ORG_MEMORY_HUMAN_DIR" |
| "Search my notes for Y" | org fts 'Y' -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json |
Present results in a clean, readable format. Don't dump raw JSON at the human β summarise it.
Archive v0.2.1: 3 files, 7269 bytes
Files: README.md (5186b), SKILL.md (12999b), _meta.json (129b)
File v0.2.1:SKILL.md
org CLI."
metadata: {"openclaw":{"emoji":"π¦","requires":{"bins":["org"]},"install":[{"id":"github-release","kind":"manual","label":"Download from GitHub releases: https://github.com/dcprevere/org-cli/releases"}]}}Use the org CLI to maintain structured, linked, human-readable knowledge in org-mode files. Org files are plain text with rich structure: headlines, TODO states, tags, properties, timestamps, and links. Combined with org-roam, they form a knowledge graph backed by a SQLite database.
When your human uses these patterns, act immediately:
| Pattern | Action |
|---------|--------|
| Remember: <info> | Save to your knowledge base ($ORG_MEMORY_AGENT_DIR). Create or update a node. This is for your future recall. |
| Note: <task or info> | Add to the human's org files ($ORG_MEMORY_HUMAN_DIR/inbox.org). This is for them to act on. |
Examples:
Don't ask for confirmation on shortcuts β just do it. After every write, print a line in this exact format:
org-memory: <action> <file-path>
Examples: org-memory: added TODO to ~/org/human/inbox.org, org-memory: created node ~/org/agent/sarah.org, org-memory: updated ~/org/agent/sarah.org.
All commands accept -f json for structured output with {"ok":true,"data":...} envelopes. Errors return {"ok":false,"error":{"type":"...","message":"..."}}. Always use -f json.
Run org schema once to get a machine-readable description of all commands, arguments, and flags. Use this to construct valid commands without memorizing the interface.
Configuration is via environment variables. Set them in openclaw.json so they are injected into every command automatically.
| Variable | Default | Purpose |
|---|---|---|
| ORG_MEMORY_USE_FOR_AGENT | true | Enable the agent's own knowledge base |
| ORG_MEMORY_AGENT_DIR | ~/org/agent | Agent's org directory |
| ORG_MEMORY_AGENT_DATABASE_LOCATION | ~/.local/share/org-memory/agent/.org.db | Agent's database |
| ORG_MEMORY_USE_FOR_HUMAN | true | Enable task management in the human's org files |
| ORG_MEMORY_HUMAN_DIR | ~/org/human | Human's org directory |
| ORG_MEMORY_HUMAN_DATABASE_LOCATION | ~/.local/share/org-memory/human/.org.db | Human's database |
If ORG_MEMORY_USE_FOR_AGENT is not true, skip the Knowledge management section. If ORG_MEMORY_USE_FOR_HUMAN is not true, skip the Task management and Batch operations sections.
Always pass --db to point at the correct database. The CLI auto-syncs the roam database after every mutation using the --db value. Without --db, the CLI defaults to the emacs org-roam database (~/.emacs.d/org-roam.db), which is not what you want.
Initialize each enabled directory by creating a first node and building the headline index:
org roam node create "Index" -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
org index -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION"
org index -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION"
The roam response includes the node's ID, file path, title, and tags. The index enables CUSTOM_ID auto-assignment and file-less commands.
This section applies when ORG_MEMORY_USE_FOR_AGENT is true.
Before creating a node or link, check if the entity already exists:
org roam node find "Sarah" -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
headline_not_found error): create a new nodeNever create a node without searching first. Duplicates fragment your knowledge graph.
Only after confirming no existing node:
org roam node create "Sarah" -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -t person -t work -f json
Use the file path returned by create/find commands:
# Add a headline to the node (response includes auto-assigned custom_id)
org add <file> "Unavailable March 2026" --tag scheduling --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
# β {"ok":true,"data":{"custom_id":"k4t","title":"Unavailable March 2026",...}}
# Use the custom_id for follow-up commands
org note k4t "Out all of March per human." -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
# Append body text to an existing headline
org append k4t "Confirmed by email on 2026-02-20." -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
# Append multi-line text via stdin
echo "First paragraph.\n\nSecond paragraph." | org append k4t --stdin -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
org note vs org append: note adds a timestamped entry to the LOGBOOK drawer (metadata). append adds text to the headline body (visible content). Use note for audit trail, append for building up content.
Note: Both commands attach to headlines, not file-level nodes. If a roam node is file-level (no headlines yet), first add a headline with org add, then use note or append on it.
Always search for both nodes first to get their IDs:
# Find source node
org roam node find "Bob" -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
# β Returns {"ok":true,"data":{"id":"e5f6a7b8-...","file":"/path/to/bob.org",...}}
# Find target node
org roam node find "Alice" -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
# β Returns {"ok":true,"data":{"id":"a1b2c3d4-...",...}}
If either node doesn't exist, create it first. Then link using the IDs from the responses:
org roam link add <source-file> "<source-id>" "<target-id>" -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" --description "manages" -f json
The --description is optional metadata about the relationship.
org roam node find "Sarah" -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
org roam backlinks "a1b2c3d4-..." -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
org roam tag find person -d "$ORG_MEMORY_AGENT_DIR" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION" -f json
org search "Sarah.*March" -d "$ORG_MEMORY_AGENT_DIR" -f json
Aliases let a node be found by multiple names. Refs associate URLs or external identifiers.
org roam alias add <file> "a1b2c3d4-..." "Sarah Chen" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION"
org roam ref add <file> "a1b2c3d4-..." "https://github.com/sarahchen" --db "$ORG_MEMORY_AGENT_DATABASE_LOCATION"
This section applies when ORG_MEMORY_USE_FOR_HUMAN is true.
Start here. org today is the most useful query β it returns all non-done TODOs that are scheduled for today or overdue:
org today -d "$ORG_MEMORY_HUMAN_DIR" -f json
For broader views:
org agenda today -d "$ORG_MEMORY_HUMAN_DIR" -f json # all scheduled + deadlines for today
org agenda week -d "$ORG_MEMORY_HUMAN_DIR" -f json # next 7 days
org agenda todo -d "$ORG_MEMORY_HUMAN_DIR" -f json # all TODOs
org agenda todo --tag work -d "$ORG_MEMORY_HUMAN_DIR" -f json
# Add a headline (response includes the auto-assigned custom_id)
org add $ORG_MEMORY_HUMAN_DIR/inbox.org "Review PR #42" --todo TODO --tag work --deadline 2026-02-10 --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
# Subsequent commands use the custom_id β no file path needed
org todo k4t DONE -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
org schedule a1b 2026-03-15 -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
org note a1b "Pushed back per manager request" -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION"
org append a1b "Meeting notes from standup." -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
# Refile still requires explicit file paths
org refile $ORG_MEMORY_HUMAN_DIR/inbox.org "Review PR #42" $ORG_MEMORY_HUMAN_DIR/work.org "Code reviews" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
Use --dry-run to see what a mutation would produce without modifying the file:
org todo tasks.org "Buy groceries" DONE --dry-run -f json
This section applies when ORG_MEMORY_USE_FOR_HUMAN is true.
Apply multiple mutations atomically. Commands execute sequentially against in-memory state. Files are written only if all succeed.
echo '{"commands":[
{"command":"todo","file":"tasks.org","identifier":"Buy groceries","args":{"state":"DONE"}},
{"command":"tag-add","file":"tasks.org","identifier":"Write report","args":{"tag":"urgent"}},
{"command":"schedule","file":"tasks.org","identifier":"Write report","args":{"date":"2026-03-01"}},
{"command":"append","file":"tasks.org","identifier":"Write report","args":{"text":"Include Q1 metrics."}}
]}' | org batch -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
When both features are enabled and the human tells you something, distinguish between requests and ambient information. Fulfill requests in $ORG_MEMORY_HUMAN_DIR. Record what you learned in $ORG_MEMORY_AGENT_DIR.
Example: "Cancel my Thursday meeting with Sarah and reschedule the API migration review to next week. Sarah is going to be out all of March."
$ORG_MEMORY_HUMAN_DIR$ORG_MEMORY_AGENT_DIRIf only agent memory is enabled, record everything relevant in $ORG_MEMORY_AGENT_DIR. If only human file management is enabled, only act on explicit requests.
Check whether a node already exists before creating it. Use the returned data from mutations rather than making follow-up queries.
Always report writes. After every mutation to either directory, print org-memory: <action> <file-path>. Never silently write to either directory.
Every headline created with org add is auto-assigned a short CUSTOM_ID (e.g. k4t) when an index database exists. This ID appears in the custom_id field of all JSON responses and as a column in text output.
Use CUSTOM_IDs to refer to headlines in subsequent commands β they are stable across edits and don't require a file path:
org todo k4t DONE -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
org schedule k4t 2026-03-15 -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
org note k4t "Pushed back per manager request" -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
org append k4t "Updated scope per review." -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION" -f json
To backfill CUSTOM_IDs on existing headlines that don't have them:
org custom-id assign -d "$ORG_MEMORY_HUMAN_DIR" --db "$ORG_MEMORY_HUMAN_DATABASE_LOCATION"
Never address headlines by position number. Positions change when files are edited. Use CUSTOM_ID, org-id, or exact title.
Branch on the ok field. Handle errors by type:
file_not_found: wrong path or deleted fileheadline_not_found: identifier doesn't match; re-query to get current stateparse_error: file has syntax the parser can't handle; don't retryinvalid_args: check org schema or org <command> --helpYou didn't search before creating. Always run node find first. If duplicates exist, manually delete the newer file and run org roam sync.
You tried to add a note to a file-level node (level 0). Use org add to create a headline first, then org note on that headline.
The --description parameter sets relationship metadata, not display text. The link displays the target node's title. This is correct org-roam behavior.
Run org roam sync -d <dir> --db <db-path> to rebuild the database from files.
File v0.2.1:README.md
An OpenClaw skill that gives your agent structured, linked, human-readable memory using org-mode files.
Put org on your PATH (releases).
Copy the skill into your OpenClaw skills directory:
cp -r integrations/openclaw ~/.openclaw/skills/org-memory
Once installed, just talk to your agent naturally:
OpenClaw's default memory (MEMORY.md + semantic search) works well for simple setups. org-memory is worth the added complexity when you need more.
| Capability | MEMORY.md | org-memory |
|------------|-----------|------------|
| Store facts about one person | Works great | Overkill |
| Store 20+ entities (people, projects, companies) | Gets messy | Each entity = separate file |
| "List all my clients" | Grep through text | tag find client β structured list |
| Track relationships | Text references | Graph links with backlinks |
| "What do I need to do today?" | Not possible | org today β due + overdue TODOs |
| "What's due this week?" | Not possible | agenda week β parsed dates |
| Task management | No date support | SCHEDULED, DEADLINE, repeaters |
| "Mark that task done" | Find file, find line | org todo k4t DONE |
Use MEMORY.md for: personal preferences, key dates, simple facts (<100 items).
Use org-memory for: CRM-like knowledge, task management, relationship graphs, or any knowledge base that will grow beyond 100 entities.
Both are linked knowledge graphs. Key differences:
| | Obsidian | org-memory | |---|----------|------------| | Format | Markdown + YAML frontmatter | Org-mode | | Task management | Limited (no native dates) | Full agenda: SCHEDULED, DEADLINE, repeaters, clock | | Query language | Dataview plugin (JS-based) | CLI with JSON output | | Human editing | Obsidian app or any editor | Emacs or any editor | | Agent integration | Needs custom tooling | Built for CLI/agent use |
Use Obsidian if: you already live in Obsidian and want your agent to share that vault.
Use org-memory if: you need real task management with dates, prefer CLI-native tooling, or use Emacs.
The real differentiator is agenda queries and short IDs. The moment you want:
org today shows all non-done TODOs due today or overdueorg today catches these automatically...MEMORY.md and Obsidian can't help. org-memory handles this natively because org-mode was built for it. Every headline gets a short CUSTOM_ID (like k4t) that works across files without remembering paths.
The skill teaches the agent to use org for:
By default the agent maintains two directories: its own knowledge base and the human's files. Either feature can be disabled independently. All files are plain text, human-readable, and version-controllable.
| Variable | Default | Purpose |
|---|---|---|
| ORG_MEMORY_USE_FOR_AGENT | true | Enable the agent's own knowledge base |
| ORG_MEMORY_AGENT_DIR | ~/org/agent | Agent's org directory |
| ORG_MEMORY_AGENT_DATABASE_LOCATION | ~/.local/share/org-memory/agent/.org.db | Agent's database |
| ORG_MEMORY_USE_FOR_HUMAN | true | Enable task management in the human's org files |
| ORG_MEMORY_HUMAN_DIR | ~/org/human | Human's org directory |
| ORG_MEMORY_HUMAN_DATABASE_LOCATION | ~/.local/share/org-memory/human/.org.db | Human's database |
All are optional. If unset, the defaults apply. Set ORG_MEMORY_USE_FOR_AGENT or ORG_MEMORY_USE_FOR_HUMAN to anything other than true to disable that feature.
The databases are stored under ~/.local/share/org-memory/ by default, separate from both the org files and the emacs org-roam database (~/.emacs.d/org-roam.db) to avoid concurrent-write conflicts. The org CLI itself defaults to the emacs database; the skill overrides this via --db.
To override, set them in ~/.openclaw/openclaw.json:
{
"skills": {
"entries": {
"org-memory": {
"env": {
"ORG_MEMORY_USE_FOR_HUMAN": "false",
"ORG_MEMORY_AGENT_DIR": "/path/to/agent",
"ORG_MEMORY_AGENT_DATABASE_LOCATION": "/path/to/agent.db"
}
}
}
}
}
Or export them in your shell. Shell env takes precedence over openclaw.json.
File v0.2.1:_meta.json
{ "ownerId": "kn70zj1ajbxmgxbsfrw0nbtv9580p7ap", "slug": "org-memory", "version": "0.2.1", "publishedAt": 1771600262202 }
Machine endpoints, contract coverage, trust signals, runtime metrics, benchmarks, and guardrails for agent-to-agent use.
Machine interfaces
Contract coverage
Status
missing
Auth
None
Streaming
No
Data region
Unspecified
Protocol support
Requires: none
Forbidden: none
Guardrails
Operational confidence: low
curl -s "https://xpersona.co/api/v1/agents/clawhub-dcprevere-org-memory/snapshot"
curl -s "https://xpersona.co/api/v1/agents/clawhub-dcprevere-org-memory/contract"
curl -s "https://xpersona.co/api/v1/agents/clawhub-dcprevere-org-memory/trust"
Operational fit
Trust signals
Handshake
UNKNOWN
Confidence
unknown
Attempts 30d
unknown
Fallback rate
unknown
Runtime metrics
Observed P50
unknown
Observed P95
unknown
Rate limit
unknown
Estimated cost
unknown
Do not use if
Raw contract, invocation, trust, capability, facts, and change-event payloads for machine-side inspection.
Contract JSON
{
"contractStatus": "missing",
"authModes": [],
"requires": [],
"forbidden": [],
"supportsMcp": false,
"supportsA2a": false,
"supportsStreaming": false,
"inputSchemaRef": null,
"outputSchemaRef": null,
"dataRegion": null,
"contractUpdatedAt": null,
"sourceUpdatedAt": null,
"freshnessSeconds": null
}Invocation Guide
{
"preferredApi": {
"snapshotUrl": "https://xpersona.co/api/v1/agents/clawhub-dcprevere-org-memory/snapshot",
"contractUrl": "https://xpersona.co/api/v1/agents/clawhub-dcprevere-org-memory/contract",
"trustUrl": "https://xpersona.co/api/v1/agents/clawhub-dcprevere-org-memory/trust"
},
"curlExamples": [
"curl -s \"https://xpersona.co/api/v1/agents/clawhub-dcprevere-org-memory/snapshot\"",
"curl -s \"https://xpersona.co/api/v1/agents/clawhub-dcprevere-org-memory/contract\"",
"curl -s \"https://xpersona.co/api/v1/agents/clawhub-dcprevere-org-memory/trust\""
],
"jsonRequestTemplate": {
"query": "summarize this repo",
"constraints": {
"maxLatencyMs": 2000,
"protocolPreference": [
"OPENCLEW"
]
}
},
"jsonResponseTemplate": {
"ok": true,
"result": {
"summary": "...",
"confidence": 0.9
},
"meta": {
"source": "CLAWHUB",
"generatedAt": "2026-04-17T04:44:21.397Z"
}
},
"retryPolicy": {
"maxAttempts": 3,
"backoffMs": [
500,
1500,
3500
],
"retryableConditions": [
"HTTP_429",
"HTTP_503",
"NETWORK_TIMEOUT"
]
}
}Trust JSON
{
"status": "unavailable",
"handshakeStatus": "UNKNOWN",
"verificationFreshnessHours": null,
"reputationScore": null,
"p95LatencyMs": null,
"successRate30d": null,
"fallbackRate": null,
"attempts30d": null,
"trustUpdatedAt": null,
"trustConfidence": "unknown",
"sourceUpdatedAt": null,
"freshnessSeconds": null
}Capability Matrix
{
"rows": [
{
"key": "OPENCLEW",
"type": "protocol",
"support": "unknown",
"confidenceSource": "profile",
"notes": "Listed on profile"
}
],
"flattenedTokens": "protocol:OPENCLEW|unknown|profile"
}Facts JSON
[
{
"factKey": "vendor",
"category": "vendor",
"label": "Vendor",
"value": "Clawhub",
"href": "https://clawhub.ai/DCPRevere/org-memory",
"sourceUrl": "https://clawhub.ai/DCPRevere/org-memory",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-04-15T00:45:39.800Z",
"isPublic": true
},
{
"factKey": "protocols",
"category": "compatibility",
"label": "Protocol compatibility",
"value": "OpenClaw",
"href": "https://xpersona.co/api/v1/agents/clawhub-dcprevere-org-memory/contract",
"sourceUrl": "https://xpersona.co/api/v1/agents/clawhub-dcprevere-org-memory/contract",
"sourceType": "contract",
"confidence": "medium",
"observedAt": "2026-04-15T00:45:39.800Z",
"isPublic": true
},
{
"factKey": "traction",
"category": "adoption",
"label": "Adoption signal",
"value": "745 downloads",
"href": "https://clawhub.ai/DCPRevere/org-memory",
"sourceUrl": "https://clawhub.ai/DCPRevere/org-memory",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-04-15T00:45:39.800Z",
"isPublic": true
},
{
"factKey": "latest_release",
"category": "release",
"label": "Latest release",
"value": "0.3.1",
"href": "https://clawhub.ai/DCPRevere/org-memory",
"sourceUrl": "https://clawhub.ai/DCPRevere/org-memory",
"sourceType": "release",
"confidence": "medium",
"observedAt": "2026-02-26T13:36:03.448Z",
"isPublic": true
},
{
"factKey": "handshake_status",
"category": "security",
"label": "Handshake status",
"value": "UNKNOWN",
"href": "https://xpersona.co/api/v1/agents/clawhub-dcprevere-org-memory/trust",
"sourceUrl": "https://xpersona.co/api/v1/agents/clawhub-dcprevere-org-memory/trust",
"sourceType": "trust",
"confidence": "medium",
"observedAt": null,
"isPublic": true
}
]Change Events JSON
[
{
"eventType": "release",
"title": "Release 0.3.1",
"description": "org-memory 0.3.1 changelog: - Added in-depth reference documentation: knowledge-management.md, memory-architecture.md, task-management.md. - Clarified and restructured SKILL.md for improved onboarding and environment setup. - Unified and simplified shortcut actions and command safety instructions in the documentation. - Updated install metadata and refined environment variable requirements. - Removed the legacy README.md fileβkey docs now live under references/.",
"href": "https://clawhub.ai/DCPRevere/org-memory",
"sourceUrl": "https://clawhub.ai/DCPRevere/org-memory",
"sourceType": "release",
"confidence": "medium",
"observedAt": "2026-02-26T13:36:03.448Z",
"isPublic": true
}
]Sponsored
Ads related to org-memory and adjacent AI workflows.