Skip to main content

Process memory for AI agents and humans. Records how a project became what it is.

Project description

๐Ÿง  NeuroWeave Timeline (NWT)

Process memory for AI agents and humans. NWT remembers how a project became what it is โ€” not just what it is now.

CI License: MIT Python 3.10+ PyPI: NWtimeline MCP Release v0.2.0 GitHub stars

Most tools remember results. NWT remembers evolution.

Traditional memory:  User โ†’ Context โ†’ Summary โ†’ Memory
Timeline memory:     User โ†’ Action  โ†’ Timeline Event โ†’ Evolution Graph

Every meaningful action in your project โ€” a decision, a refactor, a file creation, a bug fix โ€” becomes a node in a durable timeline. The links between nodes form an Evolution Graph that explains why the project looks the way it does today.


๐Ÿ’ฌ What you can ask

Question One-liner
Why does this file exist? nwt explain activation.py
Why was this architecture chosen? nwt search "architecture decision"
What happened three months ago? nwt history
What decisions led to the current design? nwt story
Show me the evolution graph nwt graph
What did that commit actually do? nwt git-hook-status

AI agents reach the same answers over MCP โ€” see MCP integration.

๐ŸŒฑ Auto-grow: timeline from git commit

The single biggest reason NWT timelines are empty is friction. The v0.2 fix is a post-commit hook that logs an event on every commit โ€” no human or agent typing required.

nwt init
nwt install-git-hook
git commit -m "Refactor retrieval layer" -m "Reason: lookup latency was high"
nwt: logged [12] Refactor retrieval layer

Add --strict to refuse events without a Reason: line, and --ai-command "claude -p" to let an external model fill the reason when the human didn't. See docs/git-hook.md.


๐Ÿš€ 30-second quick start

pip install -e .
cd your-project
nwt init
nwt log "Add activation engine" \
      --files activation.py \
      --reason "retrieval was slow"
nwt history
nwt graph

That's it. Storage is plain JSON under .nwt/. No database, no embeddings, no vendor lock-in, no daemon.


๐Ÿ‘€ A tour of the output

nwt history โ€” what happened, in order

  [1] 2026-06-15  Project scaffolded  [setup, milestone]
      reason: Kickoff the MVP
      files:  pyproject.toml, README.md
  [2] 2026-06-15  Add memory engine  [core, milestone]
      reason: Need a place to put things
      files:  memory.py
  [3] 2026-06-15  Add activation spreading  [memory, optimization]
      reason: Retrieval was sequential and slow
      files:  activation.py, retriever.py
  [4] 2026-06-15  Add decay mechanism  [memory]
      reason: Stale nodes should fade
      files:  activation.py
  [5] 2026-06-15  Vectorize activation  [refactor, performance]
      reason: Loop was the hot path in profiling
      files:  activation.py

nwt graph โ€” the evolution as a tree

โ—‹    1  Project scaffolded
โ”‚
โ”‚    2  Add memory engine
      โ”œโ”€ sibling  โ†’ [   4] Add decay mechanism
      โ””โ”€ extends  โ†’ [   3] Add activation spreading
โ”‚
โ”‚    3  Add activation spreading
โ”‚
โ”‚    5  Vectorize activation

nwt story โ€” 100 events compressed to one page

# memory-engine-demo โ€” evolution summary

span: 2026-06-15 โ†’ 2026-06-15  (5 events)

milestones:
  - 1  Project scaffolded          โ€” Kickoff the MVP
  - 2  Add memory engine           โ€” Need a place to put things
  - 3  Add activation spreading    โ€” Retrieval was sequential and slow
  - 4  Add decay mechanism         โ€” Stale nodes should fade
  - 5  Vectorize activation        โ€” Loop was the hot path in profiling

spine file: activation.py

decisions (events with stated reasons):
  - [1] Project scaffolded: Kickoff the MVP
  - [2] Add memory engine: Need a place to put things
  ...

nwt explain activation.py โ€” why a file exists

# activation.py
created in:  event 3
modified in: 4, 5

reason:
  Retrieval was sequential and slow

๐Ÿงฉ How it works

NWT lives in your project as a single .nwt/ directory:

your-project/
โ””โ”€โ”€ .nwt/
    โ”œโ”€โ”€ metadata.json       # project name, schema version
    โ”œโ”€โ”€ .counter.json       # next event id
    โ”œโ”€โ”€ timeline/           # one JSON file per event
    โ”‚   โ”œโ”€โ”€ 000001.json
    โ”‚   โ”œโ”€โ”€ 000002.json
    โ”‚   โ””โ”€โ”€ ...
    โ”œโ”€โ”€ relations/          # typed edges out of each source event
    โ”œโ”€โ”€ snapshots/          # reserved for v0.2
    โ””โ”€โ”€ indices/            # derived, rebuildable
        โ”œโ”€โ”€ files.json
        โ””โ”€โ”€ tags.json

