Configuration¶
landschaft.config.json holds every dashboard. The Settings page edits it through the API;
the file is plain JSON you can also edit by hand (it is validated on load and on save):
{
"dashboards": [
{
"id": "main",
"name": "Main",
"repos": ["owner/repo", "owner/other-repo"],
"scope": "mine",
"epicLabel": "epic",
"sort": { "by": "updated", "dir": "desc" },
"refreshMinutes": 5,
"swimlanes": [
{ "id": "high", "name": "High priority", "labels": ["prio:high"], "hideBlocked": false },
{ "id": "normal", "name": "Normal", "labels": ["prio:normal"], "hideBlocked": true },
{ "id": "rest", "name": "Unprioritised", "labels": [], "hideBlocked": true }
],
"columns": [
{ "id": "backlog", "name": "Backlog", "labels": ["backlog"] },
{ "id": "ready", "name": "Ready", "labels": [] },
{ "id": "doing", "name": "In progress", "labels": ["phase:doing"] },
{ "id": "review", "name": "In review", "labels": ["phase:review"] },
{
"id": "stuck",
"name": "Review blocked",
"labels": ["phase:review", "wait"],
"match": "all"
}
]
}
]
}
Dashboard¶
| Field | Type | Default | Meaning |
|---|---|---|---|
id |
[a-z0-9_-]{1,32} |
required | In the URL (/d/:id); immutable once saved |
name |
string | required | Shown in the header |
repos |
owner/repo[], at least one |
required | Repositories whose open issues appear |
scope |
"mine" | "all" |
"mine" |
mine: issues you created or are assigned to (the token's account) |
epicLabel |
string | none | Issues with this label form the epic strip above the board |
sort |
{ by: created\|updated, dir: asc\|desc } |
{ "by": "updated", "dir": "desc" } |
Default card order; the URL can override it |
refreshMinutes |
1–1440 | 5 |
Background sync interval; the smallest across dashboards wins per repo |
swimlanes |
Swimlane[], at least one |
required | Rows |
columns |
Column[], at least one |
required | Columns |
Swimlane and column¶
| Field | Type | Default | Meaning |
|---|---|---|---|
id |
[a-z0-9_-]{1,32} |
required | Unique within its axis; used in the move API |
name |
string | required | Header text |
labels |
string[] | [] |
Labels this entry matches; empty = catch-all |
match |
"any" | "all" |
"any" |
any: at least one of the labels; all: every one of them |
hideBlocked |
boolean (swimlanes) | false |
Drop issues with at least one open blocker |
Rules the validator enforces: ids are unique per axis and across dashboards, and each axis has at most one catch-all. See How the board works for what the labels do.
Files and environment¶
| What | Where |
|---|---|
| Dashboards | ./landschaft.config.json (LANDSCHAFT_CONFIG overrides) |
| Issue cache | ./landschaft.db (LANDSCHAFT_DB overrides), git-ignored |
| Token | GITHUB_TOKEN, else gh auth token |
Paths are relative to the directory the command runs in. Saves go through a temp file and a rename, so a crash never leaves a half-written config.