{"$schema":"https://ejfox.com/schema/page-twin@1.json","kind":"project","url":"https://ejfox.com/projects/cyberdeck-saver","json_url":"https://ejfox.com/projects/cyberdeck-saver.json","generator":"ejfox.com/json-twin@1","data":{"cacheVersion":"2026-05-13-gear-cards","html":"<p class=\"\">Most cyberpunk desktops are set dressing — fake terminals scrolling gibberish for the vibe. This one is real. cyberdeck-saver is a native macOS screensaver, written in Swift and Metal, that turns your idle screen into an actual command center: a 5×5 grid of 25 terminal panels, each typing itself out with live data and post-processed through a CRT shader chain in the vulpes palette.</p>\n<p class=\"\">The rule behind it is one line from the README — <em class=\"\">no fake data; every byte on screen comes from a real API or a system call.</em> So the panels are wired to things that are actually happening: aircraft crossing the airspace over the Hudson Valley on live ADS-B, earthquakes above magnitude 2.5 in the last day, the planetary K-index off NOAA's space-weather feed, the ISS's current distance from wherever you're sitting. Next to those runs your own telemetry — Apple Health, system thermals, GitHub commits, chess ratings, what's playing on Last.fm — and your scrapbook's extracted knowledge, down to the claim-triples and the entities trending across your last fifty saves.</p>\n<figure role=\"figure\" aria-label=\"The data streams — each terminal panel fetches and parses its own feed; here, haversine math for scrapbook distances\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/cyberdeck-saver/streams.png\" alt=\"The data streams — each terminal panel fetches and parses its own feed; here, haversine math for scrapbook distances\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/projects/cyberdeck-saver/streams.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/projects/cyberdeck-saver/streams.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/cyberdeck-saver/streams.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/projects/cyberdeck-saver/streams.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"The data streams — each terminal panel fetches and parses its own feed; here, haversine math for scrapbook distances\" width=\"1400\" height=\"900\" style=\"--splay-rot:-1.95deg;\" 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 data streams — each terminal panel fetches and parses its own feed; here, haversine math for scrapbook distances</figcaption>\n</figure>\n<p class=\"\">Every panel is config-driven, the grid auto-scales to however many you switch on, and they share a single process-wide cache so twenty-five live feeds never hammer a source.</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>","title":"cyberdeck-saver","metadata":{"title":"cyberdeck-saver","date":"2026-04-20T04:00:00.000Z","category":"Tools","featured":false,"url":"https://github.com/ejfox/cyberdeck-saver","tech":["Swift","Metal","macOS","OSINT"],"state":"deployed","ai-involvement":"ai-assisted","tags":["macos","osint","design"],"words":231,"images":2,"imageDetails":{"total":2,"cloudinary":2,"withDimensions":0},"links":0,"codeBlocks":0,"headers":{},"toc":[],"type":"post"}},"_links":{"self":"https://ejfox.com/projects/cyberdeck-saver.json","html":"https://ejfox.com/projects/cyberdeck-saver","index":"/projects.json"}}