Skip to main content
Glama
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).