WayJ/dsh-work--plugins-brand-profile ↗★ 0
brand-profile
DSH Web GUI brand customization: configure the sidebar brand mark/name, the new-session hero logo & headline, the running-turn thinking label, and the browser tab title from a General Settings row.
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:WayJ/dsh-work#fc381507d1a812baf4387d824c6aaf3962941cb3&path:plugins/brand-profile说明文档
阅读完整 README ↗description: "brand-profile: configurable brand surfaces for the dsh Web GUI — sidebar mark/name, hero mark/headline, thinking label, and tab title, edited from a General Settings row." kind: "package-reference"
brand-profile
中文 | English
Overview
brand-profile is a dsh Web GUI plugin that makes every user-visible brand surface configurable from one Settings → General card:
| Field | Surface | When empty |
|---|---|---|
| Brand name | Sidebar brand wordmark (expanded row) | official brand name |
| Logo type + image URL / emoji | Sidebar brand mark (expanded + collapsed rail) and the new-session hero mark | official whale logo |
| New-session headline | Blank-session hero headline (default 探索未至之境 / Into the Unknown) | official headline |
| Thinking label | Running-turn status text (default 深度求索中... / Deep diving...) | official label |
| Browser tab title | document.title | unchanged |
| Browser tab icon | favicon follows the logo: image URL used directly; emoji rasterized to a 64px PNG | official icon |
All values persist in the durable brand-profile settings namespace (~/.dsh/settings.yaml) and take effect immediately — no restart. The logo emoji is picked from a popup category grid (8 curated categories, zero dependencies, with a "not set" clear entry); click the current emoji to open it.
Package layout
Mirrors the official packages/client/* plugin layout:
src/index.ts— host half: registers thebrand-profilesettings namespace.src/schema.ts— schemastery durable schema (node half only; the browser bundle never depends on schemastery).src/brand-settings.ts— shared field names, types, defaults, and the official-text table.src/client/index.ts— browserapply: locale dictionaries, the settings card, brand slot occupants, and the DOM fallback injector.src/client/policy.ts— live config snapshot store with durable write-through.src/client/components.tsx— slot occupants (sidebar/hero mark, brand name).src/client/settings-row.tsx— the General Settings card.src/client/emoji-data.ts+src/client/emoji-picker.tsx— the logo-emoji popup picker (curated catalog + panel component).src/client/dom-injector.ts— MutationObserver text replacement + tab title + favicon sync.src/client/locales.ts— typed zh/en dictionaries.build.mjs— esbuild build replicating the unpublished officialclientBundlepreset:lib/index.js(ESM host bundle) andlib/client.js(window.__ModuleLoader__.load({ id, factory })lazy-CJS, bare specifiers external for the shell module table).
How it works
- The sidebar brand seats are the official
sidebar.brand.mark/sidebar.brand.nameUI slots (kindsingle; lowest priority renders). This plugin registers occupants atpriority: -10to shadow the official build (which sits at0). Empty config disposes the occupants, restoring official branding untouched. - The new-session hero logo rides
conversation.hero.brand.mark. - The thinking status and hero headline are rendered through official locale dictionaries with no provider seam, so a MutationObserver replaces those exact rendered text nodes (zh and en both matched), following the proven
ui-status-labelapproach.
Install
dsh plugin --profile web add
or from the harness checkout CLI:
node apps/cli/lib/bin.js plugin --profile web add
Restart dsh web (or refresh), then open Settings → General and find the brand card at the bottom. After editing sources, rebuild with node build.mjs and restart.
Remove
dsh plugin --profile web remove brand-profile
Model experience
None. The plugin is browser-side branding chrome plus one durable settings namespace; it registers no model-facing surface and sends no provider requests.
KV cache impact
None; the plugin neither assembles nor sends provider requests.
Known limitations and deferred work
- The DOM text injector matches the exact official zh/en strings listed in
src/brand-settings.ts; an upstream rewording stops the override silently until the table is updated. - Logo images load from the browser (URL or data URI); no host-side file route is provided yet.
MIT License