Quickstart — the customer's data in minutes
Quickstart
Install lm, log in, load one export, show the rows, ask a question.
1. Install lm
Take the archive for your platform from the Releases page. There are five: macOS (Intel, Apple Silicon), Linux (x86-64, arm64), Windows x86-64.
shasum -a 256 -c lm_<version>_checksums.txt --ignore-missing # check the download first
tar -xzf lm_<version>_darwin_arm64.tar.gz # your platform's archive
install -d ~/.local/bin && install -m 0755 lm ~/.local/bin/lm
- Windows: the archive is a
.zipwithlm.exe. Unpack it into a folder on yourPATH. - From source (Go 1.26+):
cd lm && make install. - The shell cannot find
lm? Add~/.local/binto yourPATH.
Check it:
$ lm version
lm version dev (commit 94ae18cc9667, built from 2026-10-19T05:34:15Z)
A downloaded binary prints its release number instead of dev. Put this line in a bug report.
2. Log in
lm config set-context selfhost --server http://localhost:8080 \
--oidc-issuer http://localhost:8180/realms/lumnik
lm config use-context selfhost
lm login
lm login prints a link and a code, then waits. Open the link in a browser. Sign in as
integrator: the password is INTEGRATOR_PASSWORD in .env. The terminal then finishes:
$ lm login
To sign in, open:
http://localhost:8180/realms/lumnik/device?user_code=EYQP-LLJN
and enter code: EYQP-LLJN
Waiting...
Logged in to lumnik Open Edition.
On a Pro hub, the last line reads Logged in.
Check the round trip. On a fresh hub, the table is empty:
$ lm connector list
NAME TYPE TENANT SCHED WINDOW STATUS LAST RUN
3. Load the export
The customer hands you stock.csv:
sku,label,qty,warehouse
PMP-100,Pompe doseuse,12,Lyon
VAN-200,Vanne papillon,0,Lyon
FLT-300,Filtre a cartouche,40,Grenoble
One command loads it, in a scope you name:
$ lm csv ingest stock.csv --scope retail --name stock-count
Ingested stock.csv into ext.stock_count
• rows written: 3
• promoted cols: 4
- sku (text)
- label (text)
- qty (bigint)
- warehouse (text)
• askable: scope 'retail' — try: lm ask --scope retail "how many rows are in ext.stock_count?"
A dormant connector is registered — see `lm connector list`.
qtyholds numbers only, so it lands as a number. The other columns land as text.-
On lumnik Open, the last two lines read:
A one-shot: no run recorded, nothing indexed for chat. The rows are in ext.stock_count, and a dormant connector is registered — see `lm connector list`. -
The load runs once. Nothing runs again on its own.
4. Ask a question (Pro)
Ask in the scope you named:
$ lm ask --scope retail "quels articles ont une quantité à zéro ?"
Les articles ayant une quantité à zéro sont :
- SKU : VAN-200
Libellé : Vanne papillon
SKU LABEL
VAN-200 Vanne papillon
1 row returned
SQL: SELECT "sku", "label"
FROM "ext"."stock_count"
WHERE "qty" = 0
LIMIT 500
- The rows and the SQL always come with the answer. Show them to the customer.
- Use the words of the data. « Quels articles sont en rupture de stock ? » is declined: no column says "rupture". « Quantité à zéro » names the column, and works.
- Without
--scope, the question goes to your default scope, where this file is not. - On lumnik Open,
lm askanswersError: this hub's build has no Ask: …. On Pro with the AI switched off, it answersError: this hub has the AI switched off ….
Why Ask declines, and what to do: When Ask refuses.
5. Take it back off
$ lm connector delete stock_count --dry-run
Would delete connector stock_count (csv-file) — 3 rows of ext.stock_count, its run history and RAG chunks (dry run, nothing deleted)
Without --dry-run, lm asks you to type delete. Any other answer deletes nothing. A script
passes --force.
Next
- Make it recurring: a
csv-fileconnector reads the export on a schedule: CSV & files. Give its manifest the namelm connector listshows:--name stock-countwas registered asstock_count. Thenlm connector resume stock_count. - Another source: Other first sources — an API, SFTP, S3.
- The full demo, with two sources fused into one customer: The WOW.
What makes a scope answerable
Ask needs to know a scope's tables. A connector run, a one-shot load or an entity apply tells it, with nothing to configure. See what Ask knows of a scope:
lm source schema --scope retail
Empty, or not found? Rebuild it with lm source rediscover --scope retail, then ask again.
Troubleshooting
| You see | Do this |
|---|---|
Error: API error 401 … on every command |
Your session ended. Run lm login again. |
Error: access refused (403): scope not granted |
Your account holds scope: roles, and not this one. Use a scope you hold. |
Error: this hub's build has no Ask … or Error: this hub has the AI switched off … on lm ask |
lumnik Open, or the AI is off. See The two editions. |
| Ask declines a question | Rephrase it with the words of your columns. Check lm source schema --scope <tag>. |
A second connector appears after lm apply -f |
metadata.name differs from the registered name. Delete the duplicate, re-apply under the name lm connector list shows. |