refined for my use

This commit is contained in:
Gregory Burd 2023-09-19 13:05:08 -04:00
parent 04360ce2a7
commit 80828fb71f
165 changed files with 315 additions and 32145 deletions

View file

@ -1,46 +1,16 @@
keys:
# Users
- &users:
- &misterio 7088C7421873E0DB97FF17C2245CAB70B4C225E9
- &gburd 6423C518273734713931CB331C4814F03CA7C161
# Hosts
- &hosts:
- &atlas age1hm5lf4qk84r4wh00atn6hpts7mpdx80adq26wht2e5qh9ewvhyaszfv82d
- &merope age1709qfrwglm75v5x8lpuhryt83k6p6c90npplzzec6a5w8ct93ejscpqpc3
- &pleione age1j9ld6ey62hqd33xkyd2fg9362k6xhm5gavsrpsfalwpcs8smxfdqpk84a2
- &maia age1dn7pkareh83k8el2yt4dmdfdzn7f45fuc785cnnxgzf3h4r5gqhqd4l93h
- &alcyone age1uxvuygmvwpfjrd9d3ulg6ln8dgvaw4l2c90mw0tr72qg3n8vd9ns3dm000
- &celaeno age1gxhy9eq38xfplay0kvkeyvsg96g0c4p6rkhajkrj8nc9dswdzqhssgvns0
- &electra age1n06f4dcslh8xq686z2fa9ddr3yg5yzj87p727896xsm8xvusdv6qan0grl
- &loki age1udt7tgf8pa0r278z6xwrzndg5w9jyvph8p0nycpqw3d39aal5u6skfv556
creation_rules:
- path_regex: hosts/celaeno/secrets.ya?ml$
key_groups:
- age:
- *celaeno
pgp:
- *misterio
- path_regex: hosts/alcyone/secrets.ya?ml$
key_groups:
- age:
- *alcyone
pgp:
- *misterio
- path_regex: hosts/merope/secrets.ya?ml$
key_groups:
- age:
- *merope
pgp:
- *misterio
- path_regex: hosts/common/secrets.ya?ml$
key_groups:
- age:
- *atlas
- *merope
- *pleione
- *maia
- *alcyone
- *celaeno
- *electra
- *loki
pgp:
- *misterio
- *gburd

11
NOTES Normal file
View file

@ -0,0 +1,11 @@
* Yubikeys are great, if you use them correctly
https://www.procustodibus.com/blog/2023/04/how-to-set-up-a-yubikey/
* generate age public key from host's existing SSH keypair
nix-shell -p ssh-to-age --run 'cat /etc/ssh/ssh_host_ed25519_key.pub | ssh-to-age'
* trigger first encryption of a secrets file
EDITOR=vi sops --config .sops.yaml --encrypt --in-place hosts/common/secrets.yaml
* edit secrets in that file later
sudo nixos-rebuild switch --flake .#my-hostname
-------
services.pcscd.enable = true;

View file

@ -4,19 +4,6 @@
Here's my NixOS/home-manager config files. Requires [Nix flakes](https://nixos.wiki/wiki/Flakes).
**Highlights**:
- Multiple **NixOS configurations**, including **desktop**, **laptop**, **server**
- **Opt-in persistence** through impermanence + blank snapshotting
- **Encrypted** single **BTRFS** partition
- Fully **declarative** **self-hosted** stuff
- Deployment **secrets** using **sops-nix**
- **Mesh networked** hosts with **tailscale** and **headscale**
- Flexible **Home Manager** Configs through **feature flags**
- Extensively configured wayland environments (**sway** and **hyprland**) and editor (**neovim**)
- **Declarative** **themes** and **wallpapers** with **nix-colors**
- **Hydra CI/CD server and binary cache** that uses the **desktops as remote builders**
## Structure
- `flake.nix`: Entrypoint for hosts and home configurations. Also exposes a
@ -42,10 +29,6 @@ Here's my NixOS/home-manager config files. Requires [Nix flakes](https://nixos.w
## About the installation
All my computers use a single btrfs (encrypted on all except headless systems)
partition, with subvolumes for `/nix`, a `/persist` directory (which I opt in
using `impermanence`), swap file, and a root subvolume (cleared on every boot).
Home-manager is used in a standalone way, and because of opt-in persistence is
activated on every boot with `loginShellInit`.
@ -87,8 +70,6 @@ signing, as well as for SSH'ing around.
Most relevant user apps daily drivers:
- hyprland + swayidle + swaylock
- waybar
- neovim
- fish + starship
- kitty

View file

@ -1,85 +0,0 @@
{
description = "Your new nix config";
inputs = {
# Nixpkgs
nixpkgs.url = "github:nixos/nixpkgs/nixos-23.05";
# You can access packages and modules from different nixpkgs revs
# at the same time. Here's an working example:
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
# Also see the 'unstable-packages' overlay at 'overlays/default.nix'.
# Home manager
home-manager.url = "github:nix-community/home-manager/release-23.05";
home-manager.inputs.nixpkgs.follows = "nixpkgs";
# TODO: Add any other flake you might need
# hardware.url = "github:nixos/nixos-hardware";
# Shameless plug: looking for a way to nixify your themes and make
# everything match nicely? Try nix-colors!
# nix-colors.url = "github:misterio77/nix-colors";
};
outputs = { self, nixpkgs, home-manager, ... }@inputs:
let
inherit (self) outputs;
forAllSystems = nixpkgs.lib.genAttrs [
"aarch64-linux"
"i686-linux"
"x86_64-linux"
"aarch64-darwin"
"x86_64-darwin"
];
in
rec {
# Your custom packages
# Acessible through 'nix build', 'nix shell', etc
packages = forAllSystems (system:
let pkgs = nixpkgs.legacyPackages.${system};
in import ./pkgs { inherit pkgs; }
);
# Devshell for bootstrapping
# Acessible through 'nix develop' or 'nix-shell' (legacy)
devShells = forAllSystems (system:
let pkgs = nixpkgs.legacyPackages.${system};
in import ./shell.nix { inherit pkgs; }
);
# Your custom packages and modifications, exported as overlays
overlays = import ./overlays { inherit inputs; };
# Reusable nixos modules you might want to export
# These are usually stuff you would upstream into nixpkgs
nixosModules = import ./modules/nixos;
# Reusable home-manager modules you might want to export
# These are usually stuff you would upstream into home-manager
homeManagerModules = import ./modules/home-manager;
# NixOS configuration entrypoint
# Available through 'nixos-rebuild --flake .#your-hostname'
nixosConfigurations = {
# FIXME replace with your hostname
your-hostname = nixpkgs.lib.nixosSystem {
specialArgs = { inherit inputs outputs; };
modules = [
# > Our main nixos configuration file <
./nixos/configuration.nix
];
};
};
# Standalone home-manager configuration entrypoint
# Available through 'home-manager --flake .#your-username@your-hostname'
homeConfigurations = {
# FIXME replace with your username@hostname
"your-username@your-hostname" = home-manager.lib.homeManagerConfiguration {
pkgs = nixpkgs.legacyPackages.x86_64-linux; # Home-manager requires 'pkgs' instance
extraSpecialArgs = { inherit inputs outputs; };
modules = [
# > Our main home-manager configuration file <
./home-manager/home.nix
];
};
};
};
}

View file

@ -1,63 +0,0 @@
# This is your home-manager configuration file
# Use this to configure your home environment (it replaces ~/.config/nixpkgs/home.nix)
{ inputs, outputs, lib, config, pkgs, ... }: {
# You can import other home-manager modules here
imports = [
# If you want to use modules your own flake exports (from modules/home-manager):
# outputs.homeManagerModules.example
# Or modules exported from other flakes (such as nix-colors):
# inputs.nix-colors.homeManagerModules.default
# You can also split up your configuration and import pieces of it here:
# ./nvim.nix
];
nixpkgs = {
# You can add overlays here
overlays = [
# Add overlays your own flake exports (from overlays and pkgs dir):
outputs.overlays.additions
outputs.overlays.modifications
outputs.overlays.unstable-packages
# You can also add overlays exported from other flakes:
# neovim-nightly-overlay.overlays.default
# Or define it inline, for example:
# (final: prev: {
# hi = final.hello.overrideAttrs (oldAttrs: {
# patches = [ ./change-hello-to-hi.patch ];
# });
# })
];
# Configure your nixpkgs instance
config = {
# Disable if you don't want unfree packages
allowUnfree = true;
# Workaround for https://github.com/nix-community/home-manager/issues/2942
allowUnfreePredicate = (_: true);
};
};
# TODO: Set your username
home = {
username = "your-username";
homeDirectory = "/home/your-username";
};
# Add stuff for your user as you see fit:
# programs.neovim.enable = true;
# home.packages = with pkgs; [ steam ];
# Enable home-manager and git
programs.home-manager.enable = true;
programs.git.enable = true;
# Nicely reload system units when changing configs
systemd.user.startServices = "sd-switch";
# https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
home.stateVersion = "23.05";
}

View file

@ -1,100 +0,0 @@
# This is your system's configuration file.
# Use this to configure your system environment (it replaces /etc/nixos/configuration.nix)
{ inputs, outputs, lib, config, pkgs, ... }: {
# You can import other NixOS modules here
imports = [
# If you want to use modules your own flake exports (from modules/nixos):
# outputs.nixosModules.example
# Or modules from other flakes (such as nixos-hardware):
# inputs.hardware.nixosModules.common-cpu-amd
# inputs.hardware.nixosModules.common-ssd
# You can also split up your configuration and import pieces of it here:
# ./users.nix
# Import your generated (nixos-generate-config) hardware configuration
./hardware-configuration.nix
];
nixpkgs = {
# You can add overlays here
overlays = [
# Add overlays your own flake exports (from overlays and pkgs dir):
outputs.overlays.additions
outputs.overlays.modifications
outputs.overlays.unstable-packages
# You can also add overlays exported from other flakes:
# neovim-nightly-overlay.overlays.default
# Or define it inline, for example:
# (final: prev: {
# hi = final.hello.overrideAttrs (oldAttrs: {
# patches = [ ./change-hello-to-hi.patch ];
# });
# })
];
# Configure your nixpkgs instance
config = {
# Disable if you don't want unfree packages
allowUnfree = true;
};
};
nix = {
# This will add each flake input as a registry
# To make nix3 commands consistent with your flake
registry = lib.mapAttrs (_: value: { flake = value; }) inputs;
# This will additionally add your inputs to the system's legacy channels
# Making legacy nix commands consistent as well, awesome!
nixPath = lib.mapAttrsToList (key: value: "${key}=${value.to.path}") config.nix.registry;
settings = {
# Enable flakes and new 'nix' command
experimental-features = "nix-command flakes";
# Deduplicate and optimize nix store
auto-optimise-store = true;
};
};
# FIXME: Add the rest of your current configuration
# TODO: Set your hostname
networking.hostName = "your-hostname";
# TODO: This is just an example, be sure to use whatever bootloader you prefer
boot.loader.systemd-boot.enable = true;
# TODO: Configure your system-wide user settings (groups, etc), add more users as needed.
users.users = {
# FIXME: Replace with your username
your-username = {
# TODO: You can set an initial password for your user.
# If you do, you can skip setting a root password by passing '--no-root-passwd' to nixos-install.
# Be sure to change it (using passwd) after rebooting!
initialPassword = "correcthorsebatterystaple";
isNormalUser = true;
openssh.authorizedKeys.keys = [
# TODO: Add your SSH public key(s) here, if you plan on using SSH to connect
];
# TODO: Be sure to add any other groups you need (such as networkmanager, audio, docker, etc)
extraGroups = [ "wheel" ];
};
};
# This setups a SSH server. Very important if you're setting up a headless system.
# Feel free to remove if you don't need it.
services.openssh = {
enable = true;
# Forbid root login through SSH.
permitRootLogin = "no";
# Use keys only. Remove if you want to SSH using password (not recommended)
passwordAuthentication = false;
};
# https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
system.stateVersion = "23.05";
}

View file

@ -1,10 +0,0 @@
# This is just an example, you should generate yours with nixos-generate-config and put it in here.
{
fileSystems."/" = {
device = "/dev/sda1";
fsType = "ext4";
};
# Set your system kind (needed for flakes)
nixpkgs.hostPlatform = "x86_64-linux";
}

View file

@ -196,75 +196,6 @@
"type": "github"
}
},
"hyprland": {
"inputs": {
"hyprland-protocols": "hyprland-protocols",
"nixpkgs": [
"nixpkgs"
],
"systems": "systems",
"wlroots": "wlroots",
"xdph": "xdph"
},
"locked": {
"lastModified": 1694776019,
"narHash": "sha256-hpkAehMA141aQyERaLlFRYSqePjS739+2eS293pJH+A=",
"owner": "hyprwm",
"repo": "hyprland",
"rev": "56adec7c1a49c079f320ba3c0c5ae3948946a9e5",
"type": "github"
},
"original": {
"owner": "hyprwm",
"repo": "hyprland",
"type": "github"
}
},
"hyprland-protocols": {
"inputs": {
"nixpkgs": [
"hyprland",
"nixpkgs"
],
"systems": [
"hyprland",
"systems"
]
},
"locked": {
"lastModified": 1691753796,
"narHash": "sha256-zOEwiWoXk3j3+EoF3ySUJmberFewWlagvewDRuWYAso=",
"owner": "hyprwm",
"repo": "hyprland-protocols",
"rev": "0c2ce70625cb30aef199cb388f99e19a61a6ce03",
"type": "github"
},
"original": {
"owner": "hyprwm",
"repo": "hyprland-protocols",
"type": "github"
}
},
"hyprwm-contrib": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1693997747,
"narHash": "sha256-W23nMGmDnyBgxO8O/9jcZtiSpa0taMNcRAD1das/ttw=",
"owner": "hyprwm",
"repo": "contrib",
"rev": "5b67181fced4fb06d26afcf9614b35765c576168",
"type": "github"
},
"original": {
"owner": "hyprwm",
"repo": "contrib",
"type": "github"
}
},
"impermanence": {
"locked": {
"lastModified": 1694622745,
@ -420,8 +351,6 @@
"firefox-addons": "firefox-addons",
"hardware": "hardware",
"home-manager": "home-manager",
"hyprland": "hyprland",
"hyprwm-contrib": "hyprwm-contrib",
"impermanence": "impermanence",
"nh": "nh",
"nix-colors": "nix-colors",
@ -453,21 +382,6 @@
"type": "github"
}
},
"systems": {
"locked": {
"lastModified": 1689347949,
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
"owner": "nix-systems",
"repo": "default-linux",
"rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default-linux",
"type": "github"
}
},
"utils": {
"locked": {
"lastModified": 1605370193,
@ -482,54 +396,6 @@
"repo": "flake-utils",
"type": "github"
}
},
"wlroots": {
"flake": false,
"locked": {
"host": "gitlab.freedesktop.org",
"lastModified": 1694302348,
"narHash": "sha256-S9NOc88L/1jpNKJqBu2Hihvn0V1HHCK2hXE4bNBAStg=",
"owner": "wlroots",
"repo": "wlroots",
"rev": "65bbbbbf0c3d6844cee3c4e294d0ba07e1f82211",
"type": "gitlab"
},
"original": {
"host": "gitlab.freedesktop.org",
"owner": "wlroots",
"repo": "wlroots",
"rev": "65bbbbbf0c3d6844cee3c4e294d0ba07e1f82211",
"type": "gitlab"
}
},
"xdph": {
"inputs": {
"hyprland-protocols": [
"hyprland",
"hyprland-protocols"
],
"nixpkgs": [
"hyprland",
"nixpkgs"
],
"systems": [
"hyprland",
"systems"
]
},
"locked": {
"lastModified": 1694363988,
"narHash": "sha256-RF6LXm4J6mBF3B8VcQuABuU4g4tCPHgMYJQSoJ3DW+8=",
"owner": "hyprwm",
"repo": "xdg-desktop-portal-hyprland",
"rev": "aca51609d4c415b30e88b96c6f49f0142cbcdae7",
"type": "github"
},
"original": {
"owner": "hyprwm",
"repo": "xdg-desktop-portal-hyprland",
"type": "github"
}
}
},
"root": "root",

