Skip to content

Commit 14bad7c

Browse files
Release v0.3.6.
1 parent 4bdfbe1 commit 14bad7c

File tree

61 files changed

+2602
-1221
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+2602
-1221
lines changed

.claude/rules/neotoma_cli.mdc renamed to .claude/rules/neotoma_cli.mdc.backup.20260302-114019

File renamed without changes.

.codex/neotoma_cli.md renamed to .codex/neotoma_cli.md.backup.20260302-114019

File renamed without changes.

.cursor/rules/neotoma_cli.mdc renamed to .cursor/rules/neotoma_cli.mdc.backup.20260302-114019

File renamed without changes.

.env.example

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
PORT=3000
1414

1515
# HTTP Actions server port (or set NEOTOMA_HTTP_PORT at runtime)
16-
HTTP_PORT=8080
16+
HTTP_PORT=3080
1717

1818
# Frontend URL for CORS
1919
# NEOTOMA_FRONTEND_URL=http://localhost:5195
@@ -33,7 +33,7 @@ MCP_TOKEN_ENCRYPTION_KEY=your-encryption-key-here
3333
# Host URL settings (optional)
3434
# NEOTOMA_HOST_URL=https://your-tunnel.example.com
3535
# HOST_URL=https://your-tunnel.example.com
36-
# API_BASE_URL=http://localhost:8080
36+
# API_BASE_URL=http://localhost:3080
3737

3838
# Optional shared bearer token
3939
# NEOTOMA_BEARER_TOKEN=your-shared-secret
@@ -55,7 +55,7 @@ OPENAI_API_KEY=sk-your-api-key-here
5555
# =============================================================================
5656
# Frontend Configuration (Vite)
5757
# =============================================================================
58-
VITE_API_BASE_URL=http://localhost:8080
58+
VITE_API_BASE_URL=http://localhost:3080
5959
# VITE_WS_PORT=8280
6060
# VITE_LOCAL_MCP_URL=ws://127.0.0.1:8280/mcp
6161
# VITE_MCP_URL=ws://your-mcp-server.com/mcp

Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ RUN npm run build:server
1010
FROM node:20-alpine AS runtime
1111
WORKDIR /app
1212
ENV NODE_ENV=production
13-
ENV HTTP_PORT=8080
14-
EXPOSE 8080
13+
ENV HTTP_PORT=3080
14+
EXPOSE 3080
1515

1616
COPY package*.json ./
1717
RUN npm ci --omit=dev

README.md

Lines changed: 116 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,27 @@
22

