An Obsidian theme tuned for long-form technical writing, tight note taxonomies, and daily use by a developer who lives in the editor. Built on top of the excellent Baseline theme, with opinionated typography and a few quality-of-life fixes on top.
Now a human version from me:
I checked all themes in Obsidian, and 95% of them were total garbage. Baseline was almost perfect, but I had to make a few small tweaks here and there so it works better with lists, checklists, and tags. I also adjusted the headers and fonts. The biggest issue was the folders/files tree, which felt a bit dull. Install Baseline and this theme and compare them yourself.
More details (generated) below. Enjoy!

— instead of •, in both Live Preview and Reading view.<del>, and <s> render in grey (#999), and struck bold text is forced back to weight 400 so it never competes with the strike line.#project stays legible.#333, H4–H6 in #555. Dark theme keeps Baseline defaults..obsidian/themes/One Oracle Developer/.theme.css and manifest.json from this repo into that folder.Settings → Appearance → Themes → One Oracle Developer.Once listed: Settings → Appearance → Manage → Browse → One Oracle Developer → Install and use.
Headings use Source Serif Pro, falling back to Georgia → Times New Roman → the system serif. Body text uses Open Sans, falling back to system-ui → -apple-system → Segoe UI → the system sans-serif. Both families are pulled in via a Google Fonts @import at the top of the override block, so no local install is required – but a local install will render slightly faster on first paint.
Swap either family by overriding the --ood-font-heading / --ood-font-body tokens in a snippet or in Style Settings' custom CSS. The heading scale, weight, and line-height stay pinned regardless of the family you pick.
Everything below lives in a clearly fenced override block appended to Baseline's CSS, so a future Baseline update is a clean diff-merge.
--ood-accent-bg-weak, --ood-accent-bg-hover, --ood-accent-underline-width, --ood-font-heading, --ood-font-body – single source of truth for tuning.body:not(.accented-interface) rule would flatten --interactive-accent to black. Overridden with hsl(var(--accent-h) ...) !important, with a darkened hover variant via calc(var(--accent-l) * 0.9).@import url(...) so the theme works without any local font install.--blockquote-background-color nudged to a warmer, lower-contrast tint.!important so other plugins can't push them around.font-weight: 500, line-height: 1.35. Reads like a book, not a UI component.font-family: var(--ood-font-heading) + letter-spacing: -0.05rem across H1–H6 in both Live Preview and Reading view.var(--interactive-accent); H2–H3 = #333; H4–H6 = #555. Dark theme keeps Baseline defaults..markdown-preview-view, .markdown-source-view, and .cm-content all use var(--ood-font-body) (Open Sans) so Live Preview and Reading view match.— replaces • on unordered list items. Reading view uses list-style-type + ::marker { color: #333 }; Live Preview hides .list-bullet and injects ::before { content: "—" }.strong, b, .cm-strong forced to font-weight: 700 !important so Open Sans bolds actually look bold.<del>, <s>, [data-task="x"], .HyperMD-task-line[data-task="x"], .task-list-item.is-checked, and li[data-task="x"] (plus their descendants) render in grey with matching text-decoration-color.strong/b/.cm-strong is forced back to font-weight: 400 so the strike line wins over the boldness.font-family: var(--ood-font-body), font-size: 0.85rem, font-weight: 500, letter-spacing: normal, line-height: 1 – so tags inside H1–H6 don't inherit heading serif, size, or negative tracking.#999 text so #project remains readable without shouting.#666 so it doesn't fight with the surrounding grey text.var(--ood-font-heading) at 16px italic so quotes read as voice, not as a UI element. Padding is 20px left / 16px right on every line. Italic typography is scoped to prose only (blockquote > p in Reading view, non-HyperMD-list-line quote lines in Live Preview), so lists inside blockquotes still render as lists.::before pseudo; Live Preview zeros .HyperMD-quote left/right borders and hides the stacked > markers via cm-formatting. Background is restored explicitly to var(--background-secondary).> separators (> A / > / > B). Reading view: margin-block: 0.9em on <p> children with html body specificity to beat Baseline's .markdown-rendered p reset; first/last paragraphs drop their outer margin so the blockquote's own padding-block holds. Live Preview: zero padding-block on .cm-line.HyperMD-quote – the empty > line's own line-height is the inter-paragraph gap. Embedded HTML <p> chunks inside blockquotes also get zeroed inner margins (with first/last reverted) so HTML quotes match native ones.content: "\200B") on every .cm-line.HyperMD-quote::before so the cursor on an empty > line keeps full height. Without this, CM6 has no inline content to derive caret height from once the > glyph is hidden..metadata-container is hidden with display: none !important in both Live Preview and Reading view. Properties remain editable via command palette and right sidebar..workspace-tab-header gets position: relative + padding-block: 2px; the active tab grows a ::after pseudo underline in var(--interactive-accent) at var(--ood-accent-underline-width) (2px).::-webkit-scrollbar-thumb:hover and :active flip to var(--interactive-accent). Default thumb width unchanged..cm-line.cm-active { background: transparent !important } – kept as a hook for future accent-tint experiments, currently off.<th> is display: table-cell. Live Preview wraps each th in a block-level .table-cell-wrapper div – the wrapper is set to display: inline-block; vertical-align: bottom; width: 100% so the th's own vertical-align: bottom actually moves it; the th keeps display: table-cell to preserve column geometry.:not([style*="display: none"]) so the override doesn't un-hide the original (which would render as a duplicate above the editor). The editor's CM6 layers (.cm-s-obsidian, .cm-editor, .cm-scroller, .cm-content, .cm-line) are forced transparent so the editor blends with the header background instead of showing CM6's default dark-grey fill.:hover, :active, :focus, :focus-within on <th> and .table-cell-wrapper, plus .cm-editor.cm-focused and .cm-active / .cm-activeLine are all forced transparent so clicking a header is visually inert.var(--interactive-accent)..tree-item-children gets --nav-indentation-guide-width: 2px, --nav-indentation-guide-color: #999, and border-inline-start-style: dotted..nav-folder:has(.tree-item-self.is-active), every folder on the path to the active file gets its guide in var(--interactive-accent) and its folder title in font-weight: 500 + accent colour..nav-file-title, .nav-folder-title get padding-block: 3px and line-height: 1.6 so deep trees stop feeling loose.::after so the active file reads as a cursor mark rather than a selected row..calendar .today renders at font-weight: 700..calendar .title .month picks up var(--interactive-accent) while .title .year stays inherited, so the month is the heavy visual anchor.Optional CSS snippets shipped in .obsidian/snippets/ that pair with the theme but stay opt-in. Toggle each one via Settings → Appearance → CSS snippets.
ood-left-sidebar-tabs – Files + Bookmarks left-aligned on a single row, Search rendered icon-only floating right. Overrides the theme's stacked column layout for .mod-top-left-space containers; the sidebar collapse toggle stays at the top.Jan Kvetina – Oracle APEX developer, blogger at oneoracledeveloper.com.
This theme is a fork of Baseline by aaaaalexis. All the structural work – the colour system, the Style Settings schema, the light/dark balance – comes from there. This fork only layers personal typography choices and a few rendering fixes on top. If you like the bones of this theme, go star Baseline.
MIT. Baseline is also MIT; this fork inherits the same terms.