Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
129 commits
Select commit Hold shift + click to select a range
a9a52cc
docs: replace shell design baseline with neon notch target
reze-dev Oct 2, 2026
3430f2d
fix(ui): repair notch-to-CCC click routing and session action bypass
reze-dev Oct 2, 2026
fe889cf
refactor(ui): remove dead pre-consolidation code and fix barHeight sp…
reze-dev Oct 2, 2026
b81d2d5
feat(theme): remap design tokens onto the navy/neon palette
reze-dev Oct 2, 2026
dbb93e6
fix(theme): split accent from health at the 39 status call sites
reze-dev Oct 2, 2026
5a2b838
fix(network): deliver the Wi-Fi PSK on stdin instead of argv
reze-dev Oct 2, 2026
1fbb165
feat(ui): apply target notch geometry and gradient border
reze-dev Oct 2, 2026
d55c172
fix(telemetry): make SystemMonitorService recoverable from read failures
reze-dev Oct 2, 2026
a6510b9
build(ci): add a QML parse gate and reproducible QML tooling
reze-dev Oct 2, 2026
31c3763
build(dev): headless render harness for visual verification of the shell
reze-dev Oct 2, 2026
1fb2bea
fix(calendar): correct the SystemClock precision enum in CalendarPopup
reze-dev Oct 2, 2026
20fec32
fix(theme): retokenise the last of the pre-rebrand palette
reze-dev Oct 2, 2026
d34e746
fix(widgets): stop header rows clipping, and break two binding loops
reze-dev Oct 2, 2026
6d25005
refactor(notch): one hover authority, one writable state per fact
reze-dev Oct 2, 2026
5d9277f
feat(ui): draw the identity mark as a themed hexagon
reze-dev Oct 2, 2026
91bd4ab
feat(ui): host the CCC inside the notch's own window
reze-dev Oct 2, 2026
7c74896
feat(ui): split the CCC into two columns
reze-dev Oct 2, 2026
1d4004e
feat(ccc): add a System Status card for CPU, memory, disk and network
reze-dev Oct 2, 2026
ea497fd
fix(ccc): size the notification body by its contents
reze-dev Oct 2, 2026
4429e50
feat(ui): add Card, ToggleSwitch and GlyphIcon primitives for the CCC…
reze-dev Oct 2, 2026
35ba882
feat(ccc): rebuild the command centre on Card
reze-dev Oct 2, 2026
1f20ea6
test(shot): give the render its own session bus, and a pre-capture hook
reze-dev Oct 2, 2026
07c28f4
feat(ccc): port the notifications card
reze-dev Oct 2, 2026
6b0e3e7
feat(ccc): port the power and session card
reze-dev Oct 2, 2026
238bfd1
feat(ccc): port the audio and media card, and stop toasts over the panel
reze-dev Oct 2, 2026
17c5b35
feat(ccc): port the bluetooth card
reze-dev Oct 2, 2026
122832c
feat(ccc): port the wifi card
reze-dev Oct 2, 2026
36f0721
refactor(ui): drop AccordionSection and the old SystemStatusSection
reze-dev Oct 2, 2026
4d69241
fix(ccc): set each ring's percentage in its own colour, label above
reze-dev Oct 2, 2026
4fb4bae
feat(ui): rebuild the notch bar as the panel header
reze-dev Oct 2, 2026
553de8b
fix(ccc): collapse the wifi list by default so the panel fits
reze-dev Oct 2, 2026
f875e1c
fix(ui): make the command centre clickable, and stop the notch overfl…
reze-dev Oct 2, 2026
6e13905
fix(ui): retire the duplicate hover view, restore the status word
reze-dev Oct 2, 2026
00682f1
fix(notch): let a click on the hovered bar open the command centre
reze-dev Oct 2, 2026
d83c6bf
feat(ui): set the functional glyphs in Material Icons Outlined
reze-dev Oct 3, 2026
26b54ac
fix(ui): centre the icons on their box instead of on their metrics
reze-dev Oct 3, 2026
43fcb5b
fix(audio): label the capture slider with a microphone
reze-dev Oct 3, 2026
cdc7409
feat(notch): bring the pill's proportions in line with the design
reze-dev Oct 3, 2026
79bd975
feat(devshell): add tools for driving real hover and click input
reze-dev Oct 3, 2026
030e326
feat(tools): allow the harness to nest in a running compositor
reze-dev Oct 3, 2026
668908f
fix(session): quit the outgoing session before starting the next one
reze-dev Oct 3, 2026
b1cbba0
Revert "fix(session): quit the outgoing session before starting the n…
reze-dev Oct 3, 2026
3b463ce
fix(notch): declare calendarOpen instead of writing it dynamically
reze-dev Oct 3, 2026
282fcf0
fix(compositor): read niri's real workspaces instead of assuming five
reze-dev Oct 3, 2026
5e09b82
feat(ccc): join the panel to the notch, and narrow it to the design
reze-dev Oct 3, 2026
12b08a4
fix(hyprland): point the session at the NVIDIA driver libraries
reze-dev Oct 3, 2026
5e7ecb2
chore(debug): log the Hyprland session environment
reze-dev Oct 3, 2026
a163867
fix(greeter): honour launchOverride ahead of the desktop entry's Exec
reze-dev Oct 3, 2026
7e99787
Revert "fix(greeter): honour launchOverride ahead of the desktop entr…
reze-dev Oct 3, 2026
f5d97b1
fix(hyprland): prefer the AMD APU via AQ_DRM_DEVICES and enable real …
reze-dev Oct 3, 2026
2981fd3
fix(hyprland): restrict aquamarine to the AMD APU alone
reze-dev Oct 3, 2026
d729695
fix(hyprland): build Hyprland from the system nixpkgs to fix a glibc …
reze-dev Oct 3, 2026
4ae33f5
fix(hyprland): start the session via nixos-fake-graphical-session.target
reze-dev Oct 3, 2026
a86f237
feat(bar): dismiss the CCC on an outside click
reze-dev Oct 3, 2026
8428fa8
feat(calendar): month grid and day timeline from local .ics files
reze-dev Oct 3, 2026
8d5fa86
fix(ccc): make the panel's own controls clickable again
reze-dev Oct 4, 2026
433821a
feat(theme): retheme to Rosé Pine
reze-dev Oct 4, 2026
a3d32d8
feat(theme): adopt the base46 Rosé Pine derivative palette
reze-dev Oct 4, 2026
6642938
feat(icons): move to Material Symbols and replace the hexagon logo
reze-dev Oct 4, 2026
0af53a4
feat(notch): centre the clock and size the pill to its content
reze-dev Oct 4, 2026
710c200
feat(notch): love dot in the hexagon, pine workspaces, smaller tray, …
reze-dev Oct 4, 2026
4b1ccb3
fix(notch): actually shrink the tray glyphs
reze-dev Oct 4, 2026
013ec68
fix(notch): size every glyph to the clock
reze-dev Oct 4, 2026
72a3773
fix(notch): match glyph ink height to the clock, not font size
reze-dev Oct 4, 2026
5352022
fix(notch): restore the hexagon's presence
reze-dev Oct 4, 2026
ed2db74
feat(notch): fill the hexagon in rose, keeping its edges
reze-dev Oct 4, 2026
20bc15c
fix(notch): fill the hexagon in love, not rose
reze-dev Oct 4, 2026
d49e475
fix(radial): point the scrim at palBase, not a token that no longer e…
reze-dev Oct 4, 2026
043c637
fix(cards): put the chevron hit area on the chevron
reze-dev Oct 4, 2026
eec71cb
fix(shell): break the visible binding loop on the scrim host
reze-dev Oct 4, 2026
e55b040
fix(ccc): move System Status to the left column
reze-dev Oct 4, 2026
6ebcbb4
fix(ccc): make Logout, Reboot and Poweroff work at all
reze-dev Oct 4, 2026
4c14881
fix(bar): align the CCC's top edge to the notch's bottom edge
reze-dev Oct 4, 2026
eb137eb
fix(ccc): pad card content below the header, and let the wifi prompt …
reze-dev Oct 4, 2026
ed99eeb
fix(cards): move the card's padding from below the content to above it
reze-dev Oct 4, 2026
4ba1eda
fix(cards): inset the card from its top edge instead of padding under…
reze-dev Oct 4, 2026
d4c543a
fix(cards): pad collapsed cards the same as expanded ones
reze-dev Oct 4, 2026
f1e8d51
fix(cards): make the card's vertical padding symmetric at 8
reze-dev Oct 4, 2026
bf72ebc
fix(network): stop the Wi-Fi card from announcing "Ethernet"
reze-dev Oct 4, 2026
752aac1
fix(network): stack Join over Cancel and size the prompt to its content
reze-dev Oct 4, 2026
be56406
fix(network): keep Join and Cancel side by side, equal, on a tight panel
reze-dev Oct 4, 2026
ba9df3c
fix(network): drop the stray 8px from the Wi-Fi card body height
reze-dev Oct 4, 2026
7e59897
Give the overlay host a pointer input region
reze-dev Oct 4, 2026
2151f5b
Add the picker control type and generate the radial preview subtrees
reze-dev Oct 4, 2026
1705e24
Ship the shell palette as validated slots with a runtime switch
reze-dev Oct 4, 2026
12e311b
Add a wallpaper browser over a user-settable directory
reze-dev Oct 5, 2026
1bceec7
Make the radial stop asserting things it cannot back up
reze-dev Oct 5, 2026
b632c85
Add a security toolkit module and wire it into the radial
reze-dev Oct 5, 2026
d7e9b69
Fix wallpaper install breaking system.build.toplevel
reze-dev Oct 5, 2026
70a8e84
Probe hydra-server, not hydra
reze-dev Oct 5, 2026
bf1457f
Arm the CCC card before applying it, not after
reze-dev Oct 5, 2026
f63a30e
Derive the settings tree from one topology instead of two geometries
reze-dev Oct 5, 2026
740ccf7
Bucket the toolkit into three groups instead of seven
reze-dev Oct 5, 2026
07a58c1
Stop dismissing the radial on an outside click, and put the wheel bac…
reze-dev Oct 5, 2026
15cac59
Shrink preview nodes from 30 to 20
reze-dev Oct 5, 2026
0e2c948
Draw the base tree as black discs and highlight only the focused sect…
reze-dev Oct 5, 2026
aaf9e26
Derive lock state from topology instead of typing it out 31 times
reze-dev Oct 5, 2026
d658ad3
Match the wheel's tree proportions to the reference, measured not gue…
reze-dev Oct 5, 2026
2decf3e
Elongate the wheel's branches so each edge reads as a branch
reze-dev Oct 5, 2026
e6edd41
Give the wheel's trees their own geometry, and stop a fork aiming bac…
reze-dev Oct 5, 2026
cf922b2
Brighten the radial backdrop in both palettes
reze-dev Oct 5, 2026
69c98a3
Stop dismissing the radial on an outside click
reze-dev Oct 5, 2026
7ebadec
Lay the expanded tree out from relationships and parameters, not a fi…
reze-dev Oct 5, 2026
146930d
Narrow the fan so a branch cannot reach back through the wheel
reze-dev Oct 5, 2026
156a7df
Let the wheel's fork arms stay diverged, and show the trunk
reze-dev Oct 5, 2026
0373a17
Turn the preview trees to grow outward along their own segment
reze-dev Oct 5, 2026
256db0a
Make the fork angle local, so descendants return to the axis
reze-dev Oct 5, 2026
4890776
Shorten the wheel's preview trunk to the reference proportion
reze-dev Oct 5, 2026
5da88fc
Switch both launchers to fuzzel, add ydotool, fix CTOS_INPUT escaping
reze-dev Oct 5, 2026
3f5169e
Fix the mic volume slider, which was off or full and nothing between
reze-dev Oct 5, 2026
409ea28
Give the wallpaper grid the panel's height, and re-list it on open
reze-dev Oct 5, 2026
291ac4f
Make the shell the authority on the desktop wallpaper
reze-dev Oct 5, 2026
359e3b5
Have the wallpaper unit apply the recorded choice, not a hardcoded v1
reze-dev Oct 5, 2026
4dc82ec
Add a scroll indicator to the wallpaper grid
reze-dev Oct 5, 2026
e7b7e74
Retire the network and Bluetooth popups in favour of the Command Center
reze-dev Oct 5, 2026
444b8d8
WIP: gtk module
reze-dev Oct 6, 2026
90f38aa
feat: add GTK theming module with Nautilus + Yaru theme
reze-dev Oct 6, 2026
e868ac6
feat: replace KDE polkit/portal with GTK equivalents
reze-dev Oct 6, 2026
51a2245
chore(flake.lock): bump flake.lock inputs
reze-dev Oct 6, 2026
712330e
feat: replace nautilus with thunar, yazi with superfile
reze-dev Oct 6, 2026
311d0ce
revert: restore KDE/Dolphin + superfile
reze-dev Oct 6, 2026
ed90052
fix: add nautilus and use yaru theme for nautilus
reze-dev Oct 6, 2026
7a9a5cb
fix: remove dolphin and kde apps, remove janky mime app declarations …
reze-dev Oct 6, 2026
598630f
chore: disable debugging mode
reze-dev Oct 6, 2026
a58fa65
Notch: conditional wifi/ethernet glyph + volume/battery size bump
reze-dev Oct 6, 2026
dff07d8
docs: add CHANGELOG.md + update decision-log + delivery-tracker
reze-dev Oct 6, 2026
0f176af
delivery-tracker: fix C2 (dropped) + update Phase B to reflect reality
reze-dev Oct 6, 2026
ee93ba7
chore: bump nixflake inputs
reze-dev Oct 8, 2026
29b0992
ci: fix formatting to pass ci tests
reze-dev Oct 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,8 @@ result/
*.pyc
.direnv/
*report.json

