Admin panel for managing the Libri catalog and triggering crawler runs.
Built with Vue 3, Vite, TypeScript, Clerk authentication, and Nuxt UI.
- Browse books with pagination, filtering, and sorting
- Add, edit, and delete books
- Upload or replace cover images while managing books
- Trigger crawler runs for all sources or a single source
- Browse crawl history with status, books found, and error details
- Receive live crawler status updates in the UI via SSE
- Review and resolve books with invalid ISBNs via the purgatory queue
- Protect admin access with Clerk-issued JWTs
- Node.js 20+
- pnpm
- A running
libri-apiinstance - A Clerk application with a publishable key and JWT template
Create a local env file from the example:
cp .env.example .envAvailable variables:
VITE_CLERK_PUBLISHABLE_KEY=pk_***
VITE_CLERK_JWT_TEMPLATE=jwt-admin
VITE_API_BASE=http://localhost:8080Notes:
VITE_API_BASEshould point to the host runninglibri-apiVITE_CLERK_JWT_TEMPLATEmust match the Clerk JWT template expected by the API
Install dependencies:
pnpm installStart the development server:
pnpm devThe app runs on http://localhost:3000.
libri-admin authenticates users with Clerk and sends a Bearer token to
libri-api.
To access admin endpoints successfully:
- the API must trust your Clerk JWKS URL
- the JWT template used by the admin must match the one expected by the API
- the signed-in user must have
is_admin: true
Example Clerk public metadata:
{
"is_admin": true
}