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
21 of the 22 are published on crates.io alongside the umbral facade — umbral-graphql is newer than the last release and lands with the next one. 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. | worker command | 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, 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. |