# Wallpapers kept locally but not shipped. The shipped set is the two entries in
# modules/features/desktop/wallpaper.nix and WallpaperService.wallpapers; adding
# an image here means adding it to both, not just dropping it in this directory.
shell/extras/wallpapers/waifu-*
119 changes: 119 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
# Changelog

All notable changes to ctOS are documented here.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

## [Unreleased]

### Fixed

#### Major Bug Fixes

- **Radial menu geometry was completely inverted** — Trees grew sideways across their own segment instead of outward along the segment axis. Fixed by correcting the layout frame from `(sin, -cos)` to `(cos, sin)` so `dir 0` maps to `+x` (outward). (commit `1162e81`)

- **Radial tree branching was dendrite instead of columns** — Each fork was inherited by the subtree, causing ever-widening spread. Now fork angle is local to the generation; descendants return to the axis, producing parallel columns. (commit `be5bda0`)

- **Preview trunk was 2× too long** — `r1Point` 300 → 242, matching the reference proportion (0.35× ring radius). The drawn trunk went from 99px to 41px. (commit `53b39d8`)

- **Mic volume slider was completely broken** — Node declared `minValue`/`maxValue`/`stepSize` but slider reads `minVal`/`maxVal`/`step`. It inherited defaults `0/100/1` against a 0–1 gain, making it off-or-full with nothing between. Also added missing `root.revision++` for repaint. (commit `21a006f`)

