Repository files navigation

OpenWolf demo

OpenWolf

A second brain for Claude Code.
Project intelligence, token tracking, and invisible enforcement through 6 hook scripts. Zero workflow changes.

npm versionLicense: AGPL-3.0Node.js


Why OpenWolf Exists

Claude Code is powerful but it works blind. It doesn't know what a file contains until it opens it. It can't tell a 50-token config from a 2,000-token module. It reads the same file multiple times in one session without noticing. It has no index of your project, no memory of your corrections, and no awareness of what it already tried.

OpenWolf gives Claude a second brain: a file index so it knows what files contain before reading them, a learning memory that accumulates your preferences and past mistakes, and a token ledger that tracks everything. All through 6 invisible hook scripts that fire on every Claude action.

Token Comparison

Tested on a large active project. Same codebase, same prompts, different setups:

OpenClaw + Claude ██████████████████████████████████████ ~3.4M tokens
Claude CLI (no OpenWolf) ████████████████████████████████ ~2.5M tokens
OpenWolf + Claude CLI ████████ ~425K tokens

OpenWolf saved ~80% of tokens compared to bare Claude CLI on the same project.

Across 20 projects, 132+ sessions: average token reduction of 65.8%, with 71% of repeated file reads caught and blocked. These are numbers from real usage, not benchmarks. Your results will vary by project size and usage patterns.

Quick Start

npm install -g openwolf
cd your-project
openwolf init

That's it. Use claude normally. OpenWolf is watching.

What It Creates

openwolf init creates a .wolf/ directory in your project:

FilePurpose
anatomy.mdProject file map with descriptions and token estimates
cerebrum.mdLearned preferences, corrections, Do-Not-Repeat list
memory.mdChronological action log with token estimates
buglog.jsonBug fix memory, searchable, prevents re-discovery
token-ledger.jsonLifetime token tracking and session history
hooks/6 Claude Code lifecycle hooks (pure Node.js)
config.jsonConfiguration with sensible defaults
identity.mdAgent persona for this project
OPENWOLF.mdInstructions Claude follows every session

How It Works

Before Claude reads a file, OpenWolf tells it what the file contains and how large it is. If Claude already read that file this session, OpenWolf warns it. Before Claude writes code, OpenWolf checks your cerebrum.md for known mistakes. After every write, it auto-updates the project map and logs token usage. You see none of this. It just happens.

You type a message
↓
Claude decides to read a file
↓
OpenWolf: "anatomy.md says this file is ~380 tokens. Description: Main entry point."
↓
Claude reads the file
↓
OpenWolf: logs the read, estimates tokens, checks for repeated reads
↓
Claude writes code
↓
OpenWolf: checks cerebrum.md - no known mistakes matched
↓
Claude finishes
↓
OpenWolf: updates anatomy.md, appends to memory.md, updates token ledger

The .wolf/ Files

cerebrum.md - the learning memory

Claude updates this file when you correct it, express a preference, or make a decision. The Do-Not-Repeat list prevents the same mistake across sessions.

## Do-Not-Repeat- 2026-03-10: Never use `var` - always `const` or `let`- 2026-03-11: Don't mock the database in integration tests - use the real connection
- 2026-03-14: The auth middleware reads from `cfg.talk`, not `cfg.tts` - got burned twice
## User Preferences- Prefers functional components over class components
- Always use named exports, never default exports
- Tests go in `__tests__/` next to the source file
## Key Learnings- This project uses pnpm workspaces with strict hoisting
- The API rate limiter uses a sliding window, not fixed buckets
- Auth middleware reads from env.JWT_SECRET, not config file
anatomy.md - the project map

Every file gets a description and token estimate. Claude reads this instead of opening files when the summary is enough.

## src/-`index.ts` - Main entry point. Exports createProgram() for CLI. (~180 tok)
-`server.ts` - Express HTTP server with middleware chain. (~520 tok)
## src/api/-`auth.ts` - JWT validation middleware. Reads from env.JWT_SECRET. (~340 tok)
-`users.ts` - CRUD endpoints for /api/users. Pagination via query params. (~890 tok)
token-ledger.json - the receipt

Every session gets a line item. Lifetime totals tell you if OpenWolf is actually saving tokens.

{
"lifetime": {
"total_tokens_estimated": 503978,
"total_reads": 287,
"total_writes": 269,
"total_sessions": 15,
"anatomy_hits": 198,
"anatomy_misses": 89,
"repeated_reads_blocked": 106,
"estimated_savings_vs_bare_cli": 2066959
}
}
buglog.json - the bug memory

Before fixing anything, Claude checks if the fix is already known. After fixing, it logs the solution.

{
"id": "bug-012",
"error_message": "TypeError: Cannot read properties of undefined (reading 'map')",
"file": "src/components/UserList.tsx",
"root_cause": "API response was null when users array was expected",
"fix": "Added optional chaining: data?.users?.map() and fallback empty array",
"tags": ["null-check", "api-response", "react"]
}

Commands

openwolf init Initialize .wolf/ and register hooks
openwolf status Show health, stats, file integrity
openwolf scan Refresh the project structure map
openwolf scan --check Verify anatomy matches filesystem (exits 1 if stale)
openwolf dashboard Open the real-time web dashboard
openwolf daemon start Start background task scheduler
openwolf daemon stop Stop the scheduler
openwolf daemon restart Restart the scheduler
openwolf daemon logs View scheduler logs
openwolf cron list Show all scheduled tasks
openwolf cron run <id> Trigger a task manually
openwolf cron retry <id> Retry a dead-lettered task
openwolf designqc Capture full-page screenshots for design evaluation
openwolf bug search <term> Search bug memory for known fixes
openwolf update Update all registered projects to latest version
openwolf restore [backup] Restore .wolf/ from a timestamped backup

Design QC

Capture full-page screenshots of your running app and let Claude evaluate the design.

openwolf designqc

Auto-detects your dev server, captures viewport-height JPEG sections of every route, and saves them to .wolf/designqc-captures/. Then tell Claude to read the screenshots and evaluate. Requires puppeteer-core.

Reframe

Ask Claude to help you pick a UI framework. OpenWolf ships a curated knowledge base of 12 frameworks (shadcn/ui, Aceternity, Magic UI, DaisyUI, HeroUI, Chakra, Flowbite, Preline, Park UI, Origin UI, Headless UI, Cult UI) with battle-tested migration prompts. Claude reads .wolf/reframe-frameworks.md, asks you a few questions, and executes the migration with the right prompt for your project.

How OpenWolf Compares

OpenWolf is not an AI wrapper. It is 6 hook scripts and a .wolf/ directory. It doesn't run your AI for you or change your workflow. It gives Claude Code what it lacks: a project map so it reads less, a memory so it learns faster, and a ledger so you see where tokens go.

Requirements

  • Node.js 20+
  • Claude Code CLI
  • Windows, macOS, or Linux
  • Optional: PM2 for persistent background tasks
  • Optional: puppeteer-core for Design QC screenshots

Limitations

  • Claude Code hooks are a relatively new feature. OpenWolf falls back to CLAUDE.md instructions when hooks don't fire.
  • Token tracking is estimation-based (character-to-token ratio), not exact API counts. Accurate to within ~15%.
  • cerebrum.md depends on Claude following instructions to update it after corrections. Compliance is ~85-90%, not 100%.
  • This is v1.0.4. Things may break. File issues.

Origin Story

We were building products with Claude Code at Cytostack when we noticed something off. Sessions were eating through tokens faster than they should. When we dug in, we found Claude re-reading the same files multiple times, scanning entire directories to find one function, and having no way to know what a file contained without opening it. There was no project map, no read awareness, no token visibility. So we built the tooling we wished existed -- a file index so Claude reads less, a learning memory so it gets smarter, and a ledger that tracks every token. That became OpenWolf.

License

AGPL-3.0

Author

Built by Farhan Palathinkal Afsal - Cytostack

About

Sharper context. Fewer tokens. Open-source middleware for Claude Code.

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

