Open Source

I Brought Basecamp's Omarchy to WSL — Cross-Platform Theme Sync in Go

Basecamp's Omarchy theme system is built for native Linux. Millions of developers use WSL. I built the bridge — 17 themes that sync Windows Terminal, VS Code, dark mode, accent colors, and wallpapers in one command.

Vibol Teav8 min read

The gap: Omarchy is Linux-native, not WSL

Omarchy is DHH's opinionated Linux distribution built on Hyprland (a Wayland compositor). When you run omarchy-theme-set tokyo-night, it restarts Waybar, the Alacritty terminal, btop, mako notifications, updates GNOME settings via gsettings, installs the matching VS Code extension, swaps the wallpaper, and even changes keyboard RGB lighting. Everything syncs from a single colors.toml file per theme.

But it's built for native Linux with Hyprland. If you use WSL — which is how most Windows developers work with Linux today — none of that applies. You don't have Waybar, Hyprland, or gsettings. Your terminal is Windows Terminal, your compositor is Windows itself, and theme-switching means manually changing 5 different settings files.

I've been using WSL as my daily driver and I want to stick with it. But I love how Omarchy keeps everything in sync — terminal, editor, and OS theme all switching together. So I built the WSL equivalent.

What Omarchy WSL does

One command. Everything syncs:

$ theme tokyo-night

✓ Windows Terminal → Tokyo Night color scheme
✓ VS Code → Tokyo Night theme (extension auto-installed)
✓ Windows → Dark mode enabled
✓ Title bar → Accent color #7aa2f7
✓ Wallpaper → tokyo-night.jpg

Five things change at once. Switch to a light theme like catppuccin-latte and Windows flips to light mode, your terminal goes light, VS Code goes light, and the wallpaper matches.

There's an interactive picker too — uses fzf if available, falls back to an arrow-key TUI:

$ theme

  catppuccin-latte    Light, pastel
  catppuccin          Dark, pastel
  ethereal            Dark, warm amber
  everforest          Dark, muted green
▸ hackerman           Dark, neon green    ← preview updating live
  kanagawa            Dark, muted blue
  ...

And a native Windows GUI for when you want to click instead of type:

$ theme --gui

The hard parts: Windows from Linux

Omarchy on native Linux restarts Hyprland components, writes to gsettings, and generates configs from colors.toml templates. On WSL, you're inside Linux trying to change Windows. There's no Hyprland, no gsettings, no Wayland. Here's how each piece works instead:

Windows Terminal

Terminal's config lives at a known path on the Windows filesystem. From WSL, that's accessible via /mnt/c/. The theme command reads settings.json, injects color schemes into the schemes array, and updates the colorScheme on every WSL profile.

VS Code

Same approach — find settings.json, update workbench.colorTheme. The trick is extensions: each theme needs a VS Code extension installed. Rather than requiring users to pre-install 17 extensions, the command installs the needed extension on first use — matching Omarchy's lazy-install pattern.

Windows dark/light mode + accent color

This is the tricky one. From WSL, you can call Windows executables via the interop layer. The theme command uses PowerShell to write to the Windows registry:

# Dark mode: set AppsUseLightTheme = 0
powershell.exe -Command "Set-ItemProperty \
  -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize \
  -Name AppsUseLightTheme -Value 0"

# Accent color: set via DWM registry key
powershell.exe -Command "Set-ItemProperty \
  -Path HKCU:\SOFTWARE\Microsoft\Windows\DWM \
  -Name AccentColor -Value 0xff7aa2f7"

Wallpaper

Setting a wallpaper from WSL requires calling the Win32 SystemParametersInfo API. You can't do this from PowerShell alone (it doesn't stick). This is where Go comes in — a tiny Windows binary that makes the API call directly.

Building a native Windows GUI in Go

The GUI picker is a native Windows .exe built with Go and the Win32 API directly — no Electron, no web view, no framework. Just syscall.NewLazyDLL calling user32.dll and kernel32.dll.

Why Go? Three reasons:

  • Cross-compiles from WSL to Windows GOOS=windows go build produces a .exe without needing a Windows build environment
  • Single binary, zero dependencies — no runtime, no installer, no DLLs to ship
  • Direct Win32 API access — Go's syscall package calls Windows APIs natively, no CGo needed

The GUI creates a window with a list of themes, shows a color preview for each, and applies the theme when you click. The wallpaper-setting function uses the same binary — it calls SystemParametersInfoW with the SPI_SETDESKWALLPAPER flag to change the desktop background persistently.

The entire Go codebase is about 56% of the project. The rest is Shell scripts that handle the terminal/editor config updates and orchestrate the theme-switching flow.

The 17 themes

All 17 themes come from the original Omarchy project. Each includes a Windows Terminal color scheme, a VS Code theme mapping, a light/dark mode flag, an accent color, and a wallpaper.

ThemeStyle
catppuccin-latteLight, pastel
catppuccinDark, pastel
etherealDark, warm amber
everforestDark, muted green
flexoki-lightLight, ink-inspired
gruvboxDark, retro warm
hackermanDark, neon green
kanagawaDark, muted blue
matte-blackDark, minimal
miasmaDark, earthy
nordDark, arctic blue
osaka-jadeDark, jade green
ristrettoDark, coffee warm
rose-pineLight, soft pink
tokyo-nightDark, cool blue
vantablackDark, pure black
whiteLight, pure white

Personal favorites: tokyo-night for late nights, everforest for focus work, and hackerman when I want to feel like I'm in a 90s movie.

Try it

One command:

source <(curl -fsSL https://raw.githubusercontent.com/tvcam/omarchy-theme-wsl/main/install)

This installs the theme command, adds 17 color schemes to Windows Terminal, installs JetBrainsMono Nerd Font, and sets up the GUI picker. Then:

# Interactive picker
theme

# Apply directly
theme hackerman

# Windows GUI
theme --gui

Source on GitHub: tvcam/omarchy-theme-wsl

FAQ

Does this modify Windows system files?

It modifies user-level settings only — Windows Terminal config, VS Code settings, user registry keys, and wallpaper. No admin privileges required. No system files touched. Fully reversible with theme --uninstall.

Will it conflict with my existing terminal themes?

No. It adds schemes to Windows Terminal alongside your existing ones. It only changes the active scheme on WSL profiles. Your other profiles and schemes are untouched.

Can I add my own themes?

The current version ships with the 17 Omarchy themes. Custom themes would need a Terminal color scheme, VS Code theme mapping, accent color, and wallpaper. It's on the roadmap.

Why Go and not Rust or C#?

Go cross-compiles from Linux to Windows with one flag. No Windows build environment, no Visual Studio, no CGo. And the binary is a single .exe with zero runtime dependencies.

The takeaway

WSL blurs the line between Linux and Windows, but the developer experience gaps are still real. The tools exist to close them — WSL interop lets you call PowerShell from Bash, Go cross-compiles to Windows from Linux, and config files are just JSON on a shared filesystem.

If something only works on native Linux, it probably doesn't have to.

Related