- **Wallpaper selection reverted after reboot** — Three stacked faults:
1. `ctos-wallpaper.service` applied v1 unconditionally, never reading `settings.json`
2. Fallback could destroy the record: a premature scan saw the default `wallpaper-v1.png`, which wasn't in the directory, so it wrote the first image over the user's choice and saved it
3. Stale-result guard compared against the *intended* directory, so an old scan's files were adopted as the current directory's — producing fallbacks to images from the wrong directory
(commit `5c0f726`)

- **Boot flash of wallpaper v1** — `ctos-wallpaper.service` hardcoded v1. Now the unit reads `settings.json` and applies the recorded choice, falling back to v1 only when the setting is missing/unreadable/invalid. Removed dead code `defaultWallpaper`. (commit `7dccfff`)

- **Network/Bluetooth popups were dead code but live** — 1682 lines deleted. Notch and IPC rewired to Command Center cards. Verified zero ReferenceErrors on boot. (commit `f557517`)

- **Mic volume slider was inverted contract** — Node used `minValue`/`maxValue`/`stepSize` but slider reads `minVal`/`maxVal`/`step`. Added missing `root.revision++` for repaint. (commit `21a006f`)

#### Minor Bug Fixes

- **Wallpaper grid only showed 2 rows** — Footer filler `Item { Layout.fillHeight: true }` competed with browser control box for leftover space. Filler now yields when browser is active: 2 → 5 rows. (commit `58ee861`)

