Sonophage1k downloadsThe Bureau — a theme for Obsidian, inspired by the Federal Bureau of Control, Magnus Archives and Deus Ex Machina
A noir theme for Obsidian. A worn case-file on a concrete desk, wired to a CRT that hums whether or not you're listening.

[!IMPORTANT] Most of Bureau lives in the Style Settings plugin. Install it and you get a single Bureau panel (Settings → Style Settings → Bureau) with every option in one place. The theme runs fine without it — just on its built-in defaults.
I've always liked that redacted-bureau look. The brutalism of it: heavy type that doesn't apologise, stamped labels, lines blacked out by someone who decided you didn't need to read them. Documents with purpose, and what is Obsidian for most of us if not a collection of notes and documents that serve a purpose? A lot of themes are a pile of effects in a trench coat — gorgeous in the screenshot, unlivable by the second week. Pretty to look at but hard to work in. I themed hopped for months and never really felt at home. Like I was using someone elses desk. Settings that were cool but didnt work right or made editing difficult. Then there were things that some themes just could not do. I didn't want effects. I wanted a room you could sit in at 2 AM and feel like the work mattered. One cohesive place I could spend hours in.
The mood comes from three places, and each one is an accent you pick — the single colour the whole UI, the glow, and every highlight read from, the way a room reads from one bad bulb:
Most themes pick a side and defend it like an identity, Dark only, or if your lucky Dark and Light versions. But even the light versions are too bright and the dark versions are too dark. Bureau runs both; a near-black noir and a daylight case-file in paper. The interesting part is the ground between them.
Set the editor to the opposite palette of its chrome and you get a lit page on a dark desk, or a dark page in a lit room. The picture lives in that seam where light meets dark.
Everything textural is procedural SVG, drawn by the stylesheet instead of photographed and dragged in (mostly for sharpness and responsiveness). There's a CRT layer if you want it: scanlines, phosphor glow, a white line that scans down the page and glitches like a loose wire, a power-on that fades up from black each time you open a note. None of it is load-bearing — leave it off and the theme still stands. Turn it on when you want the machine to feel haunted. On a phone it quiets all of that down on its own.

![]() White — daylight |
![]() Black & White |
![]() White & Black |
Community themes: Settings → Appearance → Manage → search Bureau.
Manual:
theme.css and manifest.json.<vault>/.obsidian/themes/Bureau/.Install the Style Settings plugin. Everything below lives there, in one Bureau panel. Without it the theme still runs — it just runs the way the house came: someone else's defaults.
Light or dark is Obsidian's own switch (Settings → Appearance), not the theme's. Bureau dresses both: a full daylight variant — aged paper, a black marginalia ledger, dark ink — sits behind light mode the same way the noir sits behind dark. The theme can't throw Obsidian's switch for you.
Everything is in Settings → Style Settings → Bureau. The panel remembers what you told it — switching presets never paves over your choices. What follows walks the panel top to bottom, in the order you'll find it.
One dial that decides how haunted the room gets, layered over everything else.
| Mode | What you get |
|---|---|
| Low | The bones. Styling only — no texture, no glow, no CRT, no motion. |
| Medium | Texture and the ambient glow. Lived-in. No CRT, no animation. |
| High | Everything awake. The machine knows you're here. |
| Custom | Your own arrangement — every toggle below, exactly as you left it. |
Low and Medium override the individual toggles while they're active; your toggles are never lost — switch to Custom and they come back.
The ambient layer — all sliders, 0 = off, so it's there only as much as you want.
The tube. Optional, and quietly the whole point.
Optional soft looks over the brutalist base — all off by default.
Fine-tuning for the floating card in Pill terminal mode (needs Pill terminal on): remove or recolour its border, set its rounding (drives the clip-path, so corners clip cleanly), and nudge the stacked-tabs spine inset to line the tab spine up with the card.
A wallpaper behind the workspace, visible through the frosted glass, plus the empty New-Tab pane's artwork.
One thing to know up front: pure CSS can't point at a vault file by path.
Obsidian serves vault files over a per-install app://<token>/… URL that only
JavaScript can mint; the old app://local/… shortcut no longer resolves, and
relative paths don't resolve inside an injected stylesheet. So a web image can
be linked directly, but a local image has to be embedded or fed in by a plugin.
Three ways:
url('https://…') into Background image — web URL. Layers on top, so a web URL always wins. (Re-fetched every launch.)magick img.png -quality 82 -strip /tmp/bw.jpg && base64 -w0 /tmp/bw.jpg) and paste the whole url('data:image/jpeg;base64,…') into the same web-URL field.New-tab image paints the empty New-Tab pane: Bureau image (the packaged
artwork, shown by default, embedded as base64 webp in theme.css), Off, or
Custom URL — with a size slider. The 3-way select + data-URI delivery is
adapted from the Border theme by Akifyss; the
artwork is original. To swap it, replace new-tab.webp and re-embed it as
--bu-new-tab-default-image (printf 'url("data:image/webp;base64,%s")' "$(base64 -w0 new-tab.webp)").
Why the plugin isn't bundled: Obsidian distributes a theme as only
theme.css+manifest.json— it can't ship or install a plugin for you. So Redacted Background lives in its own repo, installed via BRAT.
For when the room has too much furniture.
Restrained, CRT-flavoured, eased — never bouncy. A master Animations toggle gates all of it, with a speed slider and an easing select; Respect "reduce motion" hands control back to the OS setting.
The headline pieces: CRT power-on (content fades up from black on open), Boot sequence (a CRT switch-on flash on app launch), Channel-change crossfade (fade + scan-line wipe on note switch), the Scanning line (a faint line that drifts down the editor and glitches, with brightness / interval / depth sliders), and Limelight (spotlight the active pane; everything else dims until you look at it). Past those sit the small tics — terminal block caret, active-line scan, CRT flicker, eased checkbox tick, typewriter tooltips, breathing glow, faded menus — the wobble in the fan.
The divider lines between sidebars and editor: remove them for a seamless edge, or set a custom colour. (Remove wins if both are on.)
Hide them (content still scrolls), set the width, fade them in on hover (with a delay), accent the thumb while scrolling, or give the resting thumb and its grip their own custom colours.
One accent per weekday (Sun–Sat) — so Tuesday doesn't get to look like Friday
— with text and background derived from that accent automatically, light and
dark. Add the weekday class (e.g. cssclass: monday) to key a note's palette. If
you ran the old "Daily Note Themes" snippet, switch it off — Bureau owns this room
now.
The foot of the panel carries a live What's new note and the full Release history, regenerated on every release so the app always shows the same changelog as this repo.
The theatre dims itself on phones and tablets, automatically — no toggle, no Style Settings required. Grain, scanlines, glow, motion and the heavy card shadows drop; tap targets grow; and the Pill terminal / floating editor auto-suppresses even if you left it on for desktop, because the floating card and pill header don't survive a small screen. The device that can't afford the show doesn't have to sit through it.
The full history lives on the releases page,
and inside the app at the foot of the Bureau Style Settings panel (Release
history). When cutting a new release, add its ### X.Y.Z entry below this
paragraph, newest first — release.py reads it from here (see Releasing).
body.is-mobile * { animation: none }: alongside Bureau's decorative animations it also killed the zero-duration CSS animations Obsidian's list views use as a render hook, so the lists never got told to paint. The blanket rule is gone; Bureau's own animations are now held off mobile at the source (every bu-anim rule is gated :not(.is-mobile)), so a phone still shows no Bureau animation while Obsidian's hooks keep working.Bureau picked these pockets, gratefully:
Fonts, embedded in the stylesheet as woff2 (latin + latin-ext) so they load instantly and offline, with system fallbacks: Urbanist (the labels, the stamps) and Courier Prime (the body, the mono). Both OFL.
Pulling the lid off, filing a bug, or sending a change? CONTRIBUTING.md
has the house rules — one file, no !important, no :has(), opt-in atmosphere —
and the @settings scars worth not reopening.
It's one theme.css. Edit it and reload Obsidian — hard-reload, or toggle the
theme off and back on, because Obsidian caches the stylesheet and will lie to you
about whether your change took. Retheme from the .theme-dark token block at the
top, where the whole palette lives in one place. The Style Settings config is the
@settings block at the foot — it looks like a comment and it is not; leave it
alone unless you mean it.
To cut a release: add the new ### X.Y.Z entry to the Changelog
(newest first, below the pointer paragraph), then run ./release.py X.Y.Z. The
script stamps manifest.json and the theme.css header, regenerates the in-panel
What's new note and prepends the entry to Release history, validates the CSS
(braces + the @settings YAML), then commits, tags, pushes main + the tag, and
publishes the GitHub release with theme.css + manifest.json attached. Use
--dry-run to preview without touching a thing, --yes to skip the confirmation.
Tags carry no v prefix (Obsidian matches them to the manifest).
MIT. Take it apart. Build your own room.