wntr
the stack
two hand-built websites, a desktop that recolors itself from a video wallpaper, a bar i rebuilt piece by piece, and sixteen desktop apps i wrote because the existing ones weren't mine.
it started as a normal rice
it began like most people's: a downloaded setup on omarchy (ilyamiro's imperative-dots) with catppuccin pink borders, bouncy animations, and a generator that wrote my config files for me. none of that is what runs now.
a stock rice
someone else's hyprland + quickshell setup. config was spat out of a settings.json through templates and a file watcher, so nothing was really mine to edit.
generator ripped out
retired the whole template engine and rewrote hyprland as clean hand-written files: animations, rules, binds, monitors, gaming. catppuccin hardcodes gone. ~/.config became a git repo with one focused commit per area.
this site became the design spec
took the design language off this page and pushed it into every app: one font (geist mono, swapped in 515 places in the shell alone), one motion curve, moonlight glow, no bounce.
everything follows the wallpaper
wired a pipeline so a video wallpaper decides the color of the whole system, live, with no restarts.
the last of ilyamiro, gone
rebuilt the top bar and every popup on it one piece at a time: the music player, weather + calendar, network, the volume mixer, the power center, the lock screen and the app launcher. no polling shell scripts left; it all runs on quickshell's native services.
lua config, lock-screen boot new
moved all of hyprland from hyprlang to lua before hyprlang gets removed, live, without logging out. then got rid of the black disk-password prompt: the tpm unlocks the drive and the pc boots straight into my own lock screen.
a different machine
on top of that sit sixteen apps i wrote myself, from a fan + rgb controller, a channel mixer and a photo editor to configurators for my mouse, keyboard, controller and usb hub screen. all of them theme themselves from the wallpaper too.
the design language
cubic-bezier(.16, 1, .3, 1) is the ease on this website and it's the exact bezier hyprland uses for windows, layers, fades and workspaces. the desktop and the site move the same way.under the hood new
wallpaper to whole system color
the top bar, rebuilt
tuned for comp games
apps i wrote
each one is its own python program with a custom gui, themed from the wallpaper and set in geist mono. most run as background services. the hardware ones talk to devices directly, with protocols lifted from vendor web drivers.
grain new
7.6k linesa layered photo editor like pixlr, except it runs entirely on the pc. no account, no ai, nothing uploaded.
- layers with 13 blend modes and live layer styles: inner and outer glow, outline, drop shadow, bevel
- every adjustment pixlr has: curves, levels, hue/sat, color balance, exposure, highlights/shadows, vibrance
- color lookup with 20 built-in looks or any .cube lut
- filters from blur, grain and clarity to glitches (rgb split, scanlines, slice), fish eye, kaleidoscope, halftone, bloom and dehaze
- the full toolbox: marquee, lasso, magic wand, crop, brush, clone, bucket, gradient, shapes, editable text, free transform
- sliders stay live on 24 mp photos: a small proxy renders while you drag, then the exact full-res result lands
- 80 steps of copy-on-write undo, each one under a millisecond
- projects save as one .grain file with every layer intact
guise new
3.6k linesturns a switch controller into an xbox controller. my own xoutput, with rebindable everything.
i built this on a whim for one reason: i wanted to play reskate with a controller. that's it, no other reason. it ended up at 3.6k lines with a daemon, a gui, a cli, gyro and a hidhide clone, and my actual controller doesn't even have gyro or rumble. it supports both anyway.
- reads the pad straight from the kernel and grabs it so games only see the fake
- the fake has the exact identity of a real xbox 360 pad, so every game and steam treat it as one
- zero polling: each output frame goes out the instant the controller reports one
- press-to-bind remapping; the press you bind with is swallowed so it never reaches the game
- presets by position or by letter, turbo, stick routing, profiles
- deadzone, outer and anti-deadzone, response curves and invert, with a live stick preview
- gyro to stick with calibration, rumble passthrough, joy-con pairs merged into one pad
- hide mode: a udev rule that hides the real pad from steam and proton entirely (linux hidhide)
- found a bug in python-evdev's rumble upload along the way, so it does those kernel ioctls by hand
- background service plus a gui, a cli and an on/off/toggle bind
rig
4.3k linesreplaced coolercontrol. fans, aio, lcd, rgb and system monitoring.
- background daemon over a unix socket plus a gui and cli; the bar's power center reads it live
- fan curves smoothed with ema and ramp limits, panic mode at 90°c, pump curve uploaded into the kraken itself
- pushes live stats or gifs onto the kraken's 640×640 lcd
- rgb is a software effects engine: 19 effects in numpy rendered at 30 fps and streamed as raw led packets to every device
fader
3.7k linesbeacn's windows mixer, rebuilt for linux on pipewire.
- five channels (system, game, music, chat, aux) with separate personal and stream mixes
- a daemon routes every app to its channel and remembers where you put it
- ramped volume changes, zero crackle, mic latency cut from 21 ms to 5 ms
- drives the mic's onboard dsp over usb: live eq graph over the mic spectrum, headphone bass/treble, lighting
- "flex mode" with bouncing studio waves and gradient bars
terrarium
3.8k linesa small autonomous ai that lives on the pc. he named himself rill.
- wakes himself up on his own schedule, works on his own interests, journals, then picks when to sleep
- runs code inside a sandbox with no network and capped cpu and memory
- has eyes and a body: a little corner window with sprites he draws himself; poke, pet and hug him
- knows the weather, the tide and the moon phase. holds his messages while i'm in a game
splice
3.9k linesa premiere-style multi-track video editor for linux.
- compiles the whole timeline into one ffmpeg filtergraph, exports on the gpu with nvenc
- keyframes on position, scale, rotation and opacity
- chroma key, .cube luts, audio denoise and compression
- smooth playback through background-rendered proxies
halo
2.7k linesambilight for my govee bars: the lights follow what's on screen.
- captures the screen as a tiny gpu video stream so the 240 hz desktop never stutters
- splits it into zones, smooths with two-stage easing and dithering, streams frames to the lights over the lan
- drops to 8 hz when the screen is still, restores the lights' own scene on exit
- survives vpns and power-cycled lights
confidant new
1.5k linesa private ai that runs entirely on the pc. nothing leaves it.
- a 30b vision model on the 4070 super through ollama, localhost only, ~34 tokens/s
- password-locked; every chat and image encrypted with aes-gcm
- locking wipes the key, the open chats and the clipboard, and unloads the model so its memory goes too
- paste or drop images, optional web research with a strict query privacy rule, auto-lock when idle
lumen
2.3k linesmonitor control: hdr, brightness, night light, profiles.
- talks to the oled directly over ddc/ci on i2c
- smart brightness: drives sdr-in-hdr brightness when hdr is on, because the panel rejects hardware brightness in hdr
- writes hyprland's newer monitorv2 config so hdr luminance keys actually apply; slider drags apply live
flick
1.9k linesa config app for my pulsar x2 crazylight.
- speaks the mouse's hid protocol, read out of pulsar's own web driver
- dpi stages, polling rate up to 8k, lift-off, debounce, motion sync, angle snap
- whole-mouse profiles and a backup of the factory settings
hall
1.4k linesa live view of my wooting 60he+.
- every key animates to its real travel depth, 0 to 4 mm, at 60 fps
- keys glow when actuated and ripple on press; a 3-second travel graph
- measures where each key actually actuates and resets
hmlabs
1.9k linesputs my own pictures and gifs on the usb hub's little screen.
- reverse-engineered serial protocol, safe stock flash path only
- gallery with drag-drop, fill/fit, portrait mode for standing the hub up
- brightness, slideshow and a live usb power monitor
uwu vault
2.2k linesan offline password manager.
- argon2id key derivation into aes-256-gcm with an authenticated header
- key held in locked memory and wiped on lock; locks on suspend or focus loss
- built-in 2fa codes, password health audit, passphrase generator
triad wallet
1.8k linesa fake multichain crypto trading terminal, built purely to look insane.
- btc, xmr and sol, every number driven by one 40 ms heartbeat
- "the pit": flickering order books, flying trade tape, whale alerts and liquidation explosions
verse
0.7k linesdiscord "listening to spotify" with the live lyric line.
- official rich presence, no self-botting
- lyrics from spotify itself through a spicetify bridge, lrclib as backup
- runs headless as a user service
clipper
medal cloneinstant replay without obs.
- always-on 5 minute replay buffer in ram, encoded on the gpu
- f9 saves the last 30s, shift+f9 60s, ctrl+f9 15s
- 1440p at 120 fps, clip browser with thumbnails
the websites
two sites, one engine: this page and a polaroid moodboard for my gf. no framework, no build step, no database: hand-written php and plain javascript, around 4k lines, on cheap shared hosting.
what you're looking at
arch linux · kernel 7.2 · hyprland · made by wntr · updated nov 2026