lal
by lalss-dev
README.md
# lal
**A permissioned memory tree for you and your AI — served over MCP.**
Live at **[lal.dev](https://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](https://modelcontextprotocol.io). 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.
---
## Connect your AI
```bash
claude mcp add --transport http lal https://lal.dev/api/mcp
```
Then sign in and approve. Claude Desktop / web: add it as a custom connector with the same URL.
Walkthrough: **[lal.dev/connect](https://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`.
## What's in it
- **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 ⊆ read` invariant. 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.
## Stack
| 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.
## Running it
```bash
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_memory` schema, so
> `git clone && npm run deploy` will **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.
## Donate
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](https://x.com/lalss08) or [Threads · @lalss](https://www.threads.com/@lalss). Nothing you
send buys a feature, priority, or a support tier.
## What's not here
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.
## License
[MIT](LICENSE).
This server cannot be deployed
Maintenance
ActivitySlowing
ResponsivenessNo issues