A warm off-white theme (light and dark) built for long reading sessions, reproducing the reading experience of Claude’s desktop app.
The CSS is generated from a token file rather than hand-written — every color, size and
spacing value lives in scripts/tokens.json, and scripts/build.py emits the stylesheet.
Built for people who stare at a Markdown editor for hours:
#ccc on a warm background reads
as a dead, muddy line.h1 at -0.022em, body at 0.1.62, paragraph gap 0.78rem.Anthropic Sans contains 581 glyphs and zero CJK characters — not even the ideographic comma. So Chinese text necessarily falls back to the system face. That is not a compromise; it is exactly what the desktop app does. This theme therefore pairs a Latin face with the system CJK face and bundles no CJK font at all.
The font stack degrades in three tiers: Anthropic Sans (only if already present on your system — proprietary, never bundled) → Inter (SIL OFL, Latin subset, 100 KB, shipped) → system UI font. Tier 2 is what almost everyone sees.
Don’t edit the CSS; it’s generated. Edit scripts/tokens.json and rebuild:
python3 scripts/build.py
The build refuses to emit CSS that violates two Typora rules, so a bad edit fails loudly instead of silently breaking the editor:
!important — #write specificity is sufficientpx font sizes except the root — otherwise Typora’s font-size preference stops
workingThere is already a Claude Theme in the gallery with a similar goal. This is an independent implementation, not a fork — no CSS was copied, and the stylesheet is machine-generated from a token file. Both themes reference Anthropic’s published brand colors, which is where any color overlap comes from.
Measurable differences, reproducible from both repositories:
| Existing Claude Theme | Hekouwang | |
|---|---|---|
| Authoring | 3,158 hand-written lines | generated from a token file |
!important declarations |
397 | 0 (enforced at build time) |
| Font sizes | some px |
all rem except root |
| Bundled fonts | ~24 MB (full Noto Serif SC variable) | 100 KB (Inter, Latin subset) |
| Anthropic fonts | bundled and redistributed | not bundled; local() + Inter fallback |
| Body CJK | Noto Serif SC (serif) | system sans-serif |
| Latin weights | single 400 → synthetic bold | true variable 300–800 + opsz axis |
| Page background | #faf9f5 |
#fdfdfc |
| UI coverage | mainly the editor pane | sidebar, file tree, outline, search panel, focus mode |
Two of these are worth explaining:
Body CJK. The existing theme sets #write { font-family: var(--font-serif) }, rendering
Chinese in Noto Serif SC — a serif. The desktop app renders Chinese in the system sans-serif
(it has no choice, given the glyph coverage above). Matching the app means not bundling a
CJK serif, which is also why this theme is 100 KB instead of 24 MB.
Page background. #faf9f5 is Anthropic’s cream, but it is the window/sidebar color.
Sampling the app’s conversation pane gives #fdfdfc. This theme uses #fdfdfc for the editor
pane and #f5f4ed for the sidebar, preserving the app’s two-level relationship.
This theme does not bundle, redistribute or include any Anthropic font. Anthropic Sans and Anthropic Serif are proprietary to Anthropic PBC with no open license. Only Inter (SIL OFL 1.1) is shipped. The theme is an independent work inspired by the app’s reading experience, not affiliated with or endorsed by Anthropic PBC.
theme/hekouwang.css, theme/hekouwang-dark.css and the theme/hekouwang/ folder
into Typora’s theme folder.Designed and tested on macOS. Not fully tested, but should work for Windows/Linux. This theme does not include styles for the Windows “unibody” style.
hekouwang-dark.css is sampled from the app’s dark mode, not derived by inverting the
light theme — which matters, because the light theme’s relationships do not survive inversion:
#262626) is lighter than the editor pane (#1f1f1e) — the
reverse of the light theme. Inverting would have gotten this backwards.Both variants are generated from the same token file; the dark block overrides only the
color and alpha groups.