# Release v6.31.0 (2026-04-09)

Published 2026-04-09 09:56:58Z

* [fylr\_checksums.txt](https://s3.eu-central-1.wasabisys.com/fylr-releases/v6.31.0/fylr_checksums.txt)
* [fylr\_v6.31.0\_darwin\_amd64.tar.gz](https://s3.eu-central-1.wasabisys.com/fylr-releases/v6.31.0/fylr_v6.31.0_darwin_amd64.tar.gz)
* [fylr\_v6.31.0\_darwin\_arm64.tar.gz](https://s3.eu-central-1.wasabisys.com/fylr-releases/v6.31.0/fylr_v6.31.0_darwin_arm64.tar.gz)
* [fylr\_v6.31.0\_linux\_amd64.tar.gz](https://s3.eu-central-1.wasabisys.com/fylr-releases/v6.31.0/fylr_v6.31.0_linux_amd64.tar.gz)
* [fylr\_v6.31.0\_windows\_amd64.zip](https://s3.eu-central-1.wasabisys.com/fylr-releases/v6.31.0/fylr_v6.31.0_windows_amd64.zip)

## Server

### New

* **Indexer**: Added [synonym support](https://docs.opensearch.org/latest/analyzers/token-filters/synonym-graph/) for mapping, ICU folding & improved CJK indexing. The base config can now configure per database language synonym lists. These list will be applied inside the indexed documents to e.g find "pc" when searched for "computer". Support generic [ICU folding](https://docs.opensearch.org/latest/analyzers/token-filters/icu-folding/) for base type text fields as well as object type strings & text fields. This also is a per language setting. With this, the German language "de-DE" can be set up in a way the `äöü` are normalized to `aou`. Improved CJK support: The previous solution would not remember the correct order of the CJK tokens, all would stay at pos 0 in the same word. With this, we add a " " between the CJK characters to make positional queries work (like `intervals_ordered`). Also, split strings into single CJK tokens before searching. \[1f9578d71]
* **Login**: **Lock accounts** after 3 failed attempts. For 1 hour accounts are locked if 3 login attempts failed with wrong password. This setting can be changed in the base config. \[d86b568ee] \[fd9ab5e87] \[9ca56aeee] \[25bd86a8f]
* **/api/\[search|db]**: Add `max_merge_depth` and `merge_linked_objects` as query parameter. The new feature allows to load deeper than the default first linked object as standard. We had this already for `api/export` and `api/oaipmh`, but not for `/api/db` and `/api/search`. With this the task module `metadata` now supports mapping deep asset links, where the asset is inside a linked object. \[dd799888c]

### Improved

* **/api/export**: Support **custom DPI** for custom versions. This sets the DPI resolution (width & height) for custom images if given in the custom export definition. \[eda584a4c]
* **/inspect**: Add request header to the output. Also output environment of the running **fylr** binary, if set up in `fylr.yml`. The new `fylr.debug.inspectShowEnvironment` can be used to output the environment **fylr** was started with in `/inspect/`. \[f9563ce68] \[a4be23f36]
* **fylr backup/restore**: Restore plugin system rights for users & groups. \[bedc9393b] \[7071f67d4]
* **Client IP detection**: Support `x-real-ip`. In addition to `x-forwarded-for` and request `remoteaddr` we now support `x-real-ip` (used by nginx) to determine the user's real IP address. The order is x-real-ip, x-forwarded-for (first item), remoteaddr. \[3224a4481]
* **/api/objects**: Support `disposition` in query string. \[d74920fdf]
* **/api/objects\[IIIF]**: Manifests for types *Image*, *Audio* and *Video*. This patch tries to versions for browser supported audio, video file extensions. \[0350b0f60] \[9f707d2c6]
* **Indexer**: Improved re-queueing of object index jobs. If a bulk request fails in bulk mode, the error is not specified per item but the whole request is answered with one error. In that case the code now stores one error per sent item, enabling the error handler to properly re-queue all not index items. Before this would only work for error messages which contained an individual response list. \[659d5517e]
* **Zoomer**: Limit to 32k, add `zoom` version. For really big images (>100k pixels), the zoomer would fail to produce the interim zoomable BMP. This patch adds a version `zoom` which will be produced for original with a dimension > 32k. Also, no IIIF/ZOOM url is available for images bigger than 32k. The `zoom` version is not automatically produced after an update, this can be initiated manually in `/inspect/files/`. \[40f96b344]
* **fylr metadata**: Limit `--clipping-path` to files < 200MB. Bigger TIFFs take forever and use a lot of memory with `magick identify -verbose`, so this is not feasible to run. Limit to 200MB. \[db07cfff2]
* **/api/db**: Support **deferred linked objects in parallel requests**. With two parallel requests inserting a relation A -> B where A is the father of B, we couldn't guarantee that the linking happened when deferred links where used. This patch uses a PG advisory lock to link the deferred objects outside the transactions. Errors (such as wrong object type) which occur after a parallel insert scenario can only be logged as the original inject has already passed. This patch also resurrects `fylr restore --max-parallel` and the accompanying settings on the `/inspect/migration/` page. Also speed up the select to find deferred objects. \[14ff5f19c] \[4ed3fbd40]
* **System rights**: New `frontend_features[allow_fulltext_file_search]` was added. \[63316994f]
* **/api/collection**: Update collection count using count. Always count all objects in collection instead of calculating from delta in a non-reproducible case, the object count of a collection was out of sync and no operation would ever get it back right because only the delta count was considered. \[f9e3ba743]
* **/inspect/objects**: Add `_best_mask` to API output. The best mask compilation was missing for the dump output. \[efbc21934]
* **/api/export**: If **original filename** is requested, use original extension too. This matches the original filename as closely as possible. Exception are special characters, too long filenames, and double spaces within the filename. Those will still be sanitised. \[d7b8f1950]

### Fixed

* **/inspect/tasks/TASK**: Fixed for `sqlite` backends. \[a186a5c8a]
* **/api/export**: Fixed exporting metadata in custom versions. The bug caused no metadata to be written in versions if defined using the "assets" property of an export. Also fixed this for custom versions. This removes `--strip` from the produce recipe. We manage this using metadata `remove`. \[528e61ba5]
* **fylr convert**: Fix caption and watermark overlay with latest Imagemagick. Imagemagick `7.1.2-16` and later has a bug that breaks the overlay caption in fylr (its not a clean overlay, but gets sprinkles). Bug description is here: <https://github.com/imagemagick/ImageMagick/issues/8620>. Only non Docker installations were affected by this, if a new enough version of Imagemagick was used. \[36694cf27] \[b87246d23]
* **Standard rendering**: Fix crawl recursion bug in complex models. \[4ee5b0e4c]
* **Hotfolder**: Fixed series recognition with linked objects. In case the linked object is in a nested and holding the assets, the upload of the 2nd matching asset would fail with a panic. Also a reverse case was fixed: In a scenario where `object` links to `medien.file` via `object__medien` were updated, the new entry in `object__medien` would not be created, failing with a database fk violation. \[2d70bb45e] \[a8e9d0389]
* **Indexer**: Fixed **indexer mapping** in cases were a frontend language was set without a corresponding database language. This fixes a severe problem in fylr: If users use frontend language EN and have only data base language DE, the API would return "The language settings have been changed, please wait for the re-index to complete.". The underlying problem was that we used the database languages to index the sort field for pool and not the frontend languages. This patch fixes this, **affected instances need a manual re-index**. \[072f8f156]
* **/api/search\[type=acl|group]**: Fixed group rights in `_generated_rights`. Before this patch, the `_generated_rights` for groups in search type acl or group were not compiled correctly, returning too few rights in some cases. \[6fc3e80e5]
* **/api/eas/rput**: Support Wikipedia remotes. This sets a custom user-agent for http request for remote files. Turns out that Wikipedia does not accept the stdlib Go header and answers with "Forbidden" when requesting files. \[1818e704c]
* **/api/db**: Fixed loading of `_current` for `db_pre_save` plugins. he object "\_current" for the plugin payload wasn't always fully loaded (only for group mode and non \_all\_fields masks it was). This patch fixes that and fully loads that data unless plugins are skipped. \[3e31debb9]
* **DELETE /api/db**: Fixed 202 response for preventing delete case. If objects were linked to each other using a not null constraint, the deletion is only possible if all of the linked objects are present in the list to be deleted. This was fixed before, but the 202 response was not suggesting the policy `delete` as viable option because it wrongly assumed that linked objects are preventing the request. \[221128ef1]
* **/api/db**: Fixed `db_pre_save` for collection update case. If a collection was used to update an existing object, owned by someone else, and plugins were active (such as [fylr-plugin-formula-columns](https://github.com/programmfabrik/fylr-plugin-formula-columns)), the save would fail, cause `_create_user` was set to the original owner. Now, the code resets `_create_user` so that it gets assigned to the actual user updating the object. So, in a collection owned by "editor" an updated object pulled it from "editor" will be still owned by "root" but created by user "editor". \[96a294c28]
* **/api/task\[metadata]**: Use all metadata to fix mapping. The metadata module was broken in a way that not all metadata of a processed file where loaded and usable to map data. This bug caused the module to map less data than the mapping during the file upload. Fixed by loading full file metadata before running the mapper. \[a8913b49e]
* **Metadata recipes**: Include parameters in callback. **fylr** now calls the metadata recipe including the custom parameters. Before this was missing, so that a recipe never actually received the parameters it was supposed to work with. This also stores recipe parameters properly alongside with the information that a metadata recipe has run. This omits a re-run of the recipe if the request is repeated. \[4b7d4f75c]

## Frontend

### New

* **Zoom Tool**: The zoom tool in the asset browser has been completely redesigned internally. It now uses canvas rendering, providing a much smoother experience and better performance by avoiding unnecessary tile reloads. Additionally, interactivity with the minimap has been improved, allowing dynamic image navigation directly from it.
* **Shared Export Templates**: It is now possible to share export templates between users within the same Group. This new option will appear when creating an Export Template in the export manager if the user has write permissions in any Group. All group users will see the template in the list. Additionally, a new tab has been added in the group manager to manage these Shared Export Templates (only visible if any shared export template exists).
* **Collection To TopLevel**: A new option has been added to the collections context menu to move the current collection to the top level of the hierarchy.
* **Panels in base config definitions**: Support has been added to create collapsible panels in the base config. If a form implements the property `plugin_type: panel` in its definition, it will be rendered as a panel.
* **Custom DPI**: Added the option to configure a custom DPI value in exports for custom asset renditions.
* **Expiration Days in Right Presets**: A new property has been added to collection right presets to configure a default expiration value. If a right template uses expiration days, this value will be shown as a placeholder in the "Valid To" field.
* **Exact Search For Expert Search**: Added the ability to search for exact tokens in expert search fields. This allows using backticks to match the exact value of a token for a specific field.
* **Token Search in Linked Objects**: The main search has been improved to include token searches within linked objects. This means that when searching for a term like `'foo'` using single quotes, results will also include objects whose linked objects match the token search.

### Improved

* **Collection Search**: The collection field in expert search has been improved. It now supports multi-selection in the collection picker, improved labels for "has value/without" query elements, and general CSS improvements.
* **File search by name**: Improved file name search in expert search by allowing multiple names separated by commas.
* **RPUT Form**: The form for adding assets from URLs in the object creation form has been improved with better validation and enhanced UX.
* **Variant Editor Shortcut**: Now, when using the variant editor shortcut on an EAS field in the editor (Alt + double click), the asset browser will not open if it was previously closed.
* **String range search**: Improved range search in expert search to support alphanumeric ranges with spaces, e.g. `A 1 - A 9`.
* **Show Changes in history view for tags**: Improved the history view to display changes in tag fields, showing which tags were added and which were removed.

### Fixed

* **Metadata Background Task**: Fixed a bug where the frontend sent incorrect information when configuring Metadata settings in cases where linked objects required defining a pool.
* **Fullscreen Asset Browser**: Fixed a bug where the standard was not displayed in the carousel of the fullscreen asset browser when a record had more than one asset.
* **Base Config**: Fixed a bug that made it impossible to access the base config if a custom plugin definition did not implement the `name` parameter.
* **ReadOnly Parent field in polyhierarchy**: Fixed a bug where the "read-only parent field" option in polyhierarchies was not respected, allowing edits and causing errors when saving the record.
* **Auto numbering for hierarchy objects**: Auto numbering can now only be selected when the object is configured as a hierarchy and has reverse edit enabled.
* **Drag and drop Asset in the page**: Improved drag-and-drop behavior when creating records to prevent execution when dropping assets into a detail view or editor, avoiding false positives (e.g. when missing a drop in an EAS field).
* **Table View**: Fixed a bug where, after editing objects, random objects were incorrectly selected and could not be deselected.