OpenWolf demo

OpenWolf

A second brain for Claude Code.
Project intelligence, token tracking, and invisible enforcement through 6 hook scripts. Zero workflow changes.

npm versionLicense: AGPL-3.0Node.js


Why OpenWolf Exists

Claude Code is powerful but it works blind. It doesn't know what a file contains until it opens it. It can't tell a 50-token config from a 2,000-token module. It reads the same file multiple times in one session without noticing. It has no index of your project, no memory of your corrections, and no awareness of what it already tried.

OpenWolf gives Claude a second brain: a file index so it knows what files contain before reading them, a learning memory that accumulates your preferences and past mistakes, and a token ledger that tracks everything. All through 6 invisible hook scripts that fire on every Claude action.

Token Comparison

Tested on a large active project. Same codebase, same prompts, different setups:

OpenClaw + Claude ██████████████████████████████████████ ~3.4M tokens
Claude CLI (no OpenWolf) ████████████████████████████████ ~2.5M tokens
OpenWolf + Claude CLI ████████ ~425K tokens

OpenWolf saved ~80% of tokens compared to bare Claude CLI on the same project.

Across 20 projects, 132+ sessions: average token reduction of 65.8%, with 71% of repeated file reads caught and blocked. These are numbers from real usage, not benchmarks. Your results will vary by project size and usage patterns.

Quick Start

npm install -g openwolf
cd your-project
openwolf init

That's it. Use claude normally. OpenWolf is watching.

What It Creates

openwolf init creates a .wolf/ directory in your project:

FilePurpose
anatomy.mdProject file map with descriptions and token estimates
cerebrum.mdLearned preferences, corrections, Do-Not-Repeat list
memory.mdChronological action log with token estimates
buglog.jsonBug fix memory, searchable, prevents re-discovery
token-ledger.jsonLifetime token tracking and session history
hooks/6 Claude Code lifecycle hooks (pure Node.js)
config.jsonConfiguration with sensible defaults
identity.mdAgent persona for this project
OPENWOLF.mdInstructions Claude follows every session

How It Works

Before Claude reads a file, OpenWolf tells it what the file contains and how large it is. If Claude already read that file this session, OpenWolf warns it. Before Claude writes code, OpenWolf checks your cerebrum.md for known mistakes. After every write, it auto-updates the project map and logs token usage. You see none of this. It just happens.

You type a message
↓
Claude decides to read a file
↓
OpenWolf: "anatomy.md says this file is ~380 tokens. Description: Main entry point."
↓
Claude reads the file
↓
OpenWolf: logs the read, estimates tokens, checks for repeated reads
↓
Claude writes code
↓
OpenWolf: checks cerebrum.md - no known mistakes matched
↓
Claude finishes
↓
OpenWolf: updates anatomy.md, appends to memory.md, updates token ledger

The .wolf/ Files

cerebrum.md - the learning memory

Claude updates this file when you correct it, express a preference, or make a decision. The Do-Not-Repeat list prevents the same mistake across sessions.

## Do-Not-Repeat- 2026-03-10: Never use `var` - always `const` or `let`- 2026-03-11: Don't mock the database in integration tests - use the real connection
- 2026-03-14: The auth middleware reads from `cfg.talk`, not `cfg.tts` - got burned twice
## User Preferences- Prefers functional components over class components
- Always use named exports, never default exports
- Tests go in `__tests__/` next to the source file
## Key Learnings- This project uses pnpm workspaces with strict hoisting
- The API rate limiter uses a sliding window, not fixed buckets
- Auth middleware reads from env.JWT_SECRET, not config file
anatomy.md - the project map

Every file gets a description and token estimate. Claude reads this instead of opening files when the summary is enough.

## src/-`index.ts` - Main entry point. Exports createProgram() for CLI. (~180 tok)
-`server.ts` - Express HTTP server with middleware chain. (~520 tok)
## src/api/-`auth.ts` - JWT validation middleware. Reads from env.JWT_SECRET. (~340 tok)
-`users.ts` - CRUD endpoints for /api/users. Pagination via query params. (~890 tok)
token-ledger.json - the receipt

Every session gets a line item. Lifetime totals tell you if OpenWolf is actually saving tokens.

{
"lifetime": {
"total_tokens_estimated": 503978,
"total_reads": 287,
"total_writes": 269,
"total_sessions": 15,
"anatomy_hits": 198,
"anatomy_misses": 89,
"repeated_reads_blocked": 106,
"estimated_savings_vs_bare_cli": 2066959
}
}
buglog.json - the bug memory

Before fixing anything, Claude checks if the fix is already known. After fixing, it logs the solution.

{
"id": "bug-012",
"error_message": "TypeError: Cannot read properties of undefined (reading 'map')",
"file": "src/components/UserList.tsx",
"root_cause": "API response was null when users array was expected",
"fix": "Added optional chaining: data?.users?.map() and fallback empty array",
"tags": ["null-check", "api-response", "react"]
}

Commands

openwolf init Initialize .wolf/ and register hooks
openwolf status Show health, stats, file integrity
openwolf scan Refresh the project structure map
openwolf scan --check Verify anatomy matches filesystem (exits 1 if stale)
openwolf dashboard Open the real-time web dashboard
openwolf daemon start Start background task scheduler
openwolf daemon stop Stop the scheduler
openwolf daemon restart Restart the scheduler
openwolf daemon logs View scheduler logs
openwolf cron list Show all scheduled tasks
openwolf cron run <id> Trigger a task manually
openwolf cron retry <id> Retry a dead-lettered task
openwolf designqc Capture full-page screenshots for design evaluation
openwolf bug search <term> Search bug memory for known fixes
openwolf update Update all registered projects to latest version
openwolf restore [backup] Restore .wolf/ from a timestamped backup

Design QC

Capture full-page screenshots of your running app and let Claude evaluate the design.

openwolf designqc

Auto-detects your dev server, captures viewport-height JPEG sections of every route, and saves them to .wolf/designqc-captures/. Then tell Claude to read the screenshots and evaluate. Requires puppeteer-core.

Reframe

Ask Claude to help you pick a UI framework. OpenWolf ships a curated knowledge base of 12 frameworks (shadcn/ui, Aceternity, Magic UI, DaisyUI, HeroUI, Chakra, Flowbite, Preline, Park UI, Origin UI, Headless UI, Cult UI) with battle-tested migration prompts. Claude reads .wolf/reframe-frameworks.md, asks you a few questions, and executes the migration with the right prompt for your project.

How OpenWolf Compares

OpenWolf is not an AI wrapper. It is 6 hook scripts and a .wolf/ directory. It doesn't run your AI for you or change your workflow. It gives Claude Code what it lacks: a project map so it reads less, a memory so it learns faster, and a ledger so you see where tokens go.

Requirements

  • Node.js 20+
  • Claude Code CLI
  • Windows, macOS, or Linux
  • Optional: PM2 for persistent background tasks
  • Optional: puppeteer-core for Design QC screenshots

Limitations

  • Claude Code hooks are a relatively new feature. OpenWolf falls back to CLAUDE.md instructions when hooks don't fire.
  • Token tracking is estimation-based (character-to-token ratio), not exact API counts. Accurate to within ~15%.
  • cerebrum.md depends on Claude following instructions to update it after corrections. Compliance is ~85-90%, not 100%.
  • This is v1.0.4. Things may break. File issues.

Origin Story

We were building products with Claude Code at Cytostack when we noticed something off. Sessions were eating through tokens faster than they should. When we dug in, we found Claude re-reading the same files multiple times, scanning entire directories to find one function, and having no way to know what a file contained without opening it. There was no project map, no read awareness, no token visibility. So we built the tooling we wished existed -- a file index so Claude reads less, a learning memory so it gets smarter, and a ledger that tracks every token. That became OpenWolf.

License

AGPL-3.0

Author

Built by Farhan Palathinkal Afsal - Cytostack

About

Sharper context. Fewer tokens. Open-source middleware for Claude Code.

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OpenWolf demo

