@unerr-ai/unerr 0.0.0-beta.9 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src="https://unerr.dev/icon-wordmark.svg" alt="unerr" width="320" />
2
+ <a href="https://www.unerr.dev/"><img src="https://unerr.dev/icon-wordmark.svg" alt="unerr — local intelligence layer for AI coding agents" width="320" /></a>
3
3
  </p>
4
4
 
5
5
  <p align="center">
@@ -7,14 +7,19 @@
7
7
  </p>
8
8
 
9
9
  <p align="center">
10
- The intelligence layer between your AI agent and your codebase.<br/>
11
- It sees every dependency, remembers every session, and gets smarter the longer you use it.
10
+ A local intelligence layer that sits between your AI agent and your codebase —<br/>
11
+ indexes every call, remembers every decision, and gets sharper the longer you use it.
12
12
  </p>
13
13
 
14
14
  <p align="center">
15
+ <a href="https://www.unerr.dev/"><img src="https://img.shields.io/badge/website-unerr.dev-8B5CF6?style=flat-square&logo=icloud&logoColor=white" alt="Website" /></a>
15
16
  <a href="https://www.npmjs.com/package/@unerr-ai/unerr"><img src="https://img.shields.io/badge/install-npm_i_@unerr--ai/unerr-8B5CF6?style=flat-square&logo=npm" alt="Install" /></a>
17
+ <a href="https://discord.gg/JfZ4pYgb"><img src="https://img.shields.io/badge/community-Discord-5865F2?style=flat-square&logo=discord&logoColor=white" alt="Discord" /></a>
18
+ <a href="https://x.com/unerr_ai"><img src="https://img.shields.io/badge/follow-@unerr__ai-000000?style=flat-square&logo=x&logoColor=white" alt="X / Twitter" /></a>
19
+ <a href="https://www.linkedin.com/company/unerr"><img src="https://img.shields.io/badge/linkedin-unerr-0A66C2?style=flat-square&logo=linkedin&logoColor=white" alt="LinkedIn" /></a>
16
20
  <img src="https://img.shields.io/badge/runtime-Node.js_≥20-339933?style=flat-square&logo=node.js&logoColor=white" alt="Node.js" />
17
21
  <img src="https://img.shields.io/badge/protocol-MCP-7C3AED?style=flat-square" alt="MCP" />
22
+ <img src="https://img.shields.io/badge/local--first-no_cloud-22D3EE?style=flat-square" alt="Local-first" />
18
23
  <img src="https://img.shields.io/badge/license-ELv2-A1A1AA?style=flat-square" alt="License" />
19
24
  </p>
20
25
 
@@ -24,144 +29,156 @@
24
29
 
25
30
  ---
26
31
 
27
- ## Your agent loops because it's blind
32
+ ## The agent isn't stupid. It's flying blind.
28
33
 
29
- You've seen it. You ask Claude or Cursor to refactor a function. It reads 30 files to find the call graph. It misses 14 downstream callers. It re-discovers conventions you told it yesterday. It tries a broken approach, fails, tries again — burning tokens while you watch.
34
+ Watch any AI coding session for ten minutes and you'll see the same loop:
30
35
 
31
- **The agent isn't stupid. It's blind.**
36
+ - It **reads 30 files** to find one function — burning the context window before it writes a line.
37
+ - It **edits something with 40 callers** and never knows it just broke three services.
38
+ - It **re-derives the same conventions** you taught it yesterday, this morning, and an hour ago.
39
+ - It **forgets the entire session** the moment the window closes.
32
40
 
33
- - It can't see that `processPayment()` has 40 callers across 3 services
34
- - It doesn't know your team uses `fetch` prefixes, not `get`
35
- - It forgot everything from yesterday's session
36
-
37
- unerr gives it an intelligence layer that compounds. Every caller, every convention, every session — accumulated, not re-derived. The agent stops searching and starts knowing.
41
+ Every one of these is the same root cause: the agent has **no persistent memory of your code, your team's style, or its own past mistakes**. unerr is that memory. One process, fully local, indexed in seconds — and your agent picks it up automatically through MCP.
38
42
 
39
43
  ---
40
44
 
41
- ## What happens when you run it
45
+ ## What you actually see
46
+
47
+ Run `unerr` and open the dashboard. Four panes, all live:
42
48
 
43
- **5 seconds later**, your agent has:
49
+ | Pane | Answers the question | Powered by |
50
+ |---|---|---|
51
+ | **Token Optimization** | *How much context did unerr save my agent this session?* — saved vs. delivered, compounding multiplier, breakdown by mechanism (compression, graph hits, skipped re-reads). | Per-turn ledger of every tool call |
52
+ | **Reasoning Quality** | *Did the agent actually use what it remembered?* — 4-pillar score across exploration, planning, execution, persistent memory. | 5-turn outcome window per fact/convention |
53
+ | **Codebase Map + Code Intelligence** | *What's the call graph and where are the blast-radius landmines?* — entities, edges, fan-in/out chokepoints, cross-module surprise links. | CozoDB graph (in-process, <5ms) |
54
+ | **Project Memory + Activity** | *What did we already learn, and what was I doing last time?* — facts the agent recorded, sessions stitched into intents, open blockers. | Append-only fact store + timeline.db |
44
55
 
45
- | Before unerr | After unerr |
46
- |:---|:---|
47
- | Reads 30 files to understand a call graph | Queries the graph in 5ms |
48
- | Misses downstream callers, breaks things | Sees full blast radius before editing |
49
- | Re-derives conventions every session | Knows your patterns, enforces them |
50
- | Session degrades at 70% context fill | Stays sharp — 93% shell compression, context lasts 3–5x longer |
51
- | Starts from zero tomorrow | Resumes where it left off |
56
+ The agent reads from the same store through MCP — every claim on the dashboard is also a tool call it just made.
52
57
 
53
58
  ### See it in action
54
59
 
