-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathindex.html
More file actions
344 lines (321 loc) · 24.1 KB
/
index.html
File metadata and controls
344 lines (321 loc) · 24.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
<!DOCTYPE html>
<html lang="en" class="dark">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>StackMemory — Lossless memory for AI coding tools</title>
<meta name="description" content="Lossless, project-scoped memory for AI coding tools. Durable context across sessions with 73 MCP tools, FTS5 search, conductor orchestrator, loop/watch monitoring, snapshot capture, Linear sync, and automatic hooks.">
<!-- Open Graph -->
<meta property="og:type" content="website">
<meta property="og:title" content="StackMemory — Lossless memory for AI coding tools">
<meta property="og:description" content="Lossless memory runtime that preserves full context across sessions. 73 MCP tools, FTS5 search, conductor orchestrator, loop/watch monitoring, Linear sync, Claude/Codex/OpenCode wrappers.">
<meta property="og:url" content="https://stackmemoryai.github.io/stackmemory/">
<meta property="og:image" content="https://stackmemoryai.github.io/stackmemory/og-image.png">
<meta property="og:site_name" content="StackMemory">
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="StackMemory — Lossless memory for AI coding tools">
<meta name="twitter:description" content="Project-scoped memory runtime that preserves full context across sessions. 73 MCP tools, FTS5 search, Linear sync.">
<meta name="twitter:image" content="https://stackmemoryai.github.io/stackmemory/og-image.png">
<link rel="icon" href="favicon.svg" type="image/svg+xml">
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
darkMode: 'class',
theme: {
extend: {
fontFamily: {
mono: ['ui-monospace', 'SFMono-Regular', 'SF Mono', 'Menlo', 'Consolas', 'Liberation Mono', 'monospace'],
}
}
}
}
</script>
<style>
html { scroll-behavior: smooth; }
.code-block { position: relative; }
.code-block button {
position: absolute; top: 0.5rem; right: 0.5rem;
opacity: 0; transition: opacity 150ms;
}
.code-block:hover button { opacity: 1; }
</style>
</head>
<body class="bg-white dark:bg-neutral-950 text-neutral-900 dark:text-neutral-100 antialiased">
<!-- Header -->
<header class="sticky top-0 z-50 backdrop-blur bg-white/80 dark:bg-neutral-950/80 border-b border-neutral-200 dark:border-neutral-800">
<div class="max-w-5xl mx-auto px-6 h-14 flex items-center justify-between">
<a href="#" class="font-semibold text-base tracking-tight">StackMemory</a>
<nav class="flex items-center gap-5 text-sm">
<a href="#features" class="text-neutral-600 dark:text-neutral-400 hover:text-neutral-900 dark:hover:text-neutral-100 transition-colors">Features</a>
<a href="tools.html" class="text-neutral-600 dark:text-neutral-400 hover:text-neutral-900 dark:hover:text-neutral-100 transition-colors">Tools</a>
<a href="compare.html" class="text-neutral-600 dark:text-neutral-400 hover:text-neutral-900 dark:hover:text-neutral-100 transition-colors">Compare</a>
<a href="changelog.html" class="text-neutral-600 dark:text-neutral-400 hover:text-neutral-900 dark:hover:text-neutral-100 transition-colors">Changelog</a>
<a href="https://github.com/stackmemoryai/stackmemory" target="_blank" rel="noopener" class="text-neutral-600 dark:text-neutral-400 hover:text-neutral-900 dark:hover:text-neutral-100 transition-colors underline underline-offset-2">GitHub</a>
<button id="theme-toggle" class="p-1.5 rounded-md text-neutral-500 hover:text-neutral-900 dark:hover:text-neutral-100 hover:bg-neutral-100 dark:hover:bg-neutral-800 transition-colors" aria-label="Toggle theme">
<svg id="icon-sun" class="w-4 h-4 hidden dark:block" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="5"/><path d="M12 1v2m0 18v2M4.22 4.22l1.42 1.42m12.72 12.72l1.42 1.42M1 12h2m18 0h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>
<svg id="icon-moon" class="w-4 h-4 block dark:hidden" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"/></svg>
</button>
</nav>
</div>
</header>
<main class="max-w-5xl mx-auto px-6">
<!-- Hero -->
<section class="py-20 md:py-28">
<h1 class="text-3xl md:text-4xl font-semibold tracking-tight leading-tight max-w-2xl">
Lossless, project-scoped memory for AI coding tools.
</h1>
<p class="mt-4 text-neutral-600 dark:text-neutral-400 text-base leading-relaxed max-w-xl">
StackMemory preserves full project context across sessions. Instead of a linear chat log, it organizes memory as a call stack of scoped work with intelligent retrieval.
</p>
<div class="mt-8 code-block">
<pre class="bg-neutral-100 dark:bg-neutral-800 rounded-lg px-5 py-4 text-sm font-mono inline-block overflow-x-auto max-w-full"><code>npm install -g @stackmemoryai/stackmemory</code></pre>
<button onclick="navigator.clipboard.writeText('npm install -g @stackmemoryai/stackmemory')" class="text-xs text-neutral-500 hover:text-neutral-700 dark:hover:text-neutral-300 bg-neutral-200 dark:bg-neutral-700 rounded px-2 py-1">Copy</button>
</div>
<div class="mt-6 flex flex-wrap gap-3">
<a href="https://www.npmjs.com/package/@stackmemoryai/stackmemory"><img src="https://img.shields.io/npm/v/@stackmemoryai/stackmemory" alt="npm version"></a>
<a href="https://github.com/stackmemoryai/stackmemory/actions/workflows/test-shared-context.yml"><img src="https://github.com/stackmemoryai/stackmemory/actions/workflows/test-shared-context.yml/badge.svg?branch=main" alt="Tests"></a>
<a href="https://codecov.io/gh/stackmemoryai/stackmemory"><img src="https://codecov.io/gh/stackmemoryai/stackmemory/branch/main/graph/badge.svg" alt="Coverage"></a>
</div>
<!-- Terminal demo -->
<div class="mt-10">
<img src="demo.svg" alt="StackMemory setup demo" class="rounded-lg shadow-lg max-w-xl w-full">
</div>
</section>
<!-- Why -->
<section class="py-16 border-t border-neutral-200 dark:border-neutral-800">
<h2 class="text-xl font-semibold tracking-tight">Why StackMemory</h2>
<p class="mt-2 text-sm text-neutral-500 dark:text-neutral-400 italic">Memory is storage. Context is a compiled view.</p>
<div class="mt-8 grid gap-6 md:grid-cols-3">
<div>
<h3 class="font-semibold text-sm">Context survives sessions</h3>
<p class="mt-1 text-sm text-neutral-600 dark:text-neutral-400 leading-relaxed">Decisions, constraints, and progress persist across <code class="bg-neutral-100 dark:bg-neutral-800 px-1 rounded text-xs">/clear</code> operations and session restarts.</p>
</div>
<div>
<h3 class="font-semibold text-sm">Call-stack organization</h3>
<p class="mt-1 text-sm text-neutral-600 dark:text-neutral-400 leading-relaxed">Nested frames with importance scoring. Only the active path is "hot" — the rest stays accessible but quiet.</p>
</div>
<div>
<h3 class="font-semibold text-sm">Zero-config</h3>
<p class="mt-1 text-sm text-neutral-600 dark:text-neutral-400 leading-relaxed"><code class="bg-neutral-100 dark:bg-neutral-800 px-1 rounded text-xs">stackmemory init</code> just works. No database setup, no cloud account, no configuration files.</p>
</div>
</div>
</section>
<!-- Features -->
<section id="features" class="py-16 border-t border-neutral-200 dark:border-neutral-800">
<h2 class="text-xl font-semibold tracking-tight">Features</h2>
<div class="mt-8 grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
<div class="p-5 rounded-lg border border-neutral-200 dark:border-neutral-800">
<h3 class="font-semibold text-sm">73 MCP Tools</h3>
<p class="mt-2 text-sm text-neutral-600 dark:text-neutral-400 leading-relaxed">Context, tasks, Linear, traces, discovery, cord, team, planning, providers, DiffMem, Greptile, and more for Claude Code integration.</p>
</div>
<div class="p-5 rounded-lg border border-neutral-200 dark:border-neutral-800">
<h3 class="font-semibold text-sm">FTS5 Search</h3>
<p class="mt-2 text-sm text-neutral-600 dark:text-neutral-400 leading-relaxed">Full-text search with BM25 scoring, hybrid retrieval, and smart thresholds. Finds what matters.</p>
</div>
<div class="p-5 rounded-lg border border-neutral-200 dark:border-neutral-800">
<h3 class="font-semibold text-sm">Linear Integration</h3>
<p class="mt-2 text-sm text-neutral-600 dark:text-neutral-400 leading-relaxed">Bidirectional sync with API key and OAuth support. Tasks flow between Linear and your coding session.</p>
</div>
<div class="p-5 rounded-lg border border-neutral-200 dark:border-neutral-800">
<h3 class="font-semibold text-sm">Automatic Hooks</h3>
<p class="mt-2 text-sm text-neutral-600 dark:text-neutral-400 leading-relaxed">Context save, task tracking, Linear sync, and PROMPT_PLAN progress — all automatic, non-blocking.</p>
</div>
<div class="p-5 rounded-lg border border-neutral-200 dark:border-neutral-800">
<h3 class="font-semibold text-sm">Wrapper Scripts</h3>
<p class="mt-2 text-sm text-neutral-600 dark:text-neutral-400 leading-relaxed"><code class="bg-neutral-100 dark:bg-neutral-800 px-1 rounded text-xs">claude-sm</code>, <code class="bg-neutral-100 dark:bg-neutral-800 px-1 rounded text-xs">codex-sm</code>, <code class="bg-neutral-100 dark:bg-neutral-800 px-1 rounded text-xs">opencode-sm</code> — launch your tool with context pre-loaded.</p>
</div>
<div class="p-5 rounded-lg border border-neutral-200 dark:border-neutral-800">
<h3 class="font-semibold text-sm">Skills System</h3>
<p class="mt-2 text-sm text-neutral-600 dark:text-neutral-400 leading-relaxed"><code class="bg-neutral-100 dark:bg-neutral-800 px-1 rounded text-xs">/spec</code> for iterative specs, <code class="bg-neutral-100 dark:bg-neutral-800 px-1 rounded text-xs">/linear-run</code> for task execution via RLM orchestration.</p>
</div>
<div class="p-5 rounded-lg border border-neutral-200 dark:border-neutral-800">
<h3 class="font-semibold text-sm">Conductor Orchestrator</h3>
<p class="mt-2 text-sm text-neutral-600 dark:text-neutral-400 leading-relaxed">Polls Linear for tasks, creates git worktrees, spawns agents with bounded concurrency and auto team detection.</p>
</div>
<div class="p-5 rounded-lg border border-neutral-200 dark:border-neutral-800">
<h3 class="font-semibold text-sm">Loop / Watch</h3>
<p class="mt-2 text-sm text-neutral-600 dark:text-neutral-400 leading-relaxed">Poll any shell command until a condition is met. Monitor CI runs, deploy logs, inboxes, and external state with <code class="bg-neutral-100 dark:bg-neutral-800 px-1 rounded text-xs">stackmemory loop</code>.</p>
</div>
<div class="p-5 rounded-lg border border-neutral-200 dark:border-neutral-800">
<h3 class="font-semibold text-sm">Snapshot & Pre-flight</h3>
<p class="mt-2 text-sm text-neutral-600 dark:text-neutral-400 leading-relaxed">Capture post-run context snapshots for session handoff. Pre-flight checks predict file overlaps before parallel task dispatch.</p>
</div>
</div>
</section>
<!-- Quick Start -->
<section id="quickstart" class="py-16 border-t border-neutral-200 dark:border-neutral-800">
<h2 class="text-xl font-semibold tracking-tight">Quick Start</h2>
<p class="mt-2 text-sm text-neutral-600 dark:text-neutral-400">Requires Node ≥ 20</p>
<div class="mt-6 code-block">
<pre class="bg-neutral-100 dark:bg-neutral-800 rounded-lg px-5 py-4 text-sm font-mono leading-relaxed overflow-x-auto"><code><span class="text-neutral-500"># Install globally</span>
npm install -g @stackmemoryai/stackmemory
<span class="text-neutral-500"># Initialize in your project</span>
cd your-project
stackmemory init
<span class="text-neutral-500"># Configure Claude Code integration</span>
stackmemory setup-mcp
<span class="text-neutral-500"># Verify everything works</span>
stackmemory doctor</code></pre>
<button onclick="navigator.clipboard.writeText('npm install -g @stackmemoryai/stackmemory\ncd your-project\nstackmemory init\nstackmemory setup-mcp\nstackmemory doctor')" class="text-xs text-neutral-500 hover:text-neutral-700 dark:hover:text-neutral-300 bg-neutral-200 dark:bg-neutral-700 rounded px-2 py-1">Copy</button>
</div>
<p class="mt-4 text-sm text-neutral-600 dark:text-neutral-400">Restart Claude Code and StackMemory MCP tools will be available.</p>
</section>
<!-- Core Concepts -->
<section class="py-16 border-t border-neutral-200 dark:border-neutral-800">
<h2 class="text-xl font-semibold tracking-tight">Core Concepts</h2>
<div class="mt-6 overflow-x-auto">
<table class="w-full text-sm">
<thead>
<tr class="border-b border-neutral-200 dark:border-neutral-800">
<th class="text-left py-3 pr-6 font-semibold">Concept</th>
<th class="text-left py-3 font-semibold">Meaning</th>
</tr>
</thead>
<tbody class="text-neutral-600 dark:text-neutral-400">
<tr class="border-b border-neutral-100 dark:border-neutral-800/50">
<td class="py-3 pr-6 font-medium text-neutral-900 dark:text-neutral-100">Frame</td>
<td class="py-3">A scoped unit of work, like a function call. Can span multiple turns and sessions.</td>
</tr>
<tr class="border-b border-neutral-100 dark:border-neutral-800/50">
<td class="py-3 pr-6 font-medium text-neutral-900 dark:text-neutral-100">Call Stack</td>
<td class="py-3">Nested frames. Only the active path is "hot" — the rest stays accessible.</td>
</tr>
<tr class="border-b border-neutral-100 dark:border-neutral-800/50">
<td class="py-3 pr-6 font-medium text-neutral-900 dark:text-neutral-100">Event</td>
<td class="py-3">Append-only record: message, tool call, or decision.</td>
</tr>
<tr class="border-b border-neutral-100 dark:border-neutral-800/50">
<td class="py-3 pr-6 font-medium text-neutral-900 dark:text-neutral-100">Digest</td>
<td class="py-3">Structured return value when a frame closes.</td>
</tr>
<tr>
<td class="py-3 pr-6 font-medium text-neutral-900 dark:text-neutral-100">Anchor</td>
<td class="py-3">Pinned fact — DECISION, CONSTRAINT, or INTERFACE.</td>
</tr>
</tbody>
</table>
</div>
</section>
<!-- RLM-Aware Harness -->
<section class="py-16 border-t border-neutral-200 dark:border-neutral-800">
<h2 class="text-xl font-semibold tracking-tight">RLM-Aware Harness</h2>
<p class="mt-2 text-sm text-neutral-600 dark:text-neutral-400">Three layers that make agents self-harnessing. Inspired by <a href="https://github.com/Trampoline-AI/predict-rlm" class="underline underline-offset-2 hover:text-neutral-900 dark:hover:text-neutral-100">predict-rlm</a>.</p>
<div class="mt-8 grid gap-6 md:grid-cols-3">
<div class="p-5 rounded-lg border border-neutral-200 dark:border-neutral-800">
<h3 class="font-semibold text-sm">Context-as-REPL</h3>
<p class="mt-2 text-sm text-neutral-600 dark:text-neutral-400 leading-relaxed">Agents call tool functions (<code class="bg-neutral-100 dark:bg-neutral-800 px-1 rounded text-xs">search_knowledge</code>, <code class="bg-neutral-100 dark:bg-neutral-800 px-1 rounded text-xs">read_context</code>, <code class="bg-neutral-100 dark:bg-neutral-800 px-1 rounded text-xs">list_runs</code>) instead of reading prose handoffs.</p>
</div>
<div class="p-5 rounded-lg border border-neutral-200 dark:border-neutral-800">
<h3 class="font-semibold text-sm">Typed Dispatch</h3>
<p class="mt-2 text-sm text-neutral-600 dark:text-neutral-400 leading-relaxed">Signature contracts (<code class="bg-neutral-100 dark:bg-neutral-800 px-1 rounded text-xs">ImplementFeature</code>, <code class="bg-neutral-100 dark:bg-neutral-800 px-1 rounded text-xs">FixBug</code>, <code class="bg-neutral-100 dark:bg-neutral-800 px-1 rounded text-xs">Investigate</code>) with validated I/O for parent→child dispatch.</p>
</div>
<div class="p-5 rounded-lg border border-neutral-200 dark:border-neutral-800">
<h3 class="font-semibold text-sm">Critic + Self-Decomposition</h3>
<p class="mt-2 text-sm text-neutral-600 dark:text-neutral-400 leading-relaxed">LLM quality gate scores output 0-100. Pass, revise with feedback, or decompose into typed sub-runs. Max 3 revisions, depth 2.</p>
</div>
</div>
</section>
<!-- Substrate Vision -->
<section class="py-16 border-t border-neutral-200 dark:border-neutral-800">
<h2 class="text-xl font-semibold tracking-tight">Substrate: The Three-Layer Vision</h2>
<div class="mt-6 overflow-x-auto">
<table class="w-full text-sm">
<thead>
<tr class="border-b border-neutral-200 dark:border-neutral-800">
<th class="text-left py-3 pr-6 font-semibold">Layer</th>
<th class="text-left py-3 pr-6 font-semibold">Product</th>
<th class="text-left py-3 pr-6 font-semibold">Status</th>
<th class="text-left py-3 font-semibold">Purpose</th>
</tr>
</thead>
<tbody class="text-neutral-600 dark:text-neutral-400">
<tr class="border-b border-neutral-100 dark:border-neutral-800/50">
<td class="py-3 pr-6 font-medium text-neutral-900 dark:text-neutral-100">L1</td>
<td class="py-3 pr-6">StackMemory</td>
<td class="py-3 pr-6"><span class="inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400">Shipped</span></td>
<td class="py-3">Context persistence — lossless memory across sessions</td>
</tr>
<tr class="border-b border-neutral-100 dark:border-neutral-800/50">
<td class="py-3 pr-6 font-medium text-neutral-900 dark:text-neutral-100">L2</td>
<td class="py-3 pr-6">Substrate Desktop</td>
<td class="py-3 pr-6"><span class="inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400">Shipping</span></td>
<td class="py-3">Agent orchestration — multi-agent coordination with worktree isolation</td>
</tr>
<tr>
<td class="py-3 pr-6 font-medium text-neutral-900 dark:text-neutral-100">L3</td>
<td class="py-3 pr-6">Substrate Cloud</td>
<td class="py-3 pr-6"><span class="inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium bg-neutral-100 text-neutral-600 dark:bg-neutral-800 dark:text-neutral-400">Design</span></td>
<td class="py-3">Multiplayer development — shared context across teams and agents</td>
</tr>
</tbody>
</table>
</div>
</section>
<!-- Integrations -->
<section class="py-16 border-t border-neutral-200 dark:border-neutral-800">
<h2 class="text-xl font-semibold tracking-tight">Integrations</h2>
<div class="mt-6 flex flex-wrap gap-3">
<span class="px-3 py-1.5 text-sm rounded-full border border-neutral-200 dark:border-neutral-700 bg-neutral-50 dark:bg-neutral-900">Claude Code</span>
<span class="px-3 py-1.5 text-sm rounded-full border border-neutral-200 dark:border-neutral-700 bg-neutral-50 dark:bg-neutral-900">Codex</span>
<span class="px-3 py-1.5 text-sm rounded-full border border-neutral-200 dark:border-neutral-700 bg-neutral-50 dark:bg-neutral-900">OpenCode</span>
<span class="px-3 py-1.5 text-sm rounded-full border border-neutral-200 dark:border-neutral-700 bg-neutral-50 dark:bg-neutral-900">Linear</span>
<span class="px-3 py-1.5 text-sm rounded-full border border-neutral-200 dark:border-neutral-700 bg-neutral-50 dark:bg-neutral-900">MCP Protocol</span>
<span class="px-3 py-1.5 text-sm rounded-full border border-neutral-200 dark:border-neutral-700 bg-neutral-50 dark:bg-neutral-900">Browser MCP</span>
<a href="https://croissant.ai" class="px-3 py-1.5 text-sm rounded-full border border-amber-300 dark:border-amber-700 bg-amber-50 dark:bg-amber-900/20 hover:bg-amber-100 dark:hover:bg-amber-900/40 transition-colors">croissant.ai</a>
</div>
<p class="mt-4 text-sm text-neutral-600 dark:text-neutral-400 leading-relaxed">
Runs as an MCP server. Editors call StackMemory on each interaction to fetch a compiled context bundle — editors don't store memory themselves.
</p>
</section>
<!-- Who is this for -->
<section class="py-16 border-t border-neutral-200 dark:border-neutral-800">
<h2 class="text-xl font-semibold tracking-tight">Who is this for</h2>
<div class="mt-6 grid gap-4 sm:grid-cols-2">
<div class="p-4 rounded-lg bg-neutral-50 dark:bg-neutral-900">
<p class="font-semibold text-sm">Solo dev using Claude Code</p>
<p class="mt-1 text-sm text-neutral-600 dark:text-neutral-400">Keep decisions, constraints, and progress across sessions.</p>
</div>
<div class="p-4 rounded-lg bg-neutral-50 dark:bg-neutral-900">
<p class="font-semibold text-sm">Team using AI coding tools</p>
<p class="mt-1 text-sm text-neutral-600 dark:text-neutral-400">Share project context across agents and teammates.</p>
</div>
<div class="p-4 rounded-lg bg-neutral-50 dark:bg-neutral-900">
<p class="font-semibold text-sm">AI-first startup</p>
<p class="mt-1 text-sm text-neutral-600 dark:text-neutral-400">Ship faster with persistent memory and automatic Linear sync.</p>
</div>
<div class="p-4 rounded-lg bg-neutral-50 dark:bg-neutral-900">
<p class="font-semibold text-sm">Open-source maintainer</p>
<p class="mt-1 text-sm text-neutral-600 dark:text-neutral-400">Onboard contributors and AI agents with durable project knowledge.</p>
</div>
</div>
</section>
</main>
<!-- Footer -->
<footer class="border-t border-neutral-200 dark:border-neutral-800 mt-8">
<div class="max-w-5xl mx-auto px-6 py-10 flex flex-col sm:flex-row items-center justify-between gap-4 text-sm text-neutral-500 dark:text-neutral-400">
<div class="flex items-center gap-4">
<a href="tools.html" class="hover:text-neutral-900 dark:hover:text-neutral-100 underline underline-offset-2 transition-colors">MCP Tools</a>
<a href="compare.html" class="hover:text-neutral-900 dark:hover:text-neutral-100 underline underline-offset-2 transition-colors">Compare</a>
<a href="changelog.html" class="hover:text-neutral-900 dark:hover:text-neutral-100 underline underline-offset-2 transition-colors">Changelog</a>
<a href="https://github.com/stackmemoryai/stackmemory" target="_blank" rel="noopener" class="hover:text-neutral-900 dark:hover:text-neutral-100 underline underline-offset-2 transition-colors">GitHub</a>
<a href="https://www.npmjs.com/package/@stackmemoryai/stackmemory" target="_blank" rel="noopener" class="hover:text-neutral-900 dark:hover:text-neutral-100 underline underline-offset-2 transition-colors">npm</a>
</div>
<p>BSL 1.1 — converts to MIT after 4 years</p>
</div>
</footer>
<!-- Theme toggle -->
<script>
const html = document.documentElement;
const toggle = document.getElementById('theme-toggle');
const stored = localStorage.getItem('theme');
if (stored === 'light' || (!stored && window.matchMedia('(prefers-color-scheme: light)').matches)) {
html.classList.remove('dark');
}
toggle.addEventListener('click', () => {
html.classList.toggle('dark');
localStorage.setItem('theme', html.classList.contains('dark') ? 'dark' : 'light');
});
</script>
</body>
</html>