# UI Profiles & Data Source Filtering

GeoLibre can hide data sources, web services, and plugins to simplify the
interface for beginners or to standardize a deployment across a team. Hiding is
**non-destructive** — nothing is removed, and any item can be re-enabled at any
time. Profile preferences are stored locally in the browser/app and never travel
inside a saved `.geolibre.json` project.

## For users

### Onboarding

By default GeoLibre starts on the **Advanced** interface — everything visible —
and does not show a first-launch welcome dialog. Choose a simpler experience
level at any time from **Settings → Interface** (see below):

- **Beginner** — only the essential data sources and tools.
- **Intermediate** — common data sources, services, and plugins.
- **Advanced** — everything GeoLibre offers (the default).

An administrator profile can pre-configure the interface for a whole deployment
and lock these controls.

### Settings → Interface

The interface is controlled by a single four-state selector:

- **Beginner** / **Intermediate** / **Advanced** are developer-curated presets.
  Selecting one applies its layout immediately. **Advanced** reveals everything,
  so it is the full, unrestricted interface.
- **Custom** activates automatically the moment you hand-edit any item below; it
  is a status, not a button you click.

Open **Settings → Interface** to:

- Pick an **experience level**, which fills the checklists from each item's
  complexity and takes effect at once.
- Check or uncheck individual **data sources**, **plugins**, whole **menus**
  (Project, Edit, Add Data, Processing, Controls, Plugins, Help), and the items
  within the Project, Edit, Processing, Controls, Settings, and Help menus.
  Editing any item switches the selector to **Custom**.

The **Settings** menu itself, and its Language / Layout / Interface entries, are
always shown so the profile UI can never be hidden away.

## For administrators

A deployment can be pre-configured (and optionally locked) with an
`admin-profile.json` file. When present, it is applied on startup, the onboarding
wizard is skipped, and — if `lock` is set — the Interface settings are read-only.

### File location

- **Web / embed:** serve `admin-profile.json` from the application root (for the
  Docker/nginx build, the served document root). A missing file is ignored.
- **Desktop:** place `admin-profile.json` in the app config directory
  (`read_admin_profile` reads `<app_config_dir>/admin-profile.json`). The desktop
  file takes precedence over a bundled web file.

### File format

```json
{
  "enabled": true,
  "level": "intermediate",
  "lock": true,
  "hiddenDataSources": ["postgres", "video"],
  "hiddenPlugins": ["maplibre-gl-geoagent"]
}
```

| Field | Type | Meaning |
| --- | --- | --- |
| `enabled` | boolean | Whether filtering is active. Defaults to `true` for an admin file. |
| `level` | `"beginner" \| "intermediate" \| "advanced"` | Seeds the hidden lists from each item's tier. Optional. |
| `lock` | boolean | When `true`, users cannot change the profile from Settings. Removing the file (or serving one without `lock`) releases the lock on the next launch. |
| `hiddenDataSources` | string[] | Explicit data-source ids to hide. Overrides the preset when present. |
| `hiddenPlugins` | string[] | Explicit plugin ids to hide. Overrides the preset when present. |
| `hiddenMenus` | string[] | Top-level menu ids to hide (`project`, `edit`, `addData`, `processing`, `controls`, `plugins`, `help`). |
| `hiddenMenuItems` | string[] | Menu-item ids to hide (e.g. `processing.raster`, `help.diagnostics`, `controls.minimap`). |

Data-source ids are the catalog ids in
`apps/geolibre-desktop/src/lib/ui-profile.ts` (e.g. `vector`, `xyz`, `mbtiles`,
`postgres`). Plugin ids are the stable ids defined in
`packages/plugins/src/plugins/*` (e.g. `maplibre-gl-geoagent`). Menu and
menu-item ids are the catalog ids in the same `ui-profile.ts`
(`TOP_LEVEL_MENUS`, `MENU_ITEM_CATALOG`).

When a `level` preset is active, external/bundled drop-in plugins (which load
asynchronously after startup) are folded into the hidden set as they appear, so
a beginner profile keeps hiding advanced plugins even when they load late.
