Pat155 downloadsManage reusable Obsidian style profiles, path overrides, and visual settings through a native settings interface.
Style Controller is an Obsidian plugin for managing reusable style profiles, path overrides, and visual settings through a native settings interface. It applies profile values as CSS custom properties consumed by the plugin's static stylesheet; it does not edit theme files, snippets, or notes.
Obsidian Appearance owns the base text font family and font size. Style Controller preserves legacy stored values for compatibility but no longer applies or exposes those overlapping controls. Its Line height control uses an explicit numeric value and unit, including a unitless ratio option.
This plugin changes appearance by applying scoped CSS custom properties. Test profiles on a small set of notes before assigning broad path overrides. Most blank/default controls remove the corresponding property and allow native Obsidian or theme behavior to continue. Inline and block code backgrounds instead use the Style Controller built-in #fafafa background whenever their custom override is Off.
#fafafa code backgrounds.The Default profile keeps native Obsidian styling except that inline-code and fenced-code backgrounds use Style Controller's built-in #fafafa. Each code background uses one compact color control: Off displays and renders #fafafa, entering a custom color automatically changes it to On, and clearing the field automatically returns it to Off and #fafafa. Stored profiles can be applied to the global settings or used as path-specific overrides. The active profile for a note is resolved from the global settings plus matching enabled overrides in their saved order.
Overrides can match folders, files, or paths containing specific text. Matching paths receive only the modules enabled for that override. Override ordering is preserved, and later matching overrides can layer additional non-blank profile values.
Style Controller includes controls for base text, headings, links, tables, inline code, code blocks, blockquotes, callouts, images, file explorer entries, and custom CSS. Blank values produce no CSS declaration for that field; the current theme or Obsidian default remains in control.
Each major settings section has one Apply button and one Revert button. Editing a control changes only that section's draft and preview; persisted settings, Markdown views, and other sections remain unchanged until Apply is selected. The section shows Unsaved changes while its draft differs from the last applied value.
Apply validates and saves only that section atomically, makes the saved values the new Revert baseline, updates relevant views, and shows a success notice. Revert restores the last successfully applied section values. Dirty sections must be applied or reverted before navigating to another settings section, applying a stored configuration, changing override structure, or leaving the settings tab. Path overrides use the same card-level draft transaction so their match settings, module switches, profile values, and file-explorer values stay isolated.
Image settings include alignment, width, and a control for respecting explicit image sizes. Blank image settings do not emit image CSS.
The plugin uses the packaged styles.css; it does not create runtime stylesheets. It applies scoped classes and CSS custom properties to each Markdown view, clears stale values before resolving a new file or profile, and removes its classes and properties on unload.
#fafafa and Off by default.#fafafa.#fafafa.The reproducible vault fixture is Metadata class/Untitled 1.md, whose fenced block begins at line 23 with QMSE circuit. In the affected configuration, Style Controller owns the background contribution: its scoped pre/Live Preview code-background selectors load after native Obsidian CSS and resolve the approved Off/default #fafafa variable. The fix leaves the background behavior intact while keeping the native pre code transparency and native block-token colors. A blank Block text setting emits no plugin text-color declaration, and an explicit Block text value is opt-in and scoped separately.
The code-block checks above and the automated tests validate selector ownership and configuration behavior. They do not claim a live Obsidian computed-style check.
### remains identical to native.$, H, and other math syntax remain identical to native.#fafafa behavior.This checklist describes the manual equivalence checks; the release tests verify selector structure, variable cleanup, and profile isolation without claiming live UI equivalence.
The authoritative Obsidian Pro snippet contains .workspace-drawer-vault-actions { order: -1; }. The plugin applies that exact group-level behavior within the left sidebar vault-profile/footer area. The current vault does not enable that snippet.
Obsidian Pro/Cambridge/RSI/QC/Direct Variational Quantum Regression model.md and locate the sentence containing “too coarse”.coarse with adjacent normal words in the same sentence.Test/Test 6.md with Style Controller disabled and compare inline $dear_all$ and display $$\text{Dr Christopher G Lester}$$.dear_all is not a configured LaTeX Suite trigger. Test the configured inline triggers instead: txt expands automatically, while te requires the manual snippet trigger (Tab) inside math.$dear_all$ with $ dear_all $; whitespace does not create an unconfigured snippet.Style Controller runs locally. It does not use telemetry, analytics, remote code, remote images, or remote fonts.
Download the release assets from GitHub and place them in .obsidian/plugins/style-controller/:
main.jsmanifest.jsonstyles.cssThen enable the plugin in Obsidian settings.
npm ci
npm run build
The production build writes main.js.
MIT License. See LICENSE.