OpenWolf

A second brain for Claude Code.
Project intelligence, token tracking, and invisible enforcement through 6 hook scripts. Zero workflow changes.

npm versionLicense: AGPL-3.0Node.js


Why OpenWolf Exists

Claude Code is powerful but it works blind. It doesn't know what a file contains until it opens it. It can't tell a 50-token config from a 2,000-token module. It reads the same file multiple times in one session without noticing. It has no index of your project, no memory of your corrections, and no awareness of what it already tried.

OpenWolf gives Claude a second brain: a file index so it knows what files contain before reading them, a learning memory that accumulates your preferences and past mistakes, and a token ledger that tracks everything. All through 6 invisible hook scripts that fire on every Claude action.

Token Comparison

Tested on a large active project. Same codebase, same prompts, different setups:

OpenClaw + Claude ██████████████████████████████████████ ~3.4M tokens
Claude CLI (no OpenWolf) ████████████████████████████████ ~2.5M tokens
OpenWolf + Claude CLI ████████ ~425K tokens

OpenWolf saved ~80% of tokens compared to bare Claude CLI on the same project.

Across 20 projects, 132+ sessions: average token reduction of 65.8%, with 71% of repeated file reads caught and blocked. These are numbers from real usage, not benchmarks. Your results will vary by project size and usage patterns.

Quick Start

npm install -g openwolf
cd your-project
openwolf init

That's it. Use claude normally. OpenWolf is watching.

What It Creates

openwolf init creates a .wolf/ directory in your project:

FilePurpose
anatomy.mdProject file map with descriptions and token estimates
cerebrum.mdLearned preferences, corrections, Do-Not-Repeat list
memory.mdChronological action log with token estimates
buglog.jsonBug fix memory, searchable, prevents re-discovery
token-ledger.jsonLifetime token tracking and session history
hooks/6 Claude Code lifecycle hooks (pure Node.js)
config.jsonConfiguration with sensible defaults
identity.mdAgent persona for this project
OPENWOLF.mdInstructions Claude follows every session

How It Works

Before Claude reads a file, OpenWolf tells it what the file contains and how large it is. If Claude already read that file this session, OpenWolf warns it. Before Claude writes code, OpenWolf checks your cerebrum.md for known mistakes. After every write, it auto-updates the project map and logs token usage. You see none of this. It just happens.

You type a message
↓
Claude decides to read a file
↓
OpenWolf: "anatomy.md says this file is ~380 tokens. Description: Main entry point."
↓
Claude reads the file
↓
OpenWolf: logs the read, estimates tokens, checks for repeated reads
↓
Claude writes code
↓
OpenWolf: checks cerebrum.md - no known mistakes matched
↓
Claude finishes
↓
OpenWolf: updates anatomy.md, appends to memory.md, updates token ledger

The .wolf/ Files

cerebrum.md - the learning memory

Claude updates this file when you correct it, express a preference, or make a decision. The Do-Not-Repeat list prevents the same mistake across sessions.

## Do-Not-Repeat- 2026-03-10: Never use `var` - always `const` or `let`- 2026-03-11: Don't mock the database in integration tests - use the real connection
- 2026-03-14: The auth middleware reads from `cfg.talk`, not `cfg.tts` - got burned twice
## User Preferences- Prefers functional components over class components
- Always use named exports, never default exports
- Tests go in `__tests__/` next to the source file
## Key Learnings- This project uses pnpm workspaces with strict hoisting
- The API rate limiter uses a sliding window, not fixed buckets
- Auth middleware reads from env.JWT_SECRET, not config file
anatomy.md - the project map

Every file gets a description and token estimate. Claude reads this instead of opening files when the summary is enough.

## src/-`index.ts` - Main entry point. Exports createProgram() for CLI. (~180 tok)
-`server.ts` - Express HTTP server with middleware chain. (~520 tok)
## src/api/-`auth.ts` - JWT validation middleware. Reads from env.JWT_SECRET. (~340 tok)
-`users.ts` - CRUD endpoints for /api/users. Pagination via query params. (~890 tok)
token-ledger.json - the receipt

Every session gets a line item. Lifetime totals tell you if OpenWolf is actually saving tokens.

{
"lifetime": {
"total_tokens_estimated": 503978,
"total_reads": 287,
"total_writes": 269,
"total_sessions": 15,
"anatomy_hits": 198,
"anatomy_misses": 89,
"repeated_reads_blocked": 106,
"estimated_savings_vs_bare_cli": 2066959
}
}
buglog.json - the bug memory

Before fixing anything, Claude checks if the fix is already known. After fixing, it logs the solution.

{
"id": "bug-012",
"error_message": "TypeError: Cannot read properties of undefined (reading 'map')",
"file": "src/components/UserList.tsx",
"root_cause": "API response was null when users array was expected",
"fix": "Added optional chaining: data?.users?.map() and fallback empty array",
"tags": ["null-check", "api-response", "react"]
}

Commands

openwolf init Initialize .wolf/ and register hooks
openwolf status Show health, stats, file integrity
openwolf scan Refresh the project structure map
openwolf scan --check Verify anatomy matches filesystem (exits 1 if stale)
openwolf dashboard Open the real-time web dashboard
openwolf daemon start Start background task scheduler
openwolf daemon stop Stop the scheduler
openwolf daemon restart Restart the scheduler
openwolf daemon logs View scheduler logs
openwolf cron list Show all scheduled tasks
openwolf cron run <id> Trigger a task manually
openwolf cron retry <id> Retry a dead-lettered task
openwolf designqc Capture full-page screenshots for design evaluation
openwolf bug search <term> Search bug memory for known fixes
openwolf update Update all registered projects to latest version
openwolf restore [backup] Restore .wolf/ from a timestamped backup

Design QC

Capture full-page screenshots of your running app and let Claude evaluate the design.

openwolf designqc

Auto-detects your dev server, captures viewport-height JPEG sections of every route, and saves them to .wolf/designqc-captures/. Then tell Claude to read the screenshots and evaluate. Requires puppeteer-core.

Reframe

Ask Claude to help you pick a UI framework. OpenWolf ships a curated knowledge base of 12 frameworks (shadcn/ui, Aceternity, Magic UI, DaisyUI, HeroUI, Chakra, Flowbite, Preline, Park UI, Origin UI, Headless UI, Cult UI) with battle-tested migration prompts. Claude reads .wolf/reframe-frameworks.md, asks you a few questions, and executes the migration with the right prompt for your project.

How OpenWolf Compares

OpenWolf is not an AI wrapper. It is 6 hook scripts and a .wolf/ directory. It doesn't run your AI for you or change your workflow. It gives Claude Code what it lacks: a project map so it reads less, a memory so it learns faster, and a ledger so you see where tokens go.

Requirements

  • Node.js 20+
  • Claude Code CLI
  • Windows, macOS, or Linux
  • Optional: PM2 for persistent background tasks
  • Optional: puppeteer-core for Design QC screenshots

Limitations

  • Claude Code hooks are a relatively new feature. OpenWolf falls back to CLAUDE.md instructions when hooks don't fire.
  • Token tracking is estimation-based (character-to-token ratio), not exact API counts. Accurate to within ~15%.
  • cerebrum.md depends on Claude following instructions to update it after corrections. Compliance is ~85-90%, not 100%.
  • This is v1.0.4. Things may break. File issues.

Origin Story

We were building products with Claude Code at Cytostack when we noticed something off. Sessions were eating through tokens faster than they should. When we dug in, we found Claude re-reading the same files multiple times, scanning entire directories to find one function, and having no way to know what a file contained without opening it. There was no project map, no read awareness, no token visibility. So we built the tooling we wished existed -- a file index so Claude reads less, a learning memory so it gets smarter, and a ledger that tracks every token. That became OpenWolf.

License

AGPL-3.0

Author

Built by Farhan Palathinkal Afsal - Cytostack

About

Sharper context. Fewer tokens. Open-source middleware for Claude Code.

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OpenWolf demo

