Skip to content

Quickstart

Terminal window
npm i @ltikit/core

…plus one storage adapter and (optionally) one framework binding — chosen below.

Pick your storage — any of these work the same. (All options: Storage adapters.)

lib/lti.ts
import { PrismaClient } from '@prisma/client'
import { createLti, staticKeyStore } from '@ltikit/core'
import { prismaPlatformStore, prismaNonceStore } from '@ltikit/adapter-prisma'
const prisma = new PrismaClient() // SQLite for zero external service, or Postgres/MySQL
export const lti = createLti({
keys: staticKeyStore({
privateKeyPem: process.env.LTI_TOOL_PRIVATE_KEY!,
kid: process.env.LTI_TOOL_KEY_ID ?? 'ltikit-key-1',
publicJwk: JSON.parse(process.env.LTI_TOOL_PUBLIC_JWK!),
}),
platforms: prismaPlatformStore(prisma),
nonces: prismaNonceStore(prisma),
})

Copy the two models first — see Prisma adapter.

app/api/lti/login/route.ts
import { oidcLogin } from '@ltikit/next'
import { lti } from '@/lib/lti'
export const POST = oidcLogin(lti, { redirectUri: `${process.env.APP_URL}/api/lti/launch` })
app/api/lti/launch/route.ts
import { launch, sessionRedirect } from '@ltikit/next'
import { ltiIdentity } from '@ltikit/core'
import { lti } from '@/lib/lti'
export const POST = launch(lti, async (result) => {
const id = ltiIdentity(result.claims) // → create user + session (see Auth integration)
return sessionRedirect({ to: `${process.env.APP_URL}/home`, cookies: [/* your session cookie */] })
})
app/.well-known/jwks.json/route.ts
import { jwks } from '@ltikit/next'
import { lti } from '@/lib/lti'
export const GET = jwks(lti)
  • Apply the adapter schema for the store you picked:
    • Prisma — copy the two models into your schema.prisma, then npx prisma migrate dev --name add_ltikit.
    • Supabasenpx @ltikit/adapter-supabase > supabase/migrations/0001_ltikit.sql.
    • Redis — nothing to migrate (keys are created on write); pair with a durable PlatformStore.
    • Memory — nothing to set up (dev/tests only).
  • Generate an RS256 keypair for LTI_TOOL_PRIVATE_KEY / LTI_TOOL_PUBLIC_JWK.

Point your LMS at the routes (JWKS = /.well-known/jwks.json, OIDC login = /api/lti/login, redirect URI = /api/lti/launch) and add a platform row. See LMS registration.