Feature matrix
Every official Umbral plugin and core capability in one table - auth, admin, REST, OpenAPI, realtime, OAuth, background tasks, multitenancy, row-level security, field encryption, and more.
Everything Umbral ships
Umbral is batteries-included: declare your data and you get migrations, CRUD, an admin, and an optional REST API almost for free. This page lists the whole surface in one place - the 21 official plugins and the capabilities that live in the core.
Every official plugin implements the same Plugin trait you would implement yourself. There is no privileged built-in: AuthPlugin and a plugin you write are both Box, registered with the same .plugin(...) call. If a built-in cannot be expressed as a plugin, the plugin contract is wrong. See Plugins are apps.
Official plugins
All 22 are published on crates.io alongside the umbral facade, and version in lockstep. The Scaffolded column marks the ones umbral startproject wires into main.rs for you; the rest are one line in Cargo.toml plus one .plugin(...) call away.
| Plugin | What you get | Mounts | Scaffolded |
|---|---|---|---|
umbral-auth | User model, argon2 password hashing, login/signup/logout, email verification, password reset. Swappable user model via the UserModel trait. | /auth/* (opt-in) | Yes |
umbral-sessions | DB-backed sessions + signed cookies, linked to auth users. | middleware | Yes |
umbral-admin | Auto-generated CRUD admin UI, dashboard widgets, inlines, custom views. | /admin | Yes |
umbral-rest | Auto-generated JSON REST API: serializers, viewsets, routers, filtering, pagination, throttling, CSV export. Safe-by-default permissions. | /api | Yes |
umbral-openapi | OpenAPI 3.0 schema + Swagger UI over your REST endpoints. | /openapi | Yes |
umbral-graphql | A real GraphQL API derived from your models: relations both ways, DataLoader batching, cursor pagination, mutations, subscriptions over WS/SSE. Deny-by-default. | /graphql | Opt-in |
umbral-security | CSRF middleware, security headers (HSTS, CSP, frame options, nosniff, referrer policy). | middleware | Yes |
umbral-logs | Non-blocking request logging into a RequestLog model, browsable in the admin. Optional OTel export. | layer + admin | Yes |
umbral-permissions | Role-based access control: ContentType, Permission, Group, user↔group and user↔permission M2M, has_perm query layer. | — | Opt-in |
umbral-oauth | Social login + account connection (Google, GitHub). Provider tokens stored encrypted with Masked<T>. | /oauth/{provider}/callback | Opt-in |
umbral-tasks | DB-backed background task queue: define, enqueue, run with a worker process. | tasks-worker / tasks-beat commands | Opt-in |
umbral-realtime | SSE + WebSocket push, user- and room-targeted, over a pluggable broker. Model subscriptions and presence. | /realtime | Opt-in |
umbral-storage | One Storage trait for static-file serving and media uploads. Local FS + optional S3 backend. | /static, /media | Opt-in |
umbral-cache | One Cache handle over a swappable backend (memory, SQLite, Redis) plus cache_page middleware. | middleware | Opt-in |
umbral-email | SMTP + template-driven transactional email. | — | Opt-in |
umbral-signals | In-process pub/sub: pre/post save and delete. Plugins emit, other plugins subscribe. | — | Opt-in |
umbral-tenants | Schema-per-tenant multitenancy: one Postgres database, one schema per tenant, shared public schema. | middleware | Opt-in |
umbral-rls | Postgres row-level security. Declare policies at App::build; on_ready applies them. | — | Opt-in |
umbral-playground | Interactive, browsable API console for your REST endpoints. Refuses to mount in Prod. | /playground | Opt-in |
umbral-health | Liveness + readiness probes. | /healthz, /ready | Opt-in |
umbral-analytics | Product-analytics event capture (PostHog backend), ambient client, opt-in per-request middleware. | middleware | Opt-in |
umbral-livereload | Dev-only browser live-reload: file watcher pushes reload / CSS-swap over SSE, client script auto-injected. Inert outside Dev. | SSE (dev only) | Opt-in |
Core capabilities
These need no plugin. They live in umbral-core and reach you through the umbral facade.
| Area | What you get |
|---|---|
| ORM | Typed QuerySet: filter, exclude, order_by, limit/offset, first, get, count, exists, delete, update_values, bulk_create, select_related, aggregates, joins, transactions. |
| Relationships | ForeignKey<T>, OneToOne<T>, M2M<T>, reverse relations, in_bulk. i64, String and Uuid primary keys. |
| Managed migrations | Autodetected from your models: create/alter/drop table and column, renames, data migrations, squashing, drift detection. |
inspectdb | Introspect an existing database into models, straight into the managed-migration loop. |
| Templates | Server-rendered HTML with autoescaping, custom tags, filters, markdown + syntax highlighting. |
| Web | Routing, middleware, forms, pagination, streaming, compression, request limits, error pages. |
| Backends | Postgres-first, SQLite for tests. Boot-time system checks catch field/backend mismatches before prod. |
| CLI | startproject, startplugin, migrate, makemigrations, showmigrations, checkmigrations, inspectdb, createsuperuser, tasks-worker, plus per-plugin commands. |
| Testing | Test client + model factories. |
Field types and attributes
Declared on the model, enforced by the schema. #[derive(Model)] turns each of these into migrations, admin form widgets, and REST serializers.
| Feature | Spelling | What it does |
|---|---|---|
| Field encryption | Masked<String> | Encrypts the column at rest with public-key crypto. A write-only key can seal; only a process holding the secret key can reveal. GDPR-style PII protection with no app code. |
| Case-insensitive columns | #[umbral(case_insensitive)] | =, UNIQUE and ORDER BY fold case while preserving the original casing (Postgres citext, SQLite COLLATE NOCASE). |
| Normalized fields | #[umbral(trim, lowercase)] | Canonicalizes on every write surface - typed, admin form, and REST. |
| Soft delete | #[umbral(soft_delete)] | deleted_at column, excluded from queries by default. |
| File / image fields | FileField, ImageField | Uploads through the Storage backend, with an admin widget. |
| Privileged fields | #[umbral(noform, noedit)] | Keeps a column out of generated forms, or read-only in them. |
| Constraints | #[umbral(unique, index, unique_together, indexes)] | Emitted into migrations and autodetected on change. |
| Choices | #[umbral(choices = ...)] | Rust enum ↔ DB CHECK constraint ↔ OpenAPI enum ↔ admin <select>. |
| Timestamps | #[umbral(auto_now, auto_now_add)] | Set on write without touching your handler. |