Choosing what your hub offers
The same hub can show a warehouse team two tabs and a sales team four, run with the AI switched off for a client who forbids a model, or carry Search when it was built in. Four questions, asked in order, decide what a business app shows — and each has one gesture.
| Who | the integrator installing or tuning a hub |
| Gestures | the image you deploy, one environment variable, one line in a kind: App manifest — and, for Search, a kind: SearchIndex |
| See the result | lm module list, then the app itself |
| Edition | both — what differs is which answers are possible (Open vs Pro) |
The four questions
- Questions 1 to 3 decide whether a tab is on an app.
- Question 4 decides whether it is worth showing. Search checks it before it appears. Fiches opens anyway, and says what is missing.
- Read them top to bottom. When something is missing, the first no is your answer.
flowchart LR
a["1. Is it in the build?"] --> b["2. Is it switched on?"] --> c["3. Does the app ask for it?"] --> d["4. Is it ready to be used?"]
d --> tab(["the tab is there"])
| # | Question | Who decides | Your gesture | Where you look |
|---|---|---|---|---|
| 1 | Is it in the build? | the image you deploy | pick Open or Pro; add a Search provider when you build the hub | lm module list |
| 2 | Is it switched on? | the operator | LUMNIK_AI_ENABLED=false turns the AI family off; absent means on |
lm module list |
| 3 | Does the app ask for it? | the app's kind: App manifest |
spec.tabs: [...]; leave it out to take everything the hub offers |
lm app apply |
| 4 | Is it ready to be used? | the feature itself | for Search, declare a search index the user may read | the tab, and lm search status |
The tabs and who brings them:
| Tab | Shown as | Brought by | Needs |
|---|---|---|---|
fiches |
Fiches (the records) | every hub | a saved view for the app's scope (without one the tab opens and says so) |
inbox |
Décisions (the inbox) | every hub | — |
chat |
Chat | Pro (rag + llm) |
the AI switched on |
search |
Recherche (Search) | a Search provider (search_pg or search_opensearch) |
a search index the user may read |
1. Is it in the build?
What the image carries is fixed when the hub is built. No setting adds a module that is not there. Ask the hub what it carries:
$ lm module list
NAME VERSION SCHEMA STATUS REASON
core 0.1.0 Platform ACTIVE
identity 0.1.0 Identity & Tenancy ACTIVE
llm 0.1.0 Model provider ACTIVE
rag 0.1.0 Platform RAG ACTIVE
That is a Pro hub: llm and rag are there, together. An Open hub lists core and identity only —
it has no Chat tab to offer, and nothing to switch on:
$ lm module list
NAME VERSION SCHEMA STATUS REASON
core 0.1.0 Platform ACTIVE
identity 0.1.0 Identity & Tenancy ACTIVE
Search is added when you build the hub: the published image never carries a provider. See
Deploy (up.sh --search or --search-cluster, closed edition) and
choosing a provider. The provider then appears in the list:
$ lm module list
NAME VERSION SCHEMA STATUS REASON
core 0.1.0 Platform ACTIVE
identity 0.1.0 Identity & Tenancy ACTIVE
llm 0.1.0 Model provider ACTIVE
rag 0.1.0 Platform RAG ACTIVE
search_pg 0.1.0 PostgreSQL search ACTIVE
No lm command prints which tabs each module brings. The platform API does, with an integrator
token (mint $TOKEN). The hub offers the tabs of the active
modules — here a Pro hub with the AI switched off:
$ curl -s http://localhost:8080/api/platform/modules -H "Authorization: Bearer $TOKEN" \
| jq -c '.modules[] | select((.tabs|length)>0) | {id, active, tabs}'
{"id":"core","active":true,"tabs":["fiches","inbox"]}
{"id":"rag","active":false,"tabs":["chat"]}
A Search provider adds {"id":"search_pg","active":true,"tabs":["search"]}.
2. Is it switched on?
One setting switches off the whole AI family, without rebuilding: LUMNIK_AI_ENABLED=false.
Chat, ask, view generation and embeddings stop.
- The gesture per install: Deploy — switch the AI off.
- The value must be exactly
trueorfalse. Anything else stops the hub at startup. - What you see, and what keeps running: Switching the AI off.
The module list tells the difference between switched off and not there:
$ lm module list
NAME VERSION SCHEMA STATUS REASON
core 0.1.0 Platform ACTIVE
identity 0.1.0 Identity & Tenancy ACTIVE
llm 0.1.0 Model provider INACTIVE disabled:lumnik.ai.enabled
rag 0.1.0 Platform RAG INACTIVE disabled:lumnik.ai.enabled
- Inactive (Pro, switched off): the data is kept, and the image is the same. Putting the setting back restores what you had.
- One exception: content that needed indexing while the AI was off is not there when it returns. Re-apply the workflow or re-ingest the file (what comes back).
- Absent (Open): the module is not in the build, so it is not in the list at all.
Either way, the Chat tab is gone from every app. Search is not part of this switch: it stays exactly as it was.
3. Does the app ask for it?
Each business app is a kind: App manifest. Without tabs it shows everything the hub offers (and
whatever a later release adds). To show fewer tabs, or to change their order, list them:
kind: App
apiVersion: apps.lumnik.io/v1
metadata:
name: stock
spec:
title: Stock
scope: stock
icon: stock
tabs: [fiches, inbox] # no Chat for the warehouse
$ lm app apply -f stock.yaml
Applied app "stock" → scope stock
tabs: fiches, inbox
A tab the hub does not offer is kept, and shows up the day the hub offers it. The apply warns
without failing — here tabs: [fiches, inbox, chat] on a hub without Chat:
$ lm app apply -f stock.yaml
Applied app "stock" → scope stock
tabs: fiches, inbox, chat
! stock.yaml — 0 error(s), 1 warning(s)
WARN spec.tabs[2]
tab 'chat' is not offered by this hub; the declaration is kept and takes effect when a module offering it is active
→ offered here: [fiches, inbox]
The last line is the hub's offer. Order, the opening tab and what is refused: Choosing the tabs.
Hiding a tab hides it, nothing more: who may read what is still decided by roles and scopes.
4. Is it ready to be used?
| Tab | Ready when | Check |
|---|---|---|
| Fiches | a saved view exists for the app's scope (otherwise the tab opens and says so) | lm view list --scope <app scope> |
| Search | the user may read a search index (otherwise the tab is not shown) | lm search status |
Search's full checklist: Enabling Search for an app.
Is Search installed at all? The TUI's :search page says so in its banner. On a hub without a
provider, a query is refused, never answered with an empty list:
$ lm search query "Lyon"
Error: search is not installed on this hub — no Search provider is built into it, so there is nothing to query (this is not an empty result). The published hub image never carries one: build it from source with deploy/selfhost/up.sh --search (PostgreSQL) or --search-cluster (OpenSearch), both closed edition
Recipes
A warehouse app with no Chat, on a Pro hub. Question 3 only: tabs: [fiches, inbox] in the app's
manifest, then lm app apply -f. The other apps keep their Chat.
A client who forbids a model on their hub. Question 2: switch the AI off. Every app loses its Chat tab at once, with no manifest change. The rest of the hub is untouched, Oracle, SCIM and Search included.
Search in one app, but not the others (questions 3 and 4, here for the stock app):
- In the
stockapp's manifest, listsearchintabs;lm app apply -f. - In each
kind: Entityto search, setscopes: [stock](the entity'sscopeslist — not the app'sscope, not the users'scope:<tag>role);lm entity apply -f. - Declare a search index over those entities:
lm search apply -f. - Give every other app a
tabslist withoutsearch. An app that leavestabsout shows Search to any user who may read some index.
No results on every search
An app whose scope has nothing indexed still shows Search when its users can read another scope's
index — and every search answers No results. Check lm search status when a team expects hits.
When a tab is missing
Go down the questions; stop at the first one that answers no.
| What you see | Look at | Likely answer |
|---|---|---|
| No Chat tab on any app | lm module list |
llm and rag missing: this is an Open build. Listed INACTIVE with disabled:lumnik.ai.enabled: switch the AI back on. |
| No Search tab on any app | lm module list |
no search_pg / search_opensearch: the hub was built without a Search provider. |
No Search tab, yet search_pg is ACTIVE |
lm search status |
no kind: SearchIndex is declared yet (the list is empty), or the users may read none of the entities the indexes cover. |
| Search missing on one app only | that app's manifest | tabs leaves out search; or its users hold scopes that read none of the indexed entities (compare each entity's scopes with their scope:<tag> roles). |
| Search there, but always No results | lm search status |
the index is not built yet (STATUS, DOCUMENTS). |
… and STATUS reads invalid |
lm search status |
an entity re-apply removed a column the index declares — re-apply the index. |
… and STATUS reads withheld |
lm search status |
an index re-apply removed or changed a field — it serves again once rebuilt. |
| … and the index is ready | lm search status |
no index covers the entities of the app's scope. |
A tab listed in tabs does not show |
lm app apply -f again |
the hub does not offer it (question 1 or 2): the apply warns. The warning reflects the offer when you apply; the tab appears once the hub offers it. |
| Chat tab present, answers fail | lm rag status |
the tab shows whenever rag and llm are active; a model that is not reachable is a different problem (models). |
See also
- The two editions — what Open and Pro each carry
- The PWA — the tabs, from the user's side
- Switching the AI off — the full effect, and what it restores
- Declare a search index · Query it