dsh-accountDisplayName-edit
Manifest validReplaces 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
dsh-accountdisplayname-edit
Replaces the sidebar account label — the phone number, email, or account name DeepSeek Harness shows at the bottom-left — and the avatar above it, with a name and image you choose, so screenshots do not expose the original.
The edit entry is a new Edit display name row in the account menu, the one you open by clicking that label. The dialog it opens holds both the avatar and the name.
What it does
- Replaces the account label text in the sidebar footer with a display name you set.
- Replaces the launcher avatar with an image you pick from a local file.
- Adds an Edit display name / 编辑显示名称 row to the account menu, directly under Settings.
- Opens one editor dialog for both: pick or clear an avatar, type a name, then Save,
Cancel, or Use default.
Entersaves,Esccancels. - Both edits are drafts until Save — Cancel leaves the sidebar untouched.
- Saving an empty value restores the account's own text; clearing the avatar restores the account's own avatar.
- A picked image is centre-cropped square, downscaled to 128×128 and re-encoded, so the stored copy stays in the low tens of KB.
- Stores both per browser in
localStorage, underdsh.account-display-name-edit.aliasanddsh.account-display-name-edit.avatar. - Display only. The account, the credentials and the profile are never read or changed, and the plugin makes no network requests of its own.
Requirements
Built and verified against DSH 0.2.0-rc.2. The account launcher and Menu DOM it
targets — data-signed-out, the _avatar / _label spans, the portaled
div[role="menu"] with its role="presentation" viewport and itemIcon /
itemLabel rows — is unchanged in 0.2.1-rc.2, which this package was checked
against. The host half imports nothing and the browser half fails soft, so a build
whose DOM has moved on degrades to "no override, no extra row" rather than an error —
see Compatibility.
Install
From the desktop app
The desktop profile is managed exclusively by the Electron application, so install
it there through the app's own plugin surface (Settings → Plugins, or dshmarket);
the CLI refuses that profile by design.
From the CLI, for any profile the app does not own
dsh plugin --profile <profile> add github:AomiRaku/dsh-accountDisplayName-edit
There is no build step and no prepare script: the browser half is committed as
lib/client.js, so pnpm never asks for build approval and the install is a plain
file copy.
Manually, which is exactly what the commands above do
-
Put the package where the profile resolves its bundles —
<DSH_HOME>/profiles/<profile>/node_modules/dsh-accountdisplayname-edit. A directory junction/symlink to a checkout works. -
Add this to
<DSH_HOME>/profiles/<profile>/cordis.patch.yml:- insert: - id: account-display-name-edit name: dsh-accountdisplayname-editThat patch layer is watched, so it applies live — no restart needed.
Use
- Click the account row at the bottom of the sidebar.
- Choose Edit display name.
- Optionally click Choose image… and pick a PNG / JPG / WebP; the round preview shows the cropped result. Clear avatar goes back to the account's own avatar.
- Type the name you want. Save an empty value to go back to the account's own text.
- Click Save. Nothing changes until you do.
Uninstall
Remove the insert from cordis.patch.yml and delete the package directory. The
stored name and avatar stay in the browser's localStorage until you clear them; the
plugin writes nothing else.
How it works
A dual-face plugin whose host half does almost nothing.
- Host half —
lib/index.js. Deliberately import-free. Its only job is to be a Loader entry, so the host's client-module scanner readsdsh.clientfrompackage.jsonand serves./clientto the browser. With no dependencies and nopeerDependencies, it cannot fail to load because of a missing, renamed or version-mismatched peer package. - Browser half —
lib/client.js. A hand-written single-file bundle, already in thewindow.__ModuleLoader__.load({ id, factory })form the module system serves verbatim, so the package needs no build. It requires onlyreact, which the shell seeds as a platform module — which is whyreactis not a dependency either.
Why the menu row is done in the DOM
@deepseek-ai/dsh-client-ui-settings-account renders that menu from a hard-coded
items array, and its only slot (settings.launcher, a single slot) is the
launcher row itself. Occupying that slot would delete 设置 / 意见反馈 / 退出登录, which
this plugin must not do. There is no menu-item slot to add to.
So the row is appended to the open menu's list, cloned from a shipped row — it therefore inherits that build's exact markup, classes and styling. Appending one node leaves React's own children untouched, and the row is removed with the menu because React never tracked it.
Selectors use only stable identifiers, never a hashed CSS-module prefix:
- the launcher is
button[aria-haspopup="menu"][data-signed-out], an attribute the account component always writes; the text node is found by the_labelsuffix and the avatar by the_avatarsuffix, with positional fallbacks; - the menu is a
div[role="menu"]theMenuprimitive portals to<body>, identified as the one that appeared after the launcher was activated.
How the avatar is replaced
The avatar span's real contents are React's — an <img> or an initial. Rather than
remove them, the plugin paints the picked image as the span's background and
hides the span's children with one scoped rule:
[data-dsh-accountdisplayname-edit-avatar="1"] > * { display: none !important }
That is two attribute writes and a background image; no React-owned node is detached, re-parented or replaced, so a later account refresh cannot collide with it. Clearing the avatar removes the attribute and the background, and the real avatar reappears.
Failing soft
Every DOM probe runs inside try/catch; when a probe misses, the plugin does
nothing — it never edits another node and never throws into the shell's plugin
loader. Clearing the name hands the account plugin's own text back.
The label is written through React's own text node (nodeValue, not
textContent), so later account refreshes stay observable instead of updating a
node React no longer owns.
Compatibility
dsh.client.immediately: trueis required: the plugin works through side effects registered when its bundle materializes, so it belongs in the boot graph's immediate tier.- No
engines.dshrange is declared, on purpose. node-semver only admits a prerelease version when some comparator in the range shares its exactmajor.minor.patchtuple and itself carries a prerelease tag, so any range would silently exclude a later prerelease of the harness — the failure mode the awesome-dsh-plugin contributing guide warns about. Failing soft is the safer contract here.
Verification
npm install
npm test
116 checks against a real DOM (jsdom + React 18.3.1):
test/dom.test.mjs— 40 checks: the bundle wrapper contract,apply()registration, label replacement, re-application after the account half re-renders, menu-row injection (label, icon, dropped shortcut, insertion position, shipped rows untouched), row activation closing the menu and opening the dialog, save and reset, and disposal.test/robustness.test.mjs— 16 checks over the fail-soft paths: the account row gone entirely, the_labelclass renamed, the collapsed rail where the avatar is the only span, an English locale, a menu rendered before its rows exist, nodocument.body, the account span replaced by a React remount, and disposal after the account row was removed.test/avatar.test.mjs— 28 checks: a stored image painted on the launcher, the scoped stylesheet, the real avatar left intact, the dialog's file input and pick/clear controls, draft-vs-Save semantics for the avatar, a signed-out launcher without an avatar span, a corrupted stored value, and disposal. Picking a file itself is not exercised here: jsdom has no 2D canvas and never decodes images.test/edge-cases.test.mjs— 32 checks over the failure and teardown paths: a disable landing between two frames of the menu poll, a re-enable after a disable while the dialog was open, a name the browser refuses to persist, the collapsed rail before and after it expands, double disposal, re-applying, the menu closing through the launcher's own toggle instead of a document-wide Escape, the dialog's Tab containment and short-window scrolling, the click path performing zero document-wide queries while leaving the menu's own opening frame untouched, and a re-created label node, avatar node, or whole launcher button being repainted before the next frame (no flash).
It was also verified in a live DSH 0.2.0-rc.2: the host entry reached
fiberPhase: active, and the running Web GUI's slot tree listed the plugin's
shell.overlay entry as active, which means the host served the bundle and the page
materialized and ran it.
Store listing
The awesome-dsh-plugin entry is ready to copy:
store-entry/data/plugins/AomiRaku__dsh-accountDisplayName-edit.yml
-> data/plugins/AomiRaku__dsh-accountDisplayName-edit.yml
That one file, added to a fork of awesome-dsh-plugin, is the whole submission — do not edit the generated READMEs by hand.
Screenshots are optional. When you have them, add a screenshots.json next to
package.json listing 1–8 repository-relative image paths; storefronts show them in
that order and fall back to images in this README when the file is absent.
["assets/screenshot-1.png", "assets/screenshot-2.png"]
Known limitations
- The menu row and the avatar override depend on the shipped account-menu DOM. A future release that restructures it silently drops that part — nothing breaks, but the row or the avatar stops updating until this package follows the change.
- The name and the avatar live in this browser's
localStorage, so they are per-origin and not synced across machines. They never reach the account. - The avatar is stored as a 128×128 PNG data URL. A file over 10 MB, or an encoding that still exceeds the storage cap, is rejected with a message instead of being silently dropped.
- Only Simplified Chinese and English strings are bundled; the UI follows the client locale and falls back to Chinese.
License
MIT
Comments
Loading…
Similar plugins
by deepseekbluefish
WeChat-style in-app screenshot button: drag a region, fine-tune with 8 resize handles, Enter to capture and Esc to cancel; auto-numbered PNGs plus a [Shot N HH:mm] marker written into the composer. Wi
★ 0
MIT
PowerShell
Aug 24, 2026
dsh plugin --profile web add dsh-screenshot-pluginby 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.
★ 1
↓ 376/wk
MIT
TypeScript
Sep 11, 2026
dsh plugin --profile web add dsh-chat-avatarby johnoooooo
让 dsh 用独立的 OpenAI 兼容视觉模型读图:纯文本路由下粘贴图片自动改写为附件标记,聊天流内联显示图片(右对齐缩略图/点击放大/复制/拖拽),主对话历史只保留纯文本描述
★ 0
MIT
JavaScript
Aug 18, 2026
dsh plugin --profile web add dsh-view-imageby Link-h1j
DSH desktop right-sidebar infinite canvas: collect any opened image on one pannable board, annotate it, hand the notes to the Agent, and edit/generate with local ComfyUI.
★ 0
MIT
JavaScript
Oct 19, 2026
dsh plugin --profile web add dsh-image-canvasby PaoMoXML
dsh将非图片文件或文件夹以原生 @path 引用粘贴进聊天输入框,替代仅支持图片的报错。
★ 3
↓ 120/wk
MIT
JavaScript
Sep 4, 2026
dsh plugin --profile web add dsh-paste-namesby HsgtLgt
面向模型的「截图」工具插件(DeepSeek Harness,Windows 宿主)。 注册一个 screenshot 工具,让会话里的 AI 能真正「看见」并展示你的屏幕。
★ 0
MIT
JavaScript
Oct 8, 2026
dsh plugin --profile web add dsh-plugin-screenshot