OpenWolf

A second brain for Claude Code.
Project intelligence, token tracking, and invisible enforcement through 6 hook scripts. Zero workflow changes.

npm versionLicense: AGPL-3.0Node.js


Why OpenWolf Exists

Claude Code is powerful but it works blind. It doesn't know what a file contains until it opens it. It can't tell a 50-token config from a 2,000-token module. It reads the same file multiple times in one session without noticing. It has no index of your project, no memory of your corrections, and no awareness of what it already tried.

OpenWolf gives Claude a second brain: a file index so it knows what files contain before reading them, a learning memory that accumulates your preferences and past mistakes, and a token ledger that tracks everything. All through 6 invisible hook scripts that fire on every Claude action.

Token Comparison

Tested on a large active project. Same codebase, same prompts, different setups:

OpenClaw + Claude ██████████████████████████████████████ ~3.4M tokens
Claude CLI (no OpenWolf) ████████████████████████████████ ~2.5M tokens
OpenWolf + Claude CLI ████████ ~425K tokens

OpenWolf saved ~80% of tokens compared to bare Claude CLI on the same project.

Across 20 projects, 132+ sessions: average token reduction of 65.8%, with 71% of repeated file reads caught and blocked. These are numbers from real usage, not benchmarks. Your results will vary by project size and usage patterns.

Quick Start

npm install -g openwolf
cd your-project
openwolf init

That's it. Use claude normally. OpenWolf is watching.

What It Creates

openwolf init creates a .wolf/ directory in your project:

FilePurpose
anatomy.mdProject file map with descriptions and token estimates
cerebrum.mdLearned preferences, corrections, Do-Not-Repeat list
memory.mdChronological action log with token estimates
buglog.jsonBug fix memory, searchable, prevents re-discovery
token-ledger.jsonLifetime token tracking and session history
hooks/6 Claude Code lifecycle hooks (pure Node.js)
config.jsonConfiguration with sensible defaults
identity.mdAgent persona for this project
OPENWOLF.mdInstructions Claude follows every session

How It Works

Before Claude reads a file, OpenWolf tells it what the file contains and how large it is. If Claude already read that file this session, OpenWolf warns it. Before Claude writes code, OpenWolf checks your cerebrum.md for known mistakes. After every write, it auto-updates the project map and logs token usage. You see none of this. It just happens.

You type a message
↓
Claude decides to read a file
↓
OpenWolf: "anatomy.md says this file is ~380 tokens. Description: Main entry point."
↓
Claude reads the file
↓
OpenWolf: logs the read, estimates tokens, checks for repeated reads
↓
Claude writes code
↓
OpenWolf: checks cerebrum.md - no known mistakes matched
↓
Claude finishes
↓
OpenWolf: updates anatomy.md, appends to memory.md, updates token ledger

The .wolf/ Files

cerebrum.md - the learning memory

Claude updates this file when you correct it, express a preference, or make a decision. The Do-Not-Repeat list prevents the same mistake across sessions.

## Do-Not-Repeat- 2026-03-10: Never use `var` - always `const` or `let`- 2026-03-11: Don't mock the database in integration tests - use the real connection
- 2026-03-14: The auth middleware reads from `cfg.talk`, not `cfg.tts` - got burned twice
## User Preferences- Prefers functional components over class components
- Always use named exports, never default exports
- Tests go in `__tests__/` next to the source file
## Key Learnings- This project uses pnpm workspaces with strict hoisting
- The API rate limiter uses a sliding window, not fixed buckets
- Auth middleware reads from env.JWT_SECRET, not config file
anatomy.md - the project map

Every file gets a description and token estimate. Claude reads this instead of opening files when the summary is enough.

## src/-`index.ts` - Main entry point. Exports createProgram() for CLI. (~180 tok)
-`server.ts` - Express HTTP server with middleware chain. (~520 tok)
## src/api/-`auth.ts` - JWT validation middleware. Reads from env.JWT_SECRET. (~340 tok)
-`users.ts` - CRUD endpoints for /api/users. Pagination via query params. (~890 tok)
token-ledger.json - the receipt

Every session gets a line item. Lifetime totals tell you if OpenWolf is actually saving tokens.

{
"lifetime": {
"total_tokens_estimated": 503978,
"total_reads": 287,
"total_writes": 269,
"total_sessions": 15,
"anatomy_hits": 198,
"anatomy_misses": 89,
"repeated_reads_blocked": 106,
"estimated_savings_vs_bare_cli": 2066959
}
}
buglog.json - the bug memory

Before fixing anything, Claude checks if the fix is already known. After fixing, it logs the solution.

{
"id": "bug-012",
"error_message": "TypeError: Cannot read properties of undefined (reading 'map')",
"file": "src/components/UserList.tsx",
"root_cause": "API response was null when users array was expected",
"fix": "Added optional chaining: data?.users?.map() and fallback empty array",
"tags": ["null-check", "api-response", "react"]
}

Commands

openwolf init Initialize .wolf/ and register hooks
openwolf status Show health, stats, file integrity
openwolf scan Refresh the project structure map
openwolf scan --check Verify anatomy matches filesystem (exits 1 if stale)
openwolf dashboard Open the real-time web dashboard
openwolf daemon start Start background task scheduler
openwolf daemon stop Stop the scheduler
openwolf daemon restart Restart the scheduler
openwolf daemon logs View scheduler logs
openwolf cron list Show all scheduled tasks
openwolf cron run <id> Trigger a task manually
openwolf cron retry <id> Retry a dead-lettered task
openwolf designqc Capture full-page screenshots for design evaluation
openwolf bug search <term> Search bug memory for known fixes
openwolf update Update all registered projects to latest version
openwolf restore [backup] Restore .wolf/ from a timestamped backup

Design QC

Capture full-page screenshots of your running app and let Claude evaluate the design.

openwolf designqc

Auto-detects your dev server, captures viewport-height JPEG sections of every route, and saves them to .wolf/designqc-captures/. Then tell Claude to read the screenshots and evaluate. Requires puppeteer-core.

Reframe

Ask Claude to help you pick a UI framework. OpenWolf ships a curated knowledge base of 12 frameworks (shadcn/ui, Aceternity, Magic UI, DaisyUI, HeroUI, Chakra, Flowbite, Preline, Park UI, Origin UI, Headless UI, Cult UI) with battle-tested migration prompts. Claude reads .wolf/reframe-frameworks.md, asks you a few questions, and executes the migration with the right prompt for your project.

How OpenWolf Compares

OpenWolf is not an AI wrapper. It is 6 hook scripts and a .wolf/ directory. It doesn't run your AI for you or change your workflow. It gives Claude Code what it lacks: a project map so it reads less, a memory so it learns faster, and a ledger so you see where tokens go.

Requirements

  • Node.js 20+
  • Claude Code CLI
  • Windows, macOS, or Linux
  • Optional: PM2 for persistent background tasks
  • Optional: puppeteer-core for Design QC screenshots

Limitations

  • Claude Code hooks are a relatively new feature. OpenWolf falls back to CLAUDE.md instructions when hooks don't fire.
  • Token tracking is estimation-based (character-to-token ratio), not exact API counts. Accurate to within ~15%.
  • cerebrum.md depends on Claude following instructions to update it after corrections. Compliance is ~85-90%, not 100%.
  • This is v1.0.4. Things may break. File issues.

Origin Story

We were building products with Claude Code at Cytostack when we noticed something off. Sessions were eating through tokens faster than they should. When we dug in, we found Claude re-reading the same files multiple times, scanning entire directories to find one function, and having no way to know what a file contained without opening it. There was no project map, no read awareness, no token visibility. So we built the tooling we wished existed -- a file index so Claude reads less, a learning memory so it gets smarter, and a ledger that tracks every token. That became OpenWolf.

License

AGPL-3.0

Author

Built by Farhan Palathinkal Afsal - Cytostack

About

Sharper context. Fewer tokens. Open-source middleware for Claude Code.

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