View file

@ -27,31 +27,14 @@
inputs.nixpkgs-22_11.follows = "nixpkgs";
inputs.nixpkgs-23_05.follows = "nixpkgs";
};
# nix-minecraft = {
# url = "github:misterio77/nix-minecraft";
# inputs.nixpkgs.follows = "nixpkgs";
# };
firefly = {
url = "github:timhae/firefly";
inputs.nixpkgs.follows = "nixpkgs";
};
hyprland = {
url = "github:hyprwm/hyprland";
inputs.nixpkgs.follows = "nixpkgs";
};
hyprwm-contrib = {
url = "github:hyprwm/contrib";
inputs.nixpkgs.follows = "nixpkgs";
};
firefox-addons = {
url = "gitlab:rycee/nur-expressions?dir=pkgs/firefox-addons";
inputs.nixpkgs.follows = "nixpkgs";
};
# disconic.url = "github:misterio77/disconic";
# website.url = "github:misterio77/website";
# paste-misterio-me.url = "github:misterio77/paste.misterio.me";
# yrmos.url = "github:misterio77/yrmos";
};
outputs = { self, nixpkgs, home-manager, ... }@inputs:
@ -66,7 +49,6 @@
inherit lib;
nixosModules = import ./modules/nixos;
homeManagerModules = import ./modules/home-manager;
# templates = import ./templates;
overlays = import ./overlays { inherit inputs outputs; };
hydraJobs = import ./hydra.nix { inherit inputs outputs; };

View file

@ -1,4 +1,4 @@
{ pkgs, ... }: {
{ pkgs, lib, config, ... }: {
imports = [
./bash.nix
./bat.nix
@ -24,13 +24,13 @@
bc # Calculator
bottom # System viewer
ncdu # TUI disk usage
eza # Better ls
exa # Better ls
ripgrep # Better grep
fd # Better find
curl # cURL
httpie # Better curl
diffsitter # Better diff
jq # JSON pretty printer and manipulator
trekscii # Cute startrek cli printer
timer # To help with my ADHD paralysis
nil # Nix LSP

View file

@ -9,6 +9,6 @@
};
};
home.persistence = {
"/persist/home/misterio".directories = [ ".config/gh" ];
"/persist/home/gburd".directories = [ ".config/gh" ];
};
}

View file

@ -3,7 +3,7 @@ let
ssh = "${pkgs.openssh}/bin/ssh";
git-m7 = pkgs.writeShellScriptBin "git-m7" ''
repo="$(git remote -v | grep git@m7.rs | head -1 | cut -d ':' -f2 | cut -d ' ' -f1)"
repo="$(git remote -v | grep git@burd.me | head -1 | cut -d ':' -f2 | cut -d ' ' -f1)"
# Add a .git suffix if it's missing
if [[ "$repo" != *".git" ]]; then
repo="$repo.git"
@ -14,15 +14,15 @@ let
echo "You must specify a name for the repo"
exit 1
fi
${ssh} -A git@m7.rs << EOF
${ssh} -A git@burd.me << EOF
git init --bare "$2.git"
git -C "$2.git" branch -m main
EOF
git remote add origin git@m7.rs:"$2.git"
git remote add origin git@burd.me:"$2.git"
elif [ "$1" == "ls" ]; then
${ssh} -A git@m7.rs ls
${ssh} -A git@burd.me ls
else
${ssh} -A git@m7.rs git -C "/srv/git/$repo" $@
${ssh} -A git@burd.me git -C "/srv/git/$repo" $@
fi
'';
in
@ -37,11 +37,11 @@ in
add-nowhitespace = "!git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero -";
fast-forward = "merge --ff-only";
};
userName = "Gabriel Fontes";
userEmail = "hi@m7.rs";
userName = "Greg Burd";
userEmail = "gburd@symas.com";
extraConfig = {
init.defaultBranch = "main";
user.signing.key = "CE707A2C17FAAC97907FF8EF2E54EA7BFE630916";
user.signing.key = "1FC1E7793410DE46";
commit.gpgSign = true;
gpg.program = "${config.programs.gpg.package}/bin/gpg2";
};

View file

@ -12,10 +12,10 @@ in
{
home.packages = pinentry.packages;
services.gpg-agent = {
services.gpg-agent = { #TODO: gnupg vs gpg-agent ?
enable = true;
enableSshSupport = true;
sshKeys = [ "149F16412997785363112F3DBD713BC91D51B831" ];
# sshKeys = [ "149F16412997785363112F3DBD713BC91D51B831" ];
pinentryFlavor = pinentry.name;
enableExtraSocket = true;
};

View file

@ -15,13 +15,13 @@ in
}];
};
trusted = lib.hm.dag.entryBefore [ "net" ] {
host = "m7.rs *.m7.rs *.ts.m7.rs";
host = "burd.me *.burd.me *.ts.burd.me";
forwardAgent = true;
};
};
};
home.persistence = {
"/persist/home/misterio".directories = [ ".ssh" ];
"/persist/home/gburd".directories = [ ".ssh" ];
};
}

View file

@ -1,6 +1,6 @@
{
programs.xpo = {
enable = true;
defaultServer = "m7.rs";
defaultServer = "burd.me";
};
}

View file

@ -12,5 +12,6 @@
./qt.nix
./slack.nix
./sublime-music.nix
./protonmail-bridge.nix
];
}

View file

@ -5,7 +5,7 @@ in {
home.packages = with pkgs; [ discord discocss ];
home.persistence = {
"/persist/home/misterio".directories = [ ".config/discord" ];
"/persist/home/gburd".directories = [ ".config/discord" ];
};
xdg.configFile."discocss/custom.css".text = ''

View file

@ -1,14 +1,16 @@
{ pkgs, ... }:
{ pkgs, lib, ... }:
{
programs.browserpass.enable = true;
programs.firefox = {
enable = true;
profiles.misterio = {
profiles.gburd = {
bookmarks = { };
extensions = with pkgs.inputs.firefox-addons; [
ublock-origin
browserpass
keybase
tampermonkey
proton-pass
onetab
];
bookmarks = { };
settings = {
@ -18,7 +20,7 @@
"browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
"browser.shell.checkDefaultBrowser" = false;
"browser.shell.defaultBrowserCheckCount" = 1;
"browser.startup.homepage" = "https://start.duckduckgo.com";
"browser.startup.homepage" = "https://kagi.com";
"browser.uiCustomization.state" = ''{"placements":{"widget-overflow-fixed-list":[],"nav-bar":["back-button","forward-button","stop-reload-button","home-button","urlbar-container","downloads-button","library-button","ublock0_raymondhill_net-browser-action","_testpilot-containers-browser-action"],"toolbar-menubar":["menubar-items"],"TabsToolbar":["tabbrowser-tabs","new-tab-button","alltabs-button"],"PersonalToolbar":["import-button","personal-bookmarks"]},"seen":["save-to-pocket-button","developer-button","ublock0_raymondhill_net-browser-action","_testpilot-containers-browser-action"],"dirtyAreaCache":["nav-bar","PersonalToolbar","toolbar-menubar","TabsToolbar","widget-overflow-fixed-list"],"currentVersion":18,"newElementCount":4}'';
"dom.security.https_only_mode" = true;
"identity.fxaccounts.enabled" = false;
@ -31,7 +33,7 @@
home = {
persistence = {
# Not persisting is safer
# "/persist/home/misterio".directories = [ ".mozilla/firefox" ];
# "/persist/home/gburd".directories = [ ".mozilla/firefox" ];
};
};

View file

@ -0,0 +1,36 @@
{ pkgs, ... }:
{
imports = [];
home.packages = with pkgs; [
gtk3 # For gtk-launch
xdg-utils-spawn-terminal # Patched to open terminal
];
# environment.gnome.excludePackages = (with pkgs; [
# gnome-photos
# gnome-tour
# ]) ++ (with pkgs.gnome; [
# cheese # webcam tool
# gnome-music
# gedit # text editor
# epiphany # web browser
# geary # email reader
# gnome-characters
# tali # poker game
# iagno # go game
# hitori # sudoku game
# atomix # puzzle game
# yelp # Help view
# gnome-contacts
# gnome-initial-setup
# ]);
# programs.dconf.enable = true;
# environment.systemPackages = with pkgs; [
# gnome.gnome-tweaks
# ]
# };
home.sessionVariables = {
};
}

View file

@ -41,6 +41,6 @@ in
};
home.persistence = {
"/persist/home/misterio".directories = [ ".config/kdeconnect" ];
"/persist/home/gburd".directories = [ ".config/kdeconnect" ];
};
}

View file

@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.protonmail-bridge ];
}

View file

@ -1,6 +1,6 @@
{ pkgs, lib, ... }: {
home.packages = [ pkgs.sublime-music ];
home.persistence = {
"/persist/home/misterio".directories = [ ".config/sublime-music" ];
"/persist/home/gburd".directories = [ ".config/sublime-music" ];
};
}

View file

@ -1,39 +0,0 @@
{ pkgs, ... }:
{
imports = [
./hyprland-vnc.nix
./gammastep.nix
./kitty.nix
./mako.nix
./qutebrowser.nix
./swayidle.nix
./swaylock.nix
./waybar.nix
./wofi.nix
./zathura.nix
];
xdg.mimeApps.enable = true;
home.packages = with pkgs; [
grim
gtk3 # For gtk-launch
imv
mimeo
primary-xwayland
pulseaudio
slurp
waypipe
wf-recorder
wl-clipboard
wl-mirror
wl-mirror-pick
xdg-utils-spawn-terminal # Patched to open terminal
ydotool
];
home.sessionVariables = {
MOZ_ENABLE_WAYLAND = 1;
QT_QPA_PLATFORM = "wayland";
LIBSEAT_BACKEND = "logind";
};
}

View file

@ -1,13 +0,0 @@
{
services.gammastep = {
enable = true;
provider = "geoclue2";
temperature = {
day = 6000;
night = 4600;
};
settings = {
general.adjustment-method = "wayland";
};
};
}

View file

@ -1,35 +0,0 @@
{ pkgs, lib, config, ... }:
let
enabledMonitors = lib.filter (m: m.enabled) config.monitors;
# A nice VNC script for remotes running hyprland
vncsh = pkgs.writeShellScriptBin "vnc.sh" ''
ssh $1 bash <<'EOF'
pgrep "wayvnc" && exit
export HYPRLAND_INSTANCE_SIGNATURE="$(ls /tmp/hypr/ -lt | head -2 | tail -1 | rev | cut -d ' ' -f1 | rev)"
export WAYLAND_DISPLAY="wayland-1"
ip="$(ip addr show dev tailscale0 | grep 'inet ' | xargs | cut -d ' ' -f2 | cut -d '/' -f1)"
xpos="$(hyprctl monitors -j | jq -r 'sort_by(.x)[-1] | .x + .width')"
${lib.concatLines (lib.forEach enabledMonitors (m: ''
hyprctl output create headless
monitor="$(hyprctl monitors -j | jq -r 'map(.name)[-1]')"
hyprctl keyword monitor $monitor,${toString m.width}x${toString m.height}@${toString m.refreshRate},$(($xpos + ${toString m.x}))x${toString m.y},1
screen -d -m wayvnc -k br -S /tmp/vnc-${m.workspace} -f 60 -o $monitor $ip 590${m.workspace}
sudo iptables -I INPUT -j ACCEPT -p tcp --dport 590${m.workspace}
''))}
EOF
${lib.concatLines (lib.forEach enabledMonitors (m: ''
vncviewer $1::590${m.workspace} &
''))}
wait
'';
in
{
home.packages = with pkgs; [
vncsh
wayvnc
tigervnc
];
}

View file

@ -1,66 +0,0 @@
{ config, pkgs, ... }:
let
inherit (config.colorscheme) colors;
kitty-xterm = pkgs.writeShellScriptBin "xterm" ''
${config.programs.kitty.package}/bin/kitty -1 "$@"
'';
in
{
home = {
packages = [ kitty-xterm ];
sessionVariables = {
TERMINAL = "kitty -1";
};
};
programs.kitty = {
enable = true;
font = {
name = config.fontProfiles.monospace.family;
size = 12;
};
settings = {
shell_integration = "no-rc"; # I prefer to do it manually
scrollback_lines = 4000;
scrollback_pager_history_size = 2048;
window_padding_width = 15;
foreground = "#${colors.base05}";
background = "#${colors.base00}";
selection_background = "#${colors.base05}";
selection_foreground = "#${colors.base00}";
url_color = "#${colors.base04}";
cursor = "#${colors.base05}";
active_border_color = "#${colors.base03}";
inactive_border_color = "#${colors.base01}";
active_tab_background = "#${colors.base00}";
active_tab_foreground = "#${colors.base05}";
inactive_tab_background = "#${colors.base01}";
inactive_tab_foreground = "#${colors.base04}";
tab_bar_background = "#${colors.base01}";
color0 = "#${colors.base00}";
color1 = "#${colors.base08}";
color2 = "#${colors.base0B}";
color3 = "#${colors.base0A}";
color4 = "#${colors.base0D}";
color5 = "#${colors.base0E}";
color6 = "#${colors.base0C}";
color7 = "#${colors.base05}";
color8 = "#${colors.base03}";
color9 = "#${colors.base08}";
color10 = "#${colors.base0B}";
color11 = "#${colors.base0A}";
color12 = "#${colors.base0D}";
color13 = "#${colors.base0E}";
color14 = "#${colors.base0C}";
color15 = "#${colors.base07}";
color16 = "#${colors.base09}";
color17 = "#${colors.base0F}";
color18 = "#${colors.base01}";
color19 = "#${colors.base02}";
color20 = "#${colors.base04}";
color21 = "#${colors.base06}";
};
};
}

View file

@ -1,23 +0,0 @@
{ config, ... }:
let inherit (config.colorscheme) colors kind;
in {
services.mako = {
enable = true;
iconPath =
if kind == "dark" then
"${config.gtk.iconTheme.package}/share/icons/Papirus-Dark"
else
"${config.gtk.iconTheme.package}/share/icons/Papirus-Light";
font = "${config.fontProfiles.regular.family} 12";
padding = "10,20";
anchor = "top-center";
width = 400;
height = 150;
borderSize = 2;
defaultTimeout = 12000;
backgroundColor = "#${colors.base00}dd";
borderColor = "#${colors.base03}dd";
textColor = "#${colors.base05}dd";
layer = "overlay";
};
}

View file

@ -1,177 +0,0 @@
{ config, pkgs, ... }:
let inherit (config.colorscheme) colors kind;
in
{
home.persistence = {
"/persist/home/misterio".directories = [
".config/qutebrowser/bookmarks"
".config/qutebrowser/greasemonkey"
".local/share/qutebrowser"
];
};
xdg.mimeApps.defaultApplications = {
"text/html" = [ "org.qutebrowser.qutebrowser.desktop" ];
"text/xml" = [ "org.qutebrowser.qutebrowser.desktop" ];
"x-scheme-handler/http" = [ "org.qutebrowser.qutebrowser.desktop" ];
"x-scheme-handler/https" = [ "org.qutebrowser.qutebrowser.desktop" ];
"x-scheme-handler/qute" = [ "org.qutebrowser.qutebrowser.desktop" ];
};
programs.qutebrowser = {
enable = true;
loadAutoconfig = true;
settings = {
editor.command = [ "xdg-open" "{file}" ];
tabs = {
show = "multiple";
position = "left";
tree_tabs = true;
};
fonts = {
default_family = config.fontProfiles.regular.family;
default_size = "12pt";
};
colors = {
webpage = {
preferred_color_scheme = kind;
bg = "#ffffff";
};
completion = {
fg = "#${colors.base05}";
match.fg = "#${colors.base09}";
even.bg = "#${colors.base00}";
odd.bg = "#${colors.base00}";
scrollbar = {
bg = "#${colors.base00}";
fg = "#${colors.base05}";
};
category = {
bg = "#${colors.base00}";
fg = "#${colors.base0D}";
border = {
bottom = "#${colors.base00}";
top = "#${colors.base00}";
};
};
item.selected = {
bg = "#${colors.base02}";
fg = "#${colors.base05}";
match.fg = "#${colors.base05}";
border = {
bottom = "#${colors.base02}";
top = "#${colors.base02}";
};
};
};
contextmenu = {
disabled = {
bg = "#${colors.base01}";
fg = "#${colors.base04}";
};
menu = {
bg = "#${colors.base00}";
fg = "#${colors.base05}";
};
selected = {
bg = "#${colors.base02}";
fg = "#${colors.base05}";
};
};
downloads = {
bar.bg = "#${colors.base00}";
error.fg = "#${colors.base08}";
start = {
bg = "#${colors.base0D}";
fg = "#${colors.base00}";
};
stop = {
bg = "#${colors.base0C}";
fg = "#${colors.base00}";
};
};
hints = {
bg = "#${colors.base0A}";
fg = "#${colors.base00}";
match.fg = "#${colors.base05}";
};
keyhint = {
bg = "#${colors.base00}";
fg = "#${colors.base05}";
suffix.fg = "#${colors.base05}";
};
messages = {
error.bg = "#${colors.base08}";
error.border = "#${colors.base08}";
error.fg = "#${colors.base00}";
info.bg = "#${colors.base00}";
info.border = "#${colors.base00}";
info.fg = "#${colors.base05}";
warning.bg = "#${colors.base0E}";
warning.border = "#${colors.base0E}";
warning.fg = "#${colors.base00}";
};
prompts = {
bg = "#${colors.base00}";
fg = "#${colors.base05}";
border = "#${colors.base00}";
selected.bg = "#${colors.base02}";
};
statusbar = {
caret.bg = "#${colors.base00}";
caret.fg = "#${colors.base0D}";
caret.selection.bg = "#${colors.base00}";
caret.selection.fg = "#${colors.base0D}";
command.bg = "#${colors.base01}";
command.fg = "#${colors.base04}";
command.private.bg = "#${colors.base01}";
command.private.fg = "#${colors.base0E}";
insert.bg = "#${colors.base00}";
insert.fg = "#${colors.base0C}";
normal.bg = "#${colors.base00}";
normal.fg = "#${colors.base05}";
passthrough.bg = "#${colors.base00}";
passthrough.fg = "#${colors.base0A}";
private.bg = "#${colors.base00}";
private.fg = "#${colors.base0E}";
progress.bg = "#${colors.base0D}";
url.error.fg = "#${colors.base08}";
url.fg = "#${colors.base05}";
url.hover.fg = "#${colors.base09}";
url.success.http.fg = "#${colors.base0B}";
url.success.https.fg = "#${colors.base0B}";
url.warn.fg = "#${colors.base0E}";
};
tabs = {
bar.bg = "#${colors.base00}";
even.bg = "#${colors.base00}";
even.fg = "#${colors.base05}";
indicator.error = "#${colors.base08}";
indicator.start = "#${colors.base0D}";
indicator.stop = "#${colors.base0C}";
odd.bg = "#${colors.base00}";
odd.fg = "#${colors.base05}";
pinned.even.bg = "#${colors.base0B}";
pinned.even.fg = "#${colors.base00}";
pinned.odd.bg = "#${colors.base0B}";
pinned.odd.fg = "#${colors.base00}";
pinned.selected.even.bg = "#${colors.base02}";
pinned.selected.even.fg = "#${colors.base05}";
pinned.selected.odd.bg = "#${colors.base02}";
pinned.selected.odd.fg = "#${colors.base05}";
selected.even.bg = "#${colors.base02}";
selected.even.fg = "#${colors.base05}";
selected.odd.bg = "#${colors.base02}";
selected.odd.fg = "#${colors.base05}";
};
};
};
extraConfig = ''
c.tabs.padding = {"bottom": 10, "left": 10, "right": 10, "top": 10}
'';
};
}

View file

@ -1,54 +0,0 @@
{ pkgs, lib, config, ... }:
let
swaylock = "${config.programs.swaylock.package}/bin/swaylock";
pgrep = "${pkgs.procps}/bin/pgrep";
pactl = "${pkgs.pulseaudio}/bin/pactl";
hyprctl = "${config.wayland.windowManager.hyprland.package}/bin/hyprctl";
swaymsg = "${config.wayland.windowManager.sway.package}/bin/swaymsg";
isLocked = "${pgrep} -x ${swaylock}";
lockTime = 4 * 60; # TODO: configurable desktop (10 min)/laptop (4 min)
# Makes two timeouts: one for when the screen is not locked (lockTime+timeout) and one for when it is.
afterLockTimeout = { timeout, command, resumeCommand ? null }: [
{ timeout = lockTime + timeout; inherit command resumeCommand; }
{ command = "${isLocked} && ${command}"; inherit resumeCommand timeout; }
];
in
{
services.swayidle = {
enable = true;
systemdTarget = "graphical-session.target";
timeouts =
# Lock screen
[{
timeout = lockTime;
command = "${swaylock} -i ${config.wallpaper} --daemonize";
}] ++
# Mute mic
(afterLockTimeout {
timeout = 10;
command = "${pactl} set-source-mute @DEFAULT_SOURCE@ yes";
resumeCommand = "${pactl} set-source-mute @DEFAULT_SOURCE@ no";
}) ++
# Turn off RGB
(lib.optionals config.services.rgbdaemon.enable (afterLockTimeout {
timeout = 20;
command = "systemctl --user stop rgbdaemon";
resumeCommand = "systemctl --user start rgbdaemon";
})) ++
# Turn off displays (hyprland)
(lib.optionals config.wayland.windowManager.hyprland.enable (afterLockTimeout {
timeout = 40;
command = "${hyprctl} dispatch dpms off";
resumeCommand = "${hyprctl} dispatch dpms on";
})) ++
# Turn off displays (sway)
(lib.optionals config.wayland.windowManager.sway.enable (afterLockTimeout {
timeout = 40;
command = "${swaymsg} 'output * dpms off'";
resumeCommand = "${swaymsg} 'output * dpms on'";
}));
};
}

View file

@ -1,43 +0,0 @@
{ config, pkgs, ... }:
let inherit (config.colorscheme) colors;
in
{
programs.swaylock = {
enable = true;
package = pkgs.swaylock-effects;
settings = {
effect-blur = "20x3";
fade-in = 0.1;
font = config.fontProfiles.regular.family;
font-size = 15;
line-uses-inside = true;
disable-caps-lock-text = true;
indicator-caps-lock = true;
indicator-radius = 40;
indicator-idle-visible = true;
indicator-y-position = 1000;
ring-color = "#${colors.base02}";
inside-wrong-color = "#${colors.base08}";
ring-wrong-color = "#${colors.base08}";
key-hl-color = "#${colors.base0B}";
bs-hl-color = "#${colors.base08}";
ring-ver-color = "#${colors.base09}";
inside-ver-color = "#${colors.base09}";
inside-color = "#${colors.base01}";
text-color = "#${colors.base07}";
text-clear-color = "#${colors.base01}";
text-ver-color = "#${colors.base01}";
text-wrong-color = "#${colors.base01}";
text-caps-lock-color = "#${colors.base07}";
inside-clear-color = "#${colors.base0C}";
ring-clear-color = "#${colors.base0C}";
inside-caps-lock-color = "#${colors.base09}";
ring-caps-lock-color = "#${colors.base02}";
separator-color = "#${colors.base02}";
};
};
}

View file

@ -1,392 +0,0 @@
{ outputs, config, lib, pkgs, ... }:
let
# Dependencies
cat = "${pkgs.coreutils}/bin/cat";
cut = "${pkgs.coreutils}/bin/cut";
find = "${pkgs.findutils}/bin/find";
grep = "${pkgs.gnugrep}/bin/grep";
pgrep = "${pkgs.procps}/bin/pgrep";
tail = "${pkgs.coreutils}/bin/tail";
wc = "${pkgs.coreutils}/bin/wc";
xargs = "${pkgs.findutils}/bin/xargs";
timeout = "${pkgs.coreutils}/bin/timeout";
ping = "${pkgs.iputils}/bin/ping";
jq = "${pkgs.jq}/bin/jq";
gamemoded = "${pkgs.gamemode}/bin/gamemoded";
systemctl = "${pkgs.systemd}/bin/systemctl";
journalctl = "${pkgs.systemd}/bin/journalctl";
playerctl = "${pkgs.playerctl}/bin/playerctl";
playerctld = "${pkgs.playerctl}/bin/playerctld";
pavucontrol = "${pkgs.pavucontrol}/bin/pavucontrol";
wofi = "${pkgs.wofi}/bin/wofi";
# Function to simplify making waybar outputs
jsonOutput = name: { pre ? "", text ? "", tooltip ? "", alt ? "", class ? "", percentage ? "" }: "${pkgs.writeShellScriptBin "waybar-${name}" ''
set -euo pipefail
${pre}
${jq} -cn \
--arg text "${text}" \
--arg tooltip "${tooltip}" \
--arg alt "${alt}" \
--arg class "${class}" \
--arg percentage "${percentage}" \
'{text:$text,tooltip:$tooltip,alt:$alt,class:$class,percentage:$percentage}'
''}/bin/waybar-${name}";
in
{
programs.waybar = {
enable = true;
package = pkgs.waybar.overrideAttrs (oa: {
mesonFlags = (oa.mesonFlags or [ ]) ++ [ "-Dexperimental=true" ];
});
systemd.enable = true;
settings = {
primary = {
mode = "dock";
layer = "top";
height = 40;
margin = "6";
position = "top";
modules-left = [
"custom/menu"
] ++ (lib.optionals config.wayland.windowManager.sway.enable [
"sway/workspaces"
"sway/mode"
]) ++ (lib.optionals config.wayland.windowManager.hyprland.enable [
"hyprland/workspaces"
"hyprland/submap"
]) ++ [
"custom/currentplayer"
"custom/player"
];
modules-center = [
"pulseaudio"
"battery"
"clock"
"custom/unread-mail"
"custom/gpg-agent"
];
modules-right = [
"network"
"custom/tailscale-ping"
"custom/gamemode"
# TODO: currently broken for some reason
# "custom/gammastep"
"tray"
"custom/hostname"
];
clock = {
interval = 1;
format = "{:%d/%m %H:%M:%S}";
format-alt = "{:%Y-%m-%d %H:%M:%S %z}";
on-click-left = "mode";
tooltip-format = ''
<big>{:%Y %B}</big>
<tt><small>{calendar}</small></tt>'';
};
pulseaudio = {
format = "{icon} {volume}%";
format-muted = " 0%";
format-icons = {
headphone = "󰋋";
headset = "󰋎";
portable = "";
default = [ "" "" "" ];
};
on-click = pavucontrol;
};
idle_inhibitor = {
format = "{icon}";
format-icons = {
activated = "󰒳";
deactivated = "󰒲";
};
};
battery = {
bat = "BAT0";
interval = 10;
format-icons = [ "󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹" ];
format = "{icon} {capacity}%";
format-charging = "󰂄 {capacity}%";
onclick = "";
};
"sway/window" = {
max-length = 20;
};
network = {
interval = 3;
format-wifi = " {essid}";
format-ethernet = "󰈁 Connected";
format-disconnected = "";
tooltip-format = ''
{ifname}
{ipaddr}/{cidr}
Up: {bandwidthUpBits}
Down: {bandwidthDownBits}'';
on-click = "";
};
"custom/tailscale-ping" = {
interval = 10;
return-type = "json";
exec =
let
inherit (builtins) concatStringsSep attrNames;
hosts = attrNames outputs.nixosConfigurations;
homeMachine = "merope";
remoteMachine = "alcyone";
in
jsonOutput "tailscale-ping" {
# Build variables for each host
pre = ''
set -o pipefail
${concatStringsSep "\n" (map (host: ''
ping_${host}="$(${timeout} 2 ${ping} -c 1 -q ${host} 2>/dev/null | ${tail} -1 | ${cut} -d '/' -f5 | ${cut} -d '.' -f1)ms" || ping_${host}="Disconnected"
'') hosts)}
'';
# Access a remote machine's and a home machine's ping
text = " $ping_${remoteMachine} / $ping_${homeMachine}";
# Show pings from all machines
tooltip = concatStringsSep "\n" (map (host: "${host}: $ping_${host}") hosts);
};
format = "{}";
on-click = "";
};
"custom/menu" = {
return-type = "json";
exec = jsonOutput "menu" {
text = "";
tooltip = ''$(${cat} /etc/os-release | ${grep} PRETTY_NAME | ${cut} -d '"' -f2)'';
};
on-click = "${wofi} -S drun -x 10 -y 10 -W 25% -H 60%";
};
"custom/hostname" = {
exec = "echo $USER@$HOSTNAME";
};
"custom/unread-mail" = {
interval = 5;
return-type = "json";
exec = jsonOutput "unread-mail" {
pre = ''
count=$(${find} ~/Mail/*/Inbox/new -type f | ${wc} -l)
if ${pgrep} mbsync &>/dev/null; then
status="syncing"
else if [ "$count" == "0" ]; then
status="read"
else
status="unread"
fi
fi
'';
text = "$count";
alt = "$status";
};
format = "{icon} ({})";
format-icons = {
"read" = "󰇯";
"unread" = "󰇮";
"syncing" = "󰁪";
};
};
"custom/gpg-agent" = {
interval = 2;
return-type = "json";
exec =
let gpgCmds = import ../../../cli/gpg-commands.nix { inherit pkgs; };
in
jsonOutput "gpg-agent" {
pre = ''status=$(${gpgCmds.isUnlocked} && echo "unlocked" || echo "locked")'';
alt = "$status";
tooltip = "GPG is $status";
};
format = "{icon}";
format-icons = {
"locked" = "";
"unlocked" = "";
};
on-click = "";
};
"custom/gamemode" = {
exec-if = "${gamemoded} --status | ${grep} 'is active' -q";
interval = 2;
return-type = "json";
exec = jsonOutput "gamemode" {
tooltip = "Gamemode is active";
};
format = " ";
};
"custom/gammastep" = {
interval = 5;
return-type = "json";
exec = jsonOutput "gammastep" {
pre = ''
if unit_status="$(${systemctl} --user is-active gammastep)"; then
status="$unit_status ($(${journalctl} --user -u gammastep.service -g 'Period: ' | ${tail} -1 | ${cut} -d ':' -f6 | ${xargs}))"
else
status="$unit_status"
fi
'';
alt = "\${status:-inactive}";
tooltip = "Gammastep is $status";
};
format = "{icon}";
format-icons = {
"activating" = "󰁪 ";
"deactivating" = "󰁪 ";
"inactive" = "? ";
"active (Night)" = " ";
"active (Nighttime)" = " ";
"active (Transition (Night)" = " ";
"active (Transition (Nighttime)" = " ";
"active (Day)" = " ";
"active (Daytime)" = " ";
"active (Transition (Day)" = " ";
"active (Transition (Daytime)" = " ";
};
on-click = "${systemctl} --user is-active gammastep && ${systemctl} --user stop gammastep || ${systemctl} --user start gammastep";
};
"custom/currentplayer" = {
interval = 2;
return-type = "json";
exec = jsonOutput "currentplayer" {
pre = ''
player="$(${playerctl} status -f "{{playerName}}" 2>/dev/null || echo "No player active" | ${cut} -d '.' -f1)"
count="$(${playerctl} -l | ${wc} -l)"
if ((count > 1)); then
more=" +$((count - 1))"
else
more=""
fi
'';
alt = "$player";
tooltip = "$player ($count available)";
text = "$more";
};
format = "{icon}{}";
format-icons = {
"No player active" = " ";
"Celluloid" = "󰎁 ";
"spotify" = "󰓇 ";
"ncspot" = "󰓇 ";
"qutebrowser" = "󰖟 ";
"firefox" = " ";
"discord" = " 󰙯 ";
"sublimemusic" = " ";
"kdeconnect" = "󰄡 ";
"chromium" = " ";
};
on-click = "${playerctld} shift";
on-click-right = "${playerctld} unshift";
};
"custom/player" = {
exec-if = "${playerctl} status";
exec = ''${playerctl} metadata --format '{"text": "{{title}} - {{artist}}", "alt": "{{status}}", "tooltip": "{{title}} - {{artist}} ({{album}})"}' '';
return-type = "json";
interval = 2;
max-length = 30;
format = "{icon} {}";
format-icons = {
"Playing" = "󰐊";
"Paused" = "󰏤 ";
"Stopped" = "󰓛";
};
on-click = "${playerctl} play-pause";
};
};
};
# Cheatsheet:
# x -> all sides
# x y -> vertical, horizontal
# x y z -> top, horizontal, bottom
# w x y z -> top, right, bottom, left
style = let inherit (config.colorscheme) colors; in /* css */ ''
* {
font-family: ${config.fontProfiles.regular.family}, ${config.fontProfiles.monospace.family};
font-size: 12pt;
padding: 0 8px;
}
.modules-right {
margin-right: -15px;
}
.modules-left {
margin-left: -15px;
}
window#waybar.top {
opacity: 0.95;
padding: 0;
background-color: #${colors.base00};
border: 2px solid #${colors.base0C};
border-radius: 10px;
}
window#waybar.bottom {
opacity: 0.90;
background-color: #${colors.base00};
border: 2px solid #${colors.base0C};
border-radius: 10px;
}
window#waybar {
color: #${colors.base05};
}
#workspaces button {
background-color: #${colors.base01};
color: #${colors.base05};
padding: 5px 1px;
margin: 3px 0;
}
#workspaces button.hidden {
background-color: #${colors.base00};
color: #${colors.base04};
}
#workspaces button.focused,
#workspaces button.active {
background-color: #${colors.base0A};
color: #${colors.base00};
}
#clock {
background-color: #${colors.base0C};
color: #${colors.base00};
padding-left: 15px;
padding-right: 15px;
margin-top: 0;
margin-bottom: 0;
border-radius: 10px;
}
#custom-menu {
background-color: #${colors.base0C};
color: #${colors.base00};
padding-left: 15px;
padding-right: 22px;
margin: 0;
border-radius: 10px;
}
#custom-hostname {
background-color: #${colors.base0C};
color: #${colors.base00};
padding-left: 15px;
padding-right: 18px;
margin-right: 0;
margin-top: 0;
margin-bottom: 0;
border-radius: 10px;
}
#custom-currentplayer {
padding-right: 0;
}
#tray {
color: #${colors.base05};
}
'';
};
}

View file

@ -1,54 +0,0 @@
{ config, pkgs, ... }:
let
inherit (config) colorscheme;
inherit (colorscheme) colors;
in
{
programs.wezterm = {
enable = true;
colorSchemes = {
"${colorscheme.slug}" = {
foreground = "#${colors.base05}";
background = "#${colors.base00}";
ansi = [
"#${colors.base08}"
"#${colors.base09}"
"#${colors.base0A}"
"#${colors.base0B}"
"#${colors.base0C}"
"#${colors.base0D}"
"#${colors.base0E}"
"#${colors.base0F}"
];
brights = [
"#${colors.base00}"
"#${colors.base01}"
"#${colors.base02}"
"#${colors.base03}"
"#${colors.base04}"
"#${colors.base05}"
"#${colors.base06}"
"#${colors.base07}"
];
cursor_fg = "#${colors.base00}";
cursor_bg = "#${colors.base05}";
selection_fg = "#${colors.base00}";
selection_bg = "#${colors.base05}";
};
};
extraConfig = /* lua */ ''
return {
font = wezterm.font("${config.fontProfiles.monospace.family}"),
font_size = 12.0,
color_scheme = "${colorscheme.slug}",
hide_tab_bar_if_only_one_tab = true,
window_close_confirmation = "NeverPrompt",
set_environment_variables = {
TERM = 'wezterm',
},
}
'';
};
}

View file

@ -1,20 +0,0 @@
--- a/src/wofi.c Mon Feb 22 23:53:57 2021 -0800
+++ b/src/wofi.c Wed Aug 11 13:49:13 2021 -0300
@@ -881,12 +881,15 @@
}
void wofi_term_run(const char* cmd) {
+ char *shell = getenv("SHELL");
+ if (!shell) shell = "sh";
+
if(terminal != NULL) {
- execlp(terminal, terminal, "-e", cmd, NULL);
+ execlp(terminal, terminal, "-e", shell, "-c", cmd, NULL);
}
size_t term_count = sizeof(terminals) / sizeof(char*);
for(size_t count = 0; count < term_count; ++count) {
- execlp(terminals[count], terminals[count], "-e", cmd, NULL);
+ execlp(terminals[count], terminals[count], "-e", shell, "-c", cmd, NULL);
}
fprintf(stderr, "No terminal emulator found please set term in config or use --term\n");
exit(1);

View file

@ -1,25 +0,0 @@
{ config, lib, pkgs, ... }: {
programs.wofi = {
enable = true;
package = pkgs.wofi.overrideAttrs (oa: {
patches = (oa.patches or [ ]) ++ [
./wofi-run-shell.patch # Fix for https://todo.sr.ht/~scoopta/wofi/174
];
});
settings = {
image_size = 48;
columns = 3;
allow_images = true;
insensitive = true;
run-always_parse_args = true;
run-cache_file = "/dev/null";
run-exec_search = true;
};
};
home.packages =
let
inherit (config.programs.password-store) package enable;
in
lib.optional enable (pkgs.pass-wofi.override { pass = package; });
}

View file

@ -1,32 +0,0 @@
{ config, ... }:
let inherit (config.colorscheme) colors;
in {
programs.zathura = {
enable = true;
options = {
selection-clipboard = "clipboard";
font = "${config.fontProfiles.regular.family} 12";
recolor = true;
default-bg = "#${colors.base00}";
default-fg = "#${colors.base01}";
statusbar-bg = "#${colors.base02}";
statusbar-fg = "#${colors.base04}";
inputbar-bg = "#${colors.base00}";
inputbar-fg = "#${colors.base07}";
notification-bg = "#${colors.base00}";
notification-fg = "#${colors.base07}";
notification-error-bg = "#${colors.base00}";
notification-error-fg = "#${colors.base08}";
notification-warning-bg = "#${colors.base00}";
notification-warning-fg = "#${colors.base08}";
highlight-color = "#${colors.base0A}";
highlight-active-color = "#${colors.base0D}";
completion-bg = "#${colors.base01}";
completion-fg = "#${colors.base05}";
completions-highlight-bg = "#${colors.base0D}";
completions-highlight-fg = "#${colors.base07}";
recolor-lightcolor = "#${colors.base00}";
recolor-darkcolor = "#${colors.base06}";
};
};
}

View file

@ -1,3 +1,16 @@
{
imports = [ ../common ];
{ lib, config, pkgs, ... }: {
imports = [
../common
../common/gnome-wm
./tty-init.nix
];
home.packages = with pkgs; [
firefox
emacs
ungoogled-chromium
gnupg
pinentry
];
}

View file

@ -1,70 +0,0 @@
{ lib, ... }:
let
workspaces =
(map toString (lib.range 0 9)) ++
(map (n: "F${toString n}") (lib.range 1 12));
# Map keys to hyprland directions
directions = rec {
left = "l"; right = "r"; up = "u"; down = "d";
h = left; l = right; k = up; j = down;
};
in {
wayland.windowManager.hyprland.settings = {
bindm = [
"SUPER,mouse:272,movewindow"
"SUPER,mouse:273,resizewindow"
];
bind = [
"SUPERSHIFT,q,killactive"
"SUPERSHIFT,e,exit"
"SUPER,s,togglesplit"
"SUPER,f,fullscreen,1"
"SUPERSHIFT,f,fullscreen,0"
"SUPERSHIFT,space,togglefloating"
"SUPER,minus,splitratio,-0.25"
"SUPERSHIFT,minus,splitratio,-0.3333333"
"SUPER,equal,splitratio,0.25"
"SUPERSHIFT,equal,splitratio,0.3333333"
"SUPER,g,togglegroup"
"SUPER,t,lockactivegroup,toggle"
"SUPER,apostrophe,changegroupactive,f"
"SUPERSHIFT,apostrophe,changegroupactive,b"
"SUPER,u,togglespecialworkspace"
"SUPERSHIFT,u,movetoworkspace,special"
] ++
# Change workspace
(map (n:
"SUPER,${n},workspace,name:${n}"
) workspaces) ++
# Move window to workspace
(map (n:
"SUPERSHIFT,${n},movetoworkspacesilent,name:${n}"
) workspaces) ++
# Move focus
(lib.mapAttrsToList (key: direction:
"SUPER,${key},movefocus,${direction}"
) directions) ++
# Swap windows
(lib.mapAttrsToList (key: direction:
"SUPERSHIFT,${key},swapwindow,${direction}"
) directions) ++
# Move windows
(lib.mapAttrsToList (key: direction:
"SUPERCONTROL,${key},movewindoworgroup,${direction}"
) directions) ++
# Move monitor focus
(lib.mapAttrsToList (key: direction:
"SUPERALT,${key},focusmonitor,${direction}"
) directions) ++
# Move workspace to other monitor
(lib.mapAttrsToList (key: direction:
"SUPERALTSHIFT,${key},movecurrentworkspacetomonitor,${direction}"
) directions);
};
}

View file

@ -1,187 +0,0 @@
{ lib, config, pkgs, ... }: {
imports = [
../common
../common/wayland-wm
./tty-init.nix
./basic-binds.nix
./systemd-fixes.nix
];
home.packages = with pkgs; [
inputs.hyprwm-contrib.grimblast
hyprslurp
hyprpicker
];
wayland.windowManager.hyprland = {
enable = true;
package = pkgs.inputs.hyprland.hyprland;
settings = {
general = {
gaps_in = 15;
gaps_out = 20;
border_size = 2.7;
cursor_inactive_timeout = 4;
"col.active_border" = "0xff${config.colorscheme.colors.base0C}";
"col.inactive_border" = "0xff${config.colorscheme.colors.base02}";
"col.group_border_active" = "0xff${config.colorscheme.colors.base0B}";
"col.group_border" = "0xff${config.colorscheme.colors.base04}";
};
input = {
kb_layout = "br,us";
touchpad.disable_while_typing = false;
};
dwindle.split_width_multiplier = 1.35;
misc.vfr = "on";
decoration = {
active_opacity = 0.94;
inactive_opacity = 0.84;
fullscreen_opacity = 1.0;
rounding = 5;
blur = {
enabled = true;
size = 5;
passes = 3;
new_optimizations = true;
ignore_opacity = true;
};
drop_shadow = true;
shadow_range = 12;
shadow_offset = "3 3";
"col.shadow" = "0x44000000";
"col.shadow_inactive" = "0x66000000";
};
animations = {
enabled = true;
bezier = [
"easein,0.11, 0, 0.5, 0"
"easeout,0.5, 1, 0.89, 1"
"easeinback,0.36, 0, 0.66, -0.56"
"easeoutback,0.34, 1.56, 0.64, 1"
];
animation = [
"windowsIn,1,3,easeoutback,slide"
"windowsOut,1,3,easeinback,slide"
"windowsMove,1,3,easeoutback"
"workspaces,1,2,easeoutback,slide"
"fadeIn,1,3,easeout"
"fadeOut,1,3,easein"
"fadeSwitch,1,3,easeout"
"fadeShadow,1,3,easeout"
"fadeDim,1,3,easeout"
"border,1,3,easeout"
];
};
exec = [
"${pkgs.swaybg}/bin/swaybg -i ${config.wallpaper} --mode fill"
];
bind = let
swaylock = "${config.programs.swaylock.package}/bin/swaylock";
playerctl = "${config.services.playerctld.package}/bin/playerctl";
playerctld = "${config.services.playerctld.package}/bin/playerctld";
makoctl = "${config.services.mako.package}/bin/makoctl";
wofi = "${config.programs.wofi.package}/bin/wofi";
pass-wofi = "${pkgs.pass-wofi.override {
pass = config.programs.password-store.package;
}}/bin/pass-wofi";
grimblast = "${pkgs.inputs.hyprwm-contrib.grimblast}/bin/grimblast";
pactl = "${pkgs.pulseaudio}/bin/pactl";
tly = "${pkgs.tly}/bin/tly";
gtk-play = "${pkgs.libcanberra-gtk3}/bin/canberra-gtk-play";
notify-send = "${pkgs.libnotify}/bin/notify-send";
gtk-launch = "${pkgs.gtk3}/bin/gtk-launch";
xdg-mime = "${pkgs.xdg-utils}/bin/xdg-mime";
defaultApp = type: "${gtk-launch} $(${xdg-mime} query default ${type})";
terminal = config.home.sessionVariables.TERMINAL;
browser = defaultApp "x-scheme-handler/https";
editor = defaultApp "text/plain";
in [
# Program bindings
"SUPER,Return,exec,${terminal}"
"SUPER,e,exec,${editor}"
"SUPER,v,exec,${editor}"
"SUPER,b,exec,${browser}"
# Brightness control (only works if the system has lightd)
",XF86MonBrightnessUp,exec,light -A 10"
",XF86MonBrightnessDown,exec,light -U 10"
# Volume
",XF86AudioRaiseVolume,exec,${pactl} set-sink-volume @DEFAULT_SINK@ +5%"
",XF86AudioLowerVolume,exec,${pactl} set-sink-volume @DEFAULT_SINK@ -5%"
",XF86AudioMute,exec,${pactl} set-sink-mute @DEFAULT_SINK@ toggle"
"SHIFT,XF86AudioMute,exec,${pactl} set-source-mute @DEFAULT_SOURCE@ toggle"
",XF86AudioMicMute,exec,${pactl} set-source-mute @DEFAULT_SOURCE@ toggle"
# Screenshotting
",Print,exec,${grimblast} --notify --freeze copy output"
"SHIFT,Print,exec,${grimblast} --notify --freeze copy active"
"CONTROL,Print,exec,${grimblast} --notify --freeze copy screen"
"SUPER,Print,exec,${grimblast} --notify --freeze copy area"
"ALT,Print,exec,${grimblast} --notify --freeze copy area"
# Tally counter
"SUPER,z,exec,${notify-send} -t 1000 $(${tly} time) && ${tly} add && ${gtk-play} -i dialog-information" # Add new entry
"SUPERCONTROL,z,exec,${notify-send} -t 1000 $(${tly} time) && ${tly} undo && ${gtk-play} -i dialog-warning" # Undo last entry
"SUPERCONTROLSHIFT,z,exec,${tly} reset && ${gtk-play} -i complete" # Reset
"SUPERSHIFT,z,exec,${notify-send} -t 1000 $(${tly} time)" # Show current time
] ++
(lib.optionals config.services.playerctld.enable [
# Media control
",XF86AudioNext,exec,${playerctl} next"
",XF86AudioPrev,exec,${playerctl} previous"
",XF86AudioPlay,exec,${playerctl} play-pause"
",XF86AudioStop,exec,${playerctl} stop"
"ALT,XF86AudioNext,exec,${playerctld} shift"
"ALT,XF86AudioPrev,exec,${playerctld} unshift"
"ALT,XF86AudioPlay,exec,systemctl --user restart playerctld"
]) ++
# Screen lock
(lib.optionals config.programs.swaylock.enable [
",XF86Launch5,exec,${swaylock} -i ${config.wallpaper}"
",XF86Launch4,exec,${swaylock} -i ${config.wallpaper}"
"SUPER,backspace,exec,${swaylock} -i ${config.wallpaper}"
]) ++
# Notification manager
(lib.optionals config.services.mako.enable [
"SUPER,w,exec,${makoctl} dismiss"
]) ++
# Launcher
(lib.optionals config.programs.wofi.enable [
"SUPER,x,exec,${wofi} -S drun -x 10 -y 10 -W 25% -H 60%"
"SUPER,d,exec,${wofi} -S run"
] ++ (lib.optionals config.programs.password-store.enable [
",Scroll_Lock,exec,${pass-wofi}" # fn+k
",XF86Calculator,exec,${pass-wofi}" # fn+f12
"SUPER,semicolon,exec,pass-wofi"
]));
monitor = map (m: let
resolution = "${toString m.width}x${toString m.height}@${toString m.refreshRate}";
position = "${toString m.x}x${toString m.y}";
in
"${m.name},${if m.enabled then "${resolution},${position},1" else "disable"}"
) (config.monitors);
workspace = map (m:
"${m.name},${m.workspace}"
) (lib.filter (m: m.enabled && m.workspace != null) config.monitors);
};
# This is order sensitive, so it has to come here.
extraConfig = ''
# Passthrough mode (e.g. for VNC)
bind=SUPER,P,submap,passthrough
submap=passthrough
bind=SUPER,P,submap,reset
submap=reset
'';
};
}

