Obsidian theme inspired by tw93/kami. Warm parchment + ink-blue accent, serif-led hierarchy. Phase 1.
Last updated: 2026-06-19
Inspired by tw93/kami. Not affiliated with or endorsed by tw93. All visual design tokens trace to the original kami project (MIT); this repo is an Obsidian-side adaptation.
An Obsidian theme inspired by tw93/kami. Translates kami's print-grade typographic system — warm parchment surface, ink-blue accent, serif-led hierarchy, warm-gray neutrals — onto the Obsidian editor.
Status: Phase 1 — personal use, validating the visual transfer. Not yet submitted to the Obsidian Theme Gallery.
Aligned to kami v1.1.0.
| Token | Light | Dark | Role |
|---|---|---|---|
| Parchment / Deep Dark | #f5f4ed |
#141413 |
Primary note background |
| Ivory / Dark Ivory | #faf9f5 |
#1a1917 |
Sidebars, surfaces |
| Warm Sand | #e8e6dc |
#353330 |
Borders, dividers |
| Dark Surface / Warm Ivory | #30302e |
#e8e3d2 |
Body text |
| Ink Blue / Ink Light | #1B365D |
#2D5A8A |
Accent: headings, links, selection, CTA |
| Olive | #504e49 |
#b4b09e |
Quote / caption text |
| Warm Highlight | #f3e3a8 |
#5a4a1f |
==mark== highlight |
| Tag Tint | #E4ECF5 |
#E4ECF5 |
Tag background (solid, never rgba) |
All neutrals carry a yellow-brown warm undertone (no cold blue-grays) in both light and dark variants. Ink blue is used sparingly — the print-design ≤5% rule is relaxed for the editor context but the intent holds: accent only, never chrome.
| Reading View (Light) | Editing View (Light) |
|---|---|
![]() |
![]() |
| Reading View (Dark) | Callout Severity Ladder |
|---|---|
![]() |
![]() |
| Featured Card Embed | Command Palette | Settings Panel |
|---|---|---|
![]() |
![]() |
![]() |
Screenshots not captured yet — see screenshots/SCREENSHOTS.md for the shot list. Once captured with the exact filenames, this section renders automatically.
This theme ships a Style Settings schema (data-theme.json) exposing the highest-leverage variables for user tuning — no CSS editing required.
After installing the Style Settings community plugin, go to Settings → Style Settings → Kami Reader to adjust:
The schema intentionally exposes only 5 variables. Everything else stays fixed in theme.css to honor kami's restraint principle — over-configurability would dilute the design system.
--font-text-theme: "Charter", "Georgia",
"LXGW WenKai Screen", "LXGW WenKai",
"Source Han Serif SC", "Noto Serif CJK SC",
"Songti SC", "STSong", "SimSun", serif;
/System/Library/Fonts/Charter.ttc),
no install needed. Falls back to Georgia on other platforms. This is the font
kami itself uses for English.Only LXGW WenKai Screen needs manual install. Without it, CJK falls back to
Songti SC (macOS) / SimSun (Windows) — readable but loses the kaiti warmth.
LXGWWenKaiScreen-Regular.ttf + Bold.ttf)⚠️ Why this isn't a normal "drop folder in themes/" install.
Mac App Store Obsidian runs in a sandbox. macOS Sequoia 15+ tags every file created by
cpfrom Terminal withcom.apple.provenance. The sandbox then refuses to load those files as theme resources — Obsidian silently skips the theme folder and falls back to whatever it last loaded successfully.xattr -crcannot removecom.apple.provenance(SIP-protected).The workaround: ship kami as a CSS snippet instead of a theme, and inject it via Obsidian's own Vault API from the DevTools console. Files written by
app.vaultcarry Obsidian provenance and load normally.
body.<name>-theme class will out-spec kami's
body.theme-light selector)../sync.sh
inject-kami-snippet.js, Cmd+A select all, Cmd+C copy.Cmd+Option+I → Console tab → Cmd+V paste → Enter.
You should see ✓ kami.css created (... chars).# Edit theme.css, then:
./sync.sh
# Re-copy inject-kami-snippet.js contents → paste into Obsidian Console.
# Then toggle the kami snippet off → on to force reload.
Hot-reload of modified snippets is not automatic — Obsidian reads snippet
files at startup. After re-injecting via app.vault.modify, toggle the snippet
off and on in Settings → Appearance → CSS Snippets to pull the new content.
Phase 1 targets full visual coverage:
#141413 + Ink Light #2D5A8A, preserving
the same yellow-brown undertone and single-accent restraint as light mode.Not covered (deferred):
Phase 1 dogfooding confirmed the visual transfer holds. Phase 2 is sliced into three independently-shippable stages.
data-theme.json) — 5 high-leverage variables
exposed (font stack, line-height, note width, accent color, primary bg).screenshots/SCREENSHOTS.md) — 7-shot list
embedded in both READMEs. Filenames reserved; capture to render.fonttools /
cn-font-split toolchain + OFL license-file handling; not worth the risk
in a single Phase 2a session. README documents manual font install path
instead.The single load-bearing assumption of Phase 2: does Obsidian's own Theme Gallery downloader write files with Obsidian provenance, bypassing the macOS Sequoia sandbox wall?
Verification is a 30-minute manual test:
xattr -l <vault>/.obsidian/themes/<installed-theme>/theme.csscom.apple.provenance) → Phase 2c is safe.
If com.apple.provenance is present → Phase 2c must use the plugin path
(see Phase 2c plan B below).Plan A (preferred): submit theme PR to
obsidianmd/obsidian-releases →
community-css.json. Obsidian's own downloader writes the files; if 2b
confirms provenance is correct, App Store users install cleanly.
Plan B (fallback if 2b fails): ship as a community plugin instead of a
theme. onload() injects CSS via app.customCss. Plugin loading mechanism
is separate from theme loading and likely unaffected by the sandbox wall.
Higher upfront engineering cost but unblocks App Store users.
body.minimal-theme class selectors (specificity 0,1,1)
that beat kami's old :root (0,0,1). Default has no such class.body.theme-light / body.theme-dark, not :root.
Obsidian's built-in app.css defines base vars under .theme-light /
.theme-dark (specificity 0,1,0). :root (0,0,1) loses the cascade;
body.theme-light (0,1,1) wins.#E4ECF5, never rgba. kami explicitly bans
rgba tag backgrounds (WeasyPrint double-rect bug in PDF export).#faf9f5 or near-white.kami-obsidian/
├── manifest.json # Phase 2 Theme Gallery submission metadata
├── theme.css # Source of truth for all kami styles
├── data-theme.json # Style Settings schema (5 user-facing variables)
├── sync.sh # Regenerates inject-kami-snippet.js from theme.css
├── inject-kami-snippet.js # Generated by sync.sh — paste into Obsidian Console
├── screenshots/ # Phase 2a screenshot set (see SCREENSHOTS.md)
├── README.md # English docs (this file)
└── README.zh-CN.md # 简体中文文档
inject-kami-snippet.js is a build artifact, not source. Regenerate via
./sync.sh after any theme.css change.