Skip to main content
The dashboard includes export and import tools so you can move menus between environments, keep backups, or seed a fresh installation from a known-good configuration.

Exporting menus

From the dashboard menu list (/admin/menus), two export actions are available:
ActionOutput
Export all menusDownloads a single JSON file containing every menu and all its items.
Export one menuDownloads a JSON file for a single menu (filename: menu-{code}-export.json).
Both formats are identical in structure — they differ only in how many menus are included.

JSON format

{
  "menu": {
    "code": "sidebar",
    "name": "Sidebar",
    "context": {},
    "icon": null
  },
  "items": [
    {
      "label": "Dashboard",
      "itemType": "link",
      "routeName": "app_dashboard",
      "routeParams": {},
      "icon": "bootstrap-icons:house",
      "position": 1,
      "children": []
    }
  ]
}
Item trees and all per-locale translations are preserved in the exported file.

Importing menus

Import is available in two places:
  • Modal — click Import on the menu list page; the form opens in a modal overlay.
  • Standalone page — navigate to /admin/menus/import directly.

Import strategies

When importing, choose how to handle menus that already exist (matched by code + context):
StrategyBehaviour
Skip existingMenus with the same code and context are left untouched. Only new menus are created.
ReplaceItems of existing menus are replaced entirely with the imported items. The menu entity itself is updated.
1

Open the import form

On the menu list page, click Import to open the modal, or go to /admin/menus/import.
2

Upload the JSON file

Select the JSON file exported from the same or another environment.
3

Choose a strategy

Select Skip existing to preserve current menus, or Replace to overwrite them.
4

Submit

Click Import. On success, you are redirected back to the menu list (or the referring page when same-origin). Errors appear as flash messages.

Error handling

If the JSON is malformed, missing required fields (e.g. code), or exceeds the upload size limit, the import is rejected and the error details are shown as flash messages. No partial imports are committed on validation failure.

Rate limiting

The import and export actions can be rate-limited to reduce abuse risk. Configure the limit in nowo_dashboard_menu.yaml:
nowo_dashboard_menu:
    dashboard:
        import_export_rate_limit:
            limit: 10       # maximum requests
            interval: 60    # per this many seconds
The example above allows 10 import/export requests per minute per user or IP. Set the option to false or omit it entirely to disable rate limiting.
The maximum upload size for JSON import files is controlled by dashboard.import_max_bytes (default: 2 MiB). Uploads larger than this limit are rejected before processing.