33
![Neotoma banner](https://raw.githubusercontent.com/markmhendrickson/neotoma/main/docs/assets/neotoma_banner.png)
44

5-
[Neotoma](https://neotoma.io) is a **truth layer**: an explicit, inspectable, replayable substrate for personal data that AI agents read and write. When agents act, personal data becomes state. Neotoma treats that state the way production systems do: contract-first, deterministic, immutable, and queryable.
5+
_Give your agents memory you can inspect, replay, and trust._
66

7-
**Why it exists:** The thing that keeps breaking in agentic systems is not intelligence but trust. Memory changes implicitly, context drifts, and you cannot see what changed or replay it. Neotoma provides the missing primitive: user-controlled, deterministic, inspectable memory with full provenance, so you can trust agents with real, ongoing state.
7+
For a guided overview, see [neotoma.io](https://neotoma.io).
8+
9+
Agent memory is forgetful. What keeps breaking automation is trust, not intelligence: memory changes implicitly, context drifts, and you cannot see what changed or replay it. When agents act, personal data becomes state. The missing primitive is a layer of explicit, inspectable, replayable state.
10+
11+
[Neotoma](https://neotoma.io) is that layer. Open-source, privacy-protective, and user-controlled. It is contract-first and deterministic (same input, same output), with immutable, queryable state in one graph for documents you upload and data agents write.
12+
13+
It works with Cursor, Claude, Codex, and other MCP-capable tools, with CLI fallback when MCP is unavailable. Install with npm, then configure MCP for your editor or use the CLI directly.
814

915
For the full rationale, see [Building a truth layer for persistent agent memory](https://markmhendrickson.com/posts/truth-layer-agent-memory).
1016

1117
---
1218

1319
## What Neotoma Is
1420

15-
Neotoma is a **Truth Layer**, not an app, agent, or workflow engine. It is the lowest-level canonical source of truth for personal data (documents and agent-created data), exposed to AI tools via Model Context Protocol (MCP).
21+
Neotoma is a _truth layer_, not an app, agent, or workflow engine. It is the lowest-level canonical source of truth for personal data (documents and agent-created data), exposed to AI tools via Model Context Protocol (MCP).
1622

17-
**In practice:** You upload documents (PDFs, images, receipts, contracts) or share information during agent conversations. You don't have to structure it yourself: agents structure and store it via Neotoma when you provide unstructured or semi-structured content. Neotoma resolves entities across all sources, builds timelines from date fields, and keeps every fact traceable to its source. ChatGPT, Claude, and Cursor can read this memory, write new structured data, correct mistakes, and trigger reinterpretation. One graph connects people, companies, events, and relationships across all your data.
23+
You upload documents (PDFs, images, receipts, contracts) or share information during agent conversations. You don't have to structure it yourself: agents structure and store it via Neotoma when you provide unstructured or semi-structured content. Neotoma resolves entities across all sources, builds timelines from date fields, and keeps every fact traceable to its source. ChatGPT, Claude, and Cursor can read this memory, write new structured data, correct mistakes, and trigger reinterpretation. One graph connects people, companies, events, and relationships across all your data.
1824

19-
**What it is not:** Not a note-taking app or "second brain." Not provider-controlled ChatGPT Memory or Claude Projects (those are conversation-only and platform-locked; Neotoma is structured personal data memory with entity resolution and timelines, cross-platform via MCP). Not a vector store or RAG layer. Not an autonomous agent. It is the memory layer agents read and write; you control what goes in and what stays.
25+
It's not a note-taking app or "second brain." Not provider-controlled ChatGPT Memory or Claude Projects (those are conversation-only and platform-locked; Neotoma is structured personal data memory with entity resolution and timelines, cross-platform via MCP). Not a vector store or RAG layer. Not an autonomous agent. It is the memory layer agents read and write; you control what goes in and what stays.
2026

2127
---
2228

@@ -63,12 +69,29 @@ graph LR
6369

6470
---
6571

72+
## Core Terminology
73+
74+
| Term | Definition |
75+
| --------------- | --------------------------------------------------------------------------------------------- |
76+
| Truth Layer | Deterministic, immutable structured memory substrate that tools and agents read and write. |
77+
| Source | Raw data (file, text, URL, or structured JSON) stored with content-addressed deduplication. |
78+
| Observation | Granular fact extracted from a source; reducers merge observations into entity snapshots. |
79+
| Entity | Canonical representation of a person, company, task, or other object with a deterministic ID. |
80+
| Entity snapshot | Current truth for an entity computed from all related observations. |
81+
| Provenance | Origin tracking (source, timestamp, operation) so each value is traceable. |
82+
| Memory graph | Graph of sources, observations, entities, events, and typed relationships. |
83+
84+
For the full glossary, see [Core terminology](https://neotoma.io/#terminology).
85+
86+
---
87+
6688
## Who It's For
6789

68-
- **AI-native operators** who rely on ChatGPT, Claude, or Cursor and need persistent memory across sessions.
69-
- **Knowledge workers** (researchers, analysts, consultants, legal) who need cross-data reasoning and entity unification across contracts, invoices, and agent-created data.
70-
- **Small teams (2–20)** who want a shared truth layer with row-level security.
71-
- **Builders of agentic systems** who need a deterministic memory and provenance layer for agents and toolchains (e.g. agent frameworks, orchestration pipelines, observability stacks).
90+
| Who | What they need | Example data to remember |
91+
| ------------------------------------- | ------------------------------------------------------------------------ | ----------------------------------------------------------------------- |
92+
| AI-native individual operators | Memory that follows across daily tools and sessions | Tasks, preferences, notes, recurring reminders, contacts, deadlines |
93+
| Knowledge workers with scattered data | Durable context across documents and sessions, with evidence and lineage | Source documents, extracted entities, citations, key quotes, timelines |
94+
| Builders of agentic systems | Structured memory agents can read and write with provenance | Session histories, accumulated facts, decisions, runbooks, tool configs |
7295

7396
**Why Neotoma:** One memory graph across documents and agent-created data; agents remember context without re-explanation; full provenance and audit trail; works with any MCP-compatible tool; privacy-first and user-controlled. The same substrate serves both human-in-the-loop use and agent frameworks or toolchains that need deterministic memory and provenance.
7497

@@ -161,7 +184,7 @@ Full release index: [docs/releases/](docs/releases/).
161184

162185
The **primary entrypoint** for all documentation is the index and navigation guide. All contributors and AI assistants working on the repo should load it first.
163186

164-
- **[Documentation index and navigation](docs/context/index_rules.mdc)** – Map of the docs system, reading order by change type, dependency graph, and quick-reference answers. Start here when contributing or navigating the repo.
187+
- **[Documentation index and navigation](#documentation-index)** – Map of the docs system, reading order by change type, dependency graph, and quick-reference answers. Start here when contributing or navigating the repo.
165188

166189
**Foundational (load first):**
167190

@@ -213,6 +236,16 @@ neotoma init
213236
neotoma api start
214237
```
215238

239+
CLI transport defaults are API-first. Use `--offline` only when you explicitly want in-process local transport:
240+
241+
```bash
242+
# Default (API transport; no implicit local fallback)
243+
neotoma entities list --type task
244+
245+
# Explicit local inline mode (no API server required)
246+
neotoma --offline entities list --type task
247+
```
248+
216249
After installation, configure MCP for your AI tool:
217250

218251
```bash
@@ -232,6 +265,56 @@ npm test
232265

233266
**Prerequisites:** Node.js v18.x or v20.x (LTS), npm v9+. Developer preview uses **local storage only**. For local storage, **no `.env` is required**; the app uses defaults (`./data`, `./data/neotoma.db`, `./data/sources`). Optional overrides: [Getting started](docs/developer/getting_started.md).
234267

268+
### Option 3: Run with Docker
269+
270+
```bash
271+
git clone https://github.com/markmhendrickson/neotoma.git
272+
cd neotoma
273+
docker build -t neotoma .
274+
275+
docker run -d \
276+
--name neotoma \
277+
-p 3080:3080 \
278+
-v neotoma-data:/app/data \
279+
neotoma
280+
281+
docker exec neotoma neotoma init --yes --data-dir /app/data
282+
```
283+
284+
Connect MCP from Docker:
285+
286+
```json
287+
{
288+
"mcpServers": {
289+
"neotoma": {
290+
"command": "docker",
291+
"args": ["exec", "-i", "neotoma", "node", "dist/index.js"]
292+
}
293+
}
294+
}
295+
```
296+
297+
Use the CLI from Docker:
298+
299+
```bash
300+
docker exec neotoma neotoma store \
301+
--json='[{"entity_type":"task","title":"Submit expense report","status":"open"}]'
302+
303+
docker exec neotoma neotoma entities list --type task
304+
```
305+
306+
---
307+
308+
## Get started
309+
310+
After installation:
311+
312+
1. Run `neotoma init` and configure your MCP client.
313+
2. In a conversation, tell your assistant: "Remind me to review my subscription Friday."
314+
3. In the same conversation, ask it to list your open tasks.
315+
316+
This gives you a quick end-to-end validation that memory is persisting and retrievable across sessions and tools. For full setup steps, see [Getting started](docs/developer/getting_started.md).
317+
235318
---
236319

237320
## Development
@@ -287,6 +370,20 @@ To use the Neotoma MCP server from another workspace, see [Cursor MCP setup](doc
287370

288371
---
289372

373+
## Agent Instructions (Behavior Summary)
374+
375+
Neotoma-compatible agents follow a consistent behavior contract across MCP and CLI:
376+
377+
- **Store first:** Persist the conversation turn before responding.
378+
- **Bounded retrieval:** Retrieve likely related entities before storing new ones.
379+
- **Entity extraction:** Extract and store relevant people, tasks, events, places, and relationships from user input.
380+
- **Task creation:** Create tasks when users express intent, obligations, deadlines, or reminders.
381+
- **External data safety:** Store relevant entities from external tool results before responding.
382+
383+
Full instructions: [MCP instructions](docs/developer/mcp/instructions.md) and [CLI agent instructions](docs/developer/cli_agent_instructions.md).
384+
385+
---
386+
290387
## Core Principles
291388

292389
1. **Deterministic** – Same input → same output. Hash-based IDs, no randomness in core components.
@@ -310,6 +407,15 @@ If remote backend support is needed later, recover it from git history.
310407

311408
---
312409

410+
## Related posts
411+
412+
- [Neotoma developer release](https://markmhendrickson.com/posts/neotoma-developer-release)
413+
- [Building a truth layer for persistent agent memory](https://markmhendrickson.com/posts/truth-layer-agent-memory)
414+
- [Agent memory has a truth problem](https://markmhendrickson.com/posts/agent-memory-truth-problem)
415+
- [Why agent memory needs more than RAG](https://markmhendrickson.com/posts/why-agent-memory-needs-more-than-rag)
416+
417+
---
418+
313419
## Contributing
314420

315421
Neotoma is in active development. For questions or collaboration, open an issue or discussion. The work is in the open: [github.com/markmhendrickson/neotoma](https://github.com/markmhendrickson/neotoma). See [CONTRIBUTING.md](CONTRIBUTING.md) and [SECURITY.md](SECURITY.md).

docs/api/rest_api.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ This document covers:
2121
**Development:**
2222

2323
```
24-
http://localhost:8080
24+
http://localhost:3080
2525
```
2626

2727
**Production:**
@@ -265,7 +265,7 @@ Upload a file and optionally create/update a record.
265265
**Request Example:**
266266

267267
```bash
268-
curl -X POST http://localhost:8080/upload_file \
268+
curl -X POST http://localhost:3080/upload_file \
269269
-H "Authorization: Bearer $TOKEN" \
270270
-F "file=@document.pdf" \
271271
-F "properties={\"title\":\"My Document\"}"

docs/developer/cli_agent_instructions.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ When a Neotoma CLI session starts (dev or prod), the applied rule files (e.g. `.
2424

2525
## CLI startup protocol (use-existing)
2626

27-
CLI uses connect-only startup for interactive sessions. It does not auto-start servers on session start. On no-args startup, it discovers running local API instances from session ports, defaults (`8080`, `8180`), remembered ports, and optional configured ports. If multiple instances are healthy, it applies `--env` as a preference and then prompts for explicit selection.
27+
CLI uses connect-only startup for interactive sessions. It does not auto-start servers on session start. On no-args startup, it discovers running local API instances from session ports, defaults (`3080`, `3180`), remembered ports, and optional configured ports. If multiple instances are healthy, it applies `--env` as a preference and then prompts for explicit selection.
2828

2929
```bash
3030
neotoma store --json='[...]'

0 commit comments

Comments
 (0)