Skip to content

How it fits together

LTIkit is a small required core plus a few swappable slots. You don’t adopt a stack — you keep yours and plug it in. This page is the map.

flowchart TD
  LMS["LMS<br/>(Canvas / Moodle)"] -->|"OIDC + launch"| Binding["Framework binding<br/>Next / Hono / your own"]
  Binding --> Core["@ltikit/core<br/><b>REQUIRED</b>"]
  Core --> Keys["KeyStore"]
  Core --> Nonce["NonceStore"]
  Core --> Plat["PlatformStore"]
  Core -->|"verified claims"| App["Your app<br/>(session + auth)"]
  App -. "pick one" .-> AuthLib["NextAuth / better-auth<br/>Supabase Auth / custom JWT"]
  Nonce -. "pick one" .-> NStore["Prisma / Redis<br/>Supabase / memory"]
  Plat -. "pick one" .-> PStore["Prisma / Supabase<br/>your own"]

  classDef req fill:#4f46e5,color:#fff,stroke:#4f46e5;
  classDef pick fill:none,stroke-dasharray:4 3;
  class Core req;
  class AuthLib,NStore,PStore pick;

Solid boxes are things you always have; dashed boxes are choices.

PieceRequired?Your options
@ltikit/coreAlways— (the toolkit)
KeyStore (your RS256 keypair)AlwaysstaticKeyStore (env PEM) · your KMS
NonceStore (OIDC handshake state)AlwaysPrisma · Redis · Supabase · memory · your own
PlatformStore (trusted LMSs)AlwaysPrisma · Supabase · your own
HTTP glue (route handlers)Always@ltikit/next · @ltikit/hono · hand-rolled RequestResponse
Session / authYour appNextAuth · better-auth · Supabase Auth · custom JWT

Always start with @ltikit/core, then add one framework binding and one (or mixed) storage adapter. Pick the row that matches your stack:

Your stackInstall
Next.js + any DB via Prisma (SQLite, Postgres, MySQL — zero external service)npm i @ltikit/core @ltikit/next @ltikit/adapter-prisma
Next.js + Supabase / Postgresnpm i @ltikit/core @ltikit/next @ltikit/adapter-supabase
Next.js + Redis (nonces) + Prisma or Supabase (platforms)npm i @ltikit/core @ltikit/next @ltikit/adapter-redis @ltikit/adapter-prisma
Hono / edge (Workers, Deno, Bun) + Redis + Supabasenpm i @ltikit/core @ltikit/hono @ltikit/adapter-redis @ltikit/adapter-supabase
Hand-rolled framework, your own storagenpm i @ltikit/core
Local dev / tests onlynpm i -D @ltikit/core @ltikit/adapter-memory

These work the same no matter what you picked above: