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.jpgFive 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 --guiThe 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 buildproduces a.exewithout needing a Windows build environment - Single binary, zero dependencies — no runtime, no installer, no DLLs to ship
- Direct Win32 API access — Go's
syscallpackage 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.
| Theme | Style |
|---|---|
| catppuccin-latte | Light, pastel |
| catppuccin | Dark, pastel |
| ethereal | Dark, warm amber |
| everforest | Dark, muted green |
| flexoki-light | Light, ink-inspired |
| gruvbox | Dark, retro warm |
| hackerman | Dark, neon green |
| kanagawa | Dark, muted blue |
| matte-black | Dark, minimal |
| miasma | Dark, earthy |
| nord | Dark, arctic blue |
| osaka-jade | Dark, jade green |
| ristretto | Dark, coffee warm |
| rose-pine | Light, soft pink |
| tokyo-night | Dark, cool blue |
| vantablack | Dark, pure black |
| white | Light, 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 --guiSource 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.