Everything is JSON, atomically written. The whole workspace is grep-friendly and git diff-friendly. See docs/architecture.md for the rationale.


๐Ÿ”Œ MCP integration

For agent developers โ€” NWT ships an MCP server exposing the same answers as tools:

Tool Returns
create_event A persisted event with id and timestamp
search_history Matching events across task/summary/reason/files/tags
get_project_story Compressed project story (milestones, decisions, spine file)
explain_file Created/modified-in + earliest reason for a file

Wire it up in your MCP client:

{
  "mcpServers": {
    "nwt": {
      "command": "nwt-mcp",
      "env": { "NWT_ROOT": "/absolute/path/to/your/project" }
    }
  }
}

The server picks the workspace from $NWT_ROOT if set, else its own cwd. See docs/mcp.md for the recommended agent loop:

  1. Session start: call get_project_story to load context.
  2. For unfamiliar files: call explain_file rather than reading cold.
  3. As work is done: call create_event with a reason explaining why.
  4. When uncertain: call search_history with a hypothesis from the current code.

๐Ÿ“ฆ ๅฎ‰่ฃ…

# from a clone (editable)
git clone https://github.com/Thatgfsj/neuroweave-timeline
cd neuroweave-timeline
pip install -e .

# from PyPI (coming soon)
pip install NWtimeline

้œ€่ฆ Python 3.10+ใ€‚CLI ไพ่ต–ไบŽ click๏ผ›MCP ๆœๅŠกๅ™จไพ่ต–ไบŽ mcpใ€‚ไธค่€…้ƒฝๆ˜ฏ่‡ชๅŠจๅฎ‰่ฃ…็š„ใ€‚

ๅฎ‰่ฃ…ๅผ€ๅ‘ไพ่ต–๏ผˆpytest๏ผ‰ๅนถ่ฟ่กŒๆต‹่ฏ•ๅฅ—ไปถ๏ผš

pip install -e ".[dev]"
pytest -q

๐Ÿ—บ๏ธ Roadmap

v0.2 (this release) is the "auto-grow" cut: git hook integration, strict mode, file biography, and event templates. The timeline fills itself now.

  • v0.3 โ€” agent integration. Drive NWT through Claude Code, Cursor, and OpenAI Agents to find the gaps.
  • v0.4 โ€” multi-agent collaboration history (concurrency-safe writes, per-author identity).
  • v0.5 โ€” NWC integration, only if NWT earns it on its own.

See docs/roadmap.md and docs/standalone.md for the full story.


๐Ÿค Contributing

Issues and PRs are welcome. The whole project is ~1,500 lines of Python plus docs โ€” easy to read end-to-end. Start with docs/architecture.md for the layout and CONTRIBUTING.md for the workflow.


๐Ÿ”’ Security

NWT stores only what you give it, on disk, in your project's .nwt/. It does not phone home, does not read environment variables other than NWT_ROOT, and writes nowhere else. The .gitignore refuses to track tokens, keys, or .env files. See SECURITY.md for the full policy.


๐Ÿ“„ License

MIT โ€” see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nwtimeline-0.1.0.tar.gz (50.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nwtimeline-0.1.0-py3-none-any.whl (50.5 kB view details)

Uploaded Python 3

File details

Details for the file nwtimeline-0.1.0.tar.gz.

File metadata

  • Download URL: nwtimeline-0.1.0.tar.gz
  • Upload date:
  • Size: 50.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.7

File hashes

Hashes for nwtimeline-0.1.0.tar.gz
Algorithm Hash digest
SHA256 36f12cb6d5840c515cd330f3494708fbbc8ab2fb6999d523dc9aa4068105f981
MD5 56301c67b21cc54708cee1e2c78602aa
BLAKE2b-256 9bf9aa7045df5988fc944b111f2e0dfa79ee0a6e98aeeff62e129c014ec0d78d

See more details on using hashes here.

File details

Details for the file nwtimeline-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: nwtimeline-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 50.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.7

File hashes

Hashes for nwtimeline-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 391ed5bdbcc8527e05bdc6ecfd0c348b402452389b12168390a945beca9d2399
MD5 e66af57dbea01a408ed7cb562278c210
BLAKE2b-256 aa2b56ef4dbf69081ef1e5e76a886d142816aac6cd57edca7b221ba52ed9876c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page