- **Wallpaper list never refreshed** — Scanned once at boot. Now rescans when browser becomes visible. (commit `58ee861`)

- **Stale scan results from wrong directory** — `_scannedDir` recorded intent, not actual scan directory. Scan output now self-describes its directory; guard compares against that. (commit `5c0f726`)

- **Preview trunk drawn 2× too long** — `r1Point` 300 → 242 (reference proportion 0.35× ring radius). Visible run: 99px → 41px. (commit `53b39d8`)

- **Radial preview trunk was 2× too long** — `r1Point` 300 → 242 (reference proportion 0.35× ring radius). Visible run: 99px → 41px. (commit `53b39d8`)

- **Radial trees grew sideways** — Local layout frame was `(sin, -cos)` so `dir 0` = up. Changed to `(cos, sin)` so `dir 0` = +x (outward). (commit `1162e81`)

- **Radial trees were dendrites, not columns** — Fork angle was inherited by subtree. Now fork is local; descendants return to axis. (commit `be5bda0`)

- **Network/Bluetooth popups showed wrong glyph** — Notch always showed wifi glyph even on ethernet. Now conditional: wifi glyph on WiFi, ethernet glyph on wired. (commit `bfcac30`)

- **Volume/battery glyphs too small** — `opticalScale`: volume 0.85→0.90, battery 0.73→0.85 (now matches wifi scale). (commit `bfcac30`)

