Anthropic Sans, Serif, and Mono fonts for the DSH Web UI, with Source Han fallback for CJK.
Install
# from npm (prebuilt)
dsh plugin --profile web add dsh-anthropic-fonts
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:Isilsolme/dsh-anthropic-fonts
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
Apply Anthropic's typefaces to the DeepSeek Harness Web UI:
- Interface (sidebar, headings, buttons, settings):
Anthropic Sans Web Text - Model conversation (Markdown body / headings / tables):
Anthropic Serif Web Text - Code / code blocks:
Anthropic Mono Variable
CJK text falls back to the Source Han family (Noto Sans SC / Source Han Sans SC / Noto Serif SC), then to system fonts.
Fonts
Important: the plugin does not bundle fonts. The npm package does not ship font files; install the fonts below manually, then refresh / restart the web surface for the change to take effect.
The plugin references three Anthropic Latin typefaces (install them for the best English / code rendering):
| Font | Role | Where to get it |
|---|---|---|
| Anthropic Sans Web Text | Interface | Download from fonts/, or extract from a Claude app |
| Anthropic Serif Web Text | Conversation | Download from fonts/, or extract from a Claude app |
| Anthropic Mono Variable | Code | Download from fonts/, or extract from a Claude app |
Install: double-click each .ttf on Windows → Install; on macOS use Font Book. Then refresh / restart the web surface.
The fonts are proprietary to Anthropic, for personal use only, and are not covered by the MIT license (see the font notice in LICENSE).
Chinese needs no extra install — it falls back to the Source Han fonts (Noto Sans/Serif SC, Source Han), then to system CJK fonts.
Install
A standard dsh bundle plugin — the same shape as
dsh-whale-animation.
CLI (recommended)
Published on npm — install in one command:
dsh plugin --profile web add dsh-anthropic-fonts
or from GitHub:
dsh plugin --profile web add "github:Isilsolme/dsh-anthropic-fonts"
dsh plugin add runs pnpm add inside the profile and auto-appends the
bundle to dsh.profile.bundles. Restart the web surface afterwards.
⚠️ After installing the plugin you still need to install the font files manually (see "Fonts" above) — the npm package does not ship them.
Manual
// ~/.dsh/profiles/web/package.json
{
"dependencies": {
"dsh-anthropic-fonts": "^0.3.0"
},
"dsh": {
"profile": {
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"dsh-anthropic-fonts"
]
}
}
}
then:
cd ~/.dsh/profiles/web && pnpm install
For local development you can instead use
"dsh-anthropic-fonts": "link:C:/path/to/dsh-anthropic-fonts"to point at a local checkout.
Uninstall / toggle off
dsh plugin --profile web remove dsh-anthropic-fonts
(or remove it from dependencies and bundles, then pnpm install).
Restart to restore the default fonts.
Interaction with DSH's own font settings
DSH 0.2 added Text font / Code font fields under Settings → Appearance.
The plugin targets the empty (default) state of those fields: a value typed
there is written as an inline custom property on body, which outranks the
plugin's stylesheet, so body and code text fall back to your font (the
conversation serif is still owned by the plugin). Leave both fields empty to use
the plugin's typefaces.
Compatibility & permissions
| Field | Declared in | Value |
|---|---|---|
| DSH range (enforced by DSH) | engines.dsh |
>=0.1.0-rc.7 <0.3.0 |
| DSH range (docs / market display) | dsh.compatibility.dsh |
>=0.1.0-rc.7 <0.3.0 |
| DSH per release | dsh.compatibility.dshReleases |
see below |
| Node.js | engines.node |
>=22 |
| Profile | dsh.compatibility.profiles, dsh.client.platform |
web |
Since 0.2, DSH runs a compatibility preflight before starting a profile and
disables any plugin row whose engines.dsh (or @deepseek-ai/dsh* peer
range) is unmet. Declaring engines.dsh makes an out-of-range install fail
loudly instead of silently doing nothing.
dshReleases records every DSH release as compatible, incompatible, or
unknown. Only releases actually smoke-tested in a disposable profile are
marked compatible; releases covered by the range but not individually tested
stay unknown — a range is never presented as verified evidence.
Smoke-tested releases (disposable profile, DSH_HOME pointed at a temp
directory, never the real profile):
| DSH release | install | start | uninstall |
|---|---|---|---|
| 0.1.5-alpha.2 | ✅ | ✅ | ✅ |
| 0.1.5-rc.1 | ✅ | ✅ | ✅ |
| 0.1.5-rc.2 | ✅ | ✅ | ✅ |
| 0.2.1-rc.5 | ✅ | ✅ | ✅ |
0.2.1-rc.5 additionally got an in-browser acceptance check: computed styles were
read from the live page — interface --dsw-font-family resolves to Anthropic
Sans; the Markdown container, h1–h4, p, strong, em and tables resolve to
Anthropic Serif; inline code and code blocks resolve to Anthropic Mono — while
sizes, line heights and weights stay identical to the DSH defaults
(h1 21px/700/30px, body 14px/24px, tables 13px/22px, …).
How each release was checked:
DSH_HOME=/tmp/dsh-smoke dsh plugin --profile web add /path/to/dsh-anthropic-fonts # install
DSH_HOME=/tmp/dsh-smoke dsh --profile web --dump-config # entry anthropic-fonts in the composed tree
DSH_HOME=/tmp/dsh-smoke dsh --profile web --port 39123 --no-open # start, prints the served URL
DSH_HOME=/tmp/dsh-smoke dsh plugin --profile web remove dsh-anthropic-fonts # uninstall
Covered: dependency installed into the profile, bundle appended to
dsh.profile.bundles, bundle patch inserting entry anthropic-fonts (and not
disabled by the compatibility preflight), the web server binding and serving a
page whose boot payload registers dsh-anthropic-fonts/client.js, and full
removal of both the dependency and the bundle row. Not covered: an
independent security audit.
Permissions: the client half injects a single <style> element into
document.head; no file, network, command, or credential access. The host half
(lib/index.js) is empty.
After a new DSH release: re-run the four steps in a disposable profile, add that
release to dsh.compatibility.dshReleases as compatible, bump this plugin's
SemVer, and push.
How it works
Since DSH 0.2 the typography tokens come in two layers:
--dsh-font-family-{text,code}is the single source of truth (the Text font / Code font settings write exactly these);- the theme derives
--dsw-font-family/--ds-font-family-codefrom them onbody, and every other typography token references those two.
The plugin therefore overrides the --dsh-* layer. Writing only
--dsw-font-family stopped working in 0.2: the derivation rule on body
overrides the inherited :root value, which is why the plugin appeared to fall
back to the default fonts after the 0.2.1 update. 0.1.x has no --dsh-* layer
and reads --dsw-font-family directly, so both sets are written.
The serif conversation text comes from the Markdown shorthand tokens. In 0.2.x
Markdown body and headings use font: var(--dsw-font-markdown-h1) style
shorthands with the family already baked in, so the standalone
--dsw-font-markdown-*-font-family tokens are no longer read by any selector.
The plugin rebuilds those shorthands from the host's own -font-style /
-font-weight / -font-size / -line-height components, swapping only the
family: sizes, line heights and weights keep following DSH (including the size
settings), with DSH defaults as fallbacks so 0.1.x keeps working too.
The code font goes through --dsh-font-family-code / --ds-font-family-code;
the terminal font (--dsh-font-family-terminal) is out of scope.
The injected <style> is owned by the client fiber and removed on uninstall.
Structure
lib/index.js— host half (empty; the effect is browser-only)lib/client.js— client half (injects the font CSS variable overrides)cordis.patch.yml— bundle patch inserting the plugin rowfonts/— the three Latin font files
Credits
Font stack modeled on blaxisomu/typora_claude (Anthropic Web fonts for Latin, Source Han for CJK).
License
MIT
Links
More in this category
elysia395/dsh-wallpaper-engine★ 6657
Requires DeepSeek Harness 0.1.5-rc.1+ (DSH Desktop >= 2.0.7) and dsh-better-sidebar >= 0.19.0 - update both before installing or updating this plugin. Plays local Wallpaper Engine Video/Web wallpapers behind the chat, renders Scene wallpapers as extracted static frames, and adds content-rating/type filters, custom uploads and an iOS-style liquid-glass settings window.
Small-tailqwq/dsh-deep-whale#maid-atelier★ 3098
Whale-girl skin series for the DSH Web UI (maid-atelier).
Nwflower/dsh-claude-style★ 585
Claude Code Desktop look-and-feel for the DSH Web GUI — ivory/warm-black dual canvas, clay accent, three-font typography, permission segmented control and brand switcher, via CSS overrides and client DOM overrides.
d-dev0101/open-sea-skin★ 391
Realtime WebGPU ocean skin with quick controls for waves, daylight, glass opacity, and an automatic day cycle.
kingOfSoySauce/dsh-liang-skin★ 387
Adaptive reasoning slider skin that maps each model's available reasoning efforts onto a 0–30 visual intensity scale, with synchronized portraits, background, and interface colors.
RevolutionLA/dsh-dream-skin★ 301
One-command skin plugin: 8 original themes, translucent wallpaper with opacity/blur, per-user accent, and shareable theme-pack import/export, favorites and surprise-me — purely native on DSH's token system.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.