OpenWolf demo

OpenWolf

A second brain for Claude Code.
Project intelligence, token tracking, and invisible enforcement through 6 hook scripts. Zero workflow changes.

npm versionLicense: AGPL-3.0Node.js


Why OpenWolf Exists

Claude Code is powerful but it works blind. It doesn't know what a file contains until it opens it. It can't tell a 50-token config from a 2,000-token module. It reads the same file multiple times in one session without noticing. It has no index of your project, no memory of your corrections, and no awareness of what it already tried.

OpenWolf gives Claude a second brain: a file index so it knows what files contain before reading them, a learning memory that accumulates your preferences and past mistakes, and a token ledger that tracks everything. All through 6 invisible hook scripts that fire on every Claude action.

Token Comparison

Tested on a large active project. Same codebase, same prompts, different setups:

OpenClaw + Claude ██████████████████████████████████████ ~3.4M tokens
Claude CLI (no OpenWolf) ████████████████████████████████ ~2.5M tokens
OpenWolf + Claude CLI ████████ ~425K tokens

OpenWolf saved ~80% of tokens compared to bare Claude CLI on the same project.

Across 20 projects, 132+ sessions: average token reduction of 65.8%, with 71% of repeated file reads caught and blocked. These are numbers from real usage, not benchmarks. Your results will vary by project size and usage patterns.

Quick Start

npm install -g openwolf
cd your-project
openwolf init

That's it. Use claude normally. OpenWolf is watching.

What It Creates

openwolf init creates a .wolf/ directory in your project:

FilePurpose
anatomy.mdProject file map with descriptions and token estimates
cerebrum.mdLearned preferences, corrections, Do-Not-Repeat list
memory.mdChronological action log with token estimates
buglog.jsonBug fix memory, searchable, prevents re-discovery
token-ledger.jsonLifetime token tracking and session history
hooks/6 Claude Code lifecycle hooks (pure Node.js)
config.jsonConfiguration with sensible defaults
identity.mdAgent persona for this project
OPENWOLF.mdInstructions Claude follows every session

How It Works

Before Claude reads a file, OpenWolf tells it what the file contains and how large it is. If Claude already read that file this session, OpenWolf warns it. Before Claude writes code, OpenWolf checks your cerebrum.md for known mistakes. After every write, it auto-updates the project map and logs token usage. You see none of this. It just happens.

You type a message
↓
Claude decides to read a file
↓
OpenWolf: "anatomy.md says this file is ~380 tokens. Description: Main entry point."
↓
Claude reads the file
↓
OpenWolf: logs the read, estimates tokens, checks for repeated reads
↓
Claude writes code
↓
OpenWolf: checks cerebrum.md - no known mistakes matched
↓
Claude finishes
↓
OpenWolf: updates anatomy.md, appends to memory.md, updates token ledger

The .wolf/ Files

cerebrum.md - the learning memory

Claude updates this file when you correct it, express a preference, or make a decision. The Do-Not-Repeat list prevents the same mistake across sessions.

## Do-Not-Repeat- 2026-03-10: Never use `var` - always `const` or `let`- 2026-03-11: Don't mock the database in integration tests - use the real connection
- 2026-03-14: The auth middleware reads from `cfg.talk`, not `cfg.tts` - got burned twice
## User Preferences- Prefers functional components over class components
- Always use named exports, never default exports
- Tests go in `__tests__/` next to the source file
## Key Learnings- This project uses pnpm workspaces with strict hoisting
- The API rate limiter uses a sliding window, not fixed buckets
- Auth middleware reads from env.JWT_SECRET, not config file
anatomy.md - the project map

Every file gets a description and token estimate. Claude reads this instead of opening files when the summary is enough.

## src/-`index.ts` - Main entry point. Exports createProgram() for CLI. (~180 tok)
-`server.ts` - Express HTTP server with middleware chain. (~520 tok)
## src/api/-`auth.ts` - JWT validation middleware. Reads from env.JWT_SECRET. (~340 tok)
-`users.ts` - CRUD endpoints for /api/users. Pagination via query params. (~890 tok)
token-ledger.json - the receipt

Every session gets a line item. Lifetime totals tell you if OpenWolf is actually saving tokens.

{
"lifetime": {
"total_tokens_estimated": 503978,
"total_reads": 287,
"total_writes": 269,
"total_sessions": 15,
"anatomy_hits": 198,
"anatomy_misses": 89,
"repeated_reads_blocked": 106,
"estimated_savings_vs_bare_cli": 2066959
}
}
buglog.json - the bug memory

Before fixing anything, Claude checks if the fix is already known. After fixing, it logs the solution.

{
"id": "bug-012",
"error_message": "TypeError: Cannot read properties of undefined (reading 'map')",
"file": "src/components/UserList.tsx",
"root_cause": "API response was null when users array was expected",
"fix": "Added optional chaining: data?.users?.map() and fallback empty array",
"tags": ["null-check", "api-response", "react"]
}

Commands

openwolf init Initialize .wolf/ and register hooks
openwolf status Show health, stats, file integrity
openwolf scan Refresh the project structure map
openwolf scan --check Verify anatomy matches filesystem (exits 1 if stale)
openwolf dashboard Open the real-time web dashboard
openwolf daemon start Start background task scheduler
openwolf daemon stop Stop the scheduler
openwolf daemon restart Restart the scheduler
openwolf daemon logs View scheduler logs
openwolf cron list Show all scheduled tasks
openwolf cron run <id> Trigger a task manually
openwolf cron retry <id> Retry a dead-lettered task
openwolf designqc Capture full-page screenshots for design evaluation
openwolf bug search <term> Search bug memory for known fixes
openwolf update Update all registered projects to latest version
openwolf restore [backup] Restore .wolf/ from a timestamped backup

Design QC

Capture full-page screenshots of your running app and let Claude evaluate the design.

openwolf designqc

Auto-detects your dev server, captures viewport-height JPEG sections of every route, and saves them to .wolf/designqc-captures/. Then tell Claude to read the screenshots and evaluate. Requires puppeteer-core.

Reframe

Ask Claude to help you pick a UI framework. OpenWolf ships a curated knowledge base of 12 frameworks (shadcn/ui, Aceternity, Magic UI, DaisyUI, HeroUI, Chakra, Flowbite, Preline, Park UI, Origin UI, Headless UI, Cult UI) with battle-tested migration prompts. Claude reads .wolf/reframe-frameworks.md, asks you a few questions, and executes the migration with the right prompt for your project.

How OpenWolf Compares

OpenWolf is not an AI wrapper. It is 6 hook scripts and a .wolf/ directory. It doesn't run your AI for you or change your workflow. It gives Claude Code what it lacks: a project map so it reads less, a memory so it learns faster, and a ledger so you see where tokens go.

Requirements

  • Node.js 20+
  • Claude Code CLI
  • Windows, macOS, or Linux
  • Optional: PM2 for persistent background tasks
  • Optional: puppeteer-core for Design QC screenshots

Limitations

  • Claude Code hooks are a relatively new feature. OpenWolf falls back to CLAUDE.md instructions when hooks don't fire.
  • Token tracking is estimation-based (character-to-token ratio), not exact API counts. Accurate to within ~15%.
  • cerebrum.md depends on Claude following instructions to update it after corrections. Compliance is ~85-90%, not 100%.
  • This is v1.0.4. Things may break. File issues.

Origin Story

We were building products with Claude Code at Cytostack when we noticed something off. Sessions were eating through tokens faster than they should. When we dug in, we found Claude re-reading the same files multiple times, scanning entire directories to find one function, and having no way to know what a file contained without opening it. There was no project map, no read awareness, no token visibility. So we built the tooling we wished existed -- a file index so Claude reads less, a learning memory so it gets smarter, and a ledger that tracks every token. That became OpenWolf.

License

AGPL-3.0

Author

Built by Farhan Palathinkal Afsal - Cytostack

About

Sharper context. Fewer tokens. Open-source middleware for Claude Code.

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OpenWolf demo

OpenWolf

A second brain for Claude Code.
Project intelligence, token tracking, and invisible enforcement through 6 hook scripts. Zero workflow changes.

npm versionLicense: AGPL-3.0Node.js


Why OpenWolf Exists

Claude Code is powerful but it works blind. It doesn't know what a file contains until it opens it. It can't tell a 50-token config from a 2,000-token module. It reads the same file multiple times in one session without noticing. It has no index of your project, no memory of your corrections, and no awareness of what it already tried.

OpenWolf gives Claude a second brain: a file index so it knows what files contain before reading them, a learning memory that accumulates your preferences and past mistakes, and a token ledger that tracks everything. All through 6 invisible hook scripts that fire on every Claude action.

Token Comparison

Tested on a large active project. Same codebase, same prompts, different setups:

OpenClaw + Claude ██████████████████████████████████████ ~3.4M tokens
Claude CLI (no OpenWolf) ████████████████████████████████ ~2.5M tokens
OpenWolf + Claude CLI ████████ ~425K tokens

OpenWolf saved ~80% of tokens compared to bare Claude CLI on the same project.

Across 20 projects, 132+ sessions: average token reduction of 65.8%, with 71% of repeated file reads caught and blocked. These are numbers from real usage, not benchmarks. Your results will vary by project size and usage patterns.

Quick Start

npm install -g openwolf
cd your-project
openwolf init

That's it. Use claude normally. OpenWolf is watching.

What It Creates

openwolf init creates a .wolf/ directory in your project:

FilePurpose
anatomy.mdProject file map with descriptions and token estimates
cerebrum.mdLearned preferences, corrections, Do-Not-Repeat list
memory.mdChronological action log with token estimates
buglog.jsonBug fix memory, searchable, prevents re-discovery
token-ledger.jsonLifetime token tracking and session history
hooks/6 Claude Code lifecycle hooks (pure Node.js)
config.jsonConfiguration with sensible defaults
identity.mdAgent persona for this project
OPENWOLF.mdInstructions Claude follows every session

How It Works

Before Claude reads a file, OpenWolf tells it what the file contains and how large it is. If Claude already read that file this session, OpenWolf warns it. Before Claude writes code, OpenWolf checks your cerebrum.md for known mistakes. After every write, it auto-updates the project map and logs token usage. You see none of this. It just happens.

You type a message
↓
Claude decides to read a file
↓
OpenWolf: "anatomy.md says this file is ~380 tokens. Description: Main entry point."
↓
Claude reads the file
↓
OpenWolf: logs the read, estimates tokens, checks for repeated reads
↓
Claude writes code
↓
OpenWolf: checks cerebrum.md - no known mistakes matched
↓
Claude finishes
↓
OpenWolf: updates anatomy.md, appends to memory.md, updates token ledger

The .wolf/ Files

cerebrum.md - the learning memory

Claude updates this file when you correct it, express a preference, or make a decision. The Do-Not-Repeat list prevents the same mistake across sessions.

## Do-Not-Repeat- 2026-03-10: Never use `var` - always `const` or `let`- 2026-03-11: Don't mock the database in integration tests - use the real connection
- 2026-03-14: The auth middleware reads from `cfg.talk`, not `cfg.tts` - got burned twice
## User Preferences- Prefers functional components over class components
- Always use named exports, never default exports
- Tests go in `__tests__/` next to the source file
## Key Learnings- This project uses pnpm workspaces with strict hoisting
- The API rate limiter uses a sliding window, not fixed buckets
- Auth middleware reads from env.JWT_SECRET, not config file
anatomy.md - the project map

Every file gets a description and token estimate. Claude reads this instead of opening files when the summary is enough.

## src/-`index.ts` - Main entry point. Exports createProgram() for CLI. (~180 tok)
-`server.ts` - Express HTTP server with middleware chain. (~520 tok)
## src/api/-`auth.ts` - JWT validation middleware. Reads from env.JWT_SECRET. (~340 tok)
-`users.ts` - CRUD endpoints for /api/users. Pagination via query params. (~890 tok)
token-ledger.json - the receipt

Every session gets a line item. Lifetime totals tell you if OpenWolf is actually saving tokens.

{
"lifetime": {
"total_tokens_estimated": 503978,
"total_reads": 287,
"total_writes": 269,
"total_sessions": 15,
"anatomy_hits": 198,
"anatomy_misses": 89,
"repeated_reads_blocked": 106,
"estimated_savings_vs_bare_cli": 2066959
}
}
buglog.json - the bug memory

Before fixing anything, Claude checks if the fix is already known. After fixing, it logs the solution.

{
"id": "bug-012",
"error_message": "TypeError: Cannot read properties of undefined (reading 'map')",
"file": "src/components/UserList.tsx",
"root_cause": "API response was null when users array was expected",
"fix": "Added optional chaining: data?.users?.map() and fallback empty array",
"tags": ["null-check", "api-response", "react"]
}

Commands

openwolf init Initialize .wolf/ and register hooks
openwolf status Show health, stats, file integrity
openwolf scan Refresh the project structure map
openwolf scan --check Verify anatomy matches filesystem (exits 1 if stale)
openwolf dashboard Open the real-time web dashboard
openwolf daemon start Start background task scheduler
openwolf daemon stop Stop the scheduler
openwolf daemon restart Restart the scheduler
openwolf daemon logs View scheduler logs
openwolf cron list Show all scheduled tasks
openwolf cron run <id> Trigger a task manually
openwolf cron retry <id> Retry a dead-lettered task
openwolf designqc Capture full-page screenshots for design evaluation
openwolf bug search <term> Search bug memory for known fixes
openwolf update Update all registered projects to latest version
openwolf restore [backup] Restore .wolf/ from a timestamped backup

Design QC

Capture full-page screenshots of your running app and let Claude evaluate the design.

openwolf designqc

Auto-detects your dev server, captures viewport-height JPEG sections of every route, and saves them to .wolf/designqc-captures/. Then tell Claude to read the screenshots and evaluate. Requires puppeteer-core.

Reframe

Ask Claude to help you pick a UI framework. OpenWolf ships a curated knowledge base of 12 frameworks (shadcn/ui, Aceternity, Magic UI, DaisyUI, HeroUI, Chakra, Flowbite, Preline, Park UI, Origin UI, Headless UI, Cult UI) with battle-tested migration prompts. Claude reads .wolf/reframe-frameworks.md, asks you a few questions, and executes the migration with the right prompt for your project.

How OpenWolf Compares

OpenWolf is not an AI wrapper. It is 6 hook scripts and a .wolf/ directory. It doesn't run your AI for you or change your workflow. It gives Claude Code what it lacks: a project map so it reads less, a memory so it learns faster, and a ledger so you see where tokens go.

Requirements

  • Node.js 20+
  • Claude Code CLI
  • Windows, macOS, or Linux
  • Optional: PM2 for persistent background tasks
  • Optional: puppeteer-core for Design QC screenshots

Limitations

  • Claude Code hooks are a relatively new feature. OpenWolf falls back to CLAUDE.md instructions when hooks don't fire.
  • Token tracking is estimation-based (character-to-token ratio), not exact API counts. Accurate to within ~15%.
  • cerebrum.md depends on Claude following instructions to update it after corrections. Compliance is ~85-90%, not 100%.
  • This is v1.0.4. Things may break. File issues.

Origin Story

We were building products with Claude Code at Cytostack when we noticed something off. Sessions were eating through tokens faster than they should. When we dug in, we found Claude re-reading the same files multiple times, scanning entire directories to find one function, and having no way to know what a file contained without opening it. There was no project map, no read awareness, no token visibility. So we built the tooling we wished existed -- a file index so Claude reads less, a learning memory so it gets smarter, and a ledger that tracks every token. That became OpenWolf.

License

AGPL-3.0

Author

Built by Farhan Palathinkal Afsal - Cytostack

About

Sharper context. Fewer tokens. Open-source middleware for Claude Code.

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OpenWolf demo

OpenWolf

A second brain for Claude Code.
Project intelligence, token tracking, and invisible enforcement through 6 hook scripts. Zero workflow changes.

npm versionLicense: AGPL-3.0Node.js


Why OpenWolf Exists

Claude Code is powerful but it works blind. It doesn't know what a file contains until it opens it. It can't tell a 50-token config from a 2,000-token module. It reads the same file multiple times in one session without noticing. It has no index of your project, no memory of your corrections, and no awareness of what it already tried.

OpenWolf gives Claude a second brain: a file index so it knows what files contain before reading them, a learning memory that accumulates your preferences and past mistakes, and a token ledger that tracks everything. All through 6 invisible hook scripts that fire on every Claude action.

Token Comparison

Tested on a large active project. Same codebase, same prompts, different setups:

OpenClaw + Claude ██████████████████████████████████████ ~3.4M tokens
Claude CLI (no OpenWolf) ████████████████████████████████ ~2.5M tokens
OpenWolf + Claude CLI ████████ ~425K tokens

OpenWolf saved ~80% of tokens compared to bare Claude CLI on the same project.

Across 20 projects, 132+ sessions: average token reduction of 65.8%, with 71% of repeated file reads caught and blocked. These are numbers from real usage, not benchmarks. Your results will vary by project size and usage patterns.

Quick Start

npm install -g openwolf
cd your-project
openwolf init

That's it. Use claude normally. OpenWolf is watching.

What It Creates

openwolf init creates a .wolf/ directory in your project:

FilePurpose
anatomy.mdProject file map with descriptions and token estimates
cerebrum.mdLearned preferences, corrections, Do-Not-Repeat list
memory.mdChronological action log with token estimates
buglog.jsonBug fix memory, searchable, prevents re-discovery
token-ledger.jsonLifetime token tracking and session history
hooks/6 Claude Code lifecycle hooks (pure Node.js)
config.jsonConfiguration with sensible defaults
identity.mdAgent persona for this project
OPENWOLF.mdInstructions Claude follows every session

How It Works

Before Claude reads a file, OpenWolf tells it what the file contains and how large it is. If Claude already read that file this session, OpenWolf warns it. Before Claude writes code, OpenWolf checks your cerebrum.md for known mistakes. After every write, it auto-updates the project map and logs token usage. You see none of this. It just happens.

You type a message
↓
Claude decides to read a file
↓
OpenWolf: "anatomy.md says this file is ~380 tokens. Description: Main entry point."
↓
Claude reads the file
↓
OpenWolf: logs the read, estimates tokens, checks for repeated reads
↓
Claude writes code
↓
OpenWolf: checks cerebrum.md - no known mistakes matched
↓
Claude finishes
↓
OpenWolf: updates anatomy.md, appends to memory.md, updates token ledger

The .wolf/ Files

cerebrum.md - the learning memory

Claude updates this file when you correct it, express a preference, or make a decision. The Do-Not-Repeat list prevents the same mistake across sessions.

## Do-Not-Repeat- 2026-03-10: Never use `var` - always `const` or `let`- 2026-03-11: Don't mock the database in integration tests - use the real connection
- 2026-03-14: The auth middleware reads from `cfg.talk`, not `cfg.tts` - got burned twice
## User Preferences- Prefers functional components over class components
- Always use named exports, never default exports
- Tests go in `__tests__/` next to the source file
## Key Learnings- This project uses pnpm workspaces with strict hoisting
- The API rate limiter uses a sliding window, not fixed buckets
- Auth middleware reads from env.JWT_SECRET, not config file
anatomy.md - the project map

Every file gets a description and token estimate. Claude reads this instead of opening files when the summary is enough.

## src/-`index.ts` - Main entry point. Exports createProgram() for CLI. (~180 tok)
-`server.ts` - Express HTTP server with middleware chain. (~520 tok)
## src/api/-`auth.ts` - JWT validation middleware. Reads from env.JWT_SECRET. (~340 tok)
-`users.ts` - CRUD endpoints for /api/users. Pagination via query params. (~890 tok)
token-ledger.json - the receipt

Every session gets a line item. Lifetime totals tell you if OpenWolf is actually saving tokens.

{
"lifetime": {
"total_tokens_estimated": 503978,
"total_reads": 287,
"total_writes": 269,
"total_sessions": 15,
"anatomy_hits": 198,
"anatomy_misses": 89,
"repeated_reads_blocked": 106,
"estimated_savings_vs_bare_cli": 2066959
}
}
buglog.json - the bug memory

Before fixing anything, Claude checks if the fix is already known. After fixing, it logs the solution.

{
"id": "bug-012",
"error_message": "TypeError: Cannot read properties of undefined (reading 'map')",
"file": "src/components/UserList.tsx",
"root_cause": "API response was null when users array was expected",
"fix": "Added optional chaining: data?.users?.map() and fallback empty array",
"tags": ["null-check", "api-response", "react"]
}

Commands

openwolf init Initialize .wolf/ and register hooks
openwolf status Show health, stats, file integrity
openwolf scan Refresh the project structure map
openwolf scan --check Verify anatomy matches filesystem (exits 1 if stale)
openwolf dashboard Open the real-time web dashboard
openwolf daemon start Start background task scheduler
openwolf daemon stop Stop the scheduler
openwolf daemon restart Restart the scheduler
openwolf daemon logs View scheduler logs
openwolf cron list Show all scheduled tasks
openwolf cron run <id> Trigger a task manually
openwolf cron retry <id> Retry a dead-lettered task
openwolf designqc Capture full-page screenshots for design evaluation
openwolf bug search <term> Search bug memory for known fixes
openwolf update Update all registered projects to latest version
openwolf restore [backup] Restore .wolf/ from a timestamped backup

Design QC

Capture full-page screenshots of your running app and let Claude evaluate the design.

openwolf designqc

Auto-detects your dev server, captures viewport-height JPEG sections of every route, and saves them to .wolf/designqc-captures/. Then tell Claude to read the screenshots and evaluate. Requires puppeteer-core.

Reframe

Ask Claude to help you pick a UI framework. OpenWolf ships a curated knowledge base of 12 frameworks (shadcn/ui, Aceternity, Magic UI, DaisyUI, HeroUI, Chakra, Flowbite, Preline, Park UI, Origin UI, Headless UI, Cult UI) with battle-tested migration prompts. Claude reads .wolf/reframe-frameworks.md, asks you a few questions, and executes the migration with the right prompt for your project.

How OpenWolf Compares

OpenWolf is not an AI wrapper. It is 6 hook scripts and a .wolf/ directory. It doesn't run your AI for you or change your workflow. It gives Claude Code what it lacks: a project map so it reads less, a memory so it learns faster, and a ledger so you see where tokens go.

Requirements

  • Node.js 20+
  • Claude Code CLI
  • Windows, macOS, or Linux
  • Optional: PM2 for persistent background tasks
  • Optional: puppeteer-core for Design QC screenshots

Limitations

  • Claude Code hooks are a relatively new feature. OpenWolf falls back to CLAUDE.md instructions when hooks don't fire.
  • Token tracking is estimation-based (character-to-token ratio), not exact API counts. Accurate to within ~15%.
  • cerebrum.md depends on Claude following instructions to update it after corrections. Compliance is ~85-90%, not 100%.
  • This is v1.0.4. Things may break. File issues.

Origin Story

We were building products with Claude Code at Cytostack when we noticed something off. Sessions were eating through tokens faster than they should. When we dug in, we found Claude re-reading the same files multiple times, scanning entire directories to find one function, and having no way to know what a file contained without opening it. There was no project map, no read awareness, no token visibility. So we built the tooling we wished existed -- a file index so Claude reads less, a learning memory so it gets smarter, and a ledger that tracks every token. That became OpenWolf.

License

AGPL-3.0

Author

Built by Farhan Palathinkal Afsal - Cytostack

About

Sharper context. Fewer tokens. Open-source middleware for Claude Code.

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

OpenWolf demo

OpenWolf

A second brain for Claude Code.
Project intelligence, token tracking, and invisible enforcement through 6 hook scripts. Zero workflow changes.

npm versionLicense: AGPL-3.0Node.js


Why OpenWolf Exists

Claude Code is powerful but it works blind. It doesn't know what a file contains until it opens it. It can't tell a 50-token config from a 2,000-token module. It reads the same file multiple times in one session without noticing. It has no index of your project, no memory of your corrections, and no awareness of what it already tried.

OpenWolf gives Claude a second brain: a file index so it knows what files contain before reading them, a learning memory that accumulates your preferences and past mistakes, and a token ledger that tracks everything. All through 6 invisible hook scripts that fire on every Claude action.

Token Comparison

Tested on a large active project. Same codebase, same prompts, different setups:

OpenClaw + Claude ██████████████████████████████████████ ~3.4M tokens
Claude CLI (no OpenWolf) ████████████████████████████████ ~2.5M tokens
OpenWolf + Claude CLI ████████ ~425K tokens

OpenWolf saved ~80% of tokens compared to bare Claude CLI on the same project.

Across 20 projects, 132+ sessions: average token reduction of 65.8%, with 71% of repeated file reads caught and blocked. These are numbers from real usage, not benchmarks. Your results will vary by project size and usage patterns.

Quick Start

npm install -g openwolf
cd your-project
openwolf init

That's it. Use claude normally. OpenWolf is watching.

What It Creates

openwolf init creates a .wolf/ directory in your project:

FilePurpose
anatomy.mdProject file map with descriptions and token estimates
cerebrum.mdLearned preferences, corrections, Do-Not-Repeat list
memory.mdChronological action log with token estimates
buglog.jsonBug fix memory, searchable, prevents re-discovery
token-ledger.jsonLifetime token tracking and session history
hooks/6 Claude Code lifecycle hooks (pure Node.js)
config.jsonConfiguration with sensible defaults
identity.mdAgent persona for this project
OPENWOLF.mdInstructions Claude follows every session

How It Works

Before Claude reads a file, OpenWolf tells it what the file contains and how large it is. If Claude already read that file this session, OpenWolf warns it. Before Claude writes code, OpenWolf checks your cerebrum.md for known mistakes. After every write, it auto-updates the project map and logs token usage. You see none of this. It just happens.

You type a message
↓
Claude decides to read a file
↓
OpenWolf: "anatomy.md says this file is ~380 tokens. Description: Main entry point."
↓
Claude reads the file
↓
OpenWolf: logs the read, estimates tokens, checks for repeated reads
↓
Claude writes code
↓
OpenWolf: checks cerebrum.md - no known mistakes matched
↓
Claude finishes
↓
OpenWolf: updates anatomy.md, appends to memory.md, updates token ledger

The .wolf/ Files

cerebrum.md - the learning memory

Claude updates this file when you correct it, express a preference, or make a decision. The Do-Not-Repeat list prevents the same mistake across sessions.

## Do-Not-Repeat- 2026-03-10: Never use `var` - always `const` or `let`- 2026-03-11: Don't mock the database in integration tests - use the real connection
- 2026-03-14: The auth middleware reads from `cfg.talk`, not `cfg.tts` - got burned twice
## User Preferences- Prefers functional components over class components
- Always use named exports, never default exports
- Tests go in `__tests__/` next to the source file
## Key Learnings- This project uses pnpm workspaces with strict hoisting
- The API rate limiter uses a sliding window, not fixed buckets
- Auth middleware reads from env.JWT_SECRET, not config file
anatomy.md - the project map

Every file gets a description and token estimate. Claude reads this instead of opening files when the summary is enough.

## src/-`index.ts` - Main entry point. Exports createProgram() for CLI. (~180 tok)
-`server.ts` - Express HTTP server with middleware chain. (~520 tok)
## src/api/-`auth.ts` - JWT validation middleware. Reads from env.JWT_SECRET. (~340 tok)
-`users.ts` - CRUD endpoints for /api/users. Pagination via query params. (~890 tok)
token-ledger.json - the receipt

Every session gets a line item. Lifetime totals tell you if OpenWolf is actually saving tokens.

{
"lifetime": {
"total_tokens_estimated": 503978,
"total_reads": 287,
"total_writes": 269,
"total_sessions": 15,
"anatomy_hits": 198,
"anatomy_misses": 89,
"repeated_reads_blocked": 106,
"estimated_savings_vs_bare_cli": 2066959
}
}
buglog.json - the bug memory

Before fixing anything, Claude checks if the fix is already known. After fixing, it logs the solution.

{
"id": "bug-012",
"error_message": "TypeError: Cannot read properties of undefined (reading 'map')",
"file": "src/components/UserList.tsx",
"root_cause": "API response was null when users array was expected",
"fix": "Added optional chaining: data?.users?.map() and fallback empty array",
"tags": ["null-check", "api-response", "react"]
}

Commands

openwolf init Initialize .wolf/ and register hooks
openwolf status Show health, stats, file integrity
openwolf scan Refresh the project structure map
openwolf scan --check Verify anatomy matches filesystem (exits 1 if stale)
openwolf dashboard Open the real-time web dashboard
openwolf daemon start Start background task scheduler
openwolf daemon stop Stop the scheduler
openwolf daemon restart Restart the scheduler
openwolf daemon logs View scheduler logs
openwolf cron list Show all scheduled tasks
openwolf cron run <id> Trigger a task manually
openwolf cron retry <id> Retry a dead-lettered task
openwolf designqc Capture full-page screenshots for design evaluation
openwolf bug search <term> Search bug memory for known fixes
openwolf update Update all registered projects to latest version
openwolf restore [backup] Restore .wolf/ from a timestamped backup

Design QC

Capture full-page screenshots of your running app and let Claude evaluate the design.

openwolf designqc

Auto-detects your dev server, captures viewport-height JPEG sections of every route, and saves them to .wolf/designqc-captures/. Then tell Claude to read the screenshots and evaluate. Requires puppeteer-core.

Reframe

Ask Claude to help you pick a UI framework. OpenWolf ships a curated knowledge base of 12 frameworks (shadcn/ui, Aceternity, Magic UI, DaisyUI, HeroUI, Chakra, Flowbite, Preline, Park UI, Origin UI, Headless UI, Cult UI) with battle-tested migration prompts. Claude reads .wolf/reframe-frameworks.md, asks you a few questions, and executes the migration with the right prompt for your project.

How OpenWolf Compares

OpenWolf is not an AI wrapper. It is 6 hook scripts and a .wolf/ directory. It doesn't run your AI for you or change your workflow. It gives Claude Code what it lacks: a project map so it reads less, a memory so it learns faster, and a ledger so you see where tokens go.

Requirements

  • Node.js 20+
  • Claude Code CLI
  • Windows, macOS, or Linux
  • Optional: PM2 for persistent background tasks
  • Optional: puppeteer-core for Design QC screenshots

Limitations

  • Claude Code hooks are a relatively new feature. OpenWolf falls back to CLAUDE.md instructions when hooks don't fire.
  • Token tracking is estimation-based (character-to-token ratio), not exact API counts. Accurate to within ~15%.
  • cerebrum.md depends on Claude following instructions to update it after corrections. Compliance is ~85-90%, not 100%.
  • This is v1.0.4. Things may break. File issues.

Origin Story

We were building products with Claude Code at Cytostack when we noticed something off. Sessions were eating through tokens faster than they should. When we dug in, we found Claude re-reading the same files multiple times, scanning entire directories to find one function, and having no way to know what a file contained without opening it. There was no project map, no read awareness, no token visibility. So we built the tooling we wished existed -- a file index so Claude reads less, a learning memory so it gets smarter, and a ledger that tracks every token. That became OpenWolf.

License

AGPL-3.0

Author

Built by Farhan Palathinkal Afsal - Cytostack

About

Sharper context. Fewer tokens. Open-source middleware for Claude Code.

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages