From 5afc0acf77c2f0bc079824a233572545e5ef869f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Rivera?= Date: Mon, 8 Jun 2026 22:11:54 +0200 Subject: [PATCH 01/15] librewolf profiles selector: added tor-browser --- modules/applications/browser.nix | 2 +- modules/applications/hyprland.nix | 4 ++-- ...olfprofiles.nix => custom-browserprofiles.nix} | 15 +++++++++------ 3 files changed, 12 insertions(+), 9 deletions(-) rename modules/packages/{custom-librewolfprofiles.nix => custom-browserprofiles.nix} (59%) diff --git a/modules/applications/browser.nix b/modules/applications/browser.nix index 6841165..8cad7d4 100644 --- a/modules/applications/browser.nix +++ b/modules/applications/browser.nix @@ -7,7 +7,7 @@ environment.systemPackages = with pkgs; [ chromium # used only to flash the firmware on my framework laptop 16 (keyboard.frame.work) as only chromium based browser support webHID. pkgs-unstable.tor-browser - self.packages.${pkgs.system}.custom-librewolfprofiles + self.packages.${pkgs.system}.custom-browserprofiles ]; }; flake.homeModules.librewolf = _: { diff --git a/modules/applications/hyprland.nix b/modules/applications/hyprland.nix index 3c9f9fa..d2c3c4a 100644 --- a/modules/applications/hyprland.nix +++ b/modules/applications/hyprland.nix @@ -74,7 +74,7 @@ "$editor" = "nvim"; "$notes" = "kitty --class \"custom-obsidianvaults\" --name \"Select Obsidian vault\" --hold custom-obsidianvaults"; "$file" = "dolphin"; - "$browser" = "kitty --class \"custom-librewolfprofiles\" --name \"Select LibreWolf profile\" --hold custom-librewolfprofiles"; + "$browser" = "kitty --class \"custom-browserprofiles\" --name \"Select browser profile\" --hold custom-browserprofiles"; # ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ # █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ animations = { @@ -487,7 +487,7 @@ "float on, match:class ^(kitty)$, match:title ^(htop)$" "float on, match:class ^(vlc)$" "float on, match:class ^(eog)$" - "float on, size 400 225, match:class ^(custom-librewolfprofiles)$" + "float on, size 400 225, match:class ^(custom-browserprofiles)$" "float on, size 1050 200, match:class ^(custom-changeAudioOutput)$" "float on, size 400 175, match:class ^(custom-obsidianvaults)$" "float on, size 600 600, match:initial_class ^(custom-pomodoro)$" diff --git a/modules/packages/custom-librewolfprofiles.nix b/modules/packages/custom-browserprofiles.nix similarity index 59% rename from modules/packages/custom-librewolfprofiles.nix rename to modules/packages/custom-browserprofiles.nix index df79ed3..cc5275e 100644 --- a/modules/packages/custom-librewolfprofiles.nix +++ b/modules/packages/custom-browserprofiles.nix @@ -1,18 +1,19 @@ _: { perSystem = {pkgs, ...}: { # fzf librewolf profile selector - packages.custom-librewolfprofiles = pkgs.writeShellApplication { - name = "custom-librewolfprofiles"; + packages.custom-browserprofiles = pkgs.writeShellApplication { + name = "custom-browserprofiles"; runtimeInputs = with pkgs; [ zsh fzf + tor-browser ]; text = '' # List of profiles - profiles=("work" "other" "private window") + profiles=("work" "other" "private window" "tor-browser) # Use fzf to select - selected=$(printf "%s\n" "''${profiles[@]}" | fzf --height 6 --reverse --prompt="Select LibreWolf profile:") + selected=$(printf "%s\n" "''${profiles[@]}" | fzf --height 6 --reverse --prompt="Select browser profile:") # If user cancels, exit [[ -z "$selected" ]] && exit 0 @@ -20,10 +21,12 @@ _: { # Launch LibreWolf detached, keeping environment if [[ "$selected" == "private window" ]]; then setsid librewolf --private-window --no-remote >/dev/null 2>&1 & - pkill -f "kitty.*Select LibreWolf profile" + pkill -f "kitty.*Select browser profile" + elif [[ "$selected" == "tor-browser" ]]; then + setsid tor-browser >/dev/null 2>&1 & pkill -f "kitty.*Select browser profile" else setsid librewolf -P "$selected" --no-remote >/dev/null 2>&1 & - pkill -f "kitty.*Select LibreWolf profile" + pkill -f "kitty.*Select browser profile" fi # Exit the kitty terminal after selection From 99ab54cc8b80cad7db98642311425a24eff80de8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Rivera?= Date: Mon, 8 Jun 2026 22:12:43 +0200 Subject: [PATCH 02/15] fix: home.file --- modules/utilities/nixGitCherryPicker.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/utilities/nixGitCherryPicker.nix b/modules/utilities/nixGitCherryPicker.nix index 44d2a5e..7578607 100644 --- a/modules/utilities/nixGitCherryPicker.nix +++ b/modules/utilities/nixGitCherryPicker.nix @@ -20,7 +20,7 @@ inputs.nix-git-cherry-picker.packages.${pkgs.system}.default ]; }; - home.file-".config/nix-git-cherry-picker/config.json" = { + home.file.".config/nix-git-cherry-picker/config.json" = { enable = true; text = '' { @@ -31,4 +31,4 @@ ''; force = true; }; -} \ No newline at end of file +} From abf652e21b8ed9d41d698bb894e84516136a96dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Rivera?= Date: Mon, 8 Jun 2026 22:14:47 +0200 Subject: [PATCH 03/15] fix: cherry-picker-desktop --- modules/utilities/nixGitCherryPicker.nix | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/modules/utilities/nixGitCherryPicker.nix b/modules/utilities/nixGitCherryPicker.nix index 7578607..37868a5 100644 --- a/modules/utilities/nixGitCherryPicker.nix +++ b/modules/utilities/nixGitCherryPicker.nix @@ -19,16 +19,16 @@ home.packages = [ inputs.nix-git-cherry-picker.packages.${pkgs.system}.default ]; - }; - home.file.".config/nix-git-cherry-picker/config.json" = { - enable = true; - text = '' - { - "localBranch": "desktop", - "remoteBranch": "laptop", - "nixConfigPath": "/home/tomasr/nixos/" - } - ''; - force = true; + home.file.".config/nix-git-cherry-picker/config.json" = { + enable = true; + text = '' + { + "localBranch": "desktop", + "remoteBranch": "laptop", + "nixConfigPath": "/home/tomasr/nixos/" + } + ''; + force = true; + }; }; } From e3089e1d5976d40f39e8d27e4849ba197fa5393b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Rivera?= Date: Mon, 8 Jun 2026 22:20:24 +0200 Subject: [PATCH 04/15] fix: custom-browserprofiles --- modules/packages/custom-browserprofiles.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/packages/custom-browserprofiles.nix b/modules/packages/custom-browserprofiles.nix index cc5275e..fda0578 100644 --- a/modules/packages/custom-browserprofiles.nix +++ b/modules/packages/custom-browserprofiles.nix @@ -10,7 +10,7 @@ _: { ]; text = '' # List of profiles - profiles=("work" "other" "private window" "tor-browser) + profiles=("work" "other" "private window" "tor-browser") # Use fzf to select selected=$(printf "%s\n" "''${profiles[@]}" | fzf --height 6 --reverse --prompt="Select browser profile:") From 19adc625f10ad5c2ac11fde7930f28c6ce9f52ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Rivera?= Date: Tue, 9 Jun 2026 11:51:52 +0200 Subject: [PATCH 05/15] patent: use flake.nix --- modules/utilities/development.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/utilities/development.nix b/modules/utilities/development.nix index d8cec56..49f46ce 100644 --- a/modules/utilities/development.nix +++ b/modules/utilities/development.nix @@ -35,6 +35,7 @@ gnupg pinentry-curses inputs.nixpkgs-notifier.packages.${pkgs.system}.default + inputs.patent.packages.${pkgs.system}.default ]; }; flake.homeModules.development = _: { From 4b6a5ffa59b4d77a37fed3ec46436b11c74d453f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Rivera?= Date: Tue, 9 Jun 2026 16:18:15 +0200 Subject: [PATCH 06/15] patent in flake.nix --- flake.nix | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/flake.nix b/flake.nix index 49139ac..a95a4ee 100644 --- a/flake.nix +++ b/flake.nix @@ -31,6 +31,11 @@ inputs.flake-utils.follows = "flake-utils"; inputs.nixpkgs.follows = "nixpkgs-unstable"; }; + patent = { + url = "github:r14dd/patent"; + inputs.flake-utils.follows = "flake-utils"; + inputs.nixpkgs.follows = "nixpkgs-unstable"; + }; caelestia-shell = { # based on quickshell. See https://github.com/caelestia-dots/shell url = "github:caelestia-dots/shell"; From 8b2a086a4d7e68754aead4034fbd2e6f9e7c2202 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Rivera?= Date: Tue, 9 Jun 2026 16:22:59 +0200 Subject: [PATCH 07/15] patent flake.lock --- flake.lock | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/flake.lock b/flake.lock index f262f02..92c8dc5 100644 --- a/flake.lock +++ b/flake.lock @@ -338,6 +338,30 @@ "type": "github" } }, + "patent": { + "inputs": { + "flake-utils": [ + "flake-utils" + ], + "nixpkgs": [ + "nixpkgs-unstable" + ], + "rust-overlay": "rust-overlay" + }, + "locked": { + "lastModified": 1780942898, + "narHash": "sha256-cP4gUX4YE1kFe+15Zd1CbqL08XytPm1UXZuaXjYLG94=", + "owner": "r14dd", + "repo": "patent", + "rev": "bbad654b6b65264d2ba267b5c87e8be0bd89b78e", + "type": "github" + }, + "original": { + "owner": "r14dd", + "repo": "patent", + "type": "github" + } + }, "quickshell": { "inputs": { "nixpkgs": [ @@ -374,7 +398,29 @@ "nixpkgs-master": "nixpkgs-master", "nixpkgs-notifier": "nixpkgs-notifier", "nixpkgs-unstable": "nixpkgs-unstable", - "notewrapper": "notewrapper" + "notewrapper": "notewrapper", + "patent": "patent" + } + }, + "rust-overlay": { + "inputs": { + "nixpkgs": [ + "patent", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1780888890, + "narHash": "sha256-MUQPFiskEENaJ2N82TRIqpKlHXGXJJkPfKH6W788oQo=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "7d5f8d75fc195a236b46633d7679139698aeb35f", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" } }, "systems": { From d340b9c08b7f576faa2029755c8908401af96eef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Rivera?= Date: Tue, 9 Jun 2026 16:26:34 +0200 Subject: [PATCH 08/15] micro-vivify: comment out from flake.nix --- flake.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flake.nix b/flake.nix index a95a4ee..363ea8a 100644 --- a/flake.nix +++ b/flake.nix @@ -45,10 +45,10 @@ url = "github:nix-community/disko"; inputs.nixpkgs.follows = "nixpkgs"; }; - microPlugins-vivify = { + /*microPlugins-vivify = { url = "git+https://codeberg.org/gibbert/micro-vivify"; flake = false; - }; + };*/ flake-parts = { url = "github:hercules-ci/flake-parts"; }; From 7e0ba6278c32367c6a25fc03be9a58b72c94315c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Rivera?= Date: Tue, 9 Jun 2026 16:39:17 +0200 Subject: [PATCH 09/15] snapshot pre-cleanup-2026-06-09T14-39-17Z From b1edbc9378f4bdda92f3ea76841d0cb593453339 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Rivera?= Date: Tue, 9 Jun 2026 16:39:36 +0200 Subject: [PATCH 10/15] Auto: cleanup-2026-06-09T14-39-17Z --- flake.lock | 17 ---- flake.nix | 6 +- modules/applications/git.nix | 6 +- modules/applications/kdrive.nix | 14 ++-- modules/applications/zsh.nix | 2 +- modules/hardware/disko/disko-config.nix | 2 +- modules/hardware/hardware-configuration.nix | 86 +++++++++++---------- modules/hardware/nvidia.nix | 2 +- modules/utilities/development.nix | 3 +- 9 files changed, 66 insertions(+), 72 deletions(-) diff --git a/flake.lock b/flake.lock index 92c8dc5..c660d8e 100644 --- a/flake.lock +++ b/flake.lock @@ -156,22 +156,6 @@ "type": "github" } }, - "microPlugins-vivify": { - "flake": false, - "locked": { - "lastModified": 1770382657, - "narHash": "sha256-yWmIgT90mC9PhzyH/itDbRMmRTiZiwW+Yo0dsHW7ni8=", - "ref": "refs/heads/main", - "rev": "3c5cb25facf3fc4143bfea9323a60eda65ef8485", - "revCount": 8, - "type": "git", - "url": "https://codeberg.org/gibbert/micro-vivify" - }, - "original": { - "type": "git", - "url": "https://codeberg.org/gibbert/micro-vivify" - } - }, "nix-git-cherry-picker": { "inputs": { "flake-utils": [ @@ -391,7 +375,6 @@ "flake-utils": "flake-utils", "home-manager": "home-manager", "import-tree": "import-tree", - "microPlugins-vivify": "microPlugins-vivify", "nix-git-cherry-picker": "nix-git-cherry-picker", "nixos-grub-themes": "nixos-grub-themes", "nixpkgs": "nixpkgs_2", diff --git a/flake.nix b/flake.nix index 363ea8a..c86261b 100644 --- a/flake.nix +++ b/flake.nix @@ -45,10 +45,12 @@ url = "github:nix-community/disko"; inputs.nixpkgs.follows = "nixpkgs"; }; - /*microPlugins-vivify = { + /* + microPlugins-vivify = { url = "git+https://codeberg.org/gibbert/micro-vivify"; flake = false; - };*/ + }; + */ flake-parts = { url = "github:hercules-ci/flake-parts"; }; diff --git a/modules/applications/git.nix b/modules/applications/git.nix index 02a2c6e..4d12f77 100644 --- a/modules/applications/git.nix +++ b/modules/applications/git.nix @@ -2,9 +2,11 @@ _: { flake.homeModules.git = _: { programs.git = { enable = true; - /*settings = { + /* + settings = { init.defaultBranch = "main"; - };*/ + }; + */ }; programs.gh = { enable = true; diff --git a/modules/applications/kdrive.nix b/modules/applications/kdrive.nix index e7cac9a..d432f13 100644 --- a/modules/applications/kdrive.nix +++ b/modules/applications/kdrive.nix @@ -25,22 +25,24 @@ systemd.user.services.kdrive-sync = { serviceConfig = { ExecStart = "${self.packages.${pkgs.system}.custom-synckdrive-desktop}/bin/custom-synckdrive"; - - Nice = 19; # lowest CPU scheduling priority + + Nice = 19; # lowest CPU scheduling priority IOSchedulingClass = "idle"; IOSchedulingPriority = 7; - + # Optional: - CPUWeight = 1; # minimum relative CPU share + CPUWeight = 1; # minimum relative CPU share }; }; - /*systemd.user.timers.kdrive-sync = { + /* + systemd.user.timers.kdrive-sync = { wantedBy = [ "timers.target" ]; timerConfig = { OnBootSec = "1m"; OnUnitActiveSec = "5m"; }; - };*/ + }; + */ }; perSystem = {pkgs, ...}: { packages.custom-checkKdrive = pkgs.writeShellApplication { diff --git a/modules/applications/zsh.nix b/modules/applications/zsh.nix index 59525d7..c58545b 100644 --- a/modules/applications/zsh.nix +++ b/modules/applications/zsh.nix @@ -33,7 +33,7 @@ _: { command cat "$@" fi } - + custom-eza() { # behaves differently if we just call it or if we pipe initContent if [[ -t 1 ]]; then eza -hlF -aa --color=always --hyperlink --group-directories-first --show-symlinks --icons=always --git --no-permissions "$@" diff --git a/modules/hardware/disko/disko-config.nix b/modules/hardware/disko/disko-config.nix index 53cee37..f78d8dd 100644 --- a/modules/hardware/disko/disko-config.nix +++ b/modules/hardware/disko/disko-config.nix @@ -30,7 +30,7 @@ _: { content = { type = "btrfs"; - extraArgs = [ "-f" ]; + extraArgs = ["-f"]; subvolumes = { "@root" = { diff --git a/modules/hardware/hardware-configuration.nix b/modules/hardware/hardware-configuration.nix index 1cbe592..9087fa0 100644 --- a/modules/hardware/hardware-configuration.nix +++ b/modules/hardware/hardware-configuration.nix @@ -33,49 +33,53 @@ _: { nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; }; -flake.nixosModules.hardware-configuration-desktop = # Do not modify this file! It was generated by ‘nixos-generate-config’ -# and may be overwritten by future invocations. Please make changes -# to /etc/nixos/configuration.nix instead. -{ config, lib, pkgs, modulesPath, ... }: + flake.nixosModules.hardware-configuration-desktop = + # Do not modify this file! It was generated by ‘nixos-generate-config’ + # and may be overwritten by future invocations. Please make changes + # to /etc/nixos/configuration.nix instead. + { + config, + lib, + modulesPath, + ... + }: { + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; -{ - imports = - [ (modulesPath + "/installer/scan/not-detected.nix") - ]; + boot.initrd.availableKernelModules = ["vmd" "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod"]; + boot.initrd.kernelModules = []; + boot.kernelModules = ["kvm-intel"]; + boot.extraModulePackages = []; - boot.initrd.availableKernelModules = [ "vmd" "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" ]; - boot.initrd.kernelModules = [ ]; - boot.kernelModules = [ "kvm-intel" ]; - boot.extraModulePackages = [ ]; + fileSystems."/" = { + device = "/dev/disk/by-uuid/14bcd132-b4a3-46f2-ac35-3497340de4b2"; + fsType = "btrfs"; + }; - fileSystems."/" = - { device = "/dev/disk/by-uuid/14bcd132-b4a3-46f2-ac35-3497340de4b2"; - fsType = "btrfs"; + fileSystems."/home" = { + device = "/dev/disk/by-uuid/14bcd132-b4a3-46f2-ac35-3497340de4b2"; + fsType = "btrfs"; + options = ["subvol=home"]; + }; + + fileSystems."/nix" = { + device = "/dev/disk/by-uuid/14bcd132-b4a3-46f2-ac35-3497340de4b2"; + fsType = "btrfs"; + options = ["subvol=nix"]; + }; + + fileSystems."/boot" = { + device = "/dev/disk/by-uuid/BAB4-34F6"; + fsType = "vfat"; + options = ["fmask=0077" "dmask=0077"]; + }; + + swapDevices = [ + {device = "/dev/disk/by-uuid/ce6f9a68-0517-4f8a-b375-66f2173efe59";} + ]; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; }; - - fileSystems."/home" = - { device = "/dev/disk/by-uuid/14bcd132-b4a3-46f2-ac35-3497340de4b2"; - fsType = "btrfs"; - options = [ "subvol=home" ]; - }; - - fileSystems."/nix" = - { device = "/dev/disk/by-uuid/14bcd132-b4a3-46f2-ac35-3497340de4b2"; - fsType = "btrfs"; - options = [ "subvol=nix" ]; - }; - - fileSystems."/boot" = - { device = "/dev/disk/by-uuid/BAB4-34F6"; - fsType = "vfat"; - options = [ "fmask=0077" "dmask=0077" ]; - }; - - swapDevices = - [ { device = "/dev/disk/by-uuid/ce6f9a68-0517-4f8a-b375-66f2173efe59"; } - ]; - - nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; - hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; -}; } diff --git a/modules/hardware/nvidia.nix b/modules/hardware/nvidia.nix index 911c8d5..adb4a80 100644 --- a/modules/hardware/nvidia.nix +++ b/modules/hardware/nvidia.nix @@ -1,7 +1,7 @@ _: { flake.nixosModules.nvidia = _: { hardware.graphics.enable = true; - services.xserver.videoDrivers = [ "nvidia" ]; + services.xserver.videoDrivers = ["nvidia"]; hardware.nvidia.open = true; }; } diff --git a/modules/utilities/development.nix b/modules/utilities/development.nix index 49f46ce..a851b63 100644 --- a/modules/utilities/development.nix +++ b/modules/utilities/development.nix @@ -24,7 +24,8 @@ gnumake go direnv - git gh + git + gh cling # c interpreter used for coding # lsp clang-tools From 68d81d5c4b5d71bd20a32eb865c90eb8a7f215ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Rivera?= Date: Tue, 9 Jun 2026 20:11:13 +0200 Subject: [PATCH 11/15] mathematics: init module with lean4 --- modules/applications/mathematics.nix | 7 +++++++ modules/hosts/desktop.nix | 1 + modules/hosts/laptop.nix | 1 + 3 files changed, 9 insertions(+) create mode 100644 modules/applications/mathematics.nix diff --git a/modules/applications/mathematics.nix b/modules/applications/mathematics.nix new file mode 100644 index 0000000..2d8ce6e --- /dev/null +++ b/modules/applications/mathematics.nix @@ -0,0 +1,7 @@ +_: { + flake.nixosModules.mathematics = {pkgs, ...}: { + environment.systemPackages = with pkgs; [ + elan + ]; + }; +} diff --git a/modules/hosts/desktop.nix b/modules/hosts/desktop.nix index b46a235..fa83317 100644 --- a/modules/hosts/desktop.nix +++ b/modules/hosts/desktop.nix @@ -35,6 +35,7 @@ kdrive-desktop # we will setup this later latex ly + mathematics mullvad networking notifications diff --git a/modules/hosts/laptop.nix b/modules/hosts/laptop.nix index f6b1400..85fe064 100644 --- a/modules/hosts/laptop.nix +++ b/modules/hosts/laptop.nix @@ -36,6 +36,7 @@ kdrive-laptop latex ly + mathematics mullvad networking notifications From 433bb52cde2961b8b28f4914d04d9e9c1e2ba516 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Rivera?= Date: Wed, 10 Jun 2026 10:26:16 +0200 Subject: [PATCH 12/15] CI: weekly PR merge to main from desktop and laptop --- .github/workflows/sync-main.yml | 58 +++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 .github/workflows/sync-main.yml diff --git a/.github/workflows/sync-main.yml b/.github/workflows/sync-main.yml new file mode 100644 index 0000000..d92f97f --- /dev/null +++ b/.github/workflows/sync-main.yml @@ -0,0 +1,58 @@ +name: Sync branches into main + +on: + schedule: + - cron: "0 14 * * 1" + + - cron: "0 14 * * 3" + + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + sync: + runs-on: ubuntu-latest + + steps: + - name: Determine source branch + id: branch + run: | + DOW=$(date -u +%u) + + if [ "$DOW" = "1" ]; then + echo "source=laptop" >> "$GITHUB_OUTPUT" + elif [ "$DOW" = "3" ]; then + echo "source=desktop" >> "$GITHUB_OUTPUT" + else + echo "Not a scheduled sync day" + exit 1 + fi + + - name: Create pull request + id: cpr + uses: peter-evans/create-pull-request@v7 + with: + token: ${{ secrets.GITHUB_TOKEN }} + base: main + branch: ${{ steps.branch.outputs.source }} + title: "Weekly sync: ${{ steps.branch.outputs.source }} → main" + body: | + This pull request was created automatically by GitHub Actions. + + If the branch can be merged cleanly, auto-merge will merge it automatically. + + If there are merge conflicts, this PR will remain open until they are resolved. + draft: false + + - name: Enable auto-merge + if: steps.cpr.outputs.pull-request-number + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh pr merge \ + ${{ steps.cpr.outputs.pull-request-number }} \ + --auto \ + --merge From 2c95860f5b9689c42fb634170375f2eacfe8ff4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Rivera?= Date: Wed, 10 Jun 2026 20:14:49 +0200 Subject: [PATCH 13/15] CI: fix auto merge action --- .github/workflows/sync-main.yml | 81 +++++++++++++++++++++++++-------- 1 file changed, 62 insertions(+), 19 deletions(-) diff --git a/.github/workflows/sync-main.yml b/.github/workflows/sync-main.yml index d92f97f..6a9fb9d 100644 --- a/.github/workflows/sync-main.yml +++ b/.github/workflows/sync-main.yml @@ -2,11 +2,18 @@ name: Sync branches into main on: schedule: - - cron: "0 14 * * 1" - - - cron: "0 14 * * 3" + - cron: "0 14 * * 1" # Monday + - cron: "0 14 * * 3" # Wednesday workflow_dispatch: + inputs: + source: + description: Branch to sync into main + required: true + type: choice + options: + - laptop + - desktop permissions: contents: write @@ -20,6 +27,11 @@ jobs: - name: Determine source branch id: branch run: | + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + echo "source=${{ inputs.source }}" >> "$GITHUB_OUTPUT" + exit 0 + fi + DOW=$(date -u +%u) if [ "$DOW" = "1" ]; then @@ -27,32 +39,63 @@ jobs: elif [ "$DOW" = "3" ]; then echo "source=desktop" >> "$GITHUB_OUTPUT" else - echo "Not a scheduled sync day" + echo "No sync scheduled today." exit 1 fi - - name: Create pull request - id: cpr - uses: peter-evans/create-pull-request@v7 - with: - token: ${{ secrets.GITHUB_TOKEN }} - base: main - branch: ${{ steps.branch.outputs.source }} - title: "Weekly sync: ${{ steps.branch.outputs.source }} → main" - body: | - This pull request was created automatically by GitHub Actions. + - name: Check for existing PR + id: existing + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + PR_NUMBER=$(gh pr list \ + --base main \ + --head "${{ steps.branch.outputs.source }}" \ + --state open \ + --json number \ + --jq '.[0].number') - If the branch can be merged cleanly, auto-merge will merge it automatically. + echo "number=$PR_NUMBER" >> "$GITHUB_OUTPUT" - If there are merge conflicts, this PR will remain open until they are resolved. - draft: false + - name: Create PR if needed + id: pr + if: steps.existing.outputs.number == '' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + PR_URL=$(gh pr create \ + --base main \ + --head "${{ steps.branch.outputs.source }}" \ + --title "Weekly sync: ${{ steps.branch.outputs.source }} → main" \ + --body "$(cat <> "$GITHUB_OUTPUT" + echo "number=$PR_NUMBER" >> "$GITHUB_OUTPUT" + + - name: Determine PR number + id: final + run: | + if [ -n "${{ steps.existing.outputs.number }}" ]; then + echo "number=${{ steps.existing.outputs.number }}" >> "$GITHUB_OUTPUT" + else + echo "number=${{ steps.pr.outputs.number }}" >> "$GITHUB_OUTPUT" + fi - name: Enable auto-merge - if: steps.cpr.outputs.pull-request-number + if: steps.final.outputs.number != '' env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | gh pr merge \ - ${{ steps.cpr.outputs.pull-request-number }} \ + "${{ steps.final.outputs.number }}" \ --auto \ --merge From c92a868718e83edf3fe42a75a83908bec3456988 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Rivera?= Date: Wed, 10 Jun 2026 20:17:57 +0200 Subject: [PATCH 14/15] CI: fix git repo --- .github/workflows/sync-main.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/sync-main.yml b/.github/workflows/sync-main.yml index 6a9fb9d..a08095c 100644 --- a/.github/workflows/sync-main.yml +++ b/.github/workflows/sync-main.yml @@ -47,9 +47,11 @@ jobs: id: existing env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + REPO: ${{ github.repository }} run: | PR_NUMBER=$(gh pr list \ --base main \ + --repo "$REPO" \ --head "${{ steps.branch.outputs.source }}" \ --state open \ --json number \ @@ -65,6 +67,7 @@ jobs: run: | PR_URL=$(gh pr create \ --base main \ + --repo "$REPO" \ --head "${{ steps.branch.outputs.source }}" \ --title "Weekly sync: ${{ steps.branch.outputs.source }} → main" \ --body "$(cat < Date: Wed, 10 Jun 2026 20:19:26 +0200 Subject: [PATCH 15/15] CI: rewrite with checkout --- .github/workflows/sync-main.yml | 80 ++++++++++++++++----------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/.github/workflows/sync-main.yml b/.github/workflows/sync-main.yml index a08095c..8b95eba 100644 --- a/.github/workflows/sync-main.yml +++ b/.github/workflows/sync-main.yml @@ -24,6 +24,9 @@ jobs: runs-on: ubuntu-latest steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Determine source branch id: branch run: | @@ -34,24 +37,47 @@ jobs: DOW=$(date -u +%u) - if [ "$DOW" = "1" ]; then - echo "source=laptop" >> "$GITHUB_OUTPUT" - elif [ "$DOW" = "3" ]; then - echo "source=desktop" >> "$GITHUB_OUTPUT" - else - echo "No sync scheduled today." - exit 1 - fi + case "$DOW" in + 1) + echo "source=laptop" >> "$GITHUB_OUTPUT" + ;; + 3) + echo "source=desktop" >> "$GITHUB_OUTPUT" + ;; + *) + echo "No sync scheduled today." + exit 1 + ;; + esac - name: Check for existing PR id: existing env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - REPO: ${{ github.repository }} run: | PR_NUMBER=$(gh pr list \ --base main \ - --repo "$REPO" \ + --head "${{ steps.branch.outputs.source }}" \ + --state open \ + --json number \ + --jq '.[0].number // empty') + + echo "number=$PR_NUMBER" >> "$GITHUB_OUTPUT" + + - name: Create PR + id: create + if: steps.existing.outputs.number == '' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh pr create \ + --base main \ + --head "${{ steps.branch.outputs.source }}" \ + --title "Weekly sync: ${{ steps.branch.outputs.source }} → main" \ + --body "This pull request was created automatically by GitHub Actions." + + PR_NUMBER=$(gh pr list \ + --base main \ --head "${{ steps.branch.outputs.source }}" \ --state open \ --json number \ @@ -59,47 +85,21 @@ jobs: echo "number=$PR_NUMBER" >> "$GITHUB_OUTPUT" - - name: Create PR if needed - id: pr - if: steps.existing.outputs.number == '' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - PR_URL=$(gh pr create \ - --base main \ - --repo "$REPO" \ - --head "${{ steps.branch.outputs.source }}" \ - --title "Weekly sync: ${{ steps.branch.outputs.source }} → main" \ - --body "$(cat <> "$GITHUB_OUTPUT" - echo "number=$PR_NUMBER" >> "$GITHUB_OUTPUT" - - name: Determine PR number - id: final + id: pr run: | if [ -n "${{ steps.existing.outputs.number }}" ]; then echo "number=${{ steps.existing.outputs.number }}" >> "$GITHUB_OUTPUT" else - echo "number=${{ steps.pr.outputs.number }}" >> "$GITHUB_OUTPUT" + echo "number=${{ steps.create.outputs.number }}" >> "$GITHUB_OUTPUT" fi - name: Enable auto-merge - if: steps.final.outputs.number != '' + if: steps.pr.outputs.number != '' env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | gh pr merge \ - "${{ steps.final.outputs.number }}" \ - --repo "$REPO" \ + "${{ steps.pr.outputs.number }}" \ --auto \ --merge