Holstrom

by apokalypsis89
Screenshot of the Holstrom Obsidian theme
5
4
3
2
1
New Theme

Description

This theme supports Dark Mode
This theme supports Light Mode

README file from

Github

Holstrom

One screen for every system: sheets of green film on a light table.

  • Holstrom (light): white light from below, green film laid over it, one green signal.
  • Holstrom Night (dark): the same table lit from behind on black. Green phosphor.

Parts are set apart by a change of tint, never by a drawn line. Corners are soft. Behind the page there is a soft green light instead of a texture. Titles and readings are set in the mono, and whatever is chosen is printed in reverse. On the web, the panes drift a little with the pointer, the nearer ones more, like a monitor that moves with you.

This repository holds the design itself (tokens, parts and the drift, for any web page) and its ports: an Obsidian theme, a VS Code theme, and colour schemes for Windows Terminal, iTerm2, Alacritty, kitty and Ghostty. All of them are built from the same tokens.

Holstrom and Holstrom Night

Obsidian

Install

From the community gallery: Settings, Appearance, Themes, Manage, search for Holstrom, then Install and use.

By hand:

  1. Download manifest.json and theme.css from the latest release.
  2. Put both in <your vault>/.obsidian/themes/Holstrom/.
  3. Settings, Appearance, Themes: pick Holstrom. Light and dark (Holstrom and Holstrom Night) follow Obsidian's base colour scheme.

What it does

Type JetBrains Mono for the interface, titles, tags, tables and code (embedded, works offline); your system sans for body text
Light A soft green light behind notes and canvases
Separation Side panels, headers, code, tables, tags, buttons and callouts are tinted film; no borders
Corners 10 px panes, 6 px controls, pill tags
Strip The status bar printed in the signal green
Files Folders as mono capitals; the active file printed in reverse
Code A terminal inside the page with a signal bar on the left
Cursor A block, half lit

Holstrom Holstrom Night

Style Settings

With the Style Settings plugin you can turn pieces off: the soft light, the signal status bar, reverse printing of the active file, capital headings, the mono interface and the block cursor. You can also set body text in the mono. Without the plugin everything is on.

VS Code

Holstrom Night in VS Code Holstrom in VS Code

Install

Download holstrom-<version>.vsix from the latest release, then in VS Code: Extensions, the ... menu, Install from VSIX... (or code --install-extension holstrom-1.2.0.vsix). Pick Holstrom or Holstrom Night with Ctrl+K Ctrl+T.

What it does

Separation Side bar, tabs, panel and widgets are tinted film; every border is transparent
Strip The status bar printed in the signal green
Reverse The focused row in lists, suggestions and the command palette is printed in reverse
Syntax Keywords in the signal green, text in ink, strings a leaf green, types teal, numbers amber, comments a quiet italic
Terminal The same 16 colours as the terminal schemes below

The design goes with a monospaced face and a block cursor: "editor.fontFamily": "'JetBrains Mono', monospace", "editor.cursorStyle": "block".

Terminals

The 16 ANSI colours, day and night, in terminal/:

Terminal File How
Windows Terminal windows-terminal.json Settings, Open JSON file; add both entries to "schemes", then pick the scheme in a profile's Appearance
iTerm2 holstrom.itermcolors, holstrom-night.itermcolors Settings, Profiles, Colors, Color Presets, Import
Alacritty holstrom.alacritty.toml, holstrom-night.alacritty.toml general.import = ["~/.config/alacritty/holstrom-night.alacritty.toml"]
kitty holstrom.kitty.conf, holstrom-night.kitty.conf include holstrom-night.kitty.conf in kitty.conf
Ghostty holstrom.ghostty, holstrom-night.ghostty copy to ~/.config/ghostty/themes/ as Holstrom / Holstrom Night, then theme = Holstrom Night

