DeepSeek Harness DSH config files: settings.yaml, $DSH_HOME

Configuration & UsagePublished 2026-09-10Author: DeepSeek Plugin Market
DeepSeek HarnessDSH pluginconfig filesettings.yamlDSH_HOME
DSH config files live under $DSH_HOME (default ~/.dsh): global settings in settings.yaml, credentials in .credentials.yaml. Learn the paths and layering.

DeepSeek Harness keeps all user-level configuration under $DSH_HOME (default ~/.dsh): global settings in settings.yaml, credentials in .credentials.yaml, and a package.json plus cordis.patch.yml per profile. Three patch layers stack from there, and --dump-config shows the merged result without starting anything — so this covers where the files are, what overrides what, and how to check.

Where DeepSeek Harness config files are: $DSH_HOME, settings.yaml and profiles

The user-level configuration root of DeepSeek Harness is $DSH_HOME, defaulting to ~/.dsh when the variable is unset; global settings, credentials, profile directories and skills/ all live beneath it (source). Five steps to see the whole layout:

  1. Locate $DSH_HOME — run echo $DSH_HOME in a terminal. Expected: if it prints a path, that is the root; if it prints nothing, you are on the default ~/.dsh.
  2. Read the global settings$DSH_HOME/settings.yaml, which holds model routing, image modality and gateway compatibility. Expected: the file may not exist yet; it appears once a matching feature writes it.
  3. Read the credentials file$DSH_HOME/.credentials.yaml, holding API keys and the browser session signing key. Expected: plaintext and sensitive, so never commit it to a repository.
  4. Read a profile directory$DSH_HOME/profiles/<name>/, containing package.json (out-of-tree plugin dependencies plus the dsh.profile manifest, the ordered bundles and the patchReload lifecycle) and cordis.patch.yml (your own patch layer). Expected: pnpm installs plugins into that profile's node_modules, so profiles never affect each other.
  5. Read the skill roots$DSH_HOME/skills is one of the six local skill roots (rank 400). Expected: anything placed there is discovered by the local provider, as detailed in installing DSH skills.

If you lose track of which layer does what, start with the overview how to configure DeepSeek Harness; workspace-specific directory choices are in configuring the workspace. Most day-to-day changes have a graphical home: plugin toggles, the log path and the npm mirror all live in the settings of DSH Plugin Hub, so you rarely need to hand-edit YAML.

Settings

DeepSeek Harness config layering: bundles, profile, home and --patch

The configuration tree starts from an empty root and stacks in order: each bundle's own patch → the profile cordis.patch.yml → the home-level $DSH_HOME/cordis.patch.yml → the overlay passed with --patch, with later layers sitting further out (source). Walk the layers in order:

  1. Innermost are bundle patches — the bundles listed in dsh.profile.bundles (such as @deepseek-ai/dsh-base or @deepseek-ai/dsh-web-app) resolve and stack first. Expected: this is the official default composition and needs no maintenance from you.
  2. Second is the profile patch$DSH_HOME/profiles/<name>/cordis.patch.yml. Expected: it affects only that profile, which suits switching a plugin on or off for one profile.
  3. Third is the home patch$DSH_HOME/cordis.patch.yml. Expected: every profile under that home picks it up, which suits global preferences.
  4. Outermost is the --patch overlay — passed on the command line at startup. Expected: a one-off override with the highest precedence, ideal for a quick experiment.
  5. Check patchReload for how changes landlive watches the profile and home patch files, while startup applies once at startup. Expected: with startup, an edit needs a process restart before it takes effect.
  6. Pick the right layer — one profile → layer two; all profiles → layer three; a temporary experiment → layer four. Expected: writing to the wrong layer is the number one cause of a change that seems to do nothing.

DeepSeek Harness config file missing: when files appear and how to check

Files such as settings.yaml may simply not exist yet — each is created on the first write by the matching feature; --dump-default-config and --dump-config inspect the merged configuration tree without starting the app (source). Work through this order:

  1. The file is absent — start dsh once and save the relevant setting in the UI. Expected: $DSH_HOME/settings.yaml gets created rather than sitting empty waiting for you to hand-write it.
  2. Even the directory is absent — double-check whether $DSH_HOME points somewhere else. Expected: the value printed by echo $DSH_HOME matches the directory you were browsing.
  3. A change does not take effect — check whether patchReload is live or startup, then whether the edit sits in a layer an outer one overrides. Expected: ruling out those two usually locates it.
  4. Inspect the merged result with dumpdsh --dump-config prints the actual merged configuration tree and dsh --dump-default-config prints the defaults. Expected: comparing the two separates what ships by default from what you changed it to.
  5. Confirm the plugin reached the profile — check the dependencies in $DSH_HOME/profiles/<name>/package.json and the node_modules beside it. Expected: a missing dependency means the install never landed, so go back to the plugin install flow.

DeepSeek Harness config caveats

  1. .credentials.yaml is sensitive: it holds API keys and the browser session signing key, so never commit it or share screenshots; deleting its session records and restarting revokes every browser session.
  2. Outer layers reach further: a home-level patch affects every profile under that home, so write at the profile level when only one should change.
  3. patchReload: startup needs a restart: not every patch edit hot-reloads, so confirm the lifecycle setting after editing.
  4. settings.yaml stores credential references: the secret itself lives in .credentials.yaml, so never paste a plaintext key into settings.
  5. A default is not the effective value: when in doubt, run a dump and read the output rather than recalling the layer order from memory.

The plugin toggles, log path and npm mirror all converge on the settings page of DSH Plugin Hub (dsh-plugin.org), so reach for the graphical surface rather than hand-editing YAML for those.

Sources: dsh CLI README (official repo), Configuring models (official docs), dshplugin/dsh-plugin-hub

FAQ

Where are the DeepSeek Harness config files, and why is there no settings.yaml on my machine?

DeepSeek Harness keeps user-level configuration under $DSH_HOME, which falls back to ~/.dsh when that variable is unset: global settings live in settings.yaml there and credentials in .credentials.yaml beside it. A missing file is normal — each one is created the first time the matching feature writes it, so start dsh once and save a setting once.

Where is the DeepSeek Harness cordis.patch.yml, and does every profile need one?

DeepSeek Harness puts the profile-level patch at $DSH_HOME/profiles/<name>/cordis.patch.yml, next to that profile's package.json, while the home-level patch is $DSH_HOME/cordis.patch.yml. Touch the first to change one profile, and the second only when every profile under the home should see the change.

Which DeepSeek Harness config layer overrides which, and is a change not taking effect a layering mistake?

DeepSeek Harness starts from an empty root and stacks in order: each bundle's own patch, then the profile cordis.patch.yml, then the home-level $DSH_HOME/cordis.patch.yml, then the overlay passed with --patch. Later layers sit further out, so a change that does not take effect was usually written in a layer an outer one overrides.

How do I inspect the merged DSH config without starting DeepSeek Harness?

DeepSeek Harness offers --dump-default-config and --dump-config, and both inspect the configuration tree without starting: the first prints defaults, the second prints the actual merged result. Run them after editing a patch instead of starting the app and guessing.

What is inside a DeepSeek Harness profile directory, and where do plugins end up?

Each DeepSeek Harness profile directory holds package.json — which records out-of-tree plugin dependencies along with the dsh.profile manifest, the bundles order and the patchReload lifecycle — and cordis.patch.yml for your own patch layer, while pnpm installs plugins into that profile's node_modules. Different profiles under one home therefore never affect each other.

Related Terms

$DSH_HOME
$DSH_HOME is the user-level root directory of DeepSeek Harness, defaulting to ~/.dsh when the variable is unset. Global settings.yaml, credentials in .credentials.yaml, every profile directory and skills/ all live beneath it, so user-level artifacts stay in one place.dsh CLI README
settings.yaml
settings.yaml is the global settings file of DeepSeek Harness, located under $DSH_HOME, where model routing, input modalities and gateway compatibility are configured; changes take effect on the next request without a restart.DeepSeek Harness official docs - Configuring models
cordis.patch.yml
cordis.patch.yml is the user patch layer of DeepSeek Harness, split into a profile level ($DSH_HOME/profiles/<name>/cordis.patch.yml) and a home level ($DSH_HOME/cordis.patch.yml), and it overrides bundles and defaults.dsh CLI README
--dump-config
--dump-config is a dsh CLI diagnostic flag that prints the merged configuration tree without starting the service; its companion --dump-default-config prints the defaults, and the pair separates what ships by default from what is actually in effect.dsh CLI README

Sources