{"$schema":"https://ejfox.com/schema/page-twin@1.json","kind":"project","url":"https://ejfox.com/projects/vulpes-system","json_url":"https://ejfox.com/projects/vulpes-system.json","generator":"ejfox.com/json-twin@1","data":{"cacheVersion":"2026-05-13-gear-cards","html":"<p class=\"\">I believe that if I spend so much time looking at and thinking about my computer, I want to have full control over the fonts and colors I look at — to make it cinematic, aesthetic, \"me,\" and different. And it's so dope that when I go to coffee shops (true story), people stop me and say \"that setup looks sick, can I give you my card in case I need a dev?\"</p>\n<p class=\"\">Vulpes is what that belief turns into when you follow it all the way down. One palette — <code class=\"md-inline-code\">#e60067</code> magenta, <code class=\"md-inline-code\">#6eedf7</code> teal, near-black — and one fox glyph, pushed through every surface I touch: the editor, the terminal, the browser, the screensaver, and the little screens on the hardware in my bag. Each piece is a working tool. Together they're one look.</p>\n<figure role=\"figure\" aria-label=\"The vulpes palette across a full terminal — waveforms, logs, and the fox mark\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/vulpes-nvim/theme1.png\" alt=\"The vulpes palette across a full terminal — waveforms, logs, and the fox mark\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/projects/vulpes-nvim/theme1.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/projects/vulpes-nvim/theme1.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/vulpes-nvim/theme1.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/projects/vulpes-nvim/theme1.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"The vulpes palette across a full terminal — waveforms, logs, and the fox mark\" width=\"3600\" height=\"2262\" style=\"--splay-rot:2.62deg;\" data-dimensions=\"3600×2262\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">The vulpes palette across a full terminal — waveforms, logs, and the fox mark</figcaption>\n</figure>\n<h2 class=\"\" id=\"the-editor\">The editor</h2>\n<p class=\"\">It started with <a href=\"/projects/vulpes-nvim\" class=\"text-blue-600 dark:text-blue-400\">vulpes.nvim</a>: a cyberpunk neon colorscheme for Neovim — signature vulpes pink, teal comments, dark and light variants, and monthly color rotations. It ships matching themes for the rest of the terminal: wezterm, kitty, ghostty, alacritty, tmux, lazygit, bat, and fzf.</p>\n<figure role=\"figure\" aria-label=\"The vulpes colorscheme rendering its own palette file in Neovim\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/vulpes-nvim/editor.png\" alt=\"The vulpes colorscheme rendering its own palette file in Neovim\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/projects/vulpes-nvim/editor.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/projects/vulpes-nvim/editor.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/vulpes-nvim/editor.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/projects/vulpes-nvim/editor.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"The vulpes colorscheme rendering its own palette file in Neovim\" width=\"1300\" height=\"820\" style=\"--splay-rot:-1.07deg;\" data-dimensions=\"1300×820\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">The vulpes colorscheme rendering its own palette file in Neovim</figcaption>\n</figure>\n<p class=\"\"><a href=\"https://ejfox.github.io/vulpes-theme-lab/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"external-link group inline-flex items-center text-blue-600 dark:text-blue-400\" data-preview-url=\"https://ejfox.github.io/vulpes-theme-lab/\">Vulpes Theme Lab<svg class=\"inline-block w-4 h-4 ml-1 opacity-50 dark:opacity-75 group-hover:opacity-100 transition-opacity align-text-bottom\" xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M14.435 12.973c.269 0 .492.133.686.396c.192.265.294.588.294.975c0 .385-.102.711-.294.973c-.193.265-.417.396-.686.396c-.278 0-.522-.131-.715-.396c-.192-.262-.294-.588-.294-.973c0-.387.102-.71.294-.975c.192-.264.436-.396.715-.396m3.44-3.559c.746.811 1.125 1.795 1.125 2.953q0 1.122-.259 2.023q-.263.896-.654 1.459a4.3 4.3 0 0 1-.974.989a5 5 0 0 1-1.065.623a5.5 5.5 0 0 1-1.111.306a9 9 0 0 1-.943.123l-.685.014l-.547.015a18 18 0 0 1-1.524 0l-.547-.015l-.685-.014a9 9 0 0 1-.943-.123a5.3 5.3 0 0 1-1.111-.306a5 5 0 0 1-1.064-.623a4.3 4.3 0 0 1-.975-.989q-.392-.563-.654-1.459q-.26-.9-.259-2.023c0-1.158.379-2.143 1.125-2.953q-.123-.062-.008-1.217a7 7 0 0 1 .495-2.132c.934.099 2.09.629 3.471 1.581c.466-.119 1.101-.183 1.917-.183q1.278.002 1.918.184q.943-.638 1.805-1.034c.584-.261 1.005-.416 1.269-.457l.396-.09q.404.974.496 2.132q.114 1.154-.009 1.216m-5.845 7.82c1.688 0 2.954-.202 3.821-.607c.855-.404 1.292-1.238 1.292-2.496q0-1.096-.822-1.828a1.85 1.85 0 0 0-.989-.486q-.563-.091-1.72 0q-1.155.091-1.582.09c-.385 0-.8-.018-1.319-.059q-.78-.06-1.223-.078a3.7 3.7 0 0 0-.958.108a1.9 1.9 0 0 0-.853.425c-.521.469-.79 1.077-.79 1.828q0 1.888 1.28 2.496c.85.405 2.113.607 3.802.607zm-2.434-4.261c.268 0 .492.133.685.396c.192.265.294.588.294.975c0 .385-.102.711-.294.973c-.192.265-.417.396-.685.396c-.279 0-.522-.131-.716-.396c-.192-.262-.294-.588-.294-.973c0-.387.102-.71.294-.975c.193-.264.436-.396.716-.396\" class=\"\"></path></svg></a> is the live builder for it: tweak a base hue and a ±7° offset and watch nvim, lazygit, htop, and tmux recolor in real time.</p>\n<figure role=\"figure\" aria-label=\"The theme lab — palette controls on the left, live nvim / lazygit / htop / tmux previews recoloring as you tune\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/vulpes-theme-lab/previews.png\" alt=\"The theme lab — palette controls on the left, live nvim / lazygit / htop / tmux previews recoloring as you tune\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/projects/vulpes-theme-lab/previews.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/projects/vulpes-theme-lab/previews.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/vulpes-theme-lab/previews.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/projects/vulpes-theme-lab/previews.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"The theme lab — palette controls on the left, live nvim / lazygit / htop / tmux previews recoloring as you tune\" width=\"1796\" height=\"2262\" style=\"--splay-rot:-2deg;\" data-dimensions=\"1796×2262\" class=\"img-full my-8 rounded-sm img-splay aspect-[3/4] w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">The theme lab — palette controls on the left, live nvim / lazygit / htop / tmux previews recoloring as you tune</figcaption>\n</figure>\n<h2 class=\"\" id=\"the-devices\">The devices</h2>\n<p class=\"\"><a href=\"/projects/vulpes-devices\" class=\"text-blue-600 dark:text-blue-400\">Vulpes Devices</a> carries the same palette file out to seven hardware targets — Flipper Zero, OnionOS handhelds, the TD-H3 radio, Meshtastic nodes, a PortaPack, plus iPhone and iMac wallpapers — so everything boots in the same visual language.</p>\n<figure role=\"figure\" aria-label=\"One look, many targets — the Vulpes glyph and palette generated across Flipper, OnionOS, TD-H3, Meshtastic, PortaPack, and the desktop\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/vulpes-devices/devices.png\" alt=\"One look, many targets — the Vulpes glyph and palette generated across Flipper, OnionOS, TD-H3, Meshtastic, PortaPack, and the desktop\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/projects/vulpes-devices/devices.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/projects/vulpes-devices/devices.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/vulpes-devices/devices.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/projects/vulpes-devices/devices.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"One look, many targets — the Vulpes glyph and palette generated across Flipper, OnionOS, TD-H3, Meshtastic, PortaPack, and the desktop\" width=\"1524\" height=\"656\" style=\"--splay-rot:0.6deg;\" data-dimensions=\"1524×656\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">One look, many targets — the Vulpes glyph and palette generated across Flipper, OnionOS, TD-H3, Meshtastic, PortaPack, and the desktop</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"The Flipper Zero boot animation, generated straight from the palette — the fox, on a 128×64 monochrome screen\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/vulpes-devices/boot.gif\" alt=\"The Flipper Zero boot animation, generated straight from the palette — the fox, on a 128×64 monochrome screen\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/projects/vulpes-devices/boot.gif 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/projects/vulpes-devices/boot.gif 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/vulpes-devices/boot.gif 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/projects/vulpes-devices/boot.gif 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"The Flipper Zero boot animation, generated straight from the palette — the fox, on a 128×64 monochrome screen\" style=\"--splay-rot:1.52deg;\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">The Flipper Zero boot animation, generated straight from the palette — the fox, on a 128×64 monochrome screen</figcaption>\n</figure>\n<h2 class=\"\" id=\"the-screen-when-i-walk-away\">The screen when I walk away</h2>\n<p class=\"\"><a href=\"/projects/cyberdeck-saver\" class=\"text-blue-600 dark:text-blue-400\">cyberdeck-saver</a> is a native macOS screensaver in Swift and Metal: a 5×5 grid of terminal panels typing out live data — ADS-B aircraft over the Hudson Valley, earthquakes, space weather, my own telemetry — through a CRT shader chain in the vulpes palette. No fake data; every byte comes from a real API or a system call.</p>\n<figure role=\"figure\" aria-label=\"The Metal fragment shader behind the screensaver&#x27;s CRT look\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/cyberdeck-saver/code.png\" alt=\"The Metal fragment shader behind the screensaver&#x27;s CRT look\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/projects/cyberdeck-saver/code.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/projects/cyberdeck-saver/code.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/cyberdeck-saver/code.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/projects/cyberdeck-saver/code.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"The Metal fragment shader behind the screensaver&#x27;s CRT look\" width=\"1400\" height=\"900\" style=\"--splay-rot:0.6deg;\" data-dimensions=\"1400×900\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">The Metal fragment shader behind the screensaver's CRT look</figcaption>\n</figure>\n<h2 class=\"\" id=\"the-rest-of-the-kit\">The rest of the kit</h2>\n<ul class=\"list-disc\">\n<li class=\"\"><strong class=\"\"><a href=\"https://github.com/ejfox/vulpes-browser\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"external-link group inline-flex items-center text-blue-600 dark:text-blue-400\" data-preview-url=\"https://github.com/ejfox/vulpes-browser\">Vulpes Browser<svg class=\"inline-block w-4 h-4 ml-1 opacity-50 dark:opacity-75 group-hover:opacity-100 transition-opacity align-text-bottom\" xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" class=\"\"></path></svg></a></strong> — a minimalist web browser in Zig, Swift, and Metal, rendered entirely on the GPU, with particle effects, link glow, and a two-pass bloom.</li>\n<li class=\"\"><strong class=\"\">Vulpes RSS</strong> — a TUI feed reader that renders images <em class=\"\">inline</em> in the terminal by implementing the Kitty Graphics Protocol in pure Rust.</li>\n<li class=\"\"><strong class=\"\">VulpeSVG</strong> — a native visual SVG editor in Tauri and Vue, with a properties inspector for every element's geometry.</li>\n</ul>\n<figure role=\"figure\" aria-label=\"The vulpes browser rendering ejfox.com\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/vulpes/browser.png\" alt=\"The vulpes browser rendering ejfox.com\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/projects/vulpes/browser.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/projects/vulpes/browser.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/vulpes/browser.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/projects/vulpes/browser.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"The vulpes browser rendering ejfox.com\" width=\"2400\" height=\"1656\" style=\"--splay-rot:2.75deg;\" data-dimensions=\"2400×1656\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">The vulpes browser rendering ejfox.com</figcaption>\n</figure>","title":"Vulpes","metadata":{"title":"Vulpes","date":"2026-01-18T05:00:00.000Z","category":"Art","featured":true,"url":"https://github.com/ejfox/vulpes.nvim","tech":["Lua","Swift","Metal","Rust","Zig","Tauri","Flipper Zero"],"state":"doing","ai-involvement":"ai-assisted","tags":["vulpes","design","aesthetic","tools","hardware"],"words":489,"images":7,"imageDetails":{"total":7,"cloudinary":7,"withDimensions":0},"links":5,"codeBlocks":0,"headers":{"h2":4},"toc":[{"text":"The editor","slug":"the-editor","level":"h2","children":[]},{"text":"The devices","slug":"the-devices","level":"h2","children":[]},{"text":"The screen when I walk away","slug":"the-screen-when-i-walk-away","level":"h2","children":[]},{"text":"The rest of the kit","slug":"the-rest-of-the-kit","level":"h2","children":[]}],"type":"post"}},"_links":{"self":"https://ejfox.com/projects/vulpes-system.json","html":"https://ejfox.com/projects/vulpes-system","index":"/projects.json"}}