No Native Deps Required: How kit.whitneys.co Themes Your Whole Desktop in Pure JavaScript
Most Node apps shuffle JSON around. kit.whitneys.co does something more audacious: it reskins your software. Give it a color, or hand it a photo, and it returns a ready-to-install theme -- for your browser, your mail client, or your entire Linux desktop -- generated on the fly, zipped, and downloaded. And it pulls the whole thing off in plain JavaScript on a stock Node server, with not a single native image library in sight.
For a JavaScript audience, that last detail is the interesting one. Server-side image work is usually where developers reach for ImageMagick, libvips, or a native canvas binding -- the dependencies that turn npm install into a compiler adventure. kit skips all of it. Here's what it does, and why it's a small masterclass in getting a lot out of the standard toolbox.
A suite of theme factories
kit is really several builders under one roof:
- Browser themes for Brave/Chrome -- choose a palette, get an installable theme.
- Thunderbird themes -- the same idea for Mozilla's mail client.
- XFCE desktop themes -- the big one: a full GTK3 + GTK2 + xfwm4 theme, so window borders, buttons, and title bars all move together.
- XFCE icon themes -- a complete, freedesktop-compliant
~/.icons/<name>/icon set, generated from a single image.
Each takes input a normal human can supply -- a few colors, or a picture -- and returns a correctly structured, drop-in theme. No hand-editing CSS. No wrestling with index.theme. That's the product. The engineering is how it gets there.
The pure-JS image pipeline
The headline trick: kit does all of its image work with jimp, a pure-JavaScript image library, so the server carries zero native dependencies. That's a deliberate -- and slightly heroic -- constraint. It means kit deploys anywhere Node runs: no apt install, no build toolchain, no "works on my machine."
And it's doing real work with it, not just resizing thumbnails:
- Palette extraction -- upload a logo or a photo and kit pulls a coherent scheme out of it, then remaps a base theme's colors to match.
- Green-screen slicing -- for icon themes it keys out the background by corner-averaged color distance, so a hand-drawn or AI-generated icon sheet separates cleanly.
- Largest-blob flood fill -- after slicing, it keeps only the biggest connected region in each cell, so a stray neighbor pixel or a label never sneaks into your icon.
- Autocrop and contain-to-square at every icon size (16, 22, 24, 32, 48, 64, 128), so the output is pixel-correct at each scale.
None of these is exotic in isolation. Doing all of them, reliably, in JavaScript, inside a request/response web server, is genuinely impressive -- and it's exactly the kind of thing that makes a JS developer lean in.
The 8x8 board: a clever interface
The icon builder deserves its own paragraph, because the design is sharp. kit defines a standard 8x8 "board" -- sixty-four cells on a green background, one per icon, in a fixed layout. You (or an image model you prompt) draw your icons into that grid; kit slices it into a full theme. It's a lovely reduction: a genuinely hard task ("make me a coherent 64-icon set") collapses into "fill in this template," and the server handles everything after. Board in, themed desktop out.
Zipping without a zip library
Delivering a theme means delivering a directory -- many files in exactly the right structure. kit packages them with a hand-rolled, pure-JavaScript ZIP writer (store mode, no compression), so even the archiving step needs no dependency. A small thing that says a lot about the app's philosophy: keep the surface tiny, own the whole pipeline, ship anywhere.
Generating real, correct theme files
Under the hood, kit isn't merely recoloring pixels -- it emits the actual formats each platform demands:
- GTK3 CSS with
@define-colorremapping (plus the stubborn hardcoded-hex cases GTK insists on), - GTK2
gtkrc, - xfwm4 title-bar theming by recoloring the vendored XPM images, palette entry by palette entry,
- a freedesktop
index.themefor icons, with the rightDirectories,Context, andInherits, - recolored SVG folder icons for accent colors.
Getting any one of these exactly right is fiddly. Getting all of them to agree -- so the result looks designed, not assembled -- is the hard part, and kit solves it quietly.
A product, not a demo
kit reads like a finished product rather than a weekend hack. There are ready-made presets (Woods, Beach, Leather, Monopoly) if you'd rather not start from a blank canvas. Sign-in is passwordless magic-link -- nothing to forget or leak. And the pricing is refreshingly plain: one free build per tool, then a single one-time unlock (about $15 per tool, or a bundle for all of them) -- no subscription, no recurring nag. You buy the tool once and it's yours.
Why JavaScript developers should look
You can enjoy kit purely as a user; it's the fastest way to make your desktop, browser, or inbox look like yours. But if you write JavaScript, there's a second layer of appreciation. kit is a working proof that you don't need a native-dependency zoo to do serious image and file generation on the server. jimp for the pixels, a few dozen lines of pure JS for the ZIP, careful format generation on top -- that's the entire stack. It's portable, it's legible, and it does something delightful.
It's the kind of app that reminds you how far plain JavaScript reaches when you're willing to build the pipeline yourself. kit.whitneys.co is where to watch it work.