The per-file information editor is off by default. Enable only the fields and languages your application needs. It uses FLEX input components and the shared TranslatableTabs component.
Enable the editor
Default fields are title, alt, caption, copyright and tags. The action is available in list, grid and avatar layouts. Cancelling it leaves values unchanged.
For disk fields, add the companion JSON model column and normal fillable policy. Cast both multiple-file and editorial attributes:
The companion path is relative to the field’s form container, including repeaters. Use a path different from file state and storeMetadataIn() technical metadata.
Alternative text only
Omitted fields are neither shown nor accepted. No other information fields have to be enabled.
Choose your own FLEX fields
Supply 1–32 uniquely named FLEX field templates with simple relative names. Native Filament field renderers are not accepted. The editor stores a bounded plain-text/tag document rather than arbitrary HTML or EXIF modifications.
Select exactly three languages
Up to 32 locales are supported. A list such as ['pl', 'en', 'de'] is also accepted. Translations are opt-in and independent of enabling the editor.
Translate selected fields only
Only title and alt become locale maps. Caption, copyright and tags remain shared. Tags always appear once outside translation tabs: they are shared identities and cannot be configured as translated fields.
Primary language
The default must belong to the configured language list. Otherwise the first configured locale is used. The primary locale selects the initial tab and the optional fallback source.
Require alt only in the primary language
Avoid adding required() to the translated field template if other languages should remain optional; the template’s own required rule applies to every language clone.
Display fallback
Fallback is off by default. It resolves missing/null/blank display text from the primary locale without copying text into saved translations or satisfying required validation.
For application display code using the configured field instance:
For an already obtained metadata document:
readFileEditorialMetadata($fileKey) returns raw values. File reads still enforce attachment ownership.
Additional validation rules
Rules are relative to the metadata document. Laravel rule objects and wildcard rules are supported. They are checked in the editor and again before permanent persistence.
Structural limits remain: plain strings up to 4,000 characters, 50 distinct tags up to 80 characters each, 64 KiB JSON, and only declared fields/locales. Custom rules may tighten, but cannot remove, those limits.
These are per-file editorial strings. They do not implicitly synchronize the parent model’s Spatie Tags relation. For a model tag relation, use the optional FlexSpatieTagsField separately; see TagsField integration. Spatie Media Library custom properties and Spatie Tags relationships are different storage features.
No companion model column is needed for the Spatie field. After record acceptance, editorial values are saved to the owned media’s custom_properties.editorial, preserving other custom properties.
Action presentation
Standalone Livewire forms must provide Filament’s HasActions, InteractsWithActions and render <x-filament-actions::modals />. Standard Filament pages already provide that action infrastructure. Editor inputs remain FLEX components.
Disable or simplify
The second example keeps the editor but removes translation tabs. Automatic translation, concurrent-editor revision management and embedded EXIF editing are not included.
The image viewer is optional. It opens images from this field in a gallery with previous/next navigation, keyboard arrows, wheel zoom, touch pinch and swipe. By default it displays the original image without re-encoding it. Use fileViewerConversion('large') for a separate stored conversion, or fileViewerUrlUsing() for an authorized legacy preview URL; see viewer source configuration. The fullscreen gallery opens from the selected thumbnail and returns to that image when closed. If the thumbnail is outside the viewport, the gallery uses a fade. Reduced-motion preferences disable these transitions. The optional information panel sits beside the image on desktop and below it on mobile.
When the information editor is enabled, its configured fields and languages are reused in the sidebar. The sidebar is read only by default. Enable editing explicitly:
Switching images starts the visual transition immediately while the current information is validated and saved. The information panel is temporarily locked. If validation fails, the gallery returns to the previous image and keeps the entered information. The Save information button displays a spinner and Saving status, prevents duplicate submission, and locks the gallery controls until the request finishes. A failed validation keeps the form open. Closing the viewer without saving discards changes to the current image; information already saved while navigating remains in the form.
Hide the sidebar with fileViewerMetadata(false). Customize the FLEX action with configureFileViewerActionUsing(). You can add your own FLEX inputs to fileMetadataSchema() or add a schema view through the action’s schema configuration. The viewer only accepts images owned by the current field; SVG is excluded from this gallery.
The gallery uses the full available width. Thumbnail entry/return animations use the image’s actual destination bounds; they do not require a sidebar. List and avatar previews use the same viewer. With information enabled, the panel appears beside the image on desktop and below it on narrow screens.
These field and language choices are shared with the information editor. Shared credit stays outside the translation tabs. Save information runs configured validation and exposes a saving state; failed saves keep the draft available for correction. For a custom read-only view, use the viewer action schema configuration rather than declaring a non-field component in fileMetadataSchema(). Last modified on October 16, 2026