Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
8dc9dd7
Merge pull request #3 from reze-dev/feat/bar-redesign-qol
reze-dev Sep 16, 2026
2c5b4dd
fix(tmux): change tmux theme to improve consistency
reze-dev Sep 16, 2026
c4614e0
chore(flake.lock): nixos-unstable flake input bump
reze-dev Sep 16, 2026
9c36f1f
docs: add future enhancements to v2 roadmap
reze-dev Sep 16, 2026
059bd90
docs: add packet analyzer widget to planned features
reze-dev Sep 16, 2026
92ce9ee
style: ui polish for ambient bar
reze-dev Sep 16, 2026
a1df2e2
feat(lockscreen): implement ctOS themed hyprlock and hypridle
reze-dev Sep 16, 2026
ed8bcac
feat(session): implement global SessionService for stable session act…
reze-dev Sep 16, 2026
bdfcf16
feat(niri): integrate niri compositor support and workspace fallback
reze-dev Sep 16, 2026
92608b2
test(session): add headless test coverage for SessionService and Niri…
reze-dev Sep 16, 2026
8dcbb77
style(niri): update focus-ring color and add eDP-1 scaling
reze-dev Sep 16, 2026
3d3621d
chore(xdg): change default editor from zed to emacs
reze-dev Sep 16, 2026
d212079
chore(xdg): replace ghostty fallback with neovim
reze-dev Sep 17, 2026
ff060a4
fix(niri): correct command deck spawn arguments
reze-dev Sep 17, 2026
95a83da
feat(system): implement robust fuzzy search and fix compositor logout…
reze-dev Sep 17, 2026
092c4c2
feat(network): implement NetworkPopup drop-down for Ambient Bar
reze-dev Sep 17, 2026
82fcf48
feat(network): wire NetworkPopup in shell and add tests
reze-dev Sep 17, 2026
03e4b59
test(network): add final audit and stress tests
reze-dev Sep 17, 2026
96734b4
fix(ui): resolve AmbientBar crash and QML parsing regressions
reze-dev Sep 17, 2026
3c3cc3b
fix(pkg): pass -p flag to quickshell entrypoint
reze-dev Sep 17, 2026
8340846
fix: resolve niri duplicate bars and systemrail execution destruction
reze-dev Sep 17, 2026
7807cbc
fix: enforce quickshell no-duplicate flag and fix cross-compositor lo…
reze-dev Sep 17, 2026
3db618b
feat(network): implement wireshark packet analyzer widget and integra…
reze-dev Sep 17, 2026
623915f
style(widgets): move audio surveillance widget to right column below …
reze-dev Sep 17, 2026
6a3df82
fix(shell): force kill existing quickshell instances on launch and fi…
reze-dev Sep 17, 2026
b1a0215
fix(shell): fix ctos-shell-msg packaging heredoc and export default p…
reze-dev Sep 17, 2026
702e654
refactor(nix): clean WM configs, eliminate dead code, and fix tool mo…
reze-dev Sep 17, 2026
5d22626
refactor(shell): eliminate dead QML code, isolate greeter common, and…
reze-dev Sep 17, 2026
d46c1d0
test(m4): expand automated test suites and remediate baseline e2e fai…
reze-dev Sep 18, 2026
c1307b5
fix(hardening): eliminate ClockWidget MouseArea regression and fuzz-h…
reze-dev Sep 18, 2026
4eac515
ci:fix formatting to pass ci tests
reze-dev Sep 18, 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
24 changes: 11 additions & 13 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,9 @@ This provides `nixfmt`, `nil` (Nix LSP), `python3`, `git`, and `jq`.

## Adding a New Host

1. Run the interactive installer (creates `hosts/<hostname>` automatically):
```bash
nix run . --impure
```
Create a host directory (`hosts/YourHostName` containing `default.nix`, `disko.nix`, and `hardware.nix`):

2. Or create a host directory manually (`hosts/YourHostName` containing `default.nix`, `disko.nix`, and `hardware.nix`):
1. Generate hardware configuration:
```bash
mkdir -p hosts/YourHostName
sudo nixos-generate-config --show-hardware-config > hosts/YourHostName/hardware.nix
Expand Down Expand Up @@ -74,11 +71,11 @@ The host is **auto-discovered** — any directory in `hosts/` with both `default
# Nix-native checks (module syntax, lib tests, eval tests)
nix flake check --impure

# Python installer tests
python3 -m unittest discover -s tests -v
# End-to-end and test suite runner
./tests/e2e/run_tests.sh

# Format check
nix fmt -- --check .
# Format check (CI mode)
nix fmt -- --ci
```

## Code Formatting
Expand All @@ -105,21 +102,22 @@ We use `nixfmt-rfc-style` (the RFC 166 formatter).
```
ctos/
├── flake.nix # Flake entry point
├── flake/ # flake-parts modules (hosts, installer, checks, devshell, formatter)
├── flake/ # flake-parts modules (hosts, checks, devshell, formatter, modules, shell)
├── hosts/ # Host machine configs (auto-discovered)
│ ├── common.nix # Shared base config
│ └── <hostname>/ # Per-machine config
├── home/
│ └── home.nix # Base Home Manager user environment
├── lib/
│ ├── core.nix # Shared Nix helpers (scanModules, discoverHosts, mkDisko, mkUser, mkProfile)
│ ├── core.nix # Shared Nix helpers (scanModules, discoverHosts, mkDisko, mkProfile)
│ └── disko/
│ └── generator.nix # Dynamic mkDisko partition generator
├── modules/ # Option-based modules (auto-discovered)
│ ├── features/ # Vertical feature slices (core, desktop, dev, shell, terminals, tools)
│ ├── hardware/ # Hardware drivers (NVIDIA)
│ └── profiles/ # Composable feature bundles (base, desktop, workstation, gaming)
├── installer/ # Python interactive installer
├── tests/ # Python test suites
├── scripts/ # Repository and maintenance utility scripts
├── shell/ # ctOS Quickshell desktop environment and greeter
├── tests/ # End-to-end and boundary test suites
└── assets/ # Themes and media
```
46 changes: 29 additions & 17 deletions assets/ctos-plymouth/ctos.script
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,8 @@ for (i = 0; i < 13; i++) {
);
}

empty_image = Image();

log_sprites = [];
for (i = 0; i < 5; i++) {
log_sprites[i] = Sprite();
Expand Down Expand Up @@ -236,35 +238,45 @@ fun refresh_callback() {

indicator.SetOpacity(0.48 + (pulse * 0.27));

if ((frame % 12) == 0 && log_index < 13) {
log_index++;
if ((frame % 12) == 0) {
if (log_index < 13) {
log_index++;
}
}

for (i = 0; i < 5; i++) {
line_idx = log_index + i - 4;

if (line_idx >= 0 && line_idx < 13) {
log_sprites[i].SetImage(log_images[line_idx]);
log_sprites[i].SetY(telemetry_y + 22 + (i * 18));

if (i == 0) {
log_sprites[i].SetOpacity(0.24);
} else if (i == 1) {
log_sprites[i].SetOpacity(0.36);
} else if (i == 2) {
log_sprites[i].SetOpacity(0.50);
} else if (i == 3) {
log_sprites[i].SetOpacity(0.64);
if (line_idx >= 0) {
if (line_idx < 13) {
log_sprites[i].SetImage(log_images[line_idx]);
log_sprites[i].SetY(telemetry_y + 22 + (i * 18));

if (i == 0) {
log_sprites[i].SetOpacity(0.24);
} else if (i == 1) {
log_sprites[i].SetOpacity(0.36);
} else if (i == 2) {
log_sprites[i].SetOpacity(0.50);
} else if (i == 3) {
log_sprites[i].SetOpacity(0.64);
} else {
log_sprites[i].SetOpacity(0.80);
}
} else {
log_sprites[i].SetOpacity(0.80);
log_sprites[i].SetImage(empty_image);
log_sprites[i].SetOpacity(0.0);
}
} else {
log_sprites[i].SetImage(empty_image);
log_sprites[i].SetOpacity(0.0);
}
}

if ((frame % 7) == 0 && progress_index < 20) {
progress_index++;
if ((frame % 7) == 0) {
if (progress_index < 20) {
progress_index++;
}
}

progress.SetImage(progress_images[progress_index]);
Expand Down
26 changes: 13 additions & 13 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion flake/shell.nix
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
{
perSystem =
{ pkgs, ... }:
{
rec {
packages.ctos-shell = pkgs.callPackage ../shell/nix/package.nix { };
packages.default = packages.ctos-shell;
};
}
6 changes: 4 additions & 2 deletions hosts/Makima/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@
home.homeDirectory = lib.mkForce "/home/reze";
};

# Bootloader (Limine)
boot.loader.limine.resolution = "1920x1080";
ctos.features.boot.secureBoot.enable = true;

users.users.reze = {
Expand All @@ -33,6 +31,7 @@
"wheel"
"libvirtd"
"docker"
"wireshark"
];
shell = pkgs.zsh;
hashedPassword = "$6$7uVH9VA23imtOFPs$Rx7oc7xoN5gxBqdB6pg1ZG7xqAeX4LIzLuKjPExFOySTdfmVGdDbCD.4K/dtLLbUbdpcNJ8W5OYpeknaij6mM.";
Expand Down Expand Up @@ -60,6 +59,9 @@
amdgpuBusId = "PCI:5:0:0";
};

programs.wireshark.enable = true;
programs.wireshark.package = pkgs.wireshark-cli;

networking.hostName = "Makima";
system.stateVersion = "26.11";
}
44 changes: 0 additions & 44 deletions lib/core.nix
Original file line number Diff line number Diff line change
Expand Up @@ -31,33 +31,6 @@ rec {
});
};

# User & Home-Manager Functional Combinator
mkUser =
{
username,
groups ? [ "wheel" ],
shell ? null,
homeDir ? "/home/${username}",
homeConfig ? ../home/home.nix,
extraConfig ? { },
}:
{ pkgs, ... }:
{
users.users.${username} = {
isNormalUser = true;
description = username;
extraGroups = groups;
}
// (lib.optionalAttrs (shell != null) { inherit shell; })
// extraConfig;

home-manager.users.${username} = {
imports = [ homeConfig ];
home.username = username;
home.homeDirectory = homeDir;
};
};

scanModules =
dir:
if dir |> builtins.pathExists then
Expand Down Expand Up @@ -107,21 +80,4 @@ rec {
]
++ modulePaths
++ lib.optionals (hostHasDisko hostsDir hostName) [ inputs.disko.nixosModules.disko ];

mkSystem =
{
inputs,
hostName,
system ? "x86_64-linux",
hostsDir ? ../hosts,
extraModules ? [ ],
}:
lib.nixosSystem {
inherit system;
specialArgs = {
inherit inputs;
ctos = import ./core.nix { inherit lib; };
};
modules = (mkHostModules { inherit inputs hostsDir hostName; }) ++ extraModules;
};
}
2 changes: 2 additions & 0 deletions modules/features/desktop/desktopPackages.nix
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ in
easyeffects
grim
hyprcursor
hypridle
hyprlock
hyprpolkitagent
kdePackages.dolphin
kdePackages.okular
Expand Down
4 changes: 1 addition & 3 deletions modules/features/desktop/hyprland.nix
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ let
pkgs,
...
}:
let
in
{
config = {
home.packages = with pkgs; [
Expand Down Expand Up @@ -141,7 +139,7 @@ let

hl.bind(mainMod .. " + Q", hl.dsp.exec_cmd(terminal))
hl.bind(mainMod .. " + C", hl.dsp.window.close())
hl.bind(mainMod .. " + M", hl.dsp.exit())
hl.bind(mainMod .. " + SHIFT + E", hl.dsp.exit())
hl.bind(mainMod .. " + E", hl.dsp.exec_cmd(fileManager))
hl.bind(mainMod .. " + V", hl.dsp.window.float({ action = "toggle" }))
hl.bind(mainMod .. " + R", hl.dsp.exec_cmd(menu))
Expand Down
35 changes: 35 additions & 0 deletions modules/features/desktop/hyprlock.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
config,
inputs,
lib,
pkgs,
...
}:
let
cfg = config.ctos.features.hyprlock;

hmHyprlockModule =
{ ... }:
{
config = {
xdg.configFile."hypr/hyprlock.conf".source = ../../../shell/config/hypr/hyprlock.conf;
xdg.configFile."hypr/hypridle.conf".source = ../../../shell/config/hypr/hypridle.conf;
};
};
in
{
options.ctos.features.hyprlock.enable = lib.mkEnableOption "ctOS lockscreen and idle daemon";

config = lib.mkIf cfg.enable {
environment.systemPackages = with pkgs; [
hyprlock
hypridle
];

security.pam.services.hyprlock = { };

services.hypridle.enable = true;

home-manager.sharedModules = [ hmHyprlockModule ];
};
}
Loading
Loading