Green, red and yellow carry their usual meaning (ok, failed, a warning). Blue and magenta are there for programs that need them and are kept quiet, so a session still reads as green on black, or ink on white by day. Every normal colour reads at 4.4:1 or better on its background.

The design, for anything else

design/tokens.json is the source of truth. The build turns it into three files any web page can use:

File What it is
design/holstrom.css the tokens as --hs-* custom properties, day and night
design/parts.css the parts: .hs-desk, .hs-strip, .hs-pane, .hs-head, .hs-row, .hs-readout, .hs-btn, .hs-input, .hs-tag, .hs-alert, .hs-term, .hs-table
design/drift.js the drift: panes marked data-drift="0.4" (far) to "1.3" (near) move with the pointer, and the light follows
<html data-holstrom="night">  <!-- or "day"; without it, the system's colour scheme decides -->
<link rel="stylesheet" href="holstrom.css">
<link rel="stylesheet" href="parts.css">
<div class="hs-desk">
  <div class="hs-strip">Server <b>1.36.0</b></div>
  <section class="hs-pane" data-drift="0.6">
    <div class="hs-head"><h3>Systems</h3></div>
    …
  </section>
</div>
<script src="drift.js"></script>

The tokens come in three layers. The base is one green ramp and the light table. Roles say what a colour means (paper, surface, tint, ink, signal, sel, think…). Parts read only roles. Day and night are two mappings of the same roles, so a new face or a new app costs no new design. Two more groups serve code and terminals: syntax (text, comment, keyword, string, number, function, type, property, tag and the rest) and ansi (the 16 terminal colours).

Role Day Night Use
--hs-paper #ffffff #000000 the light table, the page
--hs-surface #eef8f1 #06120b side panels
--hs-tint green at 11 % green at 10 % one sheet of film: heads, rows, tags, buttons, code
--hs-glow green at 10 % green at 10 % the soft light
--hs-ink #0b3318 #d6f2de text
--hs-muted, --hs-faint #4c7356, #7f9c86 #6f9e80, #4a7a5e secondary text, hints
--hs-signal #0a8a3c #3ddc84 the one colour that means something
--hs-strip #0a8a3c #34bb70 the strip of readings
--hs-sel #0b3318 #d6f2de what is chosen, printed in reverse
--hs-think, --hs-think-ink deep green, phosphor near black, signal a terminal inside the page
--hs-warn, --hs-danger #a86a00, #b8321f #f0c04a, #ff6b55 the only other colours
--hs-radius, --hs-radius-sm, --hs-radius-pill 10px, 6px, 999px same corners
--hs-drift 6px same how far a pane at depth 1 moves

Rules of the design:

  1. One signal colour. Everything else is ink on a light table.
  2. Parts are set apart by a change of tint, never by a drawn line.
  3. Soft corners: 10 px panes, 6 px controls, pill tags.
  4. Behind everything a soft light, never a texture.
  5. Titles, labels and readings in the mono; running text in the sans.
  6. What is chosen is printed in reverse. What floats drifts a little with the pointer.
  7. Code and terminals keep the same rule: green for keywords and signals, ink for the rest; the other ANSI hues stay quiet.

The design rounds that led here are in docs/explore/.

Building

python3 build.py

Edit design/tokens.json, design/parts.css, src/theme.src.css and ports.py. The build writes design/holstrom.css, theme.css (the font embedded as base64), the VS Code themes in vscode/themes/ and the terminal schemes in terminal/. To package the VS Code extension: cd vscode && npx @vscode/vsce package.

Releasing

Bump version in manifest.json, build, commit, then create a GitHub release whose tag is exactly that version (no v), with manifest.json, theme.css, the .vsix and the terminal files attached. The Obsidian gallery reads the newest release.

Licence

MIT, see LICENSE. JetBrains Mono is embedded under the SIL Open Font License 1.1, see src/fonts/OFL.txt.

Holstrom first appeared as a theme in hyperspace, the author's own console. The name is a nod to a fictional character; the project is not affiliated with any show or studio.