55
- <p align="center">
56
- <table>
57
- <tr>
58
- <td align="center">
59
- <img src="https://unerr.dev/open-cli/screenshots/code-base-intelligence.png" alt="unerr codebase intelligence" width="130" />
60
- <br/><sub>Codebase intelligence</sub>
61
- </td>
62
- <td align="center">
63
- <img src="https://unerr.dev/open-cli/screenshots/reasoning-session.png" alt="unerr reasoning session" width="130" />
64
- <br/><sub>Reasoning session</sub>
65
- </td>
66
- <td align="center">
67
- <img src="https://unerr.dev/open-cli/screenshots/reasoning-quality.png" alt="unerr reasoning quality" width="130" />
68
- <br/><sub>Reasoning quality</sub>
69
- </td>
70
- <td align="center">
71
- <img src="https://unerr.dev/open-cli/screenshots/token-trace-main.png" alt="unerr token trace main view" width="130" />
72
- <br/><sub>Token trace</sub>
73
- </td>
74
- <td align="center">
75
- <img src="https://unerr.dev/open-cli/screenshots/token-session.png" alt="unerr session token tracking" width="130" />
76
- <br/><sub>Session tracking</sub>
77
- </td>
78
- <td align="center">
79
- <img src="https://unerr.dev/open-cli/screenshots/token-turn.png" alt="unerr per-turn token breakdown" width="130" />
80
- <br/><sub>Per-turn breakdown</sub>
81
- </td>
82
- </tr>
83
- </table>
84
- </p>
60
+ <table align="center">
61
+ <tr>
62
+ <td align="center" width="240">
63
+ <img src="https://unerr.dev/open-cli/screenshots/dashboard.png" alt="unerr dashboard — live overview" width="240" height="150" />
64
+ <br/><sub><strong>Dashboard</strong><br/>Live overview active sessions, recent tool calls, tokens saved this turn.</sub>
65
+ </td>
66
+ <td align="center" width="240">
67
+ <img src="https://unerr.dev/open-cli/screenshots/token-trace-main.png" alt="unerr token trace — global" width="240" height="150" />
68
+ <br/><sub><strong>Token Trace · global</strong><br/>Aggregate savings across every session, broken down by mechanism (graph, file_read, shell, dedup, format).</sub>
69
+ </td>
70
+ <td align="center" width="240">
71
+ <img src="https://unerr.dev/open-cli/screenshots/token-session.png" alt="unerr token trace — session" width="240" height="150" />
72
+ <br/><sub><strong>Token Trace · session</strong><br/>Single session: per-turn savings, mechanism mix, and the compounding multiplier.</sub>
73
+ </td>
74
+ <td align="center" width="240">
75
+ <img src="https://unerr.dev/open-cli/screenshots/token-turn.png" alt="unerr token trace — turn" width="240" height="150" />
76
+ <br/><sub><strong>Token Trace · turn</strong><br/>Single turn: which tool calls fired, tokens each would have cost without unerr vs what was delivered.</sub>
77
+ </td>
78
+ </tr>
79
+ <tr>
80
+ <td align="center" width="240">
81
+ <img src="https://unerr.dev/open-cli/screenshots/reasoning-quality.png" alt="unerr reasoning quality — global" width="240" height="150" />
82
+ <br/><sub><strong>Reasoning Quality · global</strong><br/>Four-pillar score across cleaner context, fewer wasted turns, fewer breakages, persistent memory.</sub>
83
+ </td>
84
+ <td align="center" width="240">
85
+ <img src="https://unerr.dev/open-cli/screenshots/reasoning-session.png" alt="unerr reasoning quality — session" width="240" height="150" />
86
+ <br/><sub><strong>Reasoning Quality · session</strong><br/>Per-session: which facts and conventions were reinforced, acted on, ignored, or corrected.</sub>
87
+ </td>
88
+ <td align="center" width="240">
89
+ <img src="https://unerr.dev/open-cli/screenshots/code-base-intelligence.png" alt="unerr code intelligence" width="240" height="150" />
90
+ <br/><sub><strong>Code Intelligence</strong><br/>Call graph, fan-in/out chokepoints, cross-module surprise links, and a risk grade per file.</sub>
91
+ </td>
92
+ <td align="center" width="240">
93
+ <img src="https://unerr.dev/open-cli/screenshots/project-memory.png" alt="unerr project memory — facts" width="240" height="150" />
94
+ <br/><sub><strong>Project Memory</strong><br/>Conventions, anti-patterns, decisions — with decay-adjusted confidence and reinforcement counts.</sub>
95
+ </td>
96
+ </tr>
97
+ <tr>
98
+ <td align="center" width="240" colspan="4">
99
+ <img src="https://unerr.dev/open-cli/screenshots/activity.png" alt="unerr activity — timeline + heatmap" width="240" height="150" />
100
+ <br/><sub><strong>Activity</strong><br/>Turn-grouped timeline with a 30-day heatmap — each row is one burst of agent work (intent → tools → outcome).</sub>
101
+ </td>
102
+ </tr>
103
+ </table>
85
104
 
86
105
  ---
87
106
 
88
107
  ## Quick Start
89
108
 
90
- ### Install from npm
109
+ ### 1. Install globally
91
110
 
92
111
  ```bash
93
- # 1. Install globally
94
112
  npm install -g @unerr-ai/unerr
95
-
96
- # 2. Add to your AI agent (in your project directory)
97
- unerr install claude-code # or: cursor, vscode, windsurf, codex, etc.
98
-
99
- # 3. Run (indexes your codebase, starts MCP server)
100
- unerr
101
113
  ```
102
114
 
103
- <!--
104
- ### Install from source
115
+ ### 2. Choose your mode
116
+
117
+ <table>
118
+ <tr>
119
+ <th width="50%">Standalone (single repo, simple)</th>
120
+ <th width="50%">Daemon Mode (multi-repo, recommended)</th>
121
+ </tr>
122
+ <tr>
123
+ <td>
105
124
 
106
125
  ```bash
107
- # 1. Clone and build
108
- git clone https://github.com/unerr-cli.git
109
- cd unerr-cli
110
- pnpm install
111
- pnpm run build
126
+ cd ~/project
127
+ unerr install cursor # install MCP config + skills
128
+ unerr # start per-repo process
129
+ ```
112
130
 
113
- # 2. Link globally (makes `unerr` command available)
114
- pnpm link --global
131
+ One `unerr` process per repo. You start it manually. Good for single-project workflows.
115
132
 
116
- # 3. Add to your AI agent (in your project directory)
117
- cd /path/to/your/project
118
- unerr install claude-code # or: cursor, vscode, windsurf, codex, etc.
133
+ </td>
134
+ <td>
119
135
 
120
- # 4. Run
121
- unerr
136
+ ```bash
137
+ unerr daemon initialize # one-time: register at boot + start
138
+ cd ~/project
139
+ unerr install cursor # install config + register repo
140
+ # done — IDE auto-connects via unerrd
122
141
  ```