- **DevShell `CTOS_INPUT` flag was broken** — `${CTOS_INPUT: -0}` inside indented string was parsed as Nix interpolation. Fixed to `''${CTOS_INPUT:-0}`. (commit `b04f5f5`)

- **`defaultWallpaper` dead code removed** — Defined but never referenced. (commit `7dccfff`)

### Added

- **Wallpaper grid scroll indicator** — Hand-rolled track+thumb (no Controls dependency). Thumb proportional to visible fraction with 24px floor. Travel arithmetic verified: thumb lands exactly on track bottom at max scroll. (commit `8cac07e`)

- **Conditional network glyph in notch** — WiFi glyph on WiFi, ethernet (router) glyph on wired. Detail shows signal% on WiFi, "LAN" on Ethernet. (commit `bfcac30`)

- **Ethernet glyph added** — Material Symbols U+E328 (router) added to `GlyphIcon.qml`. (commit `bfcac30`)

- **Volume/battery glyph size parity** — Volume `opticalScale` 0.85→0.90, battery 0.73→0.85 (matches wifi scale). (commit `bfcac30`)

- **Wallpaper unit reads recorded choice** — `ctos-wallpaper.service` now reads `settings.json` and applies recorded choice; falls back to v1 only when unreadable/absent/invalid. (commit `7dccfff`)

- **Wallpaper grid scroll indicator** — Hand-rolled track+thumb with 24px floor. (commit `8cac07e`)

- **Wallpaper rescans on browser open** — List was frozen at boot; now rescans when browser becomes visible. (commit `58ee861`)

- **Stale scan guard now self-describing** — Scan output declares its directory; guard compares against that, not against overwritten `_scannedDir`. (commit `5c0f726`)

- **Mic volume slider contract fix** — Node used `minValue`/`maxValue`/`stepSize`; slider reads `minVal`/`maxVal`/`step`. Added missing `root.revision++`. (commit `21a006f`)

- **DevShell `CTOS_INPUT` escaping fix** — `${CTOS_INPUT: -0}` → `''${CTOS_INPUT:-0}`. (commit `b04f5f5`)

### Changed

- **Radial trees now grow outward** — Local frame `(cos, sin)` so `dir 0` = +x (outward). `projectPoint` maps this to outward radial for every segment. (commit `1162e81`)

