A permissioned memory tree for you and your AI — served over MCP. Live at lal.dev. Free to use, open source, no plans and no payment method anywhere in the app.
lal is a knowledge graph you write in Markdown-ish leaves and your AI reads through the Model Context Protocol. Every leaf carries its own audience, so a person, a team, and a customer each see exactly their slice — and the AI inherits precisely the access of whoever is asking, never more.
claude mcp add --transport http lal https://lal.dev/api/mcpThen sign in and approve. Claude Desktop / web: add it as a custom connector with the same URL. Walkthrough: lal.dev/connect.
Access on lal.dev is by invitation. Anyone can create an account (Google / GitHub), but a memory tree only opens up once an organization invites that email — there is no self-serve org creation, on purpose. If you want your own instance today, self-host this repo.
Tools exposed to the model: memory_index, memory_search, memory_read, memory_suggest,
my_suggestions, plus the curator set memory_health, memory_curation, memory_verify.
- Tree + editor — leaves with frontmatter, folders, tags, aliases, full-text search.
- Version history — append-only revisions, per-editor drafts with optimistic concurrency, soft-delete → archive → bin. Nothing is ever hard-deleted except by an admin purge.
- Access tiers — reader suggests · writer edits live · keeper approves · admin manages people,
with an
edit ⊆ readinvariant. Hidden leaves are indistinguishable from missing ones. - Suggestions + review — anyone can suggest; keepers approve; approved suggestions publish in place.
- Curator — health scoring, staleness/duplicate/orphan detection and verification passes, driven by your own AI through MCP prompts. No server-side model, no vendor lock.
- Graph — a live view of the tree with four renderers (3D force graph plus three hand-rolled Canvas2D modes) and read-traffic heat.
- Multi-tenant — organizations and divisions. An invite stays pending until the invited person actually signs in with that email, and binds only to rows addressed to it.
- Bilingual UI — Indonesian and English.
| Layer | What |
|---|---|
| Client | Vite SPA (React 19, TypeScript, Tailwind) |
| API + MCP | Hono on Cloudflare Workers (worker/) |
| Data | Supabase Postgres — schema db_memory, reached only through mem_* RPCs |
| Auth | OAuth 2.1 / magic link via the AMA Forum identity server |
Brutalist dark theme on purpose: hard 2px borders, zero rounding, amber on near-black.
npm install
npm run dev # Vite dev server
npm run typecheck # app + SPA + worker
npm run build # SPA + worker bundle into dist/
npm run deploy # build, then wrangler deploy (needs your own Cloudflare + Supabase)Config lives in .env.production for the three public, client-inlined values
(Supabase URL, publishable key, app URL). Everything secret — the Supabase service key and friends —
is set as a Cloudflare Worker secret (wrangler secret put), never committed.
Honest caveat about self-hosting: the data layer is RPC-only and lives in Postgres. This repo mirrors the migrations from 2026-06-30 onward, not the full original
db_memoryschema, sogit clone && npm run deploywill not give you a working instance yet. Run it against your own Supabase and expect to fill in the earlier schema by hand. If you want that gap closed, say so in an issue — it's the main thing standing between this repo and a turnkey self-host.
lal is free and stays free. Nothing in the app charges, meters, or counts seats.
There is no donation link yet. If you want to support it — or just talk — reach me on X · @lalss08 or Threads · @lalss. Nothing you send buys a feature, priority, or a support tier.
The content of the maintainer's own memory tree is private and always will be — this repo is the application, not the knowledge in it. A handful of migrations that are pure AMA-internal billing plumbing are also left out; nothing lal-the-app needs depends on them.
MIT.