Skip to content

Your models. Your admin. Your code.

Build an AdonisJS admin panel with typed resources, reactive forms and server-authorized actions. Keep the React components yours.

Less plumbing. More application.

Pupitre turns Lucid models and immutable TypeScript builders into an Inertia React admin panel. Describe the form and table once; Pupitre handles the routes, validation, scoped queries and action transport.

import { defineResource, table } from '@rikology/pupitre'
import Post from '#models/post'

export default defineResource(Post)
  .recordTitle('title')
  .form((s) => [
    s.text('title').required().maxLength(200),
    s.select('status').options({ draft: 'Draft', published: 'Published' }),
  ])
  .table((t) => t.columns([
    table.text('title').searchable().sortable(),
    table.badge('status'),
  ]))
Adonis-native.
Lucid persistence, VineJS validation, Bouncer policies and your application's session guard.
React, not remote JavaScript.
Declarative specs power forms and tables. Simple reactive closures become safe expressions, not executable source sent to the browser.
Yours to change.
Replace a registry component without forking the backend. Add behavior through panel plugins and optional adapters.

Start with your first panel, explore the form components, or compare the Filament API equivalents.

Type to search…

↑↓ navigate↵ selectEsc close