View file

@ -1,30 +0,0 @@
{ lib, config, ... }:
let
cfg = config.wayland.windowManager.hyprland;
in
{
config = lib.mkIf (cfg.enable && cfg.systemdIntegration) {
# Stolen from https://github.com/alebastr/sway-systemd/commit/0fdb2c4b10beb6079acd6073c5b3014bd58d3b74
systemd.user.targets.hyprland-session-shutdown = {
Unit = {
Description = "Shutdown running Hyprland session";
DefaultDependencies = "no";
StopWhenUnneeded = "true";
Conflicts = [
"graphical-session.target"
"graphical-session-pre.target"
"hyprland-session.target"
];
After = [
"graphical-session.target"
"graphical-session-pre.target"
"hyprland-session.target"
];
};
};
wayland.windowManager.hyprland.settings.bind = lib.mkAfter [
"SUPERSHIFT,e,exec,systemctl --user start hyprland-session-shutdown.target; hyprctl dispatch exit"
];
};
}

View file

@ -1,9 +1,6 @@
{ pkgs, ... }: {
imports = [
./lutris.nix
./steam.nix
./prism-launcher.nix
./runescape.nix
# ./steam.nix
];
home.packages = with pkgs; [ gamescope ];
}

View file

@ -1,11 +0,0 @@
{ lib, pkgs, ... }: {
home = {
packages = [ pkgs.factorio ];
persistence = {
"/persist/home/misterio" = {
allowOther = true;
directories = [ ".factorio" ];
};
};
};
}

View file

@ -1,18 +0,0 @@
{ pkgs, lib, ... }: {
home.packages = [ pkgs.lutris ];
home.persistence = {
"/persist/home/misterio" = {
allowOther = true;
directories = [
{
# Use symlink, as games may be IO-heavy
directory = "Games/Lutris";
method = "symlink";
}
".config/lutris"
".local/share/lutris"
];
};
};
}

View file

@ -1,7 +0,0 @@
{ pkgs, lib, ... }: {
home.packages = [ pkgs.osu-lazer ];
home.persistence = {
"/persist/home/misterio".directories = [ ".local/share/osu" ];
};
}

View file

@ -1,7 +0,0 @@
{ pkgs, lib, ... }: {
home.packages = [ pkgs.prismlauncher-qt5 ];
home.persistence = {
"/persist/home/misterio".directories = [ ".local/share/PrismLauncher" ];
};
}

View file

@ -1,35 +0,0 @@
{ pkgs, lib, ... }:
let
# Add PULSE_LATENCY_MSEC to .desktop file
pulse_latency = 100;
runescape = pkgs.runescape.overrideAttrs (oa: {
nativeBuildInputs = (oa.nativeBuildInputs or []) ++ [
pkgs.makeWrapper
];
buildCommand = (oa.buildCommand or "") + ''
wrapProgram "$out/bin/RuneScape" \
--set PULSE_LATENCY_MSEC ${toString pulse_latency} \
--run 'echo $PULSE_LATENCY_MSEC'
'';
});
openssl = lib.head (lib.filter (p: p.pname == "openssl") runescape.fhsenv.targetPaths);
in {
home.packages = [
runescape
pkgs.hdos
pkgs.runelite
];
nixpkgs.config.permittedInsecurePackages = [
openssl.name
];
home.persistence = {
"/persist/home/misterio" = {
allowOther = true;
directories = [
"Jagex"
];
};
};
}

View file

@ -34,7 +34,7 @@ in
protontricks
];
home.persistence = {
"/persist/home/misterio" = {
"/persist/home/gburd" = {
allowOther = true;
directories = [
".factorio"

View file

@ -1,10 +0,0 @@
{ pkgs, lib, ... }: {
home.packages = [ pkgs.yuzu-mainline ];
home.persistence = {
"/persist/home/misterio" = {
allowOther = true;
directories = [ "Games/Yuzu" ".config/yuzu" ".local/share/yuzu" ];
};
};
}

View file

@ -12,6 +12,6 @@
};
home.persistence = {
"/persist/home/misterio".directories = [ ".password-store" ];
"/persist/home/gburd".directories = [ ".password-store" ];
};
}

View file

@ -5,9 +5,9 @@ let
pass = "${config.programs.password-store.package}/bin/pass";
common = rec {
realName = "Gabriel Fontes";
realName = "Greg Burd";
gpg = {
key = "7088 C742 1873 E0DB 97FF 17C2 245C AB70 B4C2 25E9";
key = "D4BB42BE729AEFBD2EFEBF8822931AF7895E82DF";
signByDefault = true;
};
signature = {
@ -15,7 +15,7 @@ let
text = ''
${realName}
https://gsfontes.com
https://burd.me
PGP: ${gpg.key}
'';
};
@ -23,7 +23,7 @@ let
in
{
home.persistence = {
"/persist/home/misterio".directories = [ "Mail" ];
"/persist/home/gburd".directories = [ "Mail" ];
};
accounts.email = {
@ -31,11 +31,11 @@ in
accounts = {
personal = rec {
primary = true;
address = "hi@m7.rs";
aliases = ["gabriel@gsfontes.com" "eu@misterio.me"];
address = "greg@burd.me";
aliases = ["gregburd@gmail.com"];
passwordCommand = "${pass} ${smtp.host}/${address}";
imap.host = "mail.m7.rs";
imap.host = "mail.burd.me";
mbsync = {
enable = true;
create = "maildir";
@ -53,25 +53,16 @@ in
};
msmtp.enable = true;
smtp.host = "mail.m7.rs";
smtp.host = "mail.burd.me";
userName = address;
} // common;
college = rec {
address = "g.fontes@usp.br";
passwordCommand = "${pass} ${smtp.host}/${address}";
msmtp.enable = true;
smtp.host = "smtp.gmail.com";
userName = address;
} // common;
zoocha = rec {
address = "gabriel@zoocha.com";
symas = rec {
address = "gburd@symas.com";
passwordCommand = "${pass} ${smtp.host}/${address}";
/* TODO: add imap (conditionally)
imap.host = "imap.gmail.com";
imap.host = "symas.zmailcloud.com";
mbsync = {
enable = true;
create = "maildir";
@ -87,7 +78,7 @@ in
*/
msmtp.enable = true;
smtp.host = "smtp.gmail.com";
smtp.host = "symas.zmailcloud.com";
userName = address;
} // common;
};

View file

@ -6,7 +6,7 @@ in
home.packages = with pkgs; [ vdirsyncer ];
home.persistence = {
"/persist/home/misterio".directories =
"/persist/home/gburd".directories =
[ "Calendars" "Contacts" ".local/share/vdirsyncer" ];
};
@ -27,9 +27,9 @@ in
[storage contacts_remote]
type = "carddav"
url = "https://dav.m7.rs"
username = "hi@m7.rs"
password.fetch = ["command", "${pass}", "mail.m7.rs/hi@m7.rs"]
url = "https://dav.burd.me"
username = "greg@burd.me"
password.fetch = ["command", "${pass}", "mail.burd.m/greg@burd.me"]
[pair calendars]
a = "calendars_local"
@ -45,9 +45,9 @@ in
[storage calendars_remote]
type = "caldav"
url = "https://dav.m7.rs"
username = "hi@m7.rs"
password.fetch = ["command", "${pass}", "mail.m7.rs/hi@m7.rs"]
url = "https://dav.burd.me"
username = "greg@burd.me"
password.fetch = ["command", "${pass}", "mail.burd.me/greg@burd.me"]
'';
systemd.user.services.vdirsyncer = {

View file

@ -35,16 +35,16 @@ in
};
home = {
username = lib.mkDefault "misterio";
username = lib.mkDefault "gburd";
homeDirectory = lib.mkDefault "/home/${config.home.username}";
stateVersion = lib.mkDefault "22.05";
stateVersion = lib.mkDefault "23.05";
sessionPath = [ "$HOME/.local/bin" ];
sessionVariables = {
FLAKE = "$HOME/Documents/NixConfig";
};
persistence = {
"/persist/home/misterio" = {
"/persist/home/gburd" = {
directories = [
"Documents"
"Downloads"
@ -57,19 +57,4 @@ in
};
};
colorscheme = lib.mkDefault colorSchemes.dracula;
wallpaper =
let
largest = f: xs: builtins.head (builtins.sort (a: b: a > b) (map f xs));
largestWidth = largest (x: x.width) config.monitors;
largestHeight = largest (x: x.height) config.monitors;
in
lib.mkDefault (nixWallpaperFromScheme
{
scheme = config.colorscheme;
width = largestWidth;
height = largestHeight;
logoScale = 4;
});
home.file.".colorscheme".text = config.colorscheme.slug;
}

View file

@ -2,7 +2,7 @@
{
imports = [
./global
./features/desktop/hyprland
./features/desktop/gnome
./features/desktop/wireless
./features/productivity
./features/pass
@ -12,11 +12,11 @@
wallpaper = outputs.wallpapers.aenami-lunar;
colorscheme = inputs.nix-colors.colorSchemes.atelier-heath;
monitors = [{
name = "eDP-1";
width = 1920;
height = 1080;
workspace = "1";
primary = true;
}];
# monitors = [{
# name = "eDP-1";
# width = 1920;
# height = 1080;
# workspace = "1";
# primary = true;
# }];
}

View file

@ -1,246 +1,63 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: 7088 C742 1873 E0DB 97FF 17C2 245C AB70 B4C2 25E9
Comment: Gabriel Fontes <hi@m7.rs>
Comment: Gabriel Fontes <gabriel@gsfontes.com>
Comment: Gabriel Fontes <eu@misterio.me>
Comment: Gabriel Fontes <g.fontes@usp.br>
Comment: Gabriel Fontes <gabriel@gelos.club>
Comment: Gabriel Fontes <gabriel.fontes@uget.express>
Comment: Gabriel Fontes <gabriel@zoocha.com>
Version: GnuPG v1
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
LyE=
=UHEm
mQINBFNe1PUBEACYwgGGxsjgU9iADTJrs9Fc8jtqDIqxlNIj49GGisGoKLxRkpwv
GmSA8Lf8ghN6Jq13Vf/QPjUqfUJMWe44k8KE0/knrMbXGLCWV/RCmgCoAd++naR+
gqTCKDgBRuBG4vXRpYRkApxNweN2T31uhYWjLmdBK957xfcKCOmwzWI01zvBpuW3
AJRq3+vs7TmnBJS9ryi+3UgfV2hTJkDVLt5DSCU8lBz7sO+vQXa/saV8qNT3lPY8
6fistevl8Tiw+5Bp25T9rLIcEjnAM0ccfNzUGN3f2vJ82tfpHpM5k3O8NByN3QIj
s7vunlESlgcVkZK5AVmeaL+SyaYiobWV5Lx8CaEIAgPDSIi7cGIXl6MddV41F/Gc
RgvzIfwRWSjWKY2bXm5RIgXYjohhurYR7AEy6WBec/yemXoA4GN/CT/48jlleShs
OthUu8epPs3/e5DdLsXpWJIUwmtEkz/gOx642IQ9qo3CZwl7MtaC4u5fJm+rMmhD
ilVsb3LlSbzOC16o0J7s2aWZKEhsbUcB1lKRaCjArqHlc3/7HskcV86LPqb6JBfn
JwK/hRTQQP9PpM1v7UARgtabBd6UDVCYqDlj5tZthMO5FMNCplnUrzGyR7oWJ+d8
iuo3/eJh4TldsIxRgamnGc+qnMArQIFI2NDDnHMng4nYDOrRgHe4zFJf7QARAQAB
tClrZXliYXNlLmlvL2dyZWdidXJkIDxncmVnYnVyZEBrZXliYXNlLmlvPokCPgQT
AQIAKAUCU17U9QIbLwUJEswDAAYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ
IpMa94legt8RDA/+KIJLa3fBtOuVX7KMnxc1dqb3hQ8Sf8tkBPd7qeeL+MjeGyia
9dU0XTNlEA8LgGRB5LgUelWOmIsvaJr6WinAcu1wUeW7iZGl5zCbcsfwz0GDnFhh
OxmG9qhiVet+B+AEQ36AjgVzONmpKfBzTnMSOFVKFmTBCf5jbwk5uMHzQ90RBIZc
CPDYIH8EvI5vs7F51G+09f7fXXDOlBf10M+oDnmFa4JLp//+dKr0rl4D8PA1hhej
TSJ+s/ILpMjfRVCTkwN8iOFLXnjP6s6qj5ez716DS0REYnlu+LZfNjvOcDdVtdrS
BhCQCDCVFMTI1/Umv9+S1YAsHj08aeQ8uZu2Sku3gvMv9JjhLz0gh+sMc+oymFA7
c4FWHA70oNPozpZkSf+ZozDRRCPj7D+eM37KFTN+EYos/Lvx1DC/pjgVNpCsEFZM
iGmQeGcCGhC0aes1utoLrC2Jazji04ATHQGQJieWrMes3mjknjQIM/gQAE5v2Sj/
T2yM5XquLas0popQM0wc/QNjii66jnt+L8nBWFWphRW9BQ8TV9FDXt3RAr+Oy7Dn
RO2V4AZ8ALnPovk8KRVXKneozw5bXE6wigK1YqFTWXA0L/JoKGeie/67r3j7pjAC
YdRY8xJVkA4Sa3GxTSi+n9SDK1LflUcbU2jxkiO383HPgPrAuGKH5yt2H4+5Ag0E
U17U9QEQALFRDRB+s3RztFND3EdHpcn87AYAfWrvdOHDigdZwvE56h9Efrutj1rm
e9K8E/1ljGHydLqkl5zNKQtCusRRlDOM5/fAQkios5Qpk5pda92Smgmf1XgG3XH1
I0F268OuMWHFg7JIRIEtM6vN+xKsXK0/d5ofXWbsojYqrfMrxxi8OBZWbqCdJGTs
Tk0LB8KBgN5mi1Wcl1qv65uxIaIltRhJdKghOM/mT+kmmYUQN+DfJlHw8R0sgfHU
J+c1+Gkm5GCW2kPWjBKxezvP4I3B3LRQT5rS1XV0loy5cn2bkCF2t8/54C4dOA7M
CIMlCj5oNEcZ6mxS4HEJmIZ/YeA9T95im7Cc/z7O3bJFA6nCPwaiXuzYj77vcbIJ
a33wh9fQtgaVztQDSj+gdB8hUqQ+oNZo0O/jZNwmucxztqqZ8r86irbhKbWuQIN7
XCJZpmU3yj+8pDZPdGDYqsslJcpmPrPURf+WTT866IByvbPk0drY9pspUSUMpyVd
RQMNda5Ekg4wj+L2TW3KvklPs+DxjB8raTy11yWvOw9ha7HPOP1Ne5SA06AWcChX
NX/2HbG0Td1bjW6sVbxP1iEWJaXxOV6/k8YjaAr4oQp2jopdWVrF7pdKGM+3qg6b
PVPCdMMA5nOjF4jbf0pyrR6FIDYdf5Ohq8P6Fi6/+lPnce1Tdd4BABEBAAGJBEQE
GAECAA8FAlNe1PUCGy4FCRLMAwACKQkQIpMa94legt/BXSAEGQECAAYFAlNe1PUA
CgkQrvrMP8SVr4m7rw/+IptxuRbtRVirze4VaDYXp4njgQlLqMQWPa8xrx8TJ5Gj
+8GVZLTr/ZMFXobHYfDrz8o/+JRTshxdWp5PPq8e2qWNdGujTeSDz7fuXLZtR5Ax
+D9BvvfnmKGgPBuQY/aTCNKhWU2PwW8MhqYeKXnin7LJDfVLuno1oEotQ0WwfF8r
9QMlsiN6zZ65d3E8OQW4ezA3mcPNoOCWBQbyF2LDWtGbjGk7II51z7G51gq6/ahX
uir5glMewBXe/DY3197n37YbkYam+p7yXWZIlHkUr1LlQZoKKUxtx+ZtirX4ODP1
LL73PMyTiewW0QKqvp5/znw5QIUk85TnZe6O6rJNkDF0jnhDL5ULb1pQbpOE4y1X
xIBxc3kcLeMhOUJoO2o+q8+wnK/bA5fLm/xlo72y5ioBZh1S/xRacOPsXvzDAfcQ
RLgU4VD1tihjBFs78f/Q9h9jdd4wJCiQboRJhaEIdIU0qKiPAZlxsfoYcFRiNgTy
I+1szCOk52FNIYytZV+JNb2LCEvw7TOyru3T2L3X55S+6sPQnBvXdls6bflERIwv
pS2qW9Ey7XbHnn9oMPgD5yzWDp6keD0TYBGbXS7AA85YqKMZ4ZumW/T65jOfgbBs
Y2QimzgslWGn+ER7lXh5R7mKfmLNXhie4mPilKB5WqzQtBvFwILjEOmKi/fv5ry+
cw/+PPAujPBVt4jZM4PQP7GQr2/SRa5y9Rl3UaRyHrL7sroMtP0Ms5g1ngybX0ps
2043BUceA8oulk7Lig1EgFw0MaYexHF4iNKqvHVJZ6I9qpOH7oGFU2XiN/guAC7b
LAJkQek3B991MnYSXQEuB+I3ZZw2cVHcJIgz7OZAFwh5PKqM0Yk79KWFbkgchC7Q
DDBVnA4D+yiI93MyNN8sjbTIZ4BFjJeijNLPrwYTu3Gz95TSrQng8PIyx4nwqF3g
8XbA9mOL3v/5gf9bDuwTytebGTpimz8e77rLG3PQq9XnYwN4djDj+eGbC1zlVEE8
dhL2x3n0xcHu9unnSnQ94SeAtV3OTRSHLdw3byCtaaiBpZ2oM9SxApmYz4HsEzhA
i/HJvCR8PFJb+IYzwmQiHLQQa2HdO5pRqJPLEqw2mGoHn9/mg9xlZq3TXMi2fcWy
TFu5ZpiN0+ys06HUFOsNC4f4GGwrsEP9kSdOUiNYzixagjThqWGBmMW/MkWfdGOg
5Tox/hDv9aWCr+8P2C3XyLF4w2i2ADDRCbF77Tag4/d1Ni/hz10X3lgZ/jzmhw4i
WcGEseGpMQEDbh098mUcdJJbOceXnozahIWA1XxP93gpVKpuXUyDYxJvbOMMYSQT
6x/O5FiZynjqsXMq4B+lmGmYoR7qzbfk7e0EugSj6dWrUVM=
=yrZE
-----END PGP PUBLIC KEY BLOCK-----

View file

@ -1 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDci4wJghnRRSqQuX1z2xeaUR+p/muKzac0jw0mgpXE2T/3iVlMJJ3UXJ+tIbySP6ezt0GVmzejNOvUarPAm0tOcW6W0Ejys2Tj+HBRU19rcnUtf4vsKk8r5PW5MnwS8DqZonP5eEbhW2OrX5ZsVyDT+Bqrf39p3kOyWYLXT2wA7y928g8FcXOZjwjTaWGWtA+BxAvbJgXhU9cl/y45kF69rfmc3uOQmeXpKNyOlTk6ipSrOfJkcHgNFFeLnxhJ7rYxpoXnxbObGhaNqn7gc5mt+ek+fwFzZ8j6QSKFsPr0NzwTFG80IbyiyrnC/MeRNh7SQFPAESIEP8LK3PoNx2l1M+MjCQXsb4oIG2oYYMRa2yx8qZ3npUOzMYOkJFY1uI/UEE/j/PlQSzMHfpmWus4o2sijfr8OmVPGeoU/UnVPyINqHhyAd1d3Iji3y3LMVemHtp5wVcuswABC7IRVVKZYrMCXMiycY5n00ch6XTaXBwCY00y8B3Mzkd7Ofq98YHc= hi@m7.rs
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGSNy/vMr2Zk9pvfjQnxiU9F8CGQJwCiXDxPecKG9/q+ Greg Burd <greg@burd.me> - 2023-01-23

1
home/gburd/symas-ssh.pub Normal file
View file

@ -0,0 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDPvS6pE5Y8Yc3YnKpKinjVKyziqnb7JZJGonDKnZi3I Greg Burd <gburd@symas.com> - 2023-08-03

View file

@ -2,7 +2,7 @@
{
# Enable acme for usage with nginx vhosts
security.acme = {
defaults.email = "eu@misterio.me";
defaults.email = "greg+acme@burd.me";
acceptTerms = true;
};

View file

@ -12,7 +12,7 @@ in
flags = [
"--refresh"
];
flake = "git://m7.rs/nix-config?ref=release-${hostName}";
flake = "git://github.com/gburd/nix-config?ref=release-${hostName}";
};
# Only run if current config (self) is older than the new one.

View file

@ -1,5 +1,7 @@
# This file (and the global directory) holds config that i use on all hosts
# This file (and the global directory) holds config used on all hosts
{ inputs, outputs, ... }: {
nixpkgs.config.allowUnfree = true;
imports = [
inputs.home-manager.nixosModules.home-manager
./acme.nix
@ -11,7 +13,7 @@
./optin-persistence.nix
./podman.nix
./sops.nix
./ssh-serve-store.nix
# ./ssh-serve-store.nix
./steam-hardware.nix
./systemd-initrd.nix
./tailscale.nix
@ -35,7 +37,7 @@
environment.enableAllTerminfo = true;
hardware.enableRedistributableFirmware = true;
networking.domain = "m7.rs";
networking.domain = "burd.me";
# Increase open file limit for sudoers
security.pam.loginLimits = [

View file

@ -1,13 +1,22 @@
{ lib, ... }: {
# Select internationalisation properties.
i18n = {
defaultLocale = lib.mkDefault "en_US.UTF-8";
extraLocaleSettings = {
LC_TIME = lib.mkDefault "pt_BR.UTF-8";
LC_ADDRESS = "en_US.UTF-8";
LC_IDENTIFICATION = "en_US.UTF-8";
LC_MEASUREMENT = "en_US.UTF-8";
LC_MONETARY = "en_US.UTF-8";
LC_NAME = "en_US.UTF-8";
LC_NUMERIC = "en_US.UTF-8";
LC_PAPER = "en_US.UTF-8";
LC_TELEPHONE = "en_US.UTF-8";
LC_TIME = "en_US.UTF-8";
};
supportedLocales = lib.mkDefault [
"en_US.UTF-8/UTF-8"
"pt_BR.UTF-8/UTF-8"
];
};
time.timeZone = lib.mkDefault "America/Sao_Paulo";
time.timeZone = lib.mkDefault "America/New_York";
}

View file

@ -2,12 +2,12 @@
{
nix = {
settings = {
substituters = [
"https://cache.m7.rs"
];
trusted-public-keys = [
"cache.m7.rs:kszZ/NSwE/TjhOcPPQ16IuUiuRSisdiIwhKZCxguaWg="
];
# substituters = [
# "https://cache.burd.me"
# ];
# trusted-public-keys = [
# "cache.burd.me:kszZ/NSwE/TjhOcPPQ16IuUiuRSisdiIwhKZCxguaWg="
# ];
trusted-users = [ "root" "@wheel" ];
auto-optimise-store = lib.mkDefault true;
experimental-features = [ "nix-command" "flakes" "repl-flake" ];

View file

@ -4,7 +4,7 @@ let
inherit (config.networking) hostName;
hosts = outputs.nixosConfigurations;
pubKey = host: ../../${host}/ssh_host_ed25519_key.pub;
gitHost = hosts."alcyone".config.networking.hostName;
gitHost = hosts."TODO-host-git-host-name-here".config.networking.hostName;
# Sops needs acess to the keys before the persist dirs are even mounted; so
# just persisting the keys won't work, we must point at /persist
@ -34,9 +34,9 @@ in
knownHosts = builtins.mapAttrs
(name: _: {
publicKeyFile = pubKey name;
extraHostNames =
(lib.optional (name == hostName) "localhost") ++ # Alias for localhost if it's the same host
(lib.optionals (name == gitHost) [ "m7.rs" "git.m7.rs" ]); # Alias for m7.rs and git.m7.rs if it's the git host
# extraHostNames =
# (lib.optional (name == hostName) "localhost") ++ # Alias for localhost if it's the same host
# (lib.optionals (name == gitHost) [ "burd.me" "git.burd.me" ]);
})
hosts;
};

View file

@ -0,0 +1,4 @@
{
# Enable CUPS to print documents.
services.printing.enable = true;
}

View file

@ -2,6 +2,14 @@
let hostname = config.networking.hostName;
in {
boot.initrd = {
luks.devices."${hostname}".device = "/dev/disk/by-label/${hostname}_crypt";
# Enable swap on luks
luks.devices."luks-3b6dddfd-5390-441f-a72d-a3b2809204df".device = "/dev/disk/by-uuid/3b6dddfd-5390-441f-a72d-a3b2809204df";
# Setup encrypted root keyfile
luks.devices."luks-3b6dddfd-5390-441f-a72d-a3b2809204df".keyFile = "/crypto_keyfile.bin";
secrets = {
"/crypto_keyfile.bin" = null;
};
};
}

View file

@ -1,12 +1,14 @@
{
services = {
xserver = {
enable = true;
desktopManager.gnome = {
enable = true;
};
displayManager.gdm = {
enable = true;
autoSuspend = false;
wayland = true;
};
};
geoclue2.enable = true;

View file

@ -15,12 +15,12 @@ let
exec '${vars} ${command} -l debug; ${pkgs.sway}/bin/swaymsg exit'
''}";
misterioCfg = homeCfgs.misterio;
gburdCfg = homeCfgs.gburd;
in
{
users.extraUsers.greeter.packages = [
misterioCfg.gtk.theme.package
misterioCfg.gtk.iconTheme.package
gburdCfg.gtk.theme.package
gburdCfg.gtk.iconTheme.package
];
programs.regreet = {
@ -28,10 +28,10 @@ in
settings = {
GTK = {
icon_theme_name = "ePapirus";
theme_name = misterioCfg.gtk.theme.name;
theme_name = gburdCfg.gtk.theme.name;
};
background = {
path = misterioCfg.wallpaper;
path = gburdCfg.wallpaper;
fit = "Cover";
};
};

View file

@ -11,7 +11,7 @@ in
recommendedOptimisation = true;
clientMaxBodySize = "300m";
virtualHosts."${hostName}.m7.rs" = {
virtualHosts."${hostName}.burd.me" = {
default = true;
forceSSL = true;
enableACME = true;

View file

@ -9,11 +9,6 @@
plymouth = {
enable = true;
theme = "spinner-monochrome";
themePackages = [
(pkgs.plymouth-spinner-monochrome.override {
inherit (config.boot.plymouth) logo;
})
];
};
loader.timeout = 0;
kernelParams = [

View file

@ -0,0 +1,8 @@
{
# Configure keymap in X11
services.xserver = {
layout = "us";
xkbVariant = "";
xkbOptions = "ctrl:swapcaps";
};
}

View file

@ -1,95 +1,34 @@
misterio-password: ENC[AES256_GCM,data:bQR9UtCNRl9S/anjqwO8Ssnbx8v+sx1YMKgNeL2lvHQ0JB0vXcyQuUHnvKF0qZU3h8G/zJBJ06oDSwd0xH6wghExC3LQGkqG4uuPxj2JZTbZMgaCYawq2clo45D1p/7UYkm1d+5iHGO1Ag==,iv:SYGY0leQkFniuxiG/V4EsBPF4saSctoQ9Yke9cg5QzA=,tag:5Gzj98eaop9nfSUu0x70hQ==,type:str]
layla-password: ENC[AES256_GCM,data:dE83+HB3RHl1g95mAtO7DjETyibWuJTgSAJBksYkUeG97bsXbP3YAgEdZ6NJ3YQ6/AAqVNqvhmL/GYt8B1E4cvBls8cL5YlNjvDRrp+15uDpQ8mRNF49xGciRfDsn2GQqkCLpZdHaEqowg==,iv:F2gOedMcFce/JFEY2RPAWEqQxSFsSGU4cmcTRU1+5R4=,tag:CzgiefLAzg0TwB6rRA0YDA==,type:str]
wireless: ENC[AES256_GCM,data:MZiHyKHBn6M6I9OjTFKdCvssAWCXSvIpaV6YLx+EWlSgZlihLVRHx2bZcKKo/rAoXi3kAIaEbDeID75HozMLPTcks7hFrMwoYCFlmLYsNefBvqrVHNBy1RlZqe4trF6ikKdYCJcuFcQYlTStWdjrWkdHPTJv45U0RRhzgSUvINWf3Ykv6Qt7XPGH/RLVOnIq6zmcomDx7Bi7HHANRKlEpdwhAa7O8kUDA2tMFUF9w85AW2JVlBPOVibJUd87l9OtaSNc8lJSRykvS8a1mFoMaIz8P604vRCG5N1HVahXGUg7QtTGt/gg1QJ9xZouULAM5SNaI9t3cg5XUo6nj4rt4Wcsg7hR3WdCtEKLr9xq1Ytsh2hhZkIfiZ2akEi9zU92CoOBsVDJy/PBuE0aR28cq4BzgJBGOvfGemXnuYdF3em4mvOcEQ0c4eq1trVyPFnlSmwyVEgljG042oDgdaGv12Sdxykr7QY/NpU5G/yF+hUsbaKCc/Kj7rgqWHf1ZMXOjphaYEeWwbSELU7+oMqlWHUEPqrQgRtqsjdvqKCPhMdqJl3qHGEFAE4ogPinhBWL2ajLPLefTCKyP6S/Lsj0,iv:IX60RPNzvzudIv0tN+tgLwSxCjAZeyo+QuZYgONc4R0=,tag:LVa/eneBz7iSOLfcE5Rhkg==,type:str]
gburd-password: ENC[AES256_GCM,data:ldXmHftA4POy,iv:8NLcj8hrZ9WUeqkDLctgO5G9DiK3Abwu5Rk9jbrFLhk=,tag:326N+ckbPOKi+LZsgrxusw==,type:str]
wireless: ENC[AES256_GCM,data:I3gTVu4geDms+Q==,iv:Uxjdmx/fi6mA6xt/j1dNajR4iJqUvavY+dhMZF0+500=,tag:P712+4p3lstJwGaN9DM7PA==,type:str]
sops:
kms: []
gcp_kms: []
azure_kv: []
hc_vault: []
age:
- recipient: age1hm5lf4qk84r4wh00atn6hpts7mpdx80adq26wht2e5qh9ewvhyaszfv82d
- recipient: age1udt7tgf8pa0r278z6xwrzndg5w9jyvph8p0nycpqw3d39aal5u6skfv556
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAyTE5PczhoNHpBWWczZHY2
dE5aa2tTeGFxMVBhMEtKQkwyNXdjMm5uZHlNCkVRNEFrbWJVeUdLWElBc0hNOXRN
cGlCUHYxc0MxejBIKy9JMkR1QlNtbDQKLS0tIFFhcFkwMXRhMnYrcEd2Qks3TjBC
bnplZDBhMDlkME9CaklmM1hUK1k2TDAKtZStGRVRFvsJhNBozYwD8FTRWYNpViwT
mK3qU6aVRU73MJrjpqmsfgrn7zKZ/pC+BGr3VQSRVb/3q1U2zEIQBQ==
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAxbTFNdmdQRGxEdDFLbGJH
bGcvYklVOWxEd3NDWHJxUENDaWhrZ29VQVU0ClFWbE5Fd1RwUWRLM2NOdXh0MXlI
MWI1TDZjUmsySitheWdZditORml4dFkKLS0tIERWTUFyeW9VK0NSQlI2Nk92MmRa
YmxhVWhMM1l6R28xL2NLLytBWkpvVWcK1SZNdwTA/3/wF+fzWOlwqAmQCgKJh+98
L5sVicaj0ns+G8ZsqEPnOYklHo1o0G0GpF39LOx8bDpGAQllHRpsBQ==
-----END AGE ENCRYPTED FILE-----
- recipient: age1709qfrwglm75v5x8lpuhryt83k6p6c90npplzzec6a5w8ct93ejscpqpc3
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBiVkowVnc2aG1qSHBLaDdO
RkVuZ0JOeDRWSlE4TDl3bWJ5eVVUZ3ltWkZNCm51VWFNU0dURDhRU3JLVDBoMzcx
aks1bC9Vblg2S2RldjcyL2FDMzRSVU0KLS0tIGt0aC9GTmVwV01BdFJrUFZmcTJJ
WTJiTFVMV1BZOVFQdDgzTGFrZlRybVkK5sAsALcmI6LaTS8d0N3fovrqy2T5WI8l
DFwYJ8cpNwA/b7ImLD4GWYuENk+1JAp4NgbPK5XQ/vdk590080E6Kw==
-----END AGE ENCRYPTED FILE-----
- recipient: age1j9ld6ey62hqd33xkyd2fg9362k6xhm5gavsrpsfalwpcs8smxfdqpk84a2
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBDSS9sd1J3MnVCcUdKVWRV
V0EyVm5LVE5zLzJkd0QwR3JaZ09jdFVhdmxzCloxdGpwUGJCRWUvcDU2ZE11SWNw
NzBCNzhrTnNXNzEwS1luSlI3aENFb2MKLS0tIDNJMy92bkhnaEJxbUI5OGVnZ1Fa
ZVFTa3IzeDVVT01IOXhGOE9KZVFQV2sK7LLx8yGP3iKpXtlIrvWNXCkHuqWfc6AP
A6oZMwP6P/uMOiXCSStWhAQpEmY/JcbcyfnfWXV7LckXxL7CElJloQ==
-----END AGE ENCRYPTED FILE-----
- recipient: age1dn7pkareh83k8el2yt4dmdfdzn7f45fuc785cnnxgzf3h4r5gqhqd4l93h
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBsZW1xVjJUWE1YemN4QVB5
SVZLQ0FwcERTbTZBSmJUdkorVWFFVlZLc0NzCmZaMVB5T0VCZ1BFN1ZzR0dBSnZl
UE96ZGl3d3g0cDNEOHF5UEhPZDU4blUKLS0tIG9uRThreDhVNHBTUmovTEJyZnRl
cU5TMHFyMXNIUnlXcjZHNkNtRG44OFUK9cCjIF6Ip6e+/VEJMhDV5HM2it/eFOdz
8sBVBZS6SL4xCRoFMOmnnw9PCLreCws2i34nI0uW1T22JPbh3FExTg==
-----END AGE ENCRYPTED FILE-----
- recipient: age1uxvuygmvwpfjrd9d3ulg6ln8dgvaw4l2c90mw0tr72qg3n8vd9ns3dm000
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzTDZBb0dZeEtGN2dFejVo
M2JNMGZEUnc4NTlNYUp5WUdadjlEQzVncXhZCjJpS04wRnBFb2g1VE5kdHZnNEZS
T21zQUNRc09XUGNaZWxyVWdhOE94Q0EKLS0tIFY4Y3lsWGxHWlJzNDE0cEp4ZE5M
YlVKN1VmSzhNam1mRW5xTnVDMG9GYVkKCAx2LVbYHhrWz6qS1oe2IJoSEM+TdiAq
hGECp0v9DwoQo8ud3nL4k5sAxa11j0iLNDVS2wGEpsISVNhnjOda0g==
-----END AGE ENCRYPTED FILE-----
- recipient: age1gxhy9eq38xfplay0kvkeyvsg96g0c4p6rkhajkrj8nc9dswdzqhssgvns0
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA1eVFvbEI2djYxWVBMdkxy
aEVJbUlJYU5WTmZSdGVBQW1VcHdyQlZaZWd3CjNxNTVsSWovNjVuWGs1NnlpMEsz
eUJTVUZCbkkweWFPUEF4ZTZCRVlnckkKLS0tIFlGd2x5RTVoY0ZLdjdiM3QyNVFN
djJEQW4wc2NnTWhPeXVsNTQ1RW92MGsKr1L803YuhsmaysQogh5I2KUHffYcMA03
4dekr1pEEX059oHbbvp90Xs23WWiLftcNozNT1m1iI74ZCpmyMRC/g==
-----END AGE ENCRYPTED FILE-----
- recipient: age1n06f4dcslh8xq686z2fa9ddr3yg5yzj87p727896xsm8xvusdv6qan0grl
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBTRkJ5SFJ5NkRqaE0reCtS
cFlLa0l6VVNtM3ZTQ0hEL0Y1cTlYRUJrOGpFCmFMeGtuSkdyZEhtQkphRndxR2pZ
c3QySDhJazZpQXB1TDdOVExUR0pFcWcKLS0tIGNqRk85WnllZlNzUWY1QTFmY3ZJ
WGFSejNJc3dSWjZSeWN0ZktCYm1WNVkKmjKRIFTUO9VGRS+Q+zX0SFtrraEwXxSS
8hpAMFll2qGQFi39bPqg8lUQ/t628/EZtvkRQZOwT7+xNFur28mUPA==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2023-06-27T18:54:34Z"
mac: ENC[AES256_GCM,data:AqtrQ5MHpkMm/BltLnDajgDed1WqHgZUpco3PqZ1jmeufluyVfq3J9+gjH4ougz26PSvXR4Y+qEXk5dbo6L1TJPckORlnFSr2ZZBCNuRnYPgBQo+nX6sNaNDU0pk45vXE/gKPJooBNs8emWiTb69J4HqZLtsNzQewRWEjQ2E9PM=,iv:irjTYQd8fgzxuNrhpYpbmPLivbOqTOvwEE+GGX3NqdE=,tag:1AcC871LO32FcI+meZE/cA==,type:str]
lastmodified: "2023-09-18T19:32:57Z"
mac: ENC[AES256_GCM,data:9feL7sfe6LOXecCCI5C+VKe6i6xMjWMSnP4i3rb2y1a3+/xB5575RPf3nZUbzUz9OwZIDUiydO9nx1vPHQPFcwz/gfdPsNbu0q7AuVxa9RhDEW3+vrBiGQDWUIXA29yU2XN4QYqwwIDq/kymBXH48CBCgj3RBfCBnOfIkvwQvu8=,iv:CIyGMjvT31ZkNj0BTs2euINxa2ihDqOD/ASpDqFo4Sk=,tag:zZQBqsGAcDc3ezrBhAqxNw==,type:str]
pgp:
- created_at: "2023-03-01T15:18:20Z"
enc: |-
- created_at: "2023-09-18T19:32:56Z"
enc: |
-----BEGIN PGP MESSAGE-----
wcDMAwa9kVfiDH1CAQv+JRTEbaBdksdzKsBwIrEbsx6av1pg0dct99LMwLljQNQu
Vg3apXYTavC4D+gQLYk6eKcBc4ldjSQDCxqztJH3xvRVooPg0YwAFTPhD4xlOE+N
VPElotbjWC/wKzfOe+2/6jwXILBOXPYhIiyskKx+41iPAn0TqFLzGFrx19fWUxbV
OvQqCetlU06/X2YzRG4Xw8zB/u29a+hOygpdc5fa4MSgvFcZz2PXYESPDH33jpcH
jvjLLnWt8RHiwmnRpF3rrAYbn8MhTrRqF0FShUnw+7IjZYMOqn5XM/d3iAZTijVj
XW/McYtIiDLMIX9jA3iKlK/lq4jtefPKD+RkG0eSGSDzw3+Cuvqh/B7fcKwNY1P4
jd/mHuAzC4jeT1vme1ocIezqqULA0LKjmatzG+dehQ6+mHfh+G1iuB/C6vFPG+dR
RqHM/Kk4ctiNEoellipbHSVQLKZSHVYTlVpxyz2R7tMr619Cuj+OQWYwdWgQy3Vp
2m8kPAWA1EOlDKiL81ul0lEBpLFkWVHKTKBXdbin2d4FYhhyT19FpqMqhmPkNgDt
0eVoCzyokhl9JJK/BsLHMRq5QSnlen1dE/alVpbtJ4vfNgG6gWRUcNmsMOHL/jfC
R14=
=MjJK
hF4DboE6HHw4Rh8SAQdAVnPfBHrVKJSxVWOUxe/Xxtklt2fd/fwU5grY7JCvH1kw
kJC70RC7Wcgx+gkqbkPAZqfozY2ScrC7lgga8SRNCyjaunVfQjlO6ZS9d3XhLUOr
1GgBCQIQeoBRXoQHjOht18H9f4ZdKzqJ1R+sPiU2qakjDfVkoo1mu5LRFYUOz5tc
633XPXbvL9Yi/hec+kSkynowbnpQtq6YfN2w7HASoBb5EUTdcmzGcflqoOhRNP8X
uJogC+lhlySzDQ==
=uZkZ
-----END PGP MESSAGE-----
fp: 7088C7421873E0DB97FF17C2245CAB70B4C225E9
fp: 6423C518273734713931CB331C4814F03CA7C161
unencrypted_suffix: _unencrypted
version: 3.7.3

View file

@ -3,19 +3,18 @@ let ifTheyExist = groups: builtins.filter (group: builtins.hasAttr group config.
in
{
users.mutableUsers = false;
users.users.misterio = {
users.users.gburd = {
isNormalUser = true;
shell = pkgs.fish;
shell = pkgs.bash;
extraGroups = [
"wheel"
"video"
"audio"
"networkmanager"
] ++ ifTheyExist [
"minecraft"
"network"
"wireshark"
"i2c"
"mysql"
"docker"
"podman"
"git"
@ -23,17 +22,20 @@ in
"deluge"
];
openssh.authorizedKeys.keys = [ (builtins.readFile ../../../../home/misterio/ssh.pub) ];
passwordFile = config.sops.secrets.misterio-password.path;
openssh.authorizedKeys.keys = [
(builtins.readFile ../../../../home/gburd/ssh.pub)
(builtins.readFile ../../../../home/gburd/symas-ssh.pub)
];
passwordFile = config.sops.secrets.gburd-password.path;
packages = [ pkgs.home-manager ];
};
sops.secrets.misterio-password = {
sops.secrets.gburd-password = {
sopsFile = ../../secrets.yaml;
neededForUsers = true;
};
home-manager.users.misterio = import ../../../../home/misterio/${config.networking.hostName}.nix;
home-manager.users.gburd = import ../../../../home/gburd/${config.networking.hostName}.nix;
services.geoclue2.enable = true;
security.pam.services = { swaylock = { }; };

View file

@ -1,26 +0,0 @@
{ pkgs, lib, config, ... }:
{
imports = [ ./packages.nix ];
users.mutableUsers = false;
users.users.layla = {
isNormalUser = true;
shell = pkgs.fish;
extraGroups = [
"wheel"
"video"
"audio"
];
passwordFile = config.sops.secrets.layla-password.path;
};
sops.secrets.layla-password = {
sopsFile = ../../secrets.yaml;
neededForUsers = true;
};
# Persist entire home
environment.persistence = {
"/persist".directories = [ "/home/layla" ];
};
}

View file

@ -1,28 +0,0 @@
{ pkgs, ... }:
let
steam-with-pkgs = pkgs.steam.override {
extraPkgs = pkgs: with pkgs; [
xorg.libXcursor
xorg.libXi
xorg.libXinerama
xorg.libXScrnSaver
libpng
libpulseaudio
libvorbis
stdenv.cc.cc.lib
libkrb5
keyutils
];
};
in
{
users.users.layla.packages = with pkgs; [
firefox
steam-with-pkgs
gamescope
protontricks
lutris
prismlauncher
];
}

View file

@ -7,8 +7,10 @@
./hardware-configuration.nix
../common/global
../common/users/misterio
../common/users/gburd
../common/optional/cups.nix
../common/optional/x11-keymap.nix
../common/optional/gamemode.nix
../common/optional/wireless.nix
../common/optional/greetd.nix
@ -21,6 +23,9 @@
hostName = "loki";
};
# Enable networking
# networking.networkmanager.enable = true;
boot = {
kernelPackages = pkgs.linuxKernel.packages.linux_zen;
};
@ -52,5 +57,5 @@
};
};
system.stateVersion = "22.05";
system.stateVersion = "23.05";
}

View file

@ -1,14 +1,15 @@
{
{
imports = [
../common/optional/ephemeral-btrfs.nix
../common/optional/encrypted-root.nix
];
boot = {
initrd = {
availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usb_storage" "sd_mod" ];
kernelModules = [ "kvm-amd" ];
availableKernelModules = [ "ahci" "xhci_pci" "nvme" "thunderbolt" "usb_storage" "sd_mod" "rtsx_pci_sdmmc" ];
luks.devices."luks-fae33851-b8d8-430b-8c6a-cd18675b8252".device = "/dev/disk/by-uuid/fae33851-b8d8-430b-8c6a-cd18675b8252";
};
kernelModules = [ "kvm-intel" ];
extraModulePackages = [ ];
loader = {
systemd-boot = {
enable = true;
@ -18,19 +19,21 @@
};
};
fileSystems = {
"/boot" = {
device = "/dev/disk/by-label/ESP";
fileSystems."/" =
{ device = "/dev/disk/by-uuid/88c63d59-2b86-4336-b8c7-1a4e6da1b443";
fsType = "ext4";
};
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/2EF0-3AA5";
fsType = "vfat";
};
};
swapDevices = [{
device = "/swap/swapfile";
size = 8196;
device = "/dev/disk/by-uuid/e7cc3e9c-2acc-4bbd-bc2f-a67a08a94db7";
}];
nixpkgs.hostPlatform.system = "x86_64-linux";
hardware.cpu.amd.updateMicrocode = true;
hardware.cpu.intel.updateMicrocode = true;
powerManagement.cpuFreqGovernor = "powersave";
}

View file

@ -1 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINZS9ComqcdupshNC7+FYI/acmswnUcqcV9prNh+wFO5
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICdryaTF2JNA+ZhsH1BrUCE7ehgkGCJoUyFb1DJAgZBH

View file

@ -1 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQD+sITM0U5OOyBMcOcf8+lHckw/IPSmRyqXmoqIRH8SQmgbuhqIgrCcMd9GPRt5c6nr3uMKj9JAxGTDsvpEoZAuTIln1Dx5LxRwIAlCKMznYfLBfeuU+vDoJ9p34+CkfT3+HJYgfLd2PLC31UKFl+y5PL0keRpbpCj3ooUHECH6jSQShu+4vlc6GVMYg3cYL287i8Z1S/V39x2Pd1tvZiKWt/rkXZbFmCQkncVmzEL8+mEk/4Xig7BLugjg+C7pqvzJ7U8LNjsknp93Kl+EC2aCrIFY2qKPMwiEqAcw+sy1bAH6pn9yRGvLIvn0F/f5JuN0ZF4PiMntK1hg3Jgb/gJxI0CJnGD48nhur2h/qTNoLEV5mPl8GyY7l3on8WO48QxMRnqWW8AtBmjvKPDwCCzJxKRFqqj6p9L52i0pekPXjVJw9mDy8xkWrqiXm9+9qtsi8ZaOJ7Z8XktNGKNjUowfpKOE77qVYQAojibM1Yj1w8gPGvRfxJ9qAi77C1kPghBx6A9GyAAXbRsGXCZJCzMqNJ0N04gs9B/NbnIDNYyTnAFLAS8RZro06cYvxHogpHMNyzzax7W/K3XiAJui5Dcu3oIaGjO0zs+iLYv8y5JVLs7DHjb+zFhBnNZvdPj1fd6oLg/tDRXzrqlqSJhWg1D/5NdLV235WX9GhuXyXETH/Q==
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDB2YjDJmsiUtHkPWE/Y6tqwtVcJaa/fIY7wYViUwn7bF4+OhC3Su7bN1C8TA5fhgpZWrzZXBMh74lrSG8RkbldGPyAThaUrTxVzzYdJmOvGNldynf19zrzprNFfjHvtTUosz7VTd0yEB7Ih/+5bNs7bDP0oKKoXvGruNwN0hdrDC299ocBAjmpLDXs8vSQoveuEEv8zyHJaOq1Fs9rw7IkTxk2Lj06MLzVD4ebKblQMnJ2xbJ5OEn/f+ktu+XKHGHYSgg+3mI+TEKVrle7INuiidY5fixhYFGp+T+Etj+TM02iIKG/7E0mNS+BmbUl0iWi6uS5PJaCkgW0s8VrtT/fP1L0yd0SwgGrmQAqzeoCjlEBUbzrc8YjJgg+FU4e6YY37f2dQ+FJigdGGAukH0VDYWrlnD0flfQ0KEVNnTo6CqmX/g7BBf88y6HF1BHL4sN73WHeC9FveEHBchtgfjBYf9GT8lYQnDSEisHU6C4Saz0BD3QufLDsjuvpMB+7IzYEkQrIQppRhvDT/buidwLzyBv6F9nUvlaAF9xSANLaie7iFkf+NeTFlOgEKxTTsBb8DwPGVeqHWrIfCNUjHeVgCr1FUIxnVMzIuT3osF3r+Z1NtEhNLxIHur0x8CF74m7mv5+n+0F185VPZDQCCn+6P1Zq4MWTyc22QslZRj/d8Q==

View file

@ -1,7 +0,0 @@
# Add your reusable home-manager modules to this directory, on their own file (https://nixos.wiki/wiki/Module).
# These should be stuff you would like to share with others, not your personal configurations.
{
# List your module files here
# my-module = import ./my-module.nix;
}

View file

@ -1,7 +0,0 @@
# Add your reusable NixOS modules to this directory, on their own file (https://nixos.wiki/wiki/Module).
# These should be stuff you would like to share with others, not your personal configurations.
{
# List your module files here
# my-module = import ./my-module.nix;
}

View file

@ -1,24 +0,0 @@
# This file defines overlays
{ inputs, ... }:
{
# This one brings our custom packages from the 'pkgs' directory
additions = final: _prev: import ../pkgs { pkgs = final; };
# This one contains whatever you want to overlay
# You can change versions, add patches, set compilation flags, anything really.
# https://nixos.wiki/wiki/Overlays
modifications = final: prev: {
# example = prev.example.overrideAttrs (oldAttrs: rec {
# ...
# });
};
# When applied, the unstable nixpkgs set (declared in the flake inputs) will
# be accessible through 'pkgs.unstable'
unstable-packages = final: _prev: {
unstable = import inputs.nixpkgs-unstable {
system = final.system;
config.allowUnfree = true;
};
};
}

View file

@ -56,22 +56,19 @@ in
patches = (oldAttrs.patches or [ ]) ++ [ ./pfetch.patch ];
});
# Sane default values and crash avoidance (https://github.com/k-vernooy/trekscii/pull/1)
trekscii = addPatches prev.trekscii [ ./trekscii.patch ];
qutebrowser = prev.qutebrowser.overrideAttrs (oldAttrs: {
patches = (oldAttrs.patches or [ ]) ++ [ ./qutebrowser-tree-tabs.diff ];
});
scgit = prev.cgit-pink.overrideAttrs (_: {
pname = "scgit";
version = "0.1";
src = final.fetchFromSourcehut {
owner = "~misterio";
repo = "scgit";
rev = "2cd05c95827fb94740e876733dc6f7fe88340de2";
sha256 = "sha256-95mRJ3ZCSkLHqehFQdwM2BY0h+YDhohwpnRiF6/lZtA=";
};
});
# scgit = prev.cgit-pink.overrideAttrs (_: {
# pname = "scgit";
# version = "0.1";
# src = final.fetchFromSourcehut {
# owner = "~misterio";
# repo = "scgit";
# rev = "2cd05c95827fb94740e876733dc6f7fe88340de2";
# sha256 = "sha256-95mRJ3ZCSkLHqehFQdwM2BY0h+YDhohwpnRiF6/lZtA=";
# };
# });
};
}

View file

@ -1,79 +0,0 @@
diff --git a/README.md b/README.md
index 103cc78..1e3b32e 100644
--- a/README.md
+++ b/README.md
@@ -17,10 +17,16 @@ $ make
```bash
trekscii [height] [width]
```
+
+`height` and `width` must be larger than `16` and `46`, respectively. If not
+specified, they will default to half the respective terminal dimension.
+
e.g.
```bash
-trekscii 25 85
+trekscii 25 85 # fixed dimensions
trekscii 35 $(tput cols) # terminal width, fixed height
trekscii $(tput lines) $(tput cols) # full-terminal
+trekscii $(tput lines) # full-terminal height, half-terminal width
+trekscii # half-terminal height, half-terminal width
```
diff --git a/src/trekscii.cpp b/src/trekscii.cpp
index 1b14d9a..2238ed1 100644
--- a/src/trekscii.cpp
+++ b/src/trekscii.cpp
@@ -1,7 +1,9 @@
#include <iostream>
+#include <sys/ioctl.h>
#include "trekscii.h"
-
+#define MIN_WIDTH 46
+#define MIN_HEIGHT 16
int main(int argc, char** argv) {
@@ -11,12 +13,36 @@ int main(int argc, char** argv) {
fread(&seed, 4, 1, devrnd);
fclose(devrnd);
srand(seed);
-
- int dimY = std::stoi(argv[1]);
- int dimX = std::stoi(argv[2]);
+ // get window size
+ struct winsize w;
+ ioctl(0, TIOCGWINSZ, &w);
+
+ int dimY;
+ if (argc >= 2) {
+ dimY = std::stoi(argv[1]);
+ if (dimY < MIN_HEIGHT) {
+ std::cerr << "Error: height must be at least " << MIN_HEIGHT << std::endl;
+ return 1;
+ }
+ } else {
+ // default to half terminal height, with MIN_HEIGHT min
+ dimY = std::max(w.ws_row / 2, MIN_HEIGHT);
+ }
+
+ int dimX;
+ if (argc >= 3) {
+ dimX = std::stoi(argv[2]);
+ if (dimX < MIN_WIDTH) {
+ std::cerr << "Error: width must be at least " << MIN_WIDTH << std::endl;
+ return 1;
+ }
+ } else {
+ // default to half terminal width, with MIN_WIDTH min
+ dimX = std::max(w.ws_col / 2, MIN_WIDTH);
+ }
Canvas canvas = Canvas(dimX, dimY - 2);
canvas.generate();
canvas.print();
-}
\ No newline at end of file
+}

View file

@ -1,6 +0,0 @@
# Custom packages, that can be defined similarly to ones from nixpkgs
# You can build them using 'nix build .#example' or (legacy) 'nix-build -A example'
{ pkgs ? (import ../nixpkgs.nix) { } }: {
# example = pkgs.callPackage ./example { };
}

View file

@ -3,12 +3,8 @@
# Packages with an actual source
rgbdaemon = pkgs.callPackage ./rgbdaemon { };
shellcolord = pkgs.callPackage ./shellcolord { };
trekscii = pkgs.callPackage ./trekscii { };
speedtestpp = pkgs.callPackage ./speedtestpp { };
lando = pkgs.callPackage ./lando { };
tidal-dl = pkgs.python3Packages.callPackage ./tidal-dl { };
qt6gtk2 = pkgs.qt6Packages.callPackage ./qt6gtk2 { };
hdos = pkgs.callPackage ./hdos { };
# Personal scripts
nix-inspect = pkgs.callPackage ./nix-inspect { };
@ -19,8 +15,4 @@
lyrics = pkgs.callPackage ./lyrics { };
xpo = pkgs.callPackage ./xpo { };
tly = pkgs.callPackage ./tly { };
hyprslurp = pkgs.callPackage ./hyprslurp { };
# My slightly customized plymouth theme, just makes the blue outline white
plymouth-spinner-monochrome = pkgs.callPackage ./plymouth-spinner-monochrome { };
}

View file

@ -1,47 +0,0 @@
{ lib, stdenv, fetchurl, makeWrapper, openjdk11, makeDesktopItem, copyDesktopItems }:
stdenv.mkDerivation (finalAttrs: {
pname = "hdos";
version = "411";
src = fetchurl {
# TODO find out a stable URL
url = "https://cdn.hdos.dev/launcher/latest/hdos-launcher.jar";
hash = "sha256-00ddeR+ov6Tjrn+pscXoao4C0ek/iP9Hdlgq946pL8A=";
};
dontUnpack = true;
desktop = makeDesktopItem {
name = "HDOS";
type = "Application";
exec = "hdos";
icon = fetchurl {
url = "https://raw.githubusercontent.com/flathub/dev.hdos.HDOS/8e17cbecb06548fde2c023032e89ddf30befeabc/dev.hdos.HDOS.png";
hash = "sha256-pqLNJ0g7GCPotgEPfw2ZZOqapaCRAsJxB09INp6Y6gM=";
};
comment = "HDOS is a client for Old School RuneScape that emulates the era of 2008-2011 RuneScape HD";
desktopName = "HDOS";
genericName = "Oldschool Runescape";
categories = [ "Game" ];
};
nativeBuildInputs = [ makeWrapper copyDesktopItems ];
installPhase = ''
runHook preInstall
makeWrapper ${openjdk11}/bin/java $out/bin/hdos --add-flags "-jar $src"
runHook postInstall
'';
desktopItems = [ finalAttrs.desktop ];
meta = {
description = "High Detail Old School Runescape Client";
homepage = "https://hdos.dev";
changelog = "https://hdos.dev/changelog";
sourceProvenance = [ lib.sourceTypes.binaryBytecode ];
license = lib.licenses.unfreeRedistributable;
platforms = openjdk11.meta.platforms;
maintainers = [ lib.maintainers.misterio77 ];
};
})

View file

@ -1,16 +0,0 @@
{ writeShellApplication, hyprland, jq, slurp }:
writeShellApplication {
name = "hyprslurp";
runtimeInputs = [ hyprland jq slurp ];
text = ''
hyprctl clients -j | \
jq -r \
--argjson workspaces "$(\
hyprctl monitors -j | \
jq -r 'map(.activeWorkspace.id)'\
)" \
'map(select([.workspace.id] | inside($workspaces)))' | \
jq -r '.[] | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"' | \
slurp "$@"
'';
}

View file

@ -1,43 +0,0 @@
{ lib
, stdenv
, fetchFromGitHub
, buildNpmPackage
, makeWrapper
, nodejs-16_x
, docker-compose_1
, docker
}:
let
nodejs = nodejs-16_x;
docker-compose = docker-compose_1;
in
buildNpmPackage.override { inherit nodejs; } rec {
pname = "lando";
version = "3.14.0";
src = fetchFromGitHub {
owner = "lando";
repo = "cli";
rev = "v${version}";
sha256 = "sha256-BFqCmkAnIxeVgzeMvTXFS/mgU1z1KOe74px03qnOvhM=";
};
npmDepsHash = "sha256-G54gtJ3wClcHrTqMDQbnaDZ2yr8D3Hv8q3Bg1UeC0Tk=";
makeCacheWritable = true;
npmFlags = [ "--legacy-peer-deps" ];
dontNpmBuild = true;
postPatch = ''
cp ${./package-lock.json} package-lock.json
'';
meta = with lib; {
description = "A development tool for all your projects that is fast, easy, powerful and liberating.";
homepage = "https://lando.dev";
license = licenses.gpl3;
maintainers = with maintainers; [ misterio77 ];
platforms = platforms.linux;
broken = true; # Not working 100%
};
}

File diff suppressed because it is too large Load diff

View file

@ -1,18 +0,0 @@
{ stdenv, logo ? null, lib, ... }: stdenv.mkDerivation {
pname = "plymouth-spinner-monochrome";
version = "1.0";
src = ./src;
buildPhase = lib.optionalString (logo != null) ''
cp $src . -r
ln -s ${logo} ./share/plymouth/themes/spinner-monochrome/watermark.png
'';
installPhase = ''
cp -r . $out
'';
meta = {
platforms = lib.platforms.all;
};
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Some files were not shown because too many files have changed in this diff Show more