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.
Anatomy
Section titled “Anatomy”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.
What’s required vs. what you choose
Section titled “What’s required vs. what you choose”| Piece | Required? | Your options |
|---|---|---|
@ltikit/core | Always | — (the toolkit) |
KeyStore (your RS256 keypair) | Always | staticKeyStore (env PEM) · your KMS |
NonceStore (OIDC handshake state) | Always | Prisma · Redis · Supabase · memory · your own |
PlatformStore (trusted LMSs) | Always | Prisma · Supabase · your own |
| HTTP glue (route handlers) | Always | @ltikit/next · @ltikit/hono · hand-rolled Request→Response |
| Session / auth | Your app | NextAuth · better-auth · Supabase Auth · custom JWT |
Which packages do I need?
Section titled “Which packages do I need?”Always start with @ltikit/core, then add one framework binding and one (or mixed)
storage adapter. Pick the row that matches your stack:
| Your stack | Install |
|---|---|
| Next.js + any DB via Prisma (SQLite, Postgres, MySQL — zero external service) | npm i @ltikit/core @ltikit/next @ltikit/adapter-prisma |
| Next.js + Supabase / Postgres | npm 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 + Supabase | npm i @ltikit/core @ltikit/hono @ltikit/adapter-redis @ltikit/adapter-supabase |
| Hand-rolled framework, your own storage | npm i @ltikit/core |
| Local dev / tests only | npm i -D @ltikit/core @ltikit/adapter-memory |
Choose your pieces
Section titled “Choose your pieces” Storage adapters Where nonces + platforms live: Prisma (any DB), Redis, Supabase, memory, or your own.
Framework bindings Wire routes with Next.js, Hono, or plain Web Request/Response.
Auth integration Turn a verified launch into a session with your existing auth library.
LTI features (any stack)
Section titled “LTI features (any stack)”These work the same no matter what you picked above:
Deep linking Let instructors select content the LMS places.
Grade passback (AGS) Post scores to the gradebook.
Roster (NRPS) Fetch course members.
Running in an iframe CSP + cookies for LMS embedding.