Font system plugin: OFL webfont presets served offline from the plugin, user-imported custom woff2 fonts, and a ctx.fonts registry other plugins can extend.
Install
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:zhijun-dai/dsh-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. Only install sources you trust, and pin a commit (github:owner/repo#sha).
README
dsh-Fonts
A font system plugin for DeepSeek Harness — bundled OFL webfonts served offline, user-imported custom fonts, and a ctx.fonts registry other plugins can extend
English | 中文
Overview
DeepSeek Harness's web UI ships with system font stacks and no webfonts. dsh-Fonts turns fonts into a composable resource:
- Bundled presets: JetBrains Mono + Inter, Fira Code + IBM Plex Sans, and Cascadia Code pairings, all OFL-licensed and shipped with the plugin for offline use (no CORS issues)
- Custom import: enter a family name + woff2 URL in the settings panel to import your own UI/code fonts; the selection persists locally
- Plugin API: a
ctx.fontsregistry service — other plugins can register or consume font presets viactx.get("fonts")
Previews


Usage
A dual-face DSH plugin: the host half serves the bundled font files, the browser half provides the registry and the settings row. After installation, pick fonts in Settings → General → Font.
Install:
# GitHub
dsh plugin --profile web add github:zhijun-dai/dsh-Fonts
# local directory (the profile dir is a pnpm workspace root — -w is required)
dsh plugin --profile web add -w /path/to/dsh-Fonts
# npm
dsh plugin --profile web add dsh-fonts
Then restart dsh web.
Switching fonts: Settings → General → Font row — preset cards apply live; "Default" restores the system stacks.
Importing custom fonts: fill in the editor fields (UI font / Code font) and hit Add:
| Field | Meaning |
|---|---|
| Family | Any name used to reference the font in the stack (e.g. Inter) |
| woff2 URL | An http(s) direct link to the font file; it must be CORS-accessible (CDNs usually are) |
| Weight | 400 Regular · 500 Medium · 600 Semibold · 700 Bold — pick the weight your file actually is. Download pages usually label it: Regular=400, Bold=700. A wrong pick won't break anything, the UI just shows a browser-synthesized "fake bold" |
Example — importing Inter Regular from the Fontsource CDN as the UI font:
Family: Inter
woff2 URL: https://cdn.jsdelivr.net/npm/@fontsource/inter@5.3.0/files/inter-latin-400-normal.woff2
Weight: 400 Regular
It applies immediately and survives reloads; re-adding the same family+weight replaces the old entry, and Remove deletes it.
Plugin API
Other plugins consume the font service lazily via ctx.get("fonts") (cross-plugin require is a build error — module imports cannot be used):
// in your plugin's browser half
import type { FontPreset, FontRegistry } from 'dsh-fonts/client'
// register your own font preset
const dispose = ctx.get('fonts')?.register({
id: 'my-preset',
ui: ['My Font', '-apple-system', 'sans-serif'],
code: ['My Mono', 'monospace'],
faces: [{ family: 'My Font', weight: '400', src: ['https://example.com/my-font.woff2'] }],
})
// subscribe to snapshots
const off = ctx.get('fonts')?.subscribe((snapshot) => {
console.log(snapshot.activeId, snapshot.revision)
})
Full FontPreset / FontSnapshot / FontRegistry types live in lib/types/client/index.d.ts.
How it works
- The browser half provides the registry to the root context via
ctx.provide("fonts", registry)atapplytime - On selection changes it rewrites an injected
<style id="dsh-fonts">:@font-facerules plus:rootoverrides of--dsw-font-family/--ds-font-family-code— the two CSS variables every DSH component consumes viavar()(defined in@deepseek-ai/dsh-client-ui-theme'sbase.css) - The host half registers a
/plugins/dsh-fonts/fonts/*route onctx.webServer, serving the woff2 files bundled underdata/fonts/ - The selection persists in
localStorage(dsh-fonts:prefs) and is restored at boot; a selected plugin-registered preset falls back to the default if that plugin is absent
Known limitations
- Some components hardcode an
Inter, var(--dsw-font-family)stack (e.g. the workspace browser) — those keep Inter on systems that have it installed - Bundled fonts are latin subsets (~280KB total); CJK text falls back through the stack tail to system fonts (PingFang SC / Microsoft YaHei)
- Custom imports accept woff2 URLs only (http/https)
Font credits
Bundled fonts are licensed under the SIL Open Font License 1.1; license texts ship in data/fonts/LICENSE-*.txt:
- JetBrains Mono — JetBrains s.r.o.
- Inter — Rasmus Andersson
- Fira Code — The Fira Code Project Authors
- IBM Plex Sans — IBM Corp.
- Cascadia Code — Microsoft
💝 Thanks
- DeepSeek Harness — the plugin architecture and the
dsh.clientdual-face mechanism - Fontsource — webfont distribution
- dsh-Catppuccin / dsh-Solarized — the repository conventions this plugin follows
dsh-Fonts · Copyright 2026-present zhijun-dai · MIT License
Links
More in this category
Small-tailqwq/dsh-deep-whale★ 884
Whale-girl skin series for the DSH Web UI (maid-atelier).
KinGao294/dsh-skin★ 11
Codex-style skin switcher plus a custom wallpaper layer with opacity and blur controls.
RevolutionLA/dsh-dream-skin★ 6
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.
tianyhjg-lab/dsh-font★ 6
Font switcher for the DSH Web GUI: 99 UI fonts and 31 code fonts with CJK-Latin pairing stacks, instant apply and localStorage persistence.
starslittle/dsh-blue-whale★ 6
A DeepSeek Chat-style blue-whale color skin. Light and dark follow the built-in appearance.
PAKIKNOWLEDGE/dsh-client-ui-skin-claude★ 5
Claude-style skin with a warm-black canvas, clay accent, and serif UI that follows the native light and dark themes.