DSH Plugins Marketplace

DSH Plugins

Plugins

/

UI & Experience

/

dsh-avatar-top

d

dsh-avatar-top

Manifest valid

Moves the sidebar account avatar out of the bottom strip with four placements, including a zero-height inline mode in the brand row, and three heights down to an avatar-only row, with adjustable spaci

UI (client)hasBundlePatch

dsh-avatar-top

English | 中文

Moves the left sidebar's account avatar (which is also the Settings launcher) out of the bottom strip, so the session list gains the space back. Placement, height and spacing are adjustable from a card on the Plugins page; inline brand row costs zero vertical space.

Tested against DeepSeek Harness 0.2.1-rc.2 (desktop, Windows).

What it does

DSH pins a footer at the bottom of the left sidebar: the account row (头像 + 账号名) sits next to sidebar.footer.action, where plugins such as dsh-cost-meter mount their own widgets.

This plugin moves only the account row:

  • The footer becomes display: contents, so its two children join the sidebar's flex column; the account row is then reordered while _footerActions keeps its default order and stays pinned at the bottom. (Moving the whole footer would drag other plugins' widgets along — that was a real bug in 0.2.1.)
  • Four placements: top, below the brand row, below New Session, or inline inside the brand row (Windows desktop; position: absolute at the free right end, zero vertical cost).
  • Three heights: full 44px, compact 32px, avatar only 28px (hides the account name and shrinks the avatar to 20px).
  • Spacing 0–24px, and an on/off switch that restores the stock layout without uninstalling.

Changes apply immediately — the browser half subscribes to the settings document and rewrites the stylesheet. Settings persist in the profile's cordis.patch.yml.

Settings

SettingValuesDefault
Enabledon / offon
Positiontop / below brand / below New Session / inline brand rowtop
Heightfull 44 / compact 32 / avatar only 28full 44
Spacing below0–24 px4
Restore defaultsbutton—

Install

dsh plugin add dsh-avatar-top

Restart DSH once after installing (the client bundle and package metadata are read at host start). Then open Plugins → dsh-avatar-top to configure it.

Git install works too, e.g. dsh plugin add git+https://github.com/<owner>/dsh-avatar-top.

Self-check: the plugin serves its current stylesheet at /dsh-avatar-top.css (public, read-only), so a wrong layout can be diagnosed without a session:

http://127.0.0.1:<dsh-port>/dsh-avatar-top.css

How it works

Injection channel

The Host contributes one structured style row through webserver/index-inject:

ctx.on('webserver/index-inject', (table) => {
  table.push({ kind: 'style', text: cssFor(readOptions(config)) })
})

Both shells render that row:

ShellWhere the page comes fromHow the row arrives
Browser / dsh webthe SPA dist server answers the index over HTTPrenderIndex() renders the rows into the HTML
Desktop appElectron serves dsh-web-frontend/dist/index.html itself over its dsh-app:// schemethe Host's injection table is handed to the page over IPC after startup; the page-side interpreter appends style rows to <head>

ctx.webServer.tapIndex() would only cover the HTTP shell; the desktop window never calls it.

The desktop snapshot is taken at Host start, so the browser half also applies the stylesheet live (<style id="dsh-avatar-top-live">, appended after the boot row, so it wins) and the boot row only prevents a flash on first paint.

The rule

The sidebar is a flex column; placement is pure order, and selectors key off the stable CSS-module class-name suffixes (_root, _footArea, _settingsArea, _trigger, _label, _avatar, _logoRow, _newSession, _panelList) rather than the per-build hash prefix.

html:not([data-platform='darwin']) [class*='_root']:not([class*='_collapsed']) > [class*='_footArea'] {
  display: contents;
}
… > [class*='_footArea'] > [class*='_settingsArea'] {
  order: -1;
  margin-bottom: 4px;
}
  • macOS keeps its traffic-light strip layout (:not([data-platform='darwin'])).
  • Collapsed rails are left untouched (on Windows the footer is display:none there anyway).
  • inlineBrand lifts the button out of the flow (top: 8px; right: 12px; z-index: 3) and forces the avatar-only shape. On non-Windows shells it falls back to top.

Settings plumbing

Config declares four volatile() fields (user settings, not deployment config), so the Host serves the avatar-top namespace (the loader row id). The browser half binds it through ctx.configForms.get('avatar-top'), writes through config.set() / config.unset() (which reach remote.settings.mutate), and registers its card into the plugins.bundle.config keyed slot under the package name.

Known limits

  • Only the account row moves. Plugins that mount into sidebar.settings (instead of sidebar.footer.action) would ride along; no shipped plugin does that today.
  • Layout depends on ui-sidebar's flex column. If upstream switches the footer to absolute positioning or moves it out of the column, the rules become no-ops (no errors, no misplacement).
  • inlineBrand needs the Windows titlebar (html[data-windows-titlebar]), where the collapse toggle lives in the native titlebar. Elsewhere it falls back to the top placement.
  • The diagnostics route is public and read-only; it returns this plugin's CSS text only.

Development

npm install      # @deepseek-ai/schemastery, for the tests' host-side import
node --check lib/index.js
node --check lib/client.js
npm test

The smoke test covers the schema defaults and rejections, volatile-ref and plain-value inputs, the full placement × height × spacing matrix, row de-duplication, the diagnostics route, a regression assertion that _footerActions is never reordered (so cost meters and friends stay at the bottom), and byte-equality of the two CSS generators across 120 option combinations.

lib/client.js is a hand-written bundle in the DSH client-module format (window.__ModuleLoader__.load); it has no build step.

License

MIT

Comments

Loading…

Similar plugins

dsh-accountDisplayName-edit

Replaces the sidebar account label (the phone number, email, or account name) and avatar with your own text and image, chosen in one dialog opened from a new row in the account menu, so screenshots do

UI & ExperienceTerminal & ClientsManifest valid

★ 0

MIT

JavaScript

dsh plugin --profile web add dsh-accountdisplayname-edit

by Rabbit-bot-No-002

Adds an avatar to the left of each turn's final AI reply and to the right of each user message; upload your own image and set its size and circle or square frame.

UI & ExperienceDevelopment & InfrastructureManifest valid

★ 1

↓ 376/wk

MIT

TypeScript

Sep 11, 2026

dsh plugin --profile web add dsh-chat-avatar

by 7gzgn

Describe the persona you want and the agent writes it: nickname, bio, taglines and links come from the host model, the avatar comes from your local asset library (or a path you give), then it fills yo

Tools & CapabilitiesManifest valid

★ 0

MIT

JavaScript

Oct 18, 2026

dsh plugin --profile web add dsh-profile-stylist

DSH sidebar footer ordering: forces the sidebar.footer.action slot into a vertical stack and lets users configure the top-to-bottom order of its entries.

UI & ExperienceTerminal & ClientsManifest valid

★ 0

dsh plugin --profile web add @choi-p/dsh-footer-order

Makes the DSH Settings dialog resizable from its edges and corners and movable by its top strip, remembering the chosen size across opens.

UI & ExperienceManifest valid

★ 0

dsh plugin --profile web add dsh-resizable-settings

by clown139880

Live2D avatar stage and desktop companion for DSH: bundled Haru sample, custom Cubism 2/3+ model loading with scale and position controls, a draggable in-page pet, an optional transparent always-on-to

UI & ExperienceManifest valid

★ 0

↓ 367/wk

MIT

TypeScript

Sep 28, 2026

dsh plugin --profile web add dsh-live2d-avatar