
A faithful Obsidian port of the beloved Gruber Darker color theme.
Deep blacks. Rich warm accents. Comfortable at any hour.
Originally created for BBEdit by John Gruber, adapted for Emacs by Jason R. Blevins and Alexey Kutepov (rexim). Now brought to Obsidian.
View on the Obsidian community site →
!important, so your snippets can override anythingSee the full theme preview (a long image covering every element).
Requires Obsidian 1.13 or newer.
Gruber DarkerYourVault/.obsidian/themes/Gruber Darker/ (the folder name must match the name in manifest.json)theme.css and manifest.json into itInstall the Style Settings plugin to get the settings panel under Settings → Style Settings → Gruber Darker.
| Section | Options |
|---|---|
| Palette Overrides | All 17 palette colors, OLED Mode |
| Editor | Line height, readable line width, active line highlight, smooth scrolling, Zen Mode |
| Headings | H1-H4 sizes, text transform (none / uppercase / capitalize / lowercase) |
| Code Blocks | Code font size, border around code blocks |
| Interface | Tab style (default / underline / pill), hide ribbon, compact status bar |
| Callouts | Corner radius, icon blend mode |
| Vim & Cursor | Cursor color, Vim NORMAL cursor shape, blink style, per-mode colors, status bar indicator |
A few things to know:
Turn on Vim under Settings → Editor → Vim key bindings.
| Mode | Cursor | Default color |
|---|---|---|
| NORMAL | Block █, underline _ or bar | (your choice) | yellow #ffdd33 |
| INSERT | Caret | green #73c936 |
| VISUAL | Same shape as NORMAL, plus a tinted selection | wisteria #9e95c7 |
| REPLACE | Same as NORMAL (status bar only) | red #f43841 |
Blink styles: Static · Blink · Fade · Pulse · Expand.
REPLACE gets its color in the status bar only, because the editor doesn't expose that mode to CSS.
| Mode | Status bar |
|---|---|
| NORMAL | ![]() |
| INSERT | ![]() |
| VISUAL | ![]() |
| REPLACE | ![]() |
Needs one of these plugins:
NORMAL / INSERT to get the colored pill.| Name | Hex | Used for |
|---|---|---|
| bg-1 | #101010 |
Deepest background: code blocks, gutters, ribbon, status bar |
| bg | #181818 |
Main editor background |
| bg+1 | #282828 |
Sidebars, inline code, table headers |
| bg+2 | #453d41 |
Borders, dividers, scrollbars |
| bg+3 | #484848 |
Text selection |
| bg+4 | #52494e |
Search matches, matching brackets, input borders |
| fg | #e4e4ef |
Body text |
| fg+1 | #f4f4ff |
Bold text |
| yellow | #ffdd33 |
H1, keywords, cursor, blockquote border, table headers |
| green | #73c936 |
H4, strings, inline code, success, Vim INSERT |
| niagara | #96a6c8 |
H2, links, tags, accent color, functions |
| wisteria | #9e95c7 |
H3, link hover, numbers, Vim VISUAL |
| brown | #cc8c3c |
H5, comments, warning callouts |
| quartz | #95a99f |
H6, muted text, italics |
| niagara-dim | #5f627f |
Faint text, line numbers, list markers |
| red | #f43841 |
Errors, HTML tags, danger callouts |
| red+1 | #ff4f58 |
Brighter errors |
The theme doesn't use !important, so a plain CSS snippet can override any of it. The palette lives in --gd-* variables, and everything else comes from Obsidian's standard variables:
/* .obsidian/snippets/my-gruber.css */
body {
--gd-yellow: #ffcc00; /* recolors H1, keywords, the cursor… */
}
.theme-dark {
--h2-color: var(--gd-green); /* or override one Obsidian variable */
}
Values set in Style Settings take priority over snippets.
Issues and PRs welcome. If you find an element that needs styling, or something looks off, please open an issue.
To try changes locally, symlink the repo's theme.css and manifest.json into a test vault's .obsidian/themes/Gruber Darker/ folder. Edits then show up after reloading the theme, with no copying.
Color palette ported from:
Both released under the MIT License. This Obsidian port is also MIT licensed.
!important (65 → 0). The theme now goes through Obsidian's variables (--caret-color, --text-selection, --code-background, --file-line-width, …), so CSS snippets can override it.--font-monospace-theme, so Obsidian's Monospace font setting works again.