axum-admin
A modern admin dashboard framework for Axum. Register your entities and get a full CRUD dashboard — search, filtering, pagination, bulk actions, custom actions, and built-in authentication — with zero frontend build step.
Inspired by Django Admin and Laravel Nova.
Features
- CRUD out of the box — list, create, edit, delete for any entity
- Server-side rendering via MiniJinja, no JS framework required
- HTMX + Alpine.js embedded, no CDN or build step
- Session-based auth with argon2; swap in your own backend
- RBAC via Casbin — per-entity permissions tied to user roles (SeaORM feature)
- Sidebar groups with collapsible sections and custom icons
- Filters, search, column sorting, pagination
- Bulk actions (delete, CSV export) and per-record custom actions
- Lifecycle hooks:
before_save,after_delete - Template override support
- ORM-agnostic via
DataAdaptertrait - First-party SeaORM adapter behind the
seaormfeature flag
Quick start
1. Add the dependency
2. Set the database URL
3. Run migrations
axum-admin ships its own migration set (users, sessions, RBAC rules). Apply them by calling Migrator::up at startup — the example below shows how. Your app's own migrations can run in the same migrator or separately.
4. Create the admin user
Use ensure_user during app initialization to create a default admin account if it doesn't exist yet:
let auth = new.await?;
auth.ensure_user.await?;
ensure_user is idempotent — safe to call on every startup. Change the password via the Users UI after first login.
5. Register entities and start the server
use ;
use ;
use SeaOrmAdminAuth;
async
6. Access the dashboard
# open http://localhost:3000/admin
Change the default password under Users after first login.
See examples/blog for a full working example with categories, posts, tags, foreign keys, many-to-many relations, filters, and RBAC roles.
Full documentation coming soon.
License
MIT