Skip to content

Config

The qialike config file, environment variables, updates, telemetry, colour depth, and terminal repaint behaviour.

qialike reads two configuration surfaces: its own JSON file for TUI preferences, and the harness settings sections (provider routes, the theme choice, the update switch). Everything lives under $DSH_HOME (default ~/.dsh).

~/.dsh/qialike.json

The file is JSON at $DSH_HOME/qialike.json. It is created and rewritten by the app as you use it; a missing or malformed file is treated as {} and never crashes the TUI.

~/.dsh/qialike.json
{
"resume_last": false,
"sidebar_mode": "auto",
"hidden_providers": ["my-gateway"]
}
KeyTypeDefaultMeaning
resume_lastbooleanfalseAuto-resume the newest session in the current directory on every launch.
sidebar_mode"auto" | "on" | "off""auto"Right-hand Steps panel: follow the terminal width (auto, ≥110 columns), always show, or always hide.
hidden_providersstring[][]Provider routes deactivated from the /models picker.

Precedence for a setting is: environment variable → config file value → built-in default — the environment wins. When a supported environment variable is set at launch, its value is also written back into the config file, so the choice persists for later runs without the variable.

qialike-update.auto

The automatic-update switch is a harness settings section in ~/.dsh/settings.yaml (registered by the updater, like qialike-theme:), not a key in qialike.json:

~/.dsh/settings.yaml
qialike-update:
auto: true # true (default) | false | "notify"
ValueMeaning
true (default)Check about a second after launch; patch releases are installed silently, while minor / major releases are announced in the status line only.
falseNo check at all.
"notify"Check and announce, never install.

QIALIKE_DISABLE_AUTOUPDATE=1 disables automatic updates globally, and QIALIKE_ALWAYS_NOTIFY_UPDATE=1 forces notice-only. Only a copy something owns is ever replaced — the curl installer’s ~/.dsh/bin (Linux/macOS) or an npm-installed one (Windows included). See Updates.

Environment variables

VariableEffect
DSH_HOMEThe harness home directory. Default ~/.dsh; this is where qialike.json, sessions, credentials, themes and logs live.
QIALIKE_RESUME_LAST1 / true / yes / on turns on auto-resume for every launch; 0 / false / no / off turns it off. Persisted into qialike.json.
QIALIKE_COLORForce a colour depth: 24bit (or truecolor), 256, or 16.
QIALIKE_NO_SYNC1 disables synchronized-output bracketing; frames are written plainly (see below).
QIALIKE_NO_PROJECT_OVERLAY1 ignores a repository’s .dsh/tui.cordis.patch.yml for one run.
QIALIKE_DSHPath to the dsh CLI used by qialike web.
QIALIKE_DISABLE_AUTOUPDATEAny truthy value (1 / true / yes / on) turns the automatic update check off entirely.
QIALIKE_ALWAYS_NOTIFY_UPDATEAny truthy value makes the updater announce new releases only — it never installs one, whatever qialike-update.auto says.
DSH_TELEMETRY_MODEDISABLED switches the harness telemetry off. Default mode is FEEDBACK_ONLY (see below).
DSH_TELEMETRY_DISABLEDAny non-empty value (including 0) switches the harness telemetry off.
DSH_PERMISSION_MODEThe startup sandbox mode: read-only, workspace-write (default) or danger-full-access.
DEEPSEEK_API_KEYThe key for the official DeepSeek endpoint (pick it in /models). Resolved from the environment, ~/.dsh settings, or a .env file.
BUN_JSC_collectContinuously1 makes Bun/JSC collect continuously, keeping RSS down on memory-constrained machines at the cost of more frequent GC.
COLORTERMSet to truecolor to tell qialike (and every other tool) that the terminal really is 24-bit capable.
DSH_HARNESSBuild-time only: path to the DeepSeek Harness checkout used by pnpm build (default ../deepseek-harness).

Additional QIALIKE_* switches exist for diagnostics and layout debugging. They are development aids rather than user settings, and their names and behaviour can change between builds.

Data and responsibility

