From obsidian
Design beautiful Obsidian themes, CSS snippets, and ASCII/Unicode data visualizations for markdown. Use when building custom Obsidian themes, creating CSS snippets for vault styling, designing ASCII charts or progress bars for markdown notes, or any request involving "make my vault look good," "Obsidian theme," "CSS snippet," "data visualization in markdown," "progress bars in notes," or "ASCII charts." Covers both the visual design layer (CSS custom properties, typography, color systems) and the data display layer (monospace-safe characters, Unicode rendering, sparklines, progress bars). Trigger on any Obsidian visual customization request. NOT for Obsidian plugin development (JS/TS), sync configuration, or vault structure/organization.
How this skill is triggered — by the user, by Claude, or both
Slash command
/obsidian:obsidian-designThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You're designing for a tool that people live in. Obsidian is where they think, write, and build their second brain. Every visual decision affects how it *feels* to use — rushed theming or ugly data displays break the spell. Take this seriously.
You're designing for a tool that people live in. Obsidian is where they think, write, and build their second brain. Every visual decision affects how it feels to use — rushed theming or ugly data displays break the spell. Take this seriously.
Markdown code blocks (\```) render in monospace fonts. Most Unicode characters were designed for proportional fonts. What looks perfect in your terminal or code editor may render as unreadable noise in Obsidian, especially on mobile (iOS/Android).
Use freely — render consistently everywhere:
█ ░ ▓ Block elements (full, light shade, medium shade)
─ │ ┌ ┐ └ ┘ ├ ┤ ┬ ┴ ┼ Box drawing (single line)
═ ║ ╔ ╗ ╚ ╝ ╠ ╣ ╦ ╩ ╬ Box drawing (double line)
→ ← ↑ ↓ ✓ ✗ · Arrows, checks, middle dot
● ○ ◆ ◇ ■ □ Basic geometric shapes
Avoid — inconsistent rendering across platforms:
▁▂▃▄▅▆▇ Fractional block heights — most monospace fonts render
these at IDENTICAL height. They only vary in theory.
On macOS Obsidian, iOS, and most terminals, you get
8 identical-looking rectangles. Useless for sparklines.
⠀⢀⣀⣄⣤⣦⣶⣿ Braille patterns — technically vary by dot density,
but at typical font sizes (13-16px) the differences are
imperceptible. Looks like random noise to humans.
╸━ Line weight variations — rendering depends heavily on
font. Often indistinguishable.
Why fractional blocks fail: The Unicode block elements ▁▂▃▄▅▆▇█ are designed to fill different vertical portions of the character cell. But monospace fonts in code blocks typically render them all at the same baseline with minimal visible height difference. The idea is sound; the execution across real fonts is broken. Don't use them for sparklines.
Progress bars using █ (full) and ░ (empty) are the most readable data visualization in monospace markdown. They work because:
function progressBar(value, target, width = 8) {
const pct = Math.max(0, Math.min(1, value / target));
const filled = Math.round(pct * width);
return '█'.repeat(filled) + '░'.repeat(width - filled);
}
The most readable layout for health/metric dashboards:
Label Value Bar Status
─────────────────────────────────
Sleep 7h12m ████████░ ✓
Deep 0h45m ████░░░░░ ↓
HRV 32ms █████░░░░ →
Steps 8,241 ████████░ ↑
Design principles:
Some metrics are "lower is better" (resting heart rate, stress index). For these, invert the bar calculation:
// RHR: target is 55, ceiling is 75 (higher = worse)
const invertedPct = (ceiling - value) / (ceiling - target);
This way a full bar always means "good" regardless of metric direction.
· (middle dot) — not a space, not a dash-- for value, empty bar for visual(midday) or mark the bar differentlyFor non-time-series data, aligned columns with box drawing:
┌─────────┬────────┬────────┐
│ Metric │ Today │ 7d Avg │
├─────────┼────────┼────────┤
│ Sleep │ 7h12m │ 6h45m │
│ HRV │ 32ms │ 28ms │
└─────────┴────────┴────────┘
Or simpler — just aligned text with consistent padding. Don't over-decorate.
| Approach | Problem |
|---|---|
| Sparklines with ▁▂▃▄▅▆▇ | Identical height in monospace. No visual information. |
| Braille dot density ⠀⢀⣀⣄⣤ | Imperceptible differences at body text size. |
| Emoji-based charts 🟩🟨🟥 | Inconsistent width (emoji are often 2 cells wide). Breaks alignment. |
| Color in code blocks | Code blocks don't support inline color in standard markdown. |
| HTML in code blocks | Rendered as literal text, not markup. |
If the user has Dataview or Templater plugins, you can generate dynamic visualizations. But the rendering rules are the same — the output still lands in markdown, and the same character constraints apply.
For Dataview inline queries that render outside code blocks, you have access to HTML/CSS and can use actual colored bars via <span> elements with inline styles. This is a different (and more powerful) path than code block ASCII art.
Obsidian themes are single CSS files that override CSS custom properties and add style rules. They live in .obsidian/themes/ as ThemeName/theme.css with a manifest.json.
{
"name": "Theme Name",
"version": "1.0.0",
"minAppVersion": "1.0.0"
}
Obsidian exposes hundreds of CSS variables. The most impactful ones for theming:
Colors — Background hierarchy:
body {
--background-primary: #1a1a2e; /* Main editor */
--background-primary-alt: #16213e; /* Slightly different alt */
--background-secondary: #0f3460; /* Sidebar */
--background-secondary-alt: #0a2647; /* Sidebar sections */
--background-modifier-border: #1a3a5c; /* Borders */
--background-modifier-hover: rgba(255,255,255,0.05); /* Hover states */
}
Colors — Text hierarchy:
body {
--text-normal: #e0e0e0; /* Body text */
--text-muted: #888; /* Secondary text */
--text-faint: #555; /* Tertiary text */
--text-accent: #4fc3f7; /* Links, accents */
--text-accent-hover: #81d4fa; /* Accent hover */
--text-on-accent: #000; /* Text on accent backgrounds */
--interactive-accent: #4fc3f7;/* Buttons, toggles, active states */
}
Typography:
body {
--font-text-theme: 'Inter', -apple-system, sans-serif;
--font-monospace-theme: 'JetBrains Mono', 'Fira Code', monospace;
--font-text-size: 16px;
--line-height-normal: 1.6;
--bold-weight: 600;
}
Editor spacing:
body {
--file-line-width: 700px; /* Max editor width */
--p-spacing: 1rem; /* Paragraph spacing */
--heading-spacing: 0.5em; /* Space before headings */
--indentation-guide-width: 1px; /* Indent guides */
}
1. Respect the content hierarchy. Obsidian is a writing tool. The theme should make text comfortable to read for hours, not compete with it. Background colors should recede. Text contrast should be high enough (WCAG AA minimum) without being harsh.
2. Design for both light and dark.
Use .theme-dark and .theme-light selectors. Many users switch between modes. Don't assume one.
.theme-dark {
--background-primary: #1e1e2e;
--text-normal: #cdd6f4;
}
.theme-light {
--background-primary: #eff1f5;
--text-normal: #4c4f69;
}
3. Typography makes or breaks it.
4. Subtle is better than loud. The best Obsidian themes (Minimal, Things, Prism) share a quality: you barely notice them. They make Obsidian feel refined without being distracting. If someone's first reaction to your theme is "wow, look at all the colors" — it's too much.
5. Code block styling matters. Many power users spend significant time in code blocks (dataview queries, templates, actual code). Style them intentionally:
.markdown-rendered pre,
.markdown-source-view .cm-line .cm-inline-code {
background-color: var(--background-secondary);
border-radius: 4px;
padding: 0.8em 1em;
font-size: 0.9em;
}
Snippets live in .obsidian/snippets/ and are toggled per-vault. They're ideal for targeted customizations without building a full theme.
Common high-value snippets:
Readable line width override:
.markdown-source-view.mod-cm6 .cm-content,
.markdown-preview-view {
max-width: 750px !important;
margin: 0 auto;
}
Custom checkbox styles:
input[data-task="!"]:checked {
--checkbox-color: var(--color-orange);
--checkbox-marker-color: var(--background-primary);
}
Heading styling:
.markdown-rendered h1 {
font-family: 'Instrument Serif', serif;
border-bottom: 1px solid var(--background-modifier-border);
padding-bottom: 0.3em;
}
.obsidian/themes/ThemeName/theme.css with manifest.jsonWhen building a color palette for an Obsidian theme:
When a vault uses both custom themes AND ASCII data visualizations (dashboards, health trackers, daily notes with metrics), the theme needs to account for code block rendering:
User wants data in their notes? → Time series with targets? → Progress bars (█░) → Comparison table? → Aligned columns or box drawing → Status indicators? → ✓ ✗ → ↑ ↓ ● ○
User wants their vault to look better?
→ Quick fix? → CSS snippet
→ Full overhaul? → Custom theme
→ Just typography? → Font snippet + --font-text-theme override
User says "sparklines"? → Explain why fractional blocks don't render distinctly → Offer progress bars as the better alternative → If they insist on inline sparklines, Dataview + HTML spans with colored backgrounds is the real path
npx claudepluginhub gavinsdavies/obsidian-skills --plugin obsidianGuides collaborative design exploration before implementation: explores context, asks clarifying questions, proposes approaches, and writes a design doc for user approval.
Creates structured, bite-sized implementation plans from specs or requirements before writing code. Useful for breaking down multi-step tasks into testable steps with file structure and task boundaries.
Synthesizes the current conversation into a structured spec (PRD) and publishes it to the project issue tracker with a ready-for-agent label, without interviewing the user.