Build notes from CopyCat OS.
Decisions, dead ends, and what worked.
-
Slice 19: making .app the universal target
The whole runtime work this week is one slice (19.x) with one goal: make `.app` and `.appdev` the *one source of truth* for shipping a Linux app. A `.app` should drag-anywhere, double-click, and run on Ubuntu, Fedora,…
-
Chrome pixels paint on a foreign distro (slice 19.D-α)
The first slice-19 milestone you can actually look at. Until today, the launcher could mount a single-file `.app`, register a `.desktop` entry, resolve the right theme through the four-tier precedence chain, and decide…
-
Chrome finds its window and follows it (slice 19.D-β-1)
The chrome stub from 19.D-α painted at a hardcoded (100,100) and just sat there. 19.D-β-1 makes it a proper docked title bar — it finds the bundle's window, parks itself flush against its top edge, and tracks every move…
-
Stamping the bundle id onto Legacy Mode windows (slice 19.D-β-2a)
The chrome stub from 19.D-β-1 finds the bundle window by walking `_NET_CLIENT_LIST` and matching `WM_CLASS.res_name` against the bundle id. That works for native MoonBase apps because we control how they spawn. But the…
-
Interface Scale slider + Modern vs Classic menu bars
The Displays pane got an Interface Scale slider per output (0.5× to 4.0×, continuous), riding on top of the EDID-based backing scale, with a per-config flag for whether dragging applies to the single output you grabbed…
-
Multi-monitor in earnest: hotplug, mirror, primary, DBusMenu
The Legion docks. So multi-monitor isn't a "later" feature, it's a "every day" feature. This was the day the compositor stopped pretending one output existed in any code path. RandR events became first-class in the main…
-
Naming the bundles right (and only once)
The bundle suffix went through one rename I'd rather have done earlier: `.appc` / `.appcd` (legacy, schema-suffixed names that predated the project's identity) became `.app` (shipping single file) and `.appdev`…
-
HiDPI everywhere, in points, from day one
The Legion Go S panel is 1920×1200 at 7 inches — about 323 PPI. The external monitor I dock to is 1080p at 24 inches — about 92 PPI. A desktop OS that doesn't handle that gracefully isn't a desktop OS in 2026. So HiDPI…
-
MoonBase, the framework call
The hardest design decision so far was MoonBase. Apps had to come from somewhere, and the easy answer was "host them in the shell" — one process, tabs, shared memory, fast. I rejected that. MoonBase is a framework…
-
Two sessions, genie minimize, spatial memory
CopyCatOS targets two distinct experiences and they don't share a session. The desktop session runs the full shell — MoonRock, dock, menubar, finder. The gaming session runs pure Gamescope, no MoonRock at all. They get…
-
Crystal compositor, eleven phases, then a security pass
Day two was almost entirely the compositor. I built it in phases — shader pipeline, damage tracking, blur-behind, animation framework, Mission Control, HDR, touch, VRR/Gaming, plugin/theme API — each one its own commit.…
-
The first rename: AuraOS → CopiCatOS, Crystal → MoonRock
AuraOS wasn't the right name. The project isn't an "aura"; it's an honest copy of a desktop I miss, with all the modern infrastructure under it that the original never had. I renamed everything: AuraOS became CopiCatOS…
-
Day one: bones first, name later
I wanted Snow Leopard back. Not in a VM, not as a Linux theme on top of GNOME or KDE, not as nostalgia — actually back, as a working desktop on hardware I own, with modern features bolted in cleanly. I started a repo…