What follows are the data flows qialike cannot decide for you but that you should know about.

  • What goes to the model provider you pick: every request sends the conversation to the provider selected in /models — your messages, the agent’s tool calls, and the tool results (the file contents the agent read are in there). Since qialike lets you choose among 62 providers, which privacy and retention policy applies depends on who you chose; qialike cannot make promises on their behalf — check the provider you selected.
  • The harness’s feedback-gated telemetry: the composed profile mounts session-telemetry-otel by default, in FEEDBACK_ONLY mode, against https://harness-telemetry.deepseeksvc.com/v1/logs. Nothing is uploaded by default — only a new explicit feedback event releases a bounded session prefix up to that event (which may contain message text, tool arguments and results, and workspace paths); ordinary requests, lifecycle events and stored feedback trigger nothing. Release is per provider: even on a third-party provider, the feedback still goes to the DeepSeek endpoint above. To disable it, set DSH_TELEMETRY_MODE=DISABLED, or set DSH_TELEMETRY_DISABLED to any non-empty value (including 0). qialike’s TUI does not wire up /feedback (the command registers against the harness’s commands service, which this surface does not consume), so there is currently no UI entry point that triggers it.
  • qialike itself: no analytics or telemetry of its own. It makes three kinds of outbound request — to the provider you configured (model listing and conversation requests), to GitCode / gitcode / qialike.cn when you run /upgrade (version check and download), and one automatic update check about a second after launch (disable with QIALIKE_DISABLE_AUTOUPDATE=1; see Updates). The API key never enters the transcript and is never sent to a model.

Memory and GC

The runtime is Bun/JSC, and it does not promptly return freed pages to the system, so RSS climbs slowly with use and then plateaus — that is the GC strategy, not a leak. The supported relief valve on a memory-constrained machine is:

Terminal window
BUN_JSC_collectContinuously=1 qialike

Measured under the same load, enabling it keeps RSS flat or lower at the cost of more frequent GC. For the actual memory figures see Quickstart → Requirements.

Provider routes in settings

Routes created through /models → Add provider are written into the harness settings file under the qialike-llm: section (the dialog does this for you; edit it by hand only if you want to manage routes declaratively). Each route declares a base URL, the credential reference the key resolves through, and its model ids:

~/.dsh/settings.yaml
qialike-llm:
providers:
qialike:
displayName: qialike
baseURL: https://qialike.cn/bee/v1
apiKeyEnv: QIALIKE_API_KEY
models:
- id: deepseek-v4-flash
- id: glm-5.2

Keys themselves are stored in ~/.dsh/.credentials.yaml; a key present in the environment shadows the store and wins.

Themes and colour depth

Themes are hex-authored palettes. There are 16 built-in schemes: dark (the default, the DeepSeek Harness web dark tokens), light (the One Light palette), one-dark (Atom’s One Dark), and 13 classic skins (catppuccin, dracula, everforest, falcon, flexoki, gruvbox, jellybeans, kanagawa, nord, panda, rosepine, solarized, solarized-light), all MIT or permissively licensed. Bare /theme opens a picker with live preview; /theme dark, /theme <role> <hex> and user files in ~/.dsh/themes/*.json are also supported. The choice persists in the qialike-theme: settings section.

The number of colours the terminal can show is decided from the environment, and qialike adapts to it:

  • 24-bit — the authored hexes go out unchanged. Reality check: GNOME Terminal/VTE on Ubuntu 24.04 is 24-bit capable but exports no COLORTERM, so it falls back to 256 colours. Set COLORTERM=truecolor if you want the exact hexes (only that exact string, or TERM=xterm-kitty, is treated as 24-bit).
  • 256 colours — the palette is mapped by the app itself, snapping colours to the nearest palette entry and forcing the page, panel and composer fills onto distinct entries so the card never dissolves into the background.
  • 16 colours — degraded by design: the card and the page are both black on a dark scheme because the palette has no second near-black to offer. Useful to preview a low-colour terminal.

Force a depth for one run without touching the terminal’s environment:

Terminal window
QIALIKE_COLOR=24bit qialike
QIALIKE_COLOR=256 qialike

Frame repaints and synchronized output

Every frame hides the hardware cursor for the paint and ends with a suffix that restores the caret’s shape and position, so the cursor is never dragged visibly across the rows a repaint touches. Each frame is also bracketed by the terminal’s synchronized output mode (ESC[?2026h … ESC[?2026l). A frame is a full-width repaint — opening the command palette measures ~5.5 KB at 120×30 and ~7.4 KB at 240×30 — and a pty hands writes larger than its ~4095-byte line-discipline buffer to the terminal in instalments, so without the mode a half-painted frame can be briefly visible.

Terminals that do not know the mode ignore it. If yours mishandles it, opt out:

Terminal window
QIALIKE_NO_SYNC=1 qialike