- **Radial fork angle is now local** — Descendants return to axis, producing parallel columns instead of widening dendrite. (commit `be5bda0`)

- **Preview trunk shortened to reference proportion** — `r1Point` 300 → 242 (0.35× ring radius). (commit `53b39d8`)

- **Wallpaper unit now reads settings** — Applies recorded choice; falls back to v1 only on error. (commit `7dccfff`)

- **Network/Bluetooth popups retired** — Replaced by Command Center cards. Notch and IPC rewired to CCC submenus. (commit `f557517`)

- **Volume/battery glyph sizes increased** — Volume `opticalScale` 0.85→0.90, battery 0.73→0.85. (commit `bfcac30`)

- **Conditional network glyph in notch** — WiFi glyph on WiFi, ethernet glyph on wired. Detail shows signal% or "LAN". (commit `bfcac30`)

- **Ethernet glyph added** — Material Symbols U+E328 (router). (commit `bfcac30`)

- **DevShell `CTOS_INPUT` escaping fixed** — `${CTOS_INPUT: -0}` → `''${CTOS_INPUT:-0}`. (commit `b04f5f5`)

- **`defaultWallpaper` dead code removed** (commit `7dccfff`)

### Removed

- **NetworkPopup.qml** (910 lines) — Retired, replaced by CCC WiFi card. (commit `f557517`)

- **BluetoothPopup.qml** (772 lines) — Retired, replaced by CCC Bluetooth card. (commit `f557517`)

- **`defaultWallpaper`** dead code in `wallpaper.nix` (commit `7dccfff`)

- **`toggleNetwork`/`toggleBluetooth` helpers in `shell.qml`** — Rewired to CCC submenus. (commit `f557517`)

- **`bluetoothVisible`/`networkVisible` properties** — No longer needed. (commit `f557517`)

- **Per-screen liveness checks for popups** — No longer needed. (commit `f557517`)

---

## [0.1.0] - 2026-10-05

Initial release baseline.
15 changes: 11 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ Instead of relying on bloated desktop environments or a mishmash of uncoordinate

### // KEY FEATURES

- `[+]` **Custom Quickshell Desktop** — Includes a massive `SystemRail` for hardware/session controls, an `AmbientBar`, and an instantaneous `CommandDeck` runner.
- `[+]` **Custom Quickshell Desktop** — A single unified Living Notch that breathes open on hover and unfolds into an Adaptive Command & Control Center, plus an instantaneous `CommandDeck` runner.
- `[+]` **Immersive Greetd Login** — A fully custom graphical login screen featuring a hacker boot sequence and glitch shaders.
- `[+]` **Wayland Compositors** — Highly-tuned, modular integrations for both **Hyprland** and **Niri**.
- `[+]` **Performance Optimized** — The QML shell is heavily optimized: surfaces are kept in RAM, Javascript search models are pre-computed, and aggressive background logging is disabled for a snappy UX.
Expand Down Expand Up @@ -77,13 +77,20 @@ ctOS/
│ └── terminals/ # Kitty, Ghostty
│
├── shell/ # The ctOS Quickshell Desktop Environment
│ ├── desktop/ # QML Surfaces (CommandDeck, SystemRail, AmbientBar)
│ ├── greeter/ # Custom Greetd login screen
│ └── common/ # Shared QML singletons, loggers, and services
│ ├── shell.qml # Desktop entry point; owns every PanelWindow
│ ├── desktop/ # QML: core (tokens, overlay, settings), services,
│ │ # adapters (hyprland), surfaces (notch, CCC)
│ ├── greeter/ # Custom Greetd login screen (separate boundary)
│ ├── docs/target/ # Authoritative design spec + reference images
│ └── nix/ # package.nix + Home Manager module
│
├── tests/ # QML e2e harnesses (not yet in `nix flake check`)
│
└── assets/ # GRUB themes, Plymouth splashes, SVG iconography
```

See [`shell/docs/target/`](shell/docs/target/) for the shell design specification.

---

## // COMPOSABLE PROFILES
Expand Down
Loading
Loading