Cheat sheet
The minimum that operates lumnik, on one page. Unknown word: glossary.
Stand it up
./deploy/selfhost/up.sh --build # first run writes .env with fresh secrets — BACK IT UP
curl -s http://localhost:8080/q/health # UP, or DOWN with the failing check named
./deploy/selfhost/logs.sh hub # follow the hub (see: Reading the logs)
Full walkthroughs: Deploy · Reading the logs.
The ten commands
| # | Command | What it does |
|---|---|---|
| 1 | lm login |
authenticate once; lm remembers the context |
| 2 | lm validate -f FILE |
dry-run a kind: Connector manifest: errors field by field. The other kinds have no dry-run: their apply checks first, and refuses rather than half-writes |
| 3 | lm apply -f FILE |
apply a connector manifest (upsert) |
| 4 | lm connector run NAME |
run it now |
| 5 | lm run list --connector NAME |
the run ledger — records in/out/skip at a glance |
| 6 | lm dlq list --run ID |
exactly which rows fell out, and why |
| 7 | lm entity apply -f FILE |
fuse sources into one canonical entity. A connector that feeds an entity cannot be deleted: lm entity delete NAME first |
| 8 | lm workflow apply -f FILE |
declare a lifecycle. It lists the status values your data holds and the manifest does not declare |
| 9 | lm ask --scope S "question" |
ask the data. It prints the answer, the rows and the SQL that ran; -o json gives the whole result. lumnik Pro |
| 10 | lm secret set NAME |
store a secret. It prompts, and shows nothing. lm secret set NAME - reads stdin, for a multi-line key or a script. No command prints a value back |
The full surface (sources, endpoints, mappings, tags, observations…) is in the CLI & TUI reference.
Command 5 is the screen you will read most. On every row, IN = OUT + SKIPPED:
$ lm run list
ID CONNECTOR ENDPOINT STATUS IN OUT SKIPPED DEAD-LETTERS STARTED ENDED
30b078c6 customers default Completed 12 12 0 0 2026-09-05 05:38 2026-09-05 05:38
f0466804 orders default Completed 10 8 2 2 2026-09-05 05:38 2026-09-05 05:38
3ccd21eb products default Failed 0 0 0 0 2026-09-05 05:38 2026-09-05 05:38
852771fa crm-contacts default Completed 5 5 0 0 2026-09-05 05:39 2026-09-05 05:39
Failedis the run itself (source unreachable, bad credentials):lm run get 3ccd21ebprints the reason.DEAD-LETTERSare rows set aside with their reason:lm dlq list.-
Stop a running run:
lm run cancel ID. It ends after the current batch of rows. -
Every
-falso takes-f -(stdin), and every listing takes-o json: Integration as code. - On the open edition, command 9 answers
Error: this hub's build has no Ask: …. See which edition you installed.
The TUI in six keys
lm with no arguments opens the TUI:
| Key | Does |
|---|---|
: |
command palette — :sources :runs :dlq :ask :inbox :outputs … |
r |
refresh |
d |
describe the selected row |
y |
yank the row to the clipboard |
? |
help |
q |
quit |
:runs, :dlq and :inbox live-update — you can watch a run while it happens.
The five addresses
| What | Where |
|---|---|
| Hub API | http://localhost:8080 — health at /q/health |
| Try the API | http://localhost:8080/q/swagger-ui/ — spec at /q/openapi, Postman recipe |
| Keycloak | http://localhost:8180/realms/lumnik |
| The PWA | http://localhost:8080/app/ |
| This documentation | docs.lumnik.io |
The three files
| File | Why it matters |
|---|---|
.env |
every secret of the stack. Losing LUMNIK_SECRET_MASTER_KEY makes stored secrets unrecoverable: back it up |
docker-compose.selfhost.yml |
the stack definition up.sh drives |
~/.lm/config.yaml |
lm's contexts (server, token, TLS trust) |
When it refuses
| You see | It means | Where to look |
|---|---|---|
Error: access refused (403): scope not granted |
your user holds scope roles, and this resource is in none of them | Scopes |
Je ne peux pas répondre à partir des données disponibles… from lm ask |
a guard refused rather than guess. The message says what to do next | When Ask refuses |
a run with SKIPPED > 0 |
rows counted and not written: filtered out on purpose, already present, or set aside. DEAD-LETTERS is the part set aside, with its reason |
Ingestion honesty |