http://localhost:3000. Your owner password is printed in the terminal on first
start.
The commands that matter
Contributing
Issues and pull requests are welcome. Two commands are the whole verification story — there is no CI on branches and no test suite, so the first thing that compiles a change after it lands onmain is the Docker image build that self-hosters pull.
Tenant isolation is a compile-time property
Tenant isolation is a compile-time property
Every function in
src/lib/data/ takes the owning userId as its first positional
argument, and every query filters on it. It is positional and required precisely so
the compiler rejects a call site that forgets. Do not add a data function with an
optional or object-bag userId, and never let one arrive from a client — server
actions resolve the caller from their session cookie, MCP tools from the connection
token.prisma/schema.prisma, run npx prisma generate before typechecking. Only
postinstall and build regenerate the client, so without it the compiler rejects a new
model with an error that looks like your code is wrong when it is only stale.
The stack
Next.js 15 (App Router) · React 19 · Tailwind v4 · shadcn/ui · Framer Motion · Prisma · PostgreSQL. The MCP server lives insrc/lib/mcp/ and speaks the Streamable HTTP transport directly,
with no session state — which is what lets it survive restarts and replicas without
anything reconnecting. Tools are defined once in src/lib/mcp/tools.ts, and setup recipes
are data in src/lib/mcp/clients.ts, so supporting a new client is one entry in an array.