Media
Upload, optimize, and pick media — with WebP + multi-size out of the box.
The media manager
The media-manager extension owns the media library. It runs at /admin/media with both grid (thumbnails) and list (filename, size, mime, dimensions, uploaded date) views. Search by filename, filter by mime type, sort by date or size.
What you can upload
Anything: images (jpeg, png, webp, avif, gif, svg), videos (mp4, webm), audio (mp3, m4a, ogg), documents (pdf, docx, xlsx). Per-format size limits configurable in /admin/settings/media.
Uploading
- Drag & drop a single file or many onto the library page
- Click upload for a file picker
- Paste from clipboard — ctrl/cmd+V on the library page lifts an image from the OS clipboard
- Import from URL — paste a public URL; the server downloads and stores it (
core.media.import_url)
Per-file metadata
Click any file to open the editor sheet. You can edit:
- Alt text — per-language; falls back to default-language alt if not set
- Caption
- Description
- Slug — the public URL slug at
/media/<slug>
Image optimization
Multi-size variants
Every image upload generates a configurable set of size variants. Defaults: thumbnail (300px), medium (768px), large (1536px), plus the original. Add your own at /admin/settings/media — each entry is { slug, width, height?, fit }. Theme/extension code can request a specific size by slug.
WebP conversion
Originals are kept as-is and a WebP variant is generated for each size. The public URL emitter chooses WebP for clients that send Accept: image/webp, and falls back to the original format otherwise.
Reoptimize on demand
Changed your size list, quality settings, or want to switch to AVIF later? Reoptimize regenerates all variants from the original. Bulk action available from the library list view.
Quality controls
Per-format quality (1–100), JPEG progressive on/off, PNG compression level, WebP effort — all configurable.
The media picker
The picker is a modal embedded everywhere a node, term, or block needs media — featured image, image custom fields, gallery fields, file fields. From the modal you can:
- Browse the library with grid/list/search/filter
- Upload a new file inline (drag-drop into the modal)
- Multi-select for gallery fields
- Edit alt-text and caption inline before confirming
Confirmed selections are stored as full media objects: { id, slug, url, alt, width, height, sizes: { thumbnail: {...}, medium: {...} } }. Theme templates resolve the right variant by reading .sizes.<slug>.url.
Public URL routing
Every media file resolves at /media/<slug> (or /media/<slug>@<size>.<format> for size variants). The route is owned by the media-manager extension and adds Cache-Control, ETag, and the right MIME type. Direct /storage/... paths are not exposed publicly — they're an implementation detail.