123
- -->
124
142
 
125
- After install, your AI agent automatically connects to unerr via MCP. No config files to edit manually.
143
+ A single `unerrd` supervisor manages all repos. Starts at login, spawns per-repo processes on demand, idles unused ones, unified dashboard at `localhost:9847`.
126
144
 
127
- ---
145
+ </td>
146
+ </tr>
147
+ </table>
128
148
 
129
- ## Supported Agents
149
+ > **Important:** After running `unerr install`, restart your coding AI session (close and reopen the IDE or start a new chat) for unerr to take effect. The agent needs to pick up the newly installed MCP config, skills, and instructions.
130
150
 
131
- ### Integrated
151
+ ### What each command does (no hidden behaviors)
132
152
 
133
- Fully tested with MCP config, instruction injection, skills, and hooks.
153
+ | Command | What it does | What it does NOT do |
154
+ |---------|------|------|
155
+ | `unerr daemon initialize` | Registers unerrd at boot (launchd/systemd/schtasks) + starts it | - |
156
+ | `unerr install <agent>` | MCP config + skills + hooks + instructions + gitignore. If unerrd running: registers the repo | Start unerrd, start per-repo process |
157
+ | `unerr --mcp` | Bridges to running process (standalone or daemon-managed) | Spawn unerrd, register repos, start processes |
158
+ | `unerr` (no args) | Starts a standalone per-repo proxy | Touch the daemon |
159
+
160
+ ### Supported agents
134
161
 
135
162
  ```bash
136
- unerr install claude-code # .mcp.json + CLAUDE.md + .claude/skills/ + hooks
137
- unerr install cursor # .cursor/mcp.json + .cursor/rules/ + hooks
138
- unerr install antigravity # .antigravity/mcp_config.json + .agents/rules/ + .agents/skills/
139
- unerr install windsurf # ~/.codeium/windsurf/mcp_config.json + .windsurf/rules/ + .windsurf/skills/
140
- unerr install gemini-cli # .gemini/settings.json + GEMINI.md + .gemini/skills/
141
- unerr install github-copilot-cli # .copilot/mcp-config.json + .github/copilot-instructions.md + .github/skills/
163
+ unerr install claude-code # .mcp.json + CLAUDE.md + .claude/skills/ + hooks
164
+ unerr install cursor # .cursor/mcp.json + .cursor/rules/ + hooks
165
+ unerr install antigravity # .antigravity/mcp_config.json + .agents/rules/ + .agents/skills/
166
+ unerr install windsurf # ~/.codeium/windsurf/mcp_config.json + .windsurf/rules/ + .windsurf/skills/
167
+ unerr install gemini-cli # .gemini/settings.json + GEMINI.md + .gemini/skills/
168
+ unerr install github-copilot-cli # .copilot/mcp-config.json + .github/copilot-instructions.md + .github/skills/
142
169
  ```
143
170
 
144
- ### Work in Progress
145
-
146
- MCP config and basic integration work. Instruction injection, skills, and hooks support varies — contributions welcome.
171
+ You can install multiple agents in the same repo — each writes its own config, the repo is registered once:
147
172
 
148
173
  ```bash
149
- unerr install vscode # .vscode/mcp.json + .github/copilot-instructions.md
150
- unerr install zed # .zed/mcp.json
151
- unerr install cline # .cline/mcp.json + .clinerules
152
- unerr install kiro # .kiro/mcp.json
153
- unerr install codex # .codex/mcp.json + AGENTS.md
154
- unerr install aider # .aider/mcp.json
155
- unerr install opencode # .opencode/mcp.json
156
- unerr install trae # .trae/mcp.json
157
- unerr install augment # .augment/mcp.json
158
- unerr install continue # .continue/config.json
174
+ unerr install cursor # registers repo (if daemon running), writes cursor config
175
+ unerr install claude-code # skips registration (already done), writes claude-code config
159
176
  ```
160
177
 
161
- 16 agents supported (6 integrated, 10 in progress). Works with any MCP-compatible client.
178
+ > Need manual setup? `unerr install --show-instructions <agent>` prints copy-pasteable steps.
162
179
 
163
180
  <details>
164
- <summary>Manual MCP config (any agent)</summary>
181
+ <summary>Manual MCP config (any MCP-compatible client)</summary>
165
182
 
166
183
  ```json
167
184
  {
@@ -176,47 +193,58 @@ unerr install continue # .continue/config.json
176
193
 
177
194
  </details>
178
195
 
196
+ <details>
197
+ <summary>What <code>unerr install</code> does (detailed)</summary>
198
+
199
+ | Step | What | File(s) written |
200
+ |------|------|------|
201
+ | MCP config | Agent-specific config pointing to `unerr --mcp` | `.mcp.json`, `.cursor/mcp.json`, etc. |
202
+ | Skills | 12 skill definitions teaching the agent when to use each tool | `.claude/skills/`, `.cursor/rules/`, etc. |
203
+ | Instructions | Tool-routing table injected into agent instruction file | `CLAUDE.md`, `.cursor/rules/unerr-instructions.mdc` |
204
+ | Hooks | Shell compression + tool-adoption nudging | `.claude/settings.json`, `.cursor/hooks.json` |
205
+ | Repo registration | If unerrd is running: registers repo with supervisor | Only when daemon is active |
206
+ | Gitignore | Ensures `.unerr/` isn't committed | `.gitignore` |
207
+ | Force tools | Claude Code only: denies built-in Read/Grep/Glob (opt out: `--no-force-tools`) | `.claude/settings.json` |
208
+
209
+ Idempotent — re-running updates if content changed, skips if identical. Remove with `unerr uninstall`.
210
+
211
+ </details>
212
+
179
213
  ---
180
214
 
181
- ## What you get
215
+ ## What changes the moment you connect
182
216
 
183
- ### Instant (first session)
217
+ ### First session — instant value
184
218
 
185
- - **Graph navigation** — `get_entity` · `get_references` · `get_imports` · `search_code` in <5ms. The agent stops reading 30 files to find one function.
186
- - **Blast radius** before editing, the agent sees every downstream caller via `get_references`. No more confident wrong changes.
187
- - **Smart file reads** — `file_read({entity: "functionName"})` returns just that function + context. Not 2000 lines.
188
- - **Shell compression** — 11 strategies, 645+ command classifiers. Diffs, errors, logs, test results, YAML, key-value, tabular — each compressed differently. **93% average compression** across real-world benchmarks (2MB138KB).
189
- - **Full output recovery** — when compression is significant, raw output is saved to disk with a recovery path. The agent can always access the original.
190
- - **Convention awareness** — auto-detected naming, structure, and import patterns injected into agent context.
191
- - **Semantic search** — `semantic_search` finds conceptually similar code even with different naming. `find_similar` discovers related entities by embedding distance.
192
- - **Business context** — `get_business_context` explains why code exists — purpose, feature area, taxonomy.
193
- - **Tool adoption nudging** — 5-layer reinforcement system ensures agents consistently use unerr MCP tools over built-in alternatives. Exec nudges, hook interception, instruction-level enforcement, and skill reminders — all automatic, zero config.
219
+ - **Graph navigation in <5ms** — `get_entity`, `get_references`, `get_imports`, `search_code`. The agent stops reading 30 files to find one function.
220
+ - **Blast radius before edits** `get_references` returns every caller. No more confident wrong changes that ripple across services.
221
+ - **Targeted file reads** — `file_read({entity: "fnName"})` returns just that function + relevant conventions/facts, not 2000 lines.
222
+ - **Shell compression** — 11 strategies, 645+ command classifiers. Diffs, errors, logs, test runs, YAML — each compressed differently. **93% average compression** across real-world benchmarks (2 MB 138 KB). Raw output is kept on disk; the agent can recover it on demand.
223
+ - **Convention awareness** — naming, structure, import patterns auto-detected and injected into the agent's context.
224
+ - **Tool adoption nudging** — five reinforcement layers (exec nudges, hook interception, instruction injection, skill reminders, default-deny of built-ins on Claude Code) push the agent to use the graph instead of grep.
194
225
 
195
- ### Compounding (session 2+)
226
+ ### Session 2+ — it starts compounding
196
227
 
197
- - **Session persistence** — the agent tomorrow knows what the agent learned today. No more starting from zero.
198
- - **Fact memory** — `record_fact` persists conventions, decisions, and anti-patterns across sessions. `recall_facts` retrieves them with decay-adjusted confidence.
199
- - **Convention enforcement** — patterns detected in session 1 are enforced in session 5. No manual `.cursorrules` maintenance.
200
- - **Anti-pattern rules** — when you revert bad code, unerr learns. That mistake never happens again.
201
- - **Shadow ledger** — `unerr_mark_working` snapshots known-good state. `unerr_revert_to_working_state` rolls back when things break. `unerr_get_timeline` shows what changed across sessions.
202
- - **Loop prevention** — circuit breaker fires after repeated failed attempts.
228
+ - **Session persistence** — what the agent learned today is available tomorrow. No more starting from zero.
229
+ - **Fact memory** — `record_fact` persists conventions, decisions, and anti-patterns; `recall_facts` retrieves them with decay-adjusted confidence. Facts also auto-detect from coding sessions.
230
+ - **Episodic narratives** — when you reopen a file, the agent sees what was modified there, when, and why.
231
+ - **Loop prevention** — a circuit breaker fires after repeated failed attempts on the same entity, surfacing the failure mode instead of letting the agent thrash.
232
+ - **Memory-effectiveness scoring** — every fact and convention opens a 5-turn observation window and resolves to a verdict (reinforced / acted_on / caught / ignored / corrected). The Reasoning Quality pane shows the **load-bearing rate** — not just how much the agent remembered, but how much of it actually mattered.
203
233
 
204
- ### Agent behaviors (long-lived mode)
234
+ ### Daemon mode automated behaviors
205
235
 
206
- When running `unerr` as a daemon, these automated behaviors activate:
236
+ When `unerr` is running long-lived, these activate in the background:
207
237
 
208
- - **Architecture guard** — flags structural violations before they ship
209
- - **Cascade guard** — warns when a change has wide blast radius
210
- - **Convention drift** — detects when new code diverges from established patterns
211
- - **Auto-doc** — generates documentation for undocumented entities
212
- - **Change narrative** — tracks the story behind multi-step refactors
213
- - **Loop breaker** — intervenes when the agent is stuck in a retry loop
214
- - **Session continuity** — preserves context across restarts
238
+ - **Architecture guard** — flags structural violations before they ship.
239
+ - **Cascade guard** — warns when an edit has wide blast radius.
240
+ - **Convention drift** — detects when new code diverges from established patterns.
241
+ - **Auto-doc** — generates docs for undocumented entities.
242
+ - **Change narrative** — tracks the story behind multi-step refactors.
243
+ - **Loop breaker** — intervenes when the agent is stuck retrying.
244
+ - **Session continuity** — preserves state across restarts.
215
245
 
216
246
  ### Shell compression benchmarks
217
247
 
218
- Every shell command the agent runs is classified (645+ command patterns + content heuristics) and compressed with the best-fit strategy:
219
-
220
248
  | Strategy | What it compresses | Avg compression |
221
249
  |----------|-------------------|:-:|
222
250
  | **diff** | `git diff`, patch output | **99%** |
@@ -231,138 +259,154 @@ Every shell command the agent runs is classified (645+ command patterns + conten
231
259
  | **yaml** | YAML configs, `kubectl get -o yaml`, Helm output | adaptive |
232
260
  | **omni** | Fallback for unrecognized output | adaptive |
233
261
 
234
- **Overall: 93% compression** (2MB138KB across 40 real-world test cases). Low-confidence classifications use smart fallback — tries both the best-guess strategy and generic compression, picks whichever saves more tokens.
262
+ **Overall: 93% compression** (2 MB 138 KB across 40 real-world test cases).
235
263
 
236
264
  ### Language support
237
265
 
238
- | Language | Tier | Entity Extraction | Edge Extraction | Tree-sitter AST | SCIP |
266
+ | Language | Tier | Entities | Edges | Tree-sitter | SCIP |
239
267
  |----------|:---:|:-:|:-:|:-:|:-:|
240
- | TypeScript | 1 | ✓ | ✓ | ✓ | ✓ |
241
- | JavaScript | 1 | ✓ | ✓ | ✓ | |
242
- | Python | 1 | ✓ | ✓ | ✓ | ✓ |
243
- | Go | 1 | | | | |
244
- | Java | 1 | | | | |
245
- | Kotlin | 1 | ✓ | ✓ | ✓ | ✓ |
246
- | Scala | 1 | | | | |
247
- | Rust | 1 | ✓ | ✓ | ✓ | ✓ |
248
- | Ruby | 1 | ✓ | ✓ | ✓ | ✓ |
249
- | C | 1 | ✓ | ✓ | ✓ | ✓ |
250
- | C++ | 1 | ✓ | ✓ | ✓ | ✓ |
251
- | C# | 1 | ✓ | ✓ | ✓ | ✓ |
252
- | PHP | 2 | | | | |
253
- | Swift | 2 | ✓ | ✓ | ✓ | — |
254
- | Lua | 2 | | | | |
255
- | Dart | 2 | ✓ | ✓ | ✓ | — |
256
- | Elixir | 2 | | | | |
257
- | Zig | 2 | ✓ | | | |
258
-
259
- **Tier 1** (13 languages): Full tree-sitter AST + dedicated extraction plugins + SCIP compiler-verified call graphs where available.
260
- **Tier 2** (5 languages): Tree-sitter AST + generic extraction. Regex fallback for unsupported languages.
261
-
262
- #### Tier 3: Discoverable (Search Only)
263
-
264
- Tier 3 files are indexed for search discoverability agents can find them via `search_code` using filename tokens and format-specific content extraction (headings, resource names, model definitions, etc.). No code entity extraction.
265
-
266
- | Category | Extensions |
267
- |----------|------------|
268
- | Documentation | `.md`, `.mdx`, `.txt`, `.rst`, `.adoc`, `.org`, `.tex` |
269
- | Declarative / IaC | `.tf`, `.tfvars`, `.hcl`, `.yaml`, `.yml`, `.toml`, `.json`, `.xml` |
270
- | Schemas / IDL | `.proto`, `.graphql`, `.gql`, `.prisma`, `.avsc`, `.thrift`, `.smithy` |
271
- | SQL | `.sql` |
272
- | Shell | `.sh`, `.bash`, `.zsh` |
273
- | Web / Templates | `.html`, `.css`, `.scss`, `.sass`, `.less`, `.vue`, `.svelte`, `.astro`, `.j2`, `.tmpl`, `.hbs`, `.ejs`, `.pug` |
274
- | Build / Make | `.cmake`, `.bazel`, `.bzl`, `.mk`, `Makefile`, `Dockerfile`, `Jenkinsfile` |
275
- | Config | `.ini`, `.cfg`, `.conf`, `.properties`, `.csv`, `.tsv`, `.editorconfig` |
276
- | CI/CD | `.github/workflows/*.yml`, `.gitlab-ci.yml` |
268
+ | TypeScript / JavaScript / Python / Go / Java / Kotlin / Scala / Rust / Ruby / C / C++ / C# | 1 | ✓ | ✓ | ✓ | ✓ |
269
+ | PHP / Swift / Lua / Dart / Elixir / Zig | 2 | ✓ | ✓ | ✓ | |
270
+
271
+ **Tier 1** (12 languages): full tree-sitter AST + dedicated extraction + SCIP compiler-verified call graphs where the toolchain is on PATH.
272
+ **Tier 2** (6 languages): tree-sitter AST + generic extraction. Regex fallback for the rest.
273
+
274
+ **Tier 3 (search-discoverable):** Markdown, IaC (`.tf`, `.yaml`, `.toml`), schemas (`.proto`, `.graphql`, `.prisma`), SQL, shell, templates, build files, CI configs — indexed for `search_code` only, no entity extraction.
275
+
276
+ ---
277
+
278
+ ## How unerr compares
279
+
280
+ Adjacent tools each own one layer graph navigation, persistent memory, or output compression. unerr integrates all three, plus the drift prevention that keeps the graph tools in active rotation. Peer strengths are real; the table credits them where they win.
281
+
282
+ | Capability | unerr | Graphify (~47K) | Serena (~23K) | claude-mem (~75K) | RTK (~40K) |
283
+ |---|:---:|:---:|:---:|:---:|:---:|
284
+ | **Code intelligence** | | | | | |
285
+ | Pre-hoc file-read intercept — resolves entity via graph, returns ~200 lines + conventions + blast radius instead of a 3,000-line file | ✓ | | Partial | | ✗ |
286
+ | Convention auto-detection — naming, structure, import direction from ≥70% adherence; no manual rules file | ✓ | ✗ | ✗ | ✗ | ✗ |
287
+ | Drift / staleness signals `ur\|dft` fires when code moves under stored memory | | ✗ | ✗ | ✗ | ✗ |
288
+ | **Memory & continuity** | | | | | |
289
+ | Persistent across sessions — typed facts with per-type decay, contradiction handling | ✓ | ✗ | ✗ | ✓ | ✗ |
290
+ | Per-repo isolation all state in `.unerr/` inside the repo, no cross-project leakage | ✓ | ✓ | ✓ | ✗ | — |
291
+ | **Runtime** | | | | | |
292
+ | Zero LLM in coreno API keys, no per-turn inference cost | | | | | |
293
+ | Keeps MCP tools in active rotation — without enforcement, agents revert to built-in Read/Grep/Glob within 3–5 turns | ✓ | ✗ | ✗ | ✗ | ✗ |
294
+
295
+ Three numbers behind the table:
296
+
297
+ - **~84%** of an AI coding agent's tokens are tool output, mostly file reads (JetBrains, NeurIPS 2025 DL4Code Workshop) — unerr intercepts before the read.
298
+ - **0** LLM calls per query in the Free tier facts, conventions, and drift signals are algorithmic.
299
+ - **3–5** turns is how long agents take to revert to built-in Read/Grep/Glob without drift prevention.
300
+
301
+ Honest acknowledgements: unerr is the new entrant with fewer stars than every peer; the install is heavier than `brew install` (Node + index step); TypeScript is deepest, other languages run on tree-sitter; no semantic vector retrieval and no narrative session resume in the Free tier.
277
302
 
278
303
  ---
279
304
 
280
305
  ## How it works
281
306
 
282
307
  ```
283
- AI Agent (Claude Code / Cursor / VS Code / Windsurf / any MCP client)
284
-
285
- ├── MCP tools ──→ unerr ──→ CozoDB graph (in-process, <5ms)
286
- │ │
287
- │ ├── Convention engine (auto-detects patterns)
288
- │ ├── Fact store (cross-session memory)
289
- │ ├── Shadow ledger (mark-working / revert / timeline)
290
- │ ├── Token budgeter (prevents context rot)
291
- │ └── Compression engine (11 strategies, 645+ classifiers)
308
+ AI Agent (Claude Code / Cursor / Windsurf / any MCP client)
292
309
 
293
- ├── CLI hooks ──→ Output compression ──→ Graph-aware prioritization
310
+ ├── stdio MCP ──→ unerr --mcp (bridge, per IDE session)
311
+ │ │
312
+ │ └── UDS ──→ unerr (long-lived daemon, owns everything)
313
+ │ │
314
+ │ ├── CozoDB graph (in-process, <5ms)
315
+ │ ├── Fact store (cross-session memory)
316
+ │ ├── Timeline + ledger (every tool call)
317
+ │ ├── File watcher (incremental reindex)
318
+ │ ├── Convention engine
319
+ │ ├── Compression engine (11 strategies, 645+ classifiers)
320
+ │ └── Behavior modules (cascade-guard, loop-breaker, auto-doc…)
294
321
 
295
- └── Tool nudging ──→ 5-layer adoption reinforcement (hooks, exec, instructions)
322
+ └── Dashboard ──→ http://localhost:<port> (SSE-streamed live)
296
323
  ```
297
324
 
298
- One process. Fully local. No API keys. No network calls. No cloud.
325
+ Two processes, one local DB. Zero network calls. No API keys. No cloud. Your code never leaves the machine.
299
326
 
300
327
  ---
301
328
 
302
329
  ## MCP Tools (20)
303
330
 
304
- ### Graph Intelligence (15)
331
+ ### Graph Intelligence (8)
305
332
 
306
333
  | Tool | What the agent gets |
307
334
  |------|-----|
308
- | `get_entity` | Any code entity (function, class, type) — signature, body, callers, callees, risk level |
309
- | `get_file` | All entities defined in a file with risk summary |
310
- | `get_references` | All callers (blast radius) or callees (dependencies) of an entity |
311
- | `get_imports` | Import/dependency graph for a file |
312
- | `search_code` | Graph-ranked full-text search across all indexed entities |
313
- | `get_rules` | Active rules for a path optionally validates code against them |
314
- | `get_conventions` | Detected naming, structure, import conventions with adherence rates |
315
- | `get_business_context` | Why code exists — purpose, taxonomy, feature area |
316
- | `get_critical_nodes` | High fan-in/fan-out chokepoints (structural bottlenecks) |
317
- | `get_cross_boundary_links` | Unexpected cross-module dependencies scored by surprise |
318
- | `semantic_search` | Vector-based conceptual search (finds similar code with different names) |
319
- | `find_similar` | Entities similar to a given entity by embedding distance |
320
- | `get_project_stats` | Project-wide entity counts, risk distribution, health grade |
321
- | `file_connections` | Connected files — imports, co-change correlations, structure |
322
- | `get_test_coverage` | Direct and transitive test coverage for any entity |
335
+ | `get_entity` | Any code entity — signature, body, callers, callees, risk |
336
+ | `get_file` | All entities in a file with risk summary |
337
+ | `get_references` | Callers (blast radius) or callees (dependencies) |
338
+ | `get_imports` | Import graph for a file |
339
+ | `search_code` | Graph-ranked full-text search across all entities |
340
+ | `get_conventions` | Detected naming/structure/import patterns + adherence rates |
341
+ | `get_critical_nodes` | High fan-in/fan-out chokepoints |
342
+ | `get_cross_boundary_links` | Unexpected cross-module dependencies, scored by surprise |
323
343
 
324
- ### File Protocol (2)
344
+ ### Structural Analysis (3)
325
345
 
326
346
  | Tool | What the agent gets |
327
347
  |------|-----|
328
- | `file_read` | Context-aware file reading auto-injects conventions and facts |
329
- | `file_outline` | File structure (functions, classes, exports) without reading content |
348
+ | `get_project_stats` | Entity counts, risk distribution, health grade |
349
+ | `file_connections` | Imports + co-change correlations for a file |
350
+ | `get_test_coverage` | Direct + transitive tests for any entity |
330
351
 
331
- ### Persistent Intelligence (2)
352
+ ### File Protocol (2)
332
353
 
333
354
  | Tool | What the agent gets |
334
355
  |------|-----|
335
- | `record_fact` | Persist a convention, decision, or anti-pattern to the fact store |
336
- | `recall_facts` | Retrieve stored facts with decay-adjusted confidence scoring |
356
+ | `file_read` | Context-aware read auto-injects conventions and facts |
357
+ | `file_outline` | File structure (entities, exports) without reading the body |
337
358
 
338
- ### Shadow Ledger (3)
359
+ ### Persistent Memory (2)
339
360
 
340
361
  | Tool | What the agent gets |
341
362
  |------|-----|
342
- | `unerr_mark_working` | Snapshot current known-good state before risky changes |
343
- | `unerr_revert_to_working_state` | Roll back to last working snapshot |
344
- | `unerr_get_timeline` | View modification timeline across sessions |
363
+ | `record_fact` | Persist a convention, decision, or anti-pattern |
364
+ | `recall_facts` | Retrieve facts with hierarchical scope + decay-adjusted confidence |
345
365
 
346
- Every response includes `_meta` (latency, risk level, drift status) and contextual warnings.
366
+ ### Session Narrative Markers (4)
367
+
368
+ Inline markers the agent emits as it works. Persisted to the shadow ledger and `.unerr/timeline.db` — powers turn titles, cross-session intent stitching, the resume strip, and loop/blocker miners.
369
+
370
+ | Tool | What it does |
371
+ |------|-----|
372
+ | `mark_intent` | One-sentence task start (≤80 chars). Becomes the turn title |
373
+ | `mark_decision` | Records a chosen approach + up to 5 alternatives (≤140 chars) |
374
+ | `mark_blocker` | Flags an unresolved obstacle. Carries into the next session's resume strip |
375
+ | `mark_resolution` | Resolves a prior blocker by `marker_id` |
376
+
377
+ Every response includes `_meta` (latency, risk level, drift status) and inline `ur|<tag>` signals for high-priority guidance (drift, blast-radius warnings, circuit-breaker halts).
347
378
 
348
379
  ---
349
380
 
350
381
  <details>
351
- <summary><strong>Commands</strong></summary>
382
+ <summary><strong>CLI commands</strong></summary>
352
383
 
353
384
  ```bash
354
- unerr # Start MCP proxy (auto-started by IDE via MCP config)
355
- unerr status # Graph stats, health grade, active rules
356
- unerr stats # Session and weekly efficiency metrics
357
- unerr install <agent> # Add unerr to a specific AI coding agent
358
- unerr uninstall # Remove unerr integration from agents
359
- unerr init # Initialize unerr in a new project
360
- unerr timeline # What happened across sessions
361
- unerr rewind # Restore to a previous working state
362
- unerr learn # Teach unerr a convention or correction
363
- unerr debug # Diagnostic dump
385
+ unerr # Start per-repo daemon (or resume; auto-spawned by IDE if missing)
386
+ unerr --mcp # Stdio bridge what your IDE invokes via .mcp.json
387
+ unerr install <agent> # Install MCP config + skills + instructions for one agent
388
+ unerr uninstall # Remove unerr integration from agents in this repo
389
+ unerr status # Show proxy health, entity count, graph age
390
+ unerr stats # Session statistics (tokens, tool calls, compression)
364
391
  ```
365
392
 
393
+ **Daemon supervisor** (multi-repo management):
394
+
395
+ ```bash
396
+ unerr daemon start # Start the unerrd supervisor
397
+ unerr daemon stop # Gracefully stop unerrd + all managed repos
398
+ unerr daemon status # Show all managed repos, PIDs, memory, idle time
399
+ unerr daemon add <path> # Register a repo (indexes on next access)
400
+ unerr daemon remove <path> # Unregister a repo
401
+ unerr daemon config <path> <k=v> # Set per-repo settings (idleTimeout, javaBuildTool, etc.)
402
+ unerr daemon autostart on|off|status # Manage start-at-login (launchd/systemd/schtasks)
403
+ unerr daemon logs [--repo <path>] [--follow] # Tail daemon/repo logs
404
+ unerr daemon dashboard # Open the unified dashboard in browser
405
+ unerr daemon update # Check for updates, install, restart
406
+ ```
407
+
408
+ See the [full command reference](#daemon-command-reference) below.
409
+
366
410
  </details>
367
411
 
368
412
  <details>
@@ -370,30 +414,29 @@ unerr debug # Diagnostic dump
370
414
 
371
415
  ```
372
416
  src/
373
- entrypoints/ CLI entry + boot state machine
374
- intelligence/ CozoDB graph, AST extraction, conventions, rules, search, semantic
375
- proxy/ MCP server, shell compression, session stats, token tracking
376
- tracking/ Prompt ledger, drift detection, git attribution
377
- behaviors/ Agent behavior modules (cascade guard, loop breaker, auto-doc, etc.)
378
- commands/ CLI commands (install, status, stats, timeline, learn, debug, etc.)
379
- tools/ MCP tool implementations (intelligence + coding)
380
- hooks/ Claude Code hook system integration
381
- skills/ Bundled skill definitions for agent installation
382
- server/ HTTP dashboard API server
383
- ui/ React (Vite) dashboard frontend
384
- config/ Agent registry, MCP config writer, settings
385
- schemas/ Zod schemas for entity/edge/rule types
386
- utils/ Logging, detection, git helpers
417
+ entrypoints/ CLI entry + boot state machine
418
+ proxy/ MCP server (daemon), stdio↔UDS bridge, session stats, shell compression
419
+ intelligence/ CozoDB graph, AST extraction, conventions, rules, search, semantic
420
+ tracking/ Prompt ledger, drift detection, git attribution
421
+ behaviors/ Cascade guard, loop breaker, auto-doc, change narrative…
422
+ commands/ CLI commands (install, status, stats, timeline, learn, debug, )
423
+ tools/ MCP tool implementations (intelligence + coding)
424
+ hooks/ Claude Code hook system integration
425
+ skills/ 11 bundled skill definitions
426
+ server/ + ui/ HTTP API + React (Vite) dashboard
427
+ config/ Agent registry (16 agents), MCP config writer, instruction injector
428
+ schemas/ Zod schemas
387
429
  ```
388
430
 
389
- **Design principles:**
390
- - Zero network calls — fully local, no API keys
391
- - stdout is sacred — MCP JSON-RPC only, everything else to stderr
392
- - <5ms query responses — CozoDB runs in-process (Rust via NAPI)
393
- - 30s time-to-value — shallow index first, deep enrichment in background
394
- - Enhancement, not dependency — agent falls back gracefully if unerr is unavailable
431
+ **Design principles**
395
432
 
396
- **Tech stack:** TypeScript (ESM) · CozoDB (Rust/NAPI) · web-tree-sitter (WASM) · MCP SDK · Ink (React CLI) · tsup · Vitest
433
+ - Zero network calls fully local, no API keys.
434
+ - stdout is sacred — MCP JSON-RPC only; everything else to stderr.
435
+ - <5 ms query responses — CozoDB runs in-process (Rust via NAPI).
436
+ - First useful output <5 s — shallow index first, deep enrichment in background.
437
+ - Graceful degradation — the agent still works if unerr is down, you just lose the intelligence layer.
438
+
439
+ **Tech stack** TypeScript (ESM) · CozoDB (Rust/NAPI) · web-tree-sitter (WASM) · MCP SDK · Ink (React CLI) · React + Vite (dashboard) · tsup · Vitest
397
440
 
398
441
  </details>
399
442
 
@@ -407,10 +450,8 @@ pnpm run dev # tsx watch
407
450
  pnpm run test:run # full suite
408
451
  pnpm run lint # biome check
409
452
  pnpm run typecheck # tsc --noEmit
410
- ```
411
453
 
412
- ```bash
413
- pnpm link --global # make `unerr` available globally
454
+ pnpm link --global # make local `unerr` available globally
414
455
  ```
415
456
 
416
457
  </details>
@@ -418,20 +459,126 @@ pnpm link --global # make `unerr` available globally
418
459
  <details>
419
460
  <summary><strong>Contributing</strong></summary>
420
461
 
421
- Contributions welcome. Please open an issue first.
462
+ Contributions welcome please open an issue first.
422
463
 
423
464
  **Before submitting a PR:**
424
- - Run `pnpm run typecheck && pnpm run lint && pnpm run test:run`
425
- - All output goes to stderr — never stdout (MCP JSON-RPC channel)
465
+ - `pnpm run typecheck && pnpm run lint && pnpm run test:run`
466
+ - All output to stderr — never stdout (MCP JSON-RPC channel)
426
467
  - All CozoDB interactions are async — always `await`
427
468
  - Use `.js` extensions in imports (NodeNext resolution)
428
469
 
429
- See [CLAUDE.md](./CLAUDE.md) for detailed conventions.
470
+ See [CLAUDE.md](./CLAUDE.md) for full conventions.
430
471
 
431
472
  </details>
432
473
 
433
474
  ---
434
475
 
476
+ ## Daemon Command Reference
477
+
478
+ The `unerrd` supervisor is a single lightweight process that manages all your registered repositories. It replaces the need to run `unerr` separately in each repo.
479
+
480
+ ### Lifecycle
481
+
482
+ ```bash
483
+ unerr daemon start # Start supervisor (PID-locked, one instance per machine)
484
+ unerr daemon stop # Graceful shutdown — stops all child processes, flushes state
485
+ unerr daemon status # Overview: all repos, their state (running/stopped/idle), PIDs,
486
+ # memory usage, connection count, idle time, update notices
487
+ ```
488
+
489
+ ### Repository Management
490
+
491
+ ```bash
492
+ unerr daemon add <path> # Register a repo with the supervisor
493
+ # - Auto-derives a unique label from the directory name
494
+ # - Mirrors settings to <repo>/.unerr/config.json
495
+ # - Detects parent/child directory conflicts
496
+ # - Installs platform auto-start on first add
497
+
498
+ unerr daemon remove <path> # Unregister — stops the child process if running, removes entry
499
+
500
+ unerr daemon config <path> <key>=<value> # Set per-repo settings:
501
+ # idleTimeout=600 seconds before idle sweep stops the repo
502
+ # javaBuildTool=gradle skip detection heuristic
503
+ # autostart=false exclude from warm-start at boot
504
+ ```
505
+
506
+ ### Auto-Start (Start at Login)
507
+
508
+ ```bash
509
+ unerr daemon autostart on # Install platform service:
510
+ # macOS: ~/Library/LaunchAgents/dev.unerr.daemon.plist
511
+ # Linux: ~/.config/systemd/user/unerr-daemon.service
512
+ # Windows: schtasks /create ... (or Startup folder .cmd)
513
+
514
+ unerr daemon autostart off # Remove the platform service
515
+ unerr daemon autostart status # Show whether auto-start is installed and running
516
+ ```
517
+
518
+ Auto-start is also installed automatically on your first `unerr install` or `daemon add` — no manual step needed. Skipped in CI/container environments.
519
+
520
+ ### Warm Start
521
+
522
+ After boot, the supervisor pre-spawns your Most Recently Used repos at low priority:
523
+
524
+ ```bash
525
+ unerr daemon set --warm-start-budget 3 # Max repos to warm-start (default: 3)
526
+ unerr daemon set --warm-start-idle-days 7 # Skip repos inactive for >N days
527
+ unerr daemon set --warm-start-delay-ms 5000 # Delay before warm-start begins
528
+ ```
529
+
530
+ Warm-start aborts if the system is on battery or under high load.
531
+
532
+ ### Logs
533
+
534
+ ```bash
535
+ unerr daemon logs # Tail the supervisor log (~/.unerr/logs/unerrd.log)
536
+ unerr daemon logs --repo <path> # Tail a specific repo's log
537
+ unerr daemon logs --bridge # Tail bridge session logs
538
+ unerr daemon logs --follow # Stream continuously (like tail -f)
539
+ unerr daemon logs -n 50 # Last N lines
540
+ unerr daemon logs --boot # Show only the most recent boot sequence
541
+ ```
542
+
543
+ ### Dashboard
544
+
545
+ ```bash
546
+ unerr daemon dashboard # Opens http://localhost:9847 in your default browser
547
+ ```
548
+
549
+ The unified dashboard shows:
550
+ - **Global overview** — all registered repos, their health, active sessions
551
+ - **Repo switcher** — click into any repo for its full intelligence dashboard
552
+ - **Supervisor info** — uptime, memory, warm-start events, version status
553
+
554
+ ### Updates
555
+
556
+ ```bash
557
+ unerr daemon update # Check npm registry → confirm → stop → install → restart → verify
558
+ unerr daemon dismiss-update <version> # Suppress notification for a specific version
559
+ ```
560
+
561
+ Update notifications appear as:
562
+ - A CLI banner on `unerr daemon status` and `unerr` startup
563
+ - A dashboard banner with version diff and changelog link
564
+ - An `_meta["dev.unerr/update_available"]` field in MCP responses (when >2 minor versions behind)
565
+
566
+ Updates are never auto-applied — the agent and supervisor remain stable mid-session.
567
+
568
+ ### How auto-spawn works
569
+
570
+ When your IDE opens and spawns `unerr --mcp`:
571
+
572
+ 1. Bridge checks for a per-repo UDS socket (`.unerr/state/proxy.sock`)
573
+ 2. If not found, queries the supervisor's UDS socket (`~/.unerr/state/unerrd.sock`)
574
+ 3. If supervisor isn't running, auto-spawns it as a detached background process
575
+ 4. Supervisor ensures the repo is registered and its child process is running
576
+ 5. Bridge connects — MCP requests flow through
577
+
578
+ Total cold-start latency (supervisor not running → first MCP response): **<2 seconds**.
579
+
580
+ ---
581
+
435
582
  ## License
436
583
 
437
584
  [Elastic License 2.0 (ELv2)](./LICENSE) — free to use, modify, and distribute. Cannot be offered as a hosted service.
@@ -441,5 +588,5 @@ See [CLAUDE.md](./CLAUDE.md) for detailed conventions.
441
588
  <p align="center">
442
589
  <code>npm install -g @unerr-ai/unerr</code>
443
590
  <br /><br />
444
- <a href="https://www.npmjs.com/package/@unerr-ai/unerr"><sub>npm registry</sub></a> · <sub>No cloud. No account. Free.</sub>
591
+ <a href="https://www.unerr.dev/"><sub>unerr.dev</sub></a> · <a href="https://www.npmjs.com/package/@unerr-ai/unerr"><sub>npm registry</sub></a> · <a href="https://discord.gg/2BjRftz8kG"><sub>Discord</sub></a> · <a href="https://x.com/unerr_ai"><sub>X</sub></a> · <a href="https://www.linkedin.com/company/unerr"><sub>LinkedIn</sub></a> · <sub>Fully local. No account. No cloud. Free.</sub>
445
592
  </p>