diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4838b85 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +secrets/secrets.yaml +secrets/keys.txt diff --git a/README.md b/README.md new file mode 100644 index 0000000..ed8c6df --- /dev/null +++ b/README.md @@ -0,0 +1,68 @@ +# nixConfig +This is a modular, flake-based Nix configuration repository for managing all personal machines and environments in one place. It supports: +- Full system configuration for NixOS laptop. +- Home Manager user environments on all machines (NixOS, Ubuntu, WSL, servers). +- Reusable modules for programs and services. +- Declarative configuration and reproducible builds. + +## Repository Structure + +```shell +nixConfig/ +├── flake.nix # Flake entry point with all system and user configs +├── flake.lock # Input versions for reproducibility +├── hosts/ # Per-host system-level configs +│ ├── t440p # NixOS system config for laptop +│ │ ├── configuration.nix # NixOS system config +│ │ └── hardware-configuration.nix # Hardware config generated by NixOS +│ ├── steamdeck # NixOS system running on Valve Steamdeck +│ ├── xaorus # home-manager on Ubuntu +│ └── vps04_08 # services running on Ubuntu VPS +├── home/ # Home Manager configs (user environments) +│ └── home.nix # Shared user config for 'wieerwill' +├── modules/ # Shared program/service modules +│ └── ... +``` + +## Usage +### Rebuild the system +use the systems name at the end. Example: +```bash +sudo nixos-rebuild switch --flake ~/nixConfig#t440p +``` + +### Rebuild Home Manager only (e.g. on non-NixOS systems) +```bash +home-manager switch --flake ~/nixConfig#@ +``` + +### Update flake inputs +```bash +nix flake update +``` +or use the scripts in `/scripts`. The script is build for on-system execution and will clean up afterwards: +```bash +chmod +x ./scripts/nix-maintain.sh +./scripts/nix-maintain.sh +``` + +## Setup + +* `/etc/nixos` is a symlink to `~/nixConfig` so NixOS can find configuration files (`sudo ln -s /home/$USER/nixConfig /etc/nixos`). +* Uses matching Home Manager and Nixpkgs versions (`release-25.05`) to avoid compatibility warnings. +* Home Manager is integrated via NixOS modules for system-wide user config. + +## Modules + +The `home/` and `modules/` directory will contain reusable modules such as: +* `neovim.nix` – editor configuration +* `firefox.nix` – browser preferences +* `git.nix` – shared Git settings +* `traefik.nix` – server services + +These modules will be selectively included in each host config or enabled conditionally. + +## Secrets & Private Data + +Do **not** store secrets or passwords in this repository! +SOPS with age is provided in the configuration as secure method for secrets management. diff --git a/firefox.nix b/firefox.nix deleted file mode 100644 index 20ad961..0000000 --- a/firefox.nix +++ /dev/null @@ -1,180 +0,0 @@ -{ config, pkgs, lib, ... }: -{ - - programs.firefox = { - enable = true; - - policies = { - DisablePocket = true; - DisplayBookmarksToolbar = true; - DisableFirefoxStudies = true; - DisableTelemetry = true; - PasswordManagerEnabled = false; - FirefoxHome = { - Search = true; - Pocket = false; - Snippets = false; - TopSites = false; - Highlights = false; - SponsoredPocket = false; - SponsoredTopSites = false; - }; - EnableTrackingProtection = { - Value = true; - Locked = true; - Cryptomining = true; - Fingerprinting = true; - }; - - ExtensionSettings = { - "jid1-MnnxcxisBPnSXQ@jetpack" = { - install_url = "https://addons.mozilla.org/firefox/downloads/latest/privacy-badger17/latest.xpi"; - installation_mode = "force_installed"; - }; - "firefox@ghostery.com" = { - install_url = "https://addons.mozilla.org/firefox/downloads/latest/ghostery/latest.xpi"; - installation_mode = "force_installed"; - }; - "uBlock0@raymondhill.net" = { - install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi"; - installation_mode = "force_installed"; - }; - "{446900e4-71c2-419f-a6a7-df9c091e268b}" = { - install_url = "https://addons.mozilla.org/firefox/downloads/latest/bitwarden-password-manager/latest.xpi"; - installation_mode = "force_installed"; - }; - }; - }; - - profiles = { - Personal = { - id = 0; - - search = { - force = true; - engines = { - "Nix Packages" = { - urls = [ - { - template = "https://search.nixos.org/packages"; - params = [ - { - name = "query"; - value = "{searchTerms}"; - } - ]; - icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; - definedAliases = [ "@np" ]; - } - ]; - }; - "Nix Options" = { - urls = [ - { - template = "https://search.nixos.org/options"; - params = [ - { - name = "query"; - value = "{searchTerms}"; - } - ]; - icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; - definedAliases = [ "@no" ]; - } - ]; - }; - }; - }; - - bookmarks = [ - { - name = "Toolbar"; - toolbar = true; - bookmarks = [ - { - name = "Development"; - bookmarks = [ - { - name = "Web"; - bookmarks = [ - { - name = "TypeScript docs"; - url = "https://www.typescriptlang.org/docs/"; - } - ]; - } - { - name = "Typst"; - bookmarks = [ - { - name = "Typst docs"; - url = "https://typst.app/docs/"; - } - ]; - } - { - name = "Nix"; - bookmarks = [ - { - name = "Nix(OS) manual (stable)"; - url = "https://nixos.org/manual/nixos/stable/"; - } - { - name = "Home manager options"; - url = "https://nix-community.github.io/home-manager/options.xhtml"; - } - { - name = "Noogle"; - url = "https://noogle.dev/"; - } - { - name = "Nixpkgs"; - url = "https://github.com/nixos/nixpkgs"; - } - ]; - } - { - name = "GitHub"; - url = "https://github.com/"; - } - ]; - } - { - name = "Radio"; - bookmarks = [ - { - name = "Meshtastic client"; - url = "https://client.meshtastic.org/"; - } - { - name = "Meshmap"; - url = "https://meshmap.net"; - } - ]; - } - ]; - } - { - name = "Entertainment"; - bookmarks = [ - { - name = "YouTube"; - url = "https://youtube.com/"; - } - ]; - } - ]; - }; - }; - }; - - home = { - sessionVariables.BROWSER = "firefox"; - #persistence."/persist/home/wieerwill" = { - # directories = [ - # ".mozilla/firefox" - # ]; - #}; - }; - -} diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..595209d --- /dev/null +++ b/flake.lock @@ -0,0 +1,94 @@ +{ + "nodes": { + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1758463745, + "narHash": "sha256-uhzsV0Q0I9j2y/rfweWeGif5AWe0MGrgZ/3TjpDYdGA=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "3b955f5f0a942f9f60cdc9cacb7844335d0f21c3", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "release-25.05", + "repo": "home-manager", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1763334038, + "narHash": "sha256-LBVOyaH6NFzQ3X/c6vfMZ9k4SV2ofhpxeL9YnhHNJQQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4c8cdd5b1a630e8f72c9dd9bf582b1afb3127d2c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-25.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "home-manager": "home-manager", + "nixpkgs": "nixpkgs", + "sops-nix": "sops-nix", + "zen-browser": "zen-browser" + } + }, + "sops-nix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1763509310, + "narHash": "sha256-s2WzTAD3vJtPACBCZXezNUMTG/wC6SFsU9DxazB9wDI=", + "owner": "Mic92", + "repo": "sops-nix", + "rev": "3ee33c0ed7c5aa61b4e10484d2ebdbdc98afb03e", + "type": "github" + }, + "original": { + "owner": "Mic92", + "repo": "sops-nix", + "type": "github" + } + }, + "zen-browser": { + "inputs": { + "home-manager": [ + "home-manager" + ], + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1764166920, + "narHash": "sha256-AEpt8JdKA4RVobRjaR7S2QP3bmUz8dhuWasB7mr9Ylo=", + "owner": "0xc000022070", + "repo": "zen-browser-flake", + "rev": "6f5d615393a5e923ea2883ef28e274031d1b1e1e", + "type": "github" + }, + "original": { + "owner": "0xc000022070", + "repo": "zen-browser-flake", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..4d295b4 --- /dev/null +++ b/flake.nix @@ -0,0 +1,85 @@ +{ + description = "Multi-machine NixOS and Home Manager config"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05"; + home-manager.url = "github:nix-community/home-manager/release-25.05"; + sops-nix.url = "github:Mic92/sops-nix"; + + zen-browser = { + url = "github:0xc000022070/zen-browser-flake"; + inputs = { + # IMPORTANT: we're using "libgbm" and is only available in unstable so ensure + # to have it up-to-date or simply don't specify the nixpkgs input + nixpkgs.follows = "nixpkgs"; + home-manager.follows = "home-manager"; + }; + }; + + home-manager.inputs.nixpkgs.follows = "nixpkgs"; + sops-nix.inputs.nixpkgs.follows = "nixpkgs"; + }; + + outputs = inputs@ { self, nixpkgs, home-manager, sops-nix, ... }: { + nixosConfigurations = { + + t440p = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + modules = [ + ./hosts/t440p/configuration.nix + home-manager.nixosModules.home-manager + sops-nix.nixosModules.sops + { + home-manager.useGlobalPkgs = true; + home-manager.useUserPackages = true; + home-manager.users.wieerwill = import ./hosts/t440p/home.nix { + inherit inputs; + }; + } + ]; + }; + + steamdeck = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + modules = [ + ./hosts/steamdeck/configuration.nix + home-manager.nixosModules.home-manager + sops-nix.nixosModules.sops + { + home-manager.useGlobalPkgs = true; + home-manager.useUserPackages = true; + home-manager.users.wieerwill = import ./hosts/steamdeck/home.nix { + inherit inputs; + }; + } + ]; + }; + }; + + homeConfigurations = { + + xaorus = home-manager.lib.homeManagerConfiguration { + pkgs = import nixpkgs { + system = "x86_64-linux"; + }; + modules = [ + ./hosts/xaorus/home.nix + sops-nix.homeManagerModules.sops + ]; + extraSpecialArgs = { inherit inputs; }; + }; + + vps04_08 = home-manager.lib.homeManagerConfiguration { + pkgs = import nixpkgs { + system = "x86_64-linux"; + }; + modules = [ + ./hosts/vps04_08/home.nix + sops-nix.homeManagerModules.sops + ]; + extraSpecialArgs = { inherit inputs; }; + }; + + }; + }; +} diff --git a/home.nix b/home.nix deleted file mode 100644 index fdf75d1..0000000 --- a/home.nix +++ /dev/null @@ -1,36 +0,0 @@ -{ config, pkgs, lib, ... }: -{ - - imports = [ - ./firefox.nix - ./fonts.nix - ./git.nix - ./programs.nix - ./security.nix - ./sway.nix - ./terminal.nix - ./vim.nix - ./vscode.nix - ]; - - # Home Manager needs a bit of information about you - # and the paths it should manage. - home = { - username = "wieerwill"; - homeDirectory = "/home/wieerwill"; - enableNixpkgsReleaseCheck = false; - stateVersion = "24.05"; # read DOCs before changing. - - file = { - # ".screenrc".source = dotfiles/screenrc; - }; - - sessionVariables = { - # EDITOR = "emacs"; - }; - }; - - # Let Home Manager install and manage itself. - programs.home-manager.enable = true; - -} diff --git a/home/_home.nix b/home/_home.nix new file mode 100644 index 0000000..04ba115 --- /dev/null +++ b/home/_home.nix @@ -0,0 +1,49 @@ +{ config, pkgs, lib, ... }: + +{ + imports = [ + ./_options.nix + ./androidstudio.nix + ./backup.nix + ./chromium.nix + ./design.nix + ./embedded.nix + ./fonts.nix + ./git.nix + ./javascript.nix + ./keepass.nix + ./llm.nix + ./logseq.nix + ./mail.nix + ./obsidian.nix + ./redshift.nix + ./secrets.nix + ./security.nix + ./social.nix + ./sway.nix + ./syncthing.nix + ./terminal.nix + ./tor.nix + ./vim.nix + ./vpn-pia.nix + ./vscode.nix + #./zen-browser.nix + ]; + + home.username = "wieerwill"; + home.homeDirectory = "/home/wieerwill"; + home.stateVersion = "25.05"; + home.sessionVariables = { + SOPS_CONFIG = "${config.home.homeDirectory}/nixConfig/secrets/.sops.yaml"; + }; + + home.packages = with pkgs; [ + unzip + sops + age + ]; + + home.sessionVariables = { + PATH = "$PNPM_HOME:${config.home.homeDirectory}/Android/Sdk/cmdline-tools/latest/bin:${config.home.homeDirectory}/Android/Sdk/platform-tools"; + }; +} diff --git a/home/_options.nix b/home/_options.nix new file mode 100644 index 0000000..0dd92ae --- /dev/null +++ b/home/_options.nix @@ -0,0 +1,35 @@ +{ lib, ... }: + +with lib; + +{ + options = { + homeModules = { + androidstudio.enable = mkEnableOption "Enable Android Studio setup"; + backup.enable = mkEnableOption "Enable Borg backup"; + chromium.enable = mkEnableOption "Enable Chromium browser"; + design.enable = mkEnableOption "Enable graphics tools"; + embedded.enable = mkEnableOption "Enable embedded development setup"; + fonts.enable = mkEnableOption "Enable fonts management"; + git.enable = mkEnableOption "Enable git"; + javascript.enable = mkEnableOption "Enable JS/TS dev environment"; + keepass.enable = mkEnableOption "Enable KeePassXC"; + llm.enable = mkEnableOption "Enable local LLM setup (Ollama etc.)"; + logseq.enable = mkEnableOption "Enable Logseq"; + mail.enable = mkEnableOption "Enable mail clients"; + obsidian.enable = mkEnableOption "Enable Obsidian markdown setup"; + redshift.enable = mkEnableOption "Enable Redshift"; + secrets.enable = mkEnableOption "Enable SOPS Secrets"; + security.enable = mkEnableOption "Enable home security settings"; + social.enable = mkEnableOption "Enable social apps"; + sway.enable = mkEnableOption "Enable sway desktop"; + syncthing.enable = mkEnableOption "Enable Syncthing"; + terminal.enable = mkEnableOption "Enable terminal config"; + tor.enable = mkEnableOption "Enable TOR and Onionshare"; + vim.enable = mkEnableOption "Enable vim config"; + vpnpia.enable = mkEnableOption "Enable Private Internet Access VPN"; + vscode.enable = mkEnableOption "Enable VSCode"; + zenbrowser.enable = mkEnableOption "Enable Zen browser"; + }; + }; +} diff --git a/home/androidstudio.nix b/home/androidstudio.nix new file mode 100644 index 0000000..e507f75 --- /dev/null +++ b/home/androidstudio.nix @@ -0,0 +1,33 @@ +{ config, pkgs, lib, ... }: + +let + androidSdkRoot = "${config.home.homeDirectory}/Android/Sdk"; + cfg = config.homeModules.androidstudio; +in +lib.mkIf cfg.enable { + home.packages = with pkgs; [ + android-studio + # Tools for Android SDK management + android-tools + jdk11 # or jdk17 if needed by Android Studio + gradle + ]; + + # Set up environment variables for Android development + home.sessionVariables = { + ANDROID_SDK_ROOT = androidSdkRoot; + ANDROID_HOME = androidSdkRoot; + ANDROID_AVD_HOME = "${config.home.homeDirectory}/.android/avd"; + JAVA_HOME = "${pkgs.jdk11}/lib/openjdk"; # Or jdk17 if preferred + # in _home.nix PATH = lib.mkAfter "${androidSdkRoot}/cmdline-tools/latest/bin:${androidSdkRoot}/platform-tools"; + }; + + # Create needed folders and install SDK components on first run (optional) + home.activation.setupAndroidSdk = lib.hm.dag.entryAfter [ "writeBoundary" ] '' + mkdir -p "${androidSdkRoot}" + if ! [ -x "${androidSdkRoot}/cmdline-tools/latest/bin/sdkmanager" ]; then + echo "✴️ Installing Android SDK Command-line Tools..." + cp -r ${pkgs.androidsdk}/cmdline-tools "${androidSdkRoot}/cmdline-tools" + fi + ''; +} diff --git a/home/backup.nix b/home/backup.nix new file mode 100644 index 0000000..382882b --- /dev/null +++ b/home/backup.nix @@ -0,0 +1,68 @@ +{ config, pkgs, lib, ... }: + +let + hostname = config.networking.hostName or (builtins.getEnv "HOSTNAME"); + backupTarget = "/mnt/backup/borg"; # Adjust this path to your remote or local backup repo + backupRepo = "${backupTarget}/${hostname}"; + backupPaths = { + "t440p" = [ "Documents" "Projects" ]; + "steamdeck" = [ ".config" ]; + "xaorus" = [ "Pictures" "Videos" ]; + }; + folders = builtins.map (dir: "${config.home.homeDirectory}/${dir}") (backupPaths.${hostname} or []); + cfg = config.homeModules.backup; +in + +lib.mkIf cfg.enable { + home.packages = with pkgs; [ borgbackup ]; + + systemd.user.services.borg-backup = { + Unit = { + Description = "Borg Backup for ${hostname}"; + Wants = [ "network-online.target" ]; + After = [ "network-online.target" ]; + }; + + Service = { + Type = "oneshot"; + ExecStart = '' + ${pkgs.borgbackup}/bin/borg create \ + --verbose \ + --filter AME \ + --list \ + --stats \ + --show-rc \ + --compression lz20 \ + ${backupRepo}::"{now:%Y-%m-%d_%H-%M}" \ + ${builtins.concatStringsSep " \\\n " folders} \ + --exclude ${config.home.homeDirectory}/.cache \ + --exclude ${config.home.homeDirectory}/Downloads \ + --exclude ${config.home.homeDirectory}/node_modules \ + --exclude '*/.git' \ + --exclude '*/venv' \ + --exclude '*/target' + ''; + ExecStopPost = '' + ${pkgs.borgbackup}/bin/borg prune -v --list ${backupRepo} \ + --keep-daily=7 \ + --keep-weekly=4 \ + --keep-monthly=3 + ''; + }; + + Install = { + WantedBy = [ "default.target" ]; + }; + }; + + # Optional: allow the backup location to be automounted + xdg.userDirs.extraConfig = { + XDG_BACKUP_DIR = "${backupTarget}"; + }; + + # Optional: set environment variable to simplify CLI usage + home.sessionVariables = { + BORG_REPO = backupRepo; + BORG_PASSPHRASE = ""; # or use environment.d or a secrets mechanism + }; +} diff --git a/home/chromium.nix b/home/chromium.nix new file mode 100644 index 0000000..bd7e823 --- /dev/null +++ b/home/chromium.nix @@ -0,0 +1,40 @@ +{ config, pkgs, lib, ... }: + +let + cfg = config.homeModules.chromium; +in + +lib.mkIf cfg.enable { + programs.chromium = { + enable = true; + + package = pkgs.brave; # use brave as package + + # List of Chromium dictionaries to install + dictionaries = [ + pkgs.hunspellDictsChromium.en_US + pkgs.hunspellDictsChromium.de_DE + ]; + + extensions = [ + # Add Chrome extension IDs here to auto-install them + # Example: + "cjpalhdlnbpafiamejdnhcphjbkeiagm" # uBlock Origin + ]; + + # Enable hardware acceleration (VAAPI, WebGL, etc.) +# enableWideVine = true; + commandLineArgs = [ + "--enable-features=UseOzonePlatform" + "--ozone-platform=wayland" + "--restore-last-sesstion" # on startup restore + "--safebrowsing-enable-enhanced-protection" + ]; + }; + + xdg.mimeApps.defaultApplications = { + "x-scheme-handler/http" = "chromium-browser.desktop"; + "x-scheme-handler/https" = "chromium-browser.desktop"; + "text/html" = "chromium-browser.desktop"; + }; +} diff --git a/home/design.nix b/home/design.nix new file mode 100644 index 0000000..533acb8 --- /dev/null +++ b/home/design.nix @@ -0,0 +1,69 @@ +{ config, pkgs, lib, ... }: + +let + cfg = config.homeModules.design; +in + +lib.mkIf cfg.enable { + home.packages = with pkgs; [ + inkscape + openscad + gimp + darktable + ]; + + # Optional desktop entries and MIME associations + xdg.mimeApps.defaultApplications = { + "image/png" = "org.gimp.GIMP.desktop"; + "image/svg+xml" = "org.inkscape.Inkscape.desktop"; + "application/x-gimp" = "org.gimp.GIMP.desktop"; + "application/x-openraster" = "org.gimp.GIMP.desktop"; + "image/x-xcf" = "org.gimp.GIMP.desktop"; + "image/x-raw" = "org.darktable.Darktable.desktop"; + "application/x-openscad" = "openscad.desktop"; + }; + + xdg.desktopEntries = { + gimp = { + name = "GIMP"; + genericName = "Image Editor"; + exec = "gimp %F"; + terminal = false; + icon = "gimp"; + type = "Application"; + categories = [ "Graphics" "2DGraphics" "RasterGraphics" ]; + }; + + inkscape = { + name = "Inkscape"; + genericName = "Vector Graphics Editor"; + exec = "inkscape %F"; + terminal = false; + icon = "inkscape"; + type = "Application"; + categories = [ "Graphics" "VectorGraphics" ]; + }; + + openscad = { + name = "OpenSCAD"; + genericName = "3D CAD Modeler"; + exec = "openscad %F"; + terminal = false; + icon = "openscad"; + type = "Application"; + categories = [ "Graphics" "3DGraphics" "Engineering" ]; + }; + + darktable = { + name = "Darktable"; + genericName = "Photography Workflow Software"; + exec = "darktable %F"; + terminal = false; + icon = "darktable"; + type = "Application"; + categories = [ "Graphics" "Photography" "RAW" ]; + }; + }; + + # Optional tweaks or plugins setup can go here if needed in the future +} diff --git a/home/email.nix b/home/email.nix new file mode 100644 index 0000000..6806544 --- /dev/null +++ b/home/email.nix @@ -0,0 +1,200 @@ +{ pkgs, ... }: +{ + + accounts.email.accounts = { + + gmx = { + primary = true; + address = "robert.jeutter@gmx.de"; + userName = "robert.jeutter@gmx.de"; + smtp = { + host = "mail.gmx.net"; + }; + realName = "Robert Jeutter"; + imap.host = "imap.gmx.net"; + #gpg = { + # key = "F9119EC8FCC56192B5CF53A0BF4F64254BD8C8B5"; + # signByDefault = true; + #}; + signature = { + text = '' + Mit besten Grüßen + Robert Jeutter + https://wieerwill.dev + ''; + showSignature = "append"; + }; + passwordCommand = "mail-password"; + }; + + web = { + #primary = true; + address = "robert.jeutter@web.de"; + userName = "robert.jeutter@web.de"; + smtp = { + host = "smtp.web.de"; + }; + realName = "Robert Jeutter"; + imap.host = "imap.web.de"; + #gpg = { + # key = "F9119EC8FCC56192B5CF53A0BF4F64254BD8C8B5"; + # signByDefault = true; + #}; + signature = { + text = '' + Mit besten Grüßen + Robert Jeutter + https://wieerwill.dev + ''; + showSignature = "append"; + }; + passwordCommand = "mail-password"; + }; + + web2 = { + #primary = true; + address = "fuer.hilfe@web.de"; + userName = "fuer.hilfe@web.de"; + smtp = { + host = "smtp.web.de"; + }; + realName = "Fuer Hilfe"; + imap.host = "imap.web.de"; + #gpg = { + # key = "F9119EC8FCC56192B5CF53A0BF4F64254BD8C8B5"; + # signByDefault = true; + #}; + #signature = { + # text = '' + # Mit besten Grüßen + # Robert Jeutter + # https://wieerwill.dev + # ''; + # showSignature = "append"; + #}; + passwordCommand = "mail-password"; + }; + + gmail = { + #primary = true; + address = "apfelsaftrr@gmail.com"; + userName = "apfelsaftrr@gmail.com"; + smtp = { + host = "smtp.gmail.com"; + }; + realName = "Apfel RR Saft"; + imap.host = "imap.gmail.com"; + #gpg = { + # key = "F9119EC8FCC56192B5CF53A0BF4F64254BD8C8B5"; + # signByDefault = true; + #}; + #signature = { + # text = '' + # Mit besten Grüßen + # Robert Jeutter + # https://wieerwill.dev + # ''; + # showSignature = "append"; + #}; + passwordCommand = "mail-password"; + }; + + flyhering = { + #primary = true; + address = "flyhering@web.de"; + userName = "flyhering@web.de"; + smtp = { + host = "smtp.web.de"; + }; + realName = "flyhering"; + imap.host = "imap.web.de"; + #gpg = { + # key = "F9119EC8FCC56192B5CF53A0BF4F64254BD8C8B5"; + # signByDefault = true; + #}; + #signature = { + # text = '' + # Mit besten Grüßen + # Robert Jeutter + # https://wieerwill.dev + # ''; + # showSignature = "append"; + #}; + passwordCommand = "mail-password"; + }; + + rolex = { + #primary = true; + address = "rolex.sorela@web.de"; + userName = "rolex.sorela@web.de"; + smtp = { + host = "smtp.web.de"; + }; + realName = "Apfel RR Saft"; + imap.host = "imap.web.de"; + #gpg = { + # key = "F9119EC8FCC56192B5CF53A0BF4F64254BD8C8B5"; + # signByDefault = true; + #}; + #signature = { + # text = '' + # Mit besten Grüßen + # Robert Jeutter + # https://wieerwill.dev + # ''; + # showSignature = "append"; + #}; + passwordCommand = "mail-password"; + }; + + wieerwill = { + #primary = true; + address = "mail@wieerwill.dev"; + userName = "mail@wieerwill.dev"; + smtp = { + host = "mail.wieerwill.dev"; + }; + realName = "WieErWill"; + imap.host = "mail.wieerwill.dev"; + #gpg = { + # key = "F9119EC8FCC56192B5CF53A0BF4F64254BD8C8B5"; + # signByDefault = true; + #}; + signature = { + text = '' + Mit besten Grüßen + WieErWill + https://wieerwill.dev + ''; + showSignature = "append"; + }; + passwordCommand = "mail-password"; + }; + + valwiArt = { + #primary = true; + address = "mail@valwi.art"; + userName = "mail@valwi.art"; + smtp = { + host = "mail.wieerwill.dev"; + }; + realName = "Valwi.Art"; + imap.host = "mail.wieerwill.dev"; + #gpg = { + # key = "F9119EC8FCC56192B5CF53A0BF4F64254BD8C8B5"; + # signByDefault = true; + #}; + signature = { + text = '' + Mit besten Grüßen + Valwi.Art + https://valwi.art + ''; + showSignature = "append"; + }; + passwordCommand = "mail-password"; + }; + + } + +} \ No newline at end of file diff --git a/home/embedded.nix b/home/embedded.nix new file mode 100644 index 0000000..b19baf3 --- /dev/null +++ b/home/embedded.nix @@ -0,0 +1,83 @@ +# You should run espup-init once per user to install toolchains. +# +# For STM32/RP2040, you’ll likely configure chip names in flash-stm. +# +# Add .cargo/config.toml for probe-rs targets like: +# [target.riscv32imac-unknown-none-elf] +# runner = "probe-rs run" +# +# Set up arduino-cli using: +# arduino-cli config init +# arduino-cli core update-index +# arduino-cli core install arduino:avr +# + +{ config, pkgs, lib, ... }: + +let + cfg = config.homeModules.embedded; +in + +lib.mkIf cfg.enable { + home.packages = with pkgs; [ + # General embedded tools + rustup + binutils + cargo-binutils + llvmPackages.bintools + openocd + dfu-util + minicom + picocom + lldb + gcc + gdb + # qemu # quick emulator + # gnumake + # pkg-config + + # ARM toolchains + gcc-arm-embedded + + # Espressif ESP32 + espup + espflash + #espmonitor + ldproxy + cargo-espflash + + # ST-Link / J-Link / Debug probes + probe-rs + #jlink + + # Arduino + arduino-cli + ]; + + # Optional system envs for toolchains or common paths + home.sessionVariables = { + ESPUP_INSTALL_PATH = "${config.home.homeDirectory}/.espressif"; + RUSTUP_HOME = "${config.home.homeDirectory}/.rustup"; + CARGO_HOME = "${config.home.homeDirectory}/.cargo"; + }; + + # Udev rules for embedded devices (ESP, STLink, J-Link, Arduino) + # These must be placed on a NixOS system-wide level; for non-NixOS we print a helper + home.activation.printUdevHint = lib.hm.dag.entryAfter [ "writeBoundary" ] '' + echo "📎 Embedded development: Make sure you have correct udev rules installed for USB devices." + echo "Examples:" + echo " - https://github.com/espressif/esp-idf/blob/master/tools/udev/60-esper-devices.rules" + echo " - https://probe.rs/docs/getting-started/installation/#udev-rules" + echo " - https://www.arduino.cc/en/guide/linux" + echo " - For STLink and J-Link adapters: udev rules are required for non-root flashing." + ''; + + # Optional: shell aliases to speed up common flows + programs.zsh.shellAliases = { + espup-init = "espup install"; + flash-esp = "cargo espflash"; + monitor-esp = "espmonitor"; + flash-stm = "cargo flash --chip"; + embed = "cargo embed"; + }; +} diff --git a/home/firefox.nix b/home/firefox.nix new file mode 100644 index 0000000..66394fb --- /dev/null +++ b/home/firefox.nix @@ -0,0 +1,1417 @@ +{ config, pkgs, lib, ... }: +{ + + programs.firefox = { + enable = true; + + policies = { + DisablePocket = true; + DisplayBookmarksToolbar = true; + DisableFirefoxStudies = true; + DisableTelemetry = true; + PasswordManagerEnabled = false; + FirefoxHome = { + Search = true; + Pocket = false; + Snippets = false; + TopSites = false; + Highlights = false; + SponsoredPocket = false; + SponsoredTopSites = false; + }; + EnableTrackingProtection = { + Value = true; + Locked = true; + Cryptomining = true; + Fingerprinting = true; + }; + + ExtensionSettings = { + "jid1-MnnxcxisBPnSXQ@jetpack" = { + install_url = "https://addons.mozilla.org/firefox/downloads/latest/privacy-badger17/latest.xpi"; + installation_mode = "force_installed"; + }; + "firefox@ghostery.com" = { + install_url = "https://addons.mozilla.org/firefox/downloads/latest/ghostery/latest.xpi"; + installation_mode = "force_installed"; + }; + "uBlock0@raymondhill.net" = { + install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi"; + installation_mode = "force_installed"; + }; + "{446900e4-71c2-419f-a6a7-df9c091e268b}" = { + install_url = "https://addons.mozilla.org/firefox/downloads/latest/bitwarden-password-manager/latest.xpi"; + installation_mode = "force_installed"; + }; + /** + https://github.com/kkapsner/CanvasBlocker/ + https://docs.clearurls.xyz + https://decentraleyes.org + https://disconnect.me/ + https://github.com/Rob--W/dont-track-me-google + https://www.mrfdev.com/enhancer-for-youtube + https://github.com/deathau/markdown-clipper + https://opendyslexic.org + https://privacybadger.org/ + https://github.com/cowlicks/privacypossum + https://github.com/gorhill/uBlock#ublock-origin + */ + }; + }; + + profiles = { + Personal = { + id = 0; + + search = { + force = true; + engines = { + "Nix Packages" = { + urls = [ + { + template = "https://search.nixos.org/packages"; + params = [ + { + name = "query"; + value = "{searchTerms}"; + } + ]; + icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; + definedAliases = [ "@np" ]; + } + ]; + }; + "Nix Options" = { + urls = [ + { + template = "https://search.nixos.org/options"; + params = [ + { + name = "query"; + value = "{searchTerms}"; + } + ]; + icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; + definedAliases = [ "@no" ]; + } + ]; + }; + }; + }; + + bookmarks = [ + { + name = "Toolbar"; + toolbar = true; + bookmarks = [ + { + name = "Own"; + bookmarks = [ + { + name = "WieErWill"; + url = "https://wieerwill.dev"; + } + { + name = "ValwiArt"; + url = "https://valwi.art/"; + } + { + name = "BundesMemesterium"; + #"iconUri": "https://bundesmemesterium.de/_nuxt/icons/icon_512x512.63244c.png"; + url = "https://bundesmemesterium.de/"; + } + { + name = "Focalboard"; + url = "https://board.wieerwill.dev"; + } + { + name = "Lychee Images"; + url = "https://img.wieerwill.dev"; + } + { + name = "MixPost"; + url = "https://post.wieerwill.dev/mixpost"; + } + { + name = "Portainer"; + url = "https://port.wieerwill.dev/"; + } + { + name = "Umami"; + url = "https://umami.wieerwill.dev/dashboard"; + } + { + name = "Gitea"; + url = "https://git.wieerwill.dev/explore/repos"; + } + { + name = "Drone"; + url = "https://drone.wieerwill.dev"; + } + { + name = "Strato"; + url = "https://www.strato.de"; + } + { + name = "Cloudflare"; + url = "https://dash.cloudflare.com"; + } + + ]; + } + { + name = "Hobby"; + bookmarks = [ + { + name = "CCC Kalender"; + url = "https://events.ccc.de/calendar/"; + } + { + name = "Hackerkiste"; + url = "https://hackerkiste.de/calls/"; + } + ]; + } + { + name = "Development"; + bookmarks = [ + { + name = "Web"; + bookmarks = [ + { + name = "TypeScript docs"; + url = "https://www.typescriptlang.org/docs/"; + } + { + name = "betula: A link collection software"; + #"iconUri": "https://sr.ht/static/logo.svg"; + url = "https://sr.ht/~bouncepaw/betula/"; + } + { + name = "Welcome - 100 Exercises To Learn Rust"; + #"iconUri": "https://rust-exercises.com/favicon.svg"; + url = "https://rust-exercises.com/"; + } + { + name = "Rudelblinken - HedgeDoc"; + #"iconUri": "https://md.darmstadt.ccc.de/icons/favicon-32x32.png"; + url = "https://md.darmstadt.ccc.de/s/rudelblinken-38c3#"; + } + { + name = "Installieren der erforderlichen Bibliotheken — SunFounder Zeus Robot Car Kit for Arduino Dokumentation"; + url = "https://docs.sunfounder.com/projects/zeus-car/de/latest/get_started/add_libraries.html"; + } + { + name = "DevDocs"; + url = "https://devdocs.io/"; + } + { + name = "Tasten"; + url = "https://support.mozilla.org/de/kb/Tastaturkuerzel?redirectslug=Keyboard+shortcuts&redirectlocale=en-US"; + } + { + name = "Electronic library"; + #"iconUri": "https://b-ok.cc/favicon-16x16.svg?v=2"; + url = "https://b-ok.cc/"; + } + { + name = "Farbpaletten-Generator"; + #"iconUri": "https://color.adobe.com/apple-touch-icon.png"; + url = "https://color.adobe.com/de/create"; + } + { + name = "Unsplash"; + #"iconUri": "https://unsplash.com/favicon-32x32.png"; + url = "https://unsplash.com/"; + } + { + name = "Awesome CV - Overleaf"; + #"iconUri": "https://www.overleaf.com/touch-icon-192x192.png"; + url = "https://www.overleaf.com/project/5c4851148df5392fc0768588"; + } + { + name = "Photopea | Online Photo Editor"; + #"iconUri": "https://www.photopea.com/promo/icon512.png"; + url = "https://www.photopea.com/"; + } + { + name = "Horizon EDA"; + url = "https://horizon-eda.readthedocs.io/en/latest/index.html"; + } + { + name = "Privacy Tools: Fight Mass Surveillance"; + #"iconUri": "https://www.privacytools.io/img/favicons/apple-touch-icon.png"; + url = "https://www.privacytools.io/"; + } + { + name = "DeepL Translate"; + url = "https://www.deepl.com/translator#en/de/"; + } + ]; + } + { + name = "Nix"; + bookmarks = [ + { + name = "Nix(OS) manual"; + url = "https://nixos.org/manual/nixos/stable/"; + } + { + name = "Home manager"; + url = "https://nix-community.github.io/home-manager/options.xhtml"; + } + { + name = "Noogle"; + url = "https://noogle.dev/"; + } + { + name = "Nixpkgs"; + url = "https://github.com/nixos/nixpkgs"; + } + ]; + } + { + name = "GitHub"; + url = "https://github.com/wieerwill"; + } + ]; + } + { + name = "Architektur"; + bookmarks = [ + { + name = "Check-In Generator - Fragen für bessere Meetings & Workshops"; + #"iconUri": "https://www.checkin-generator.de/favicon-32x32.png"; + url = "https://www.checkin-generator.de/"; + } + { + name = "Architektur-Spicker - embarc"; + #"iconUri": "https://www.embarc.de/img/favicons/favicon-32x32.png"; + url = "https://www.embarc.de/architektur-spicker/"; + } + { + name = "Liberating Structures – Innovation durch echte Zusammenarbeit"; + #"iconUri": "https://liberatingstructures.de/wp-content/uploads/2016/10/cropped-ls-1-192x192.png"; + url = "https://liberatingstructures.de/"; + } + { + name = "4MAT Online - Home"; + #"iconUri": "https://lwfiles.mycourse.app/656ecc83592169df5486ddaf-public/d08cdd8c29a2895fcdfef99962025e58.png"; + url = "https://4mat.org/"; + } + { + name = "Art of Hosting | Die Kunst des Gastgebens und Erntens guter Gespräche"; + #"iconUri": "https://artofhosting.org/wp-content/uploads/2019/10/cropped-p1dnujnp8v866tob9kn1eq21q375-192x192.png"; + url = "https://artofhosting.org/de/"; + } + { + name = "Rollen-Canvas"; + #"iconUri": "https://www.projektmagazin.de/themes/custom/wunder/favicon-32x32.png"; + url = "https://www.projektmagazin.de/methoden/rollen-canvas"; + } + { + name = "(32) Team Topologies in Theorie & Praxis - YouTube"; + #"iconUri": "https://www.youtube.com/s/desktop/be7304fd/img/logos/favicon_144x144.png"; + url = "https://www.youtube.com/watch?v=EXrFeHsc-II&t=445s"; + } + { + name = "Integers - 100 Exercises To Learn Rust"; + #"iconUri": "https://rust-exercises.com/100-exercises/favicon.svg"; + url = "https://rust-exercises.com/100-exercises/02_basic_calculator/01_integers"; + } + { + name = "The Software Architecture Handbook"; + url = "https://www.freecodecamp.org/news/an-introduction-to-software-architecture-patterns/"; + } + { + name = "Software architects: 12 hard and soft skills needed to become a leader "; + url = "https://www.redhat.com/en/blog/what-is-software-architect"; + } + ]; + } + { + name = "Radio"; + bookmarks = [ + { + name = "Meshtastic"; + url = "https://client.meshtastic.org/"; + } + { + name = "Meshmap"; + url = "https://meshmap.net"; + } + ]; + } + { + name = "Series"; + bookmarks = [ + { + name = "Burning Series: Serien online sehen"; + url = "https://bs.to/"; + } + { + name = "Shangri-La Frontier"; + url = "https://bs.to/serie/Shangri-La-Frontier-Crappy-Game-Hunter-Challenges-God-Tier-G/"; + } + { + name = "Solo Leveling"; + url = "https://bs.to/serie/Ore-dake-Level-Up-na-Ken-Solo-Leveling/"; + } + { + name = "One Piece | OP"; + url = "https://bs.to/serie/One-Piece-OP"; + } + ] + } + { + name = "Entertainment"; + bookmarks = [ + { + name = "Arte DE"; + url = "https://www.youtube.com/@artede/videos"; + } + { + name = "Heilung | LIFA - Krigsgaldr"; + url = "https://www.youtube.com/watch?v=QRg_8NNPTD8&list=RDEMySn049V6ngoctlRn6Z2VyA&index=4"; + } + { + name = "The Batman ft. KxllSwxtch & Nirvana"; + url = "https://www.youtube.com/watch?v=4CnqZeUNioA"; + } + { + name = "WITCHZ - THE MASTER"; + url = "https://www.youtube.com/watch?v=nDc-vOouf68&list=PLKOddXt3Y4w4fOahtNMM0AGtHDkqEOBfb&index=4"; + } + { + name = "Swiss & Die Andern - Schwarz Rot Braun"; + url = "https://www.youtube.com/watch?v=T4efeaW6kSo"; + } + { + name = "SAHARA PHONK | HENSONN"; + url = "https://www.youtube.com/watch?v=YESR7wQuO6E"; + } + { + name = "Jugendwort des Jahres"; + url = "https://www.youtube.com/watch?v=3RS_zzG91Ds"; + } + { + name = "Youjo Senki「Los! Los! Los!」"; + url = "https://www.youtube.com/watch?v=hOYzB3Qa9DE"; + } + + { + name = "Reading Music to Concentrate"; + #"iconUri": "https://www.youtube.com/s/desktop/9cc6dbeb/img/favicon_144x144.png"; + url = "https://www.youtube.com/watch?v=BklGhQYKl30"; + } + { + name = "Nina Chuba - Wildberry Lillet Remix feat. Juju"; + #"iconUri": "https://www.youtube.com/s/desktop/9cc6dbeb/img/favicon_144x144.png"; + url = "https://www.youtube.com/watch?v=qVSALcVpwkc"; + } + { + name = "Nightcore - I WANNA BE YOUR SLAVE → Måneskin"; + #"iconUri": "https://www.youtube.com/s/desktop/c01ea7e3/img/logos/favicon_144x144.png"; + url = "https://www.youtube.com/watch?v=v2LsqDjhNbA"; + } + { + name = "https://www.youtube.com/watch?v=kSRNrVjISRQ"; + #"iconUri": "https://www.youtube.com/s/desktop/c01ea7e3/img/logos/favicon_144x144.png"; + url = "https://www.youtube.com/watch?v=kSRNrVjISRQ"; + } + { + name = "In Extremo - Frei zu sein (Official Video) - YouTube"; + #"iconUri": "https://www.youtube.com/s/desktop/26a583e4/img/logos/favicon_144x144.png"; + url = "https://www.youtube.com/watch?v=b01wTOPOZT4&list=RDEM4MWMpZxWdEqq6zr1RJ8QXA&index=4"; + } + { + name = "FERRIS x SHOCKY x SWISS - BULLENWAGEN (Official Video) - YouTube"; + #"iconUri": "https://www.youtube.com/s/desktop/3637873e/img/logos/favicon_144x144.png"; + url = "https://www.youtube.com/watch?v=iMnhNo4SYQc&list=RDEMvdzqPZZ10ThAYyiC6PoWgw&index=26"; + } + { + name = "Bre Petrunko - Koutev Bulgarian National Ensemble [] LYRICS - YouTube"; + url = "https://www.youtube.com/watch?v=ByFLkUQZaNc"; + } + { + name = "Overlord OST CD1 02 '「MMO RPG YGGDRASILL」 - YouTube"; + url = "https://www.youtube.com/watch?v=F-vU8OhguvA&list=PLjUUDZUvksbRybfP_bdtBL06owwNRzN7v&index=3"; + } + { + name = "Games | DIY Multideck"; + #"iconUri": "https://diymultideck.mauri.app/favicon/black/favicon-32x32.png"; + url = "https://diymultideck.mauri.app/games/"; + } + { + name = "Rogue's Gallery: Pirate Ballads; Sea Songs; and Chanteys Lyrics and Tracklist | Genius"; + url = "https://genius.com/albums/Various-artists/Rogue-s-gallery-pirate-ballads-sea-songs-and-chanteys"; + } + { + name = "Shanties and Sailor Songs / Shantys und Seemannslieder"; + url = "https://www.musicanet.org/robokopp/shanty.html"; + } + { + name = "Seefahrtslieder | Liederkiste.com"; + url = "https://www.liederkiste.com/index.php?c=seefahrtslieder&l=de"; + } + { + name = "Pathfinder 2e"; + url = "https://2e.aonprd.com/Default.aspx"; + } + ]; + } + { + name = "Learning"; + bookmarks = [ + { + name = "Leadership & Management"; + url = "https://www.oxfordhomestudy.com/courses/leadership-courses-online/leadership-v-management-free"; + } + { + name = "Learn to Code — For Free — Coding Courses for Busy People"; + #"iconUri": "https://www.freecodecamp.org/favicon-32x32.png?v=6cba562cbd10e31af925a976f3db73f7"; + url = "https://www.freecodecamp.org/learn/"; + } + { + name = "vhs Augsburger Land e.V. - Ihre 34 Volkshochschulen vor Ort – vhs Augsburger Land e.V."; + url = "https://www.vhs-augsburger-land.de/"; + } + { + name = "Python Bootcamp: Vom Anfänger zum Profi; inkl. Data Science | Udemy"; + url = "https://www.udemy.com/course/python-bootcamp/learn/lecture/8025354#overview"; + } + { + name = "OverTheWire: Level Goal: Bandit Level 17 → Level 18"; + #"iconUri": "https://overthewire.org/img/favicon.ico"; + url = "https://overthewire.org/wargames/bandit/bandit18.html"; + } + { + name = "Zenva"; + url = "https://academy.zenva.com/"; + } + { + name = "GameDev.tv"; + #"iconUri": "fake-favicon-uri:https://www.gamedev.tv/courses/enrolled"; + url = "https://www.gamedev.tv/courses/enrolled"; + } + { + name = "Eduonix | Learn platform"; + #"iconUri": "fake-favicon-uri:https://www.eduonix.com/dashboard"; + url = "https://www.eduonix.com/dashboard"; + } + { + name = "Datenschutz-Podcast des c't Magazins"; + #"iconUri": "https://www.heise.de/ct/icons/apple-touch-icon-152.png"; + url = "https://www.heise.de/ct/artikel/Auslegungssache-Der-Datenschutz-Podcast-des-c-t-Magazins-4571821.html"; + } + { + name = "openHPI"; + #"iconUri": "https://open.hpi.de/assets/favicon-13c25d6c81b1f50462cb05d7065b1ae8afe27d06b24cdc8114b0f99da300bd6d.ico"; + url = "https://open.hpi.de/dashboard"; + } + { + name = "freeCodeCamp"; + #"iconUri": "https://www.freecodecamp.org/favicon-32x32.png?v=6cba562cbd10e31af925a976f3db73f7"; + url = "https://www.freecodecamp.org/learn/"; + } + { + name = "heise online"; + #"iconUri": "https://www.heise.de/icons/ho/favicon/favicon.svg"; + url = "https://www.heise.de/"; + } + { + name = "Krautreporter – Verstehe die Zusammenhänge"; + #"iconUri": "https://uploads-ssl.webflow.com/63298ddcb71d1183a3456b21/63298e71ceaf9105b826fccc_256x256.png"; + url = "https://krautreporter.de/mitglied-werden"; + } + { + name = "16Personalities"; + #"iconUri": "https://static.neris-assets.com/images/favicons/favicon-194x194.png"; + url = "https://www.16personalities.com/members-area/overview"; + } + { + name = "EDUCBA"; + #"iconUri": "fake-favicon-uri:https://www.educba.com/my-courses/bundle/"; + url = "https://www.educba.com/my-courses/bundle/"; + } + { + name = "OverTheWire: Wargames"; + #"iconUri": "https://overthewire.org/img/favicon.ico"; + url = "https://overthewire.org/wargames/"; + } + { + name = "GameDev.tv"; + #"iconUri": "fake-favicon-uri:https://www.gamedev.tv/courses/enrolled"; + url = "https://www.gamedev.tv/courses/enrolled"; + } + { + name = "Eduonix | Learn platform"; + #"iconUri": "fake-favicon-uri:https://www.eduonix.com/dashboard"; + url = "https://www.eduonix.com/dashboard"; + } + { + name = "Zenva"; + url = "https://academy.zenva.com/"; + } + { + name = "PC-WELT"; + #"iconUri": "fake-favicon-uri:https://magazin.pcwelt.de/#/kiosk/issues?backToIssue=12190531"; + url = "https://magazin.pcwelt.de/#/kiosk/issues?backToIssue=12190531"; + } + { + name = "Udemy"; + #"iconUri": "https://www.udemy.com/staticx/udemy/images/v8/favicon-16x16.png"; + url = "https://www.udemy.com/home/my-courses/learning/"; + } + ]; + } + { + name = "Shopping"; + bookmarks = [ + { + name = "Kleinanzeigen"; + url = "https://www.kleinanzeigen.de/"; + } + { + name = "Amazon"; + url = "https://www.amazon.de/"; + } + { + name = "WISO Steuer"; + url = "https://www.buhl.de/shop/wisosteuer/auswahl?2022=agv&wkz=STWEBMARKETINGSEITE&src=WEB"; + } + { + name = "ImmoScout24"; + url = "https://www.immobilienscout24.de/Suche"; + } + { + name = "Hannes Roether Leinenhemd | LODENFREY"; + #"iconUri": "https://www.lodenfrey.com/out/LF_2022/img/favicons/android-chrome-256x256.png"; + url = "https://www.lodenfrey.com/Hannes-Roether-Leinenhemd-12.html"; + } + { + name = "Zegna Leinenhemd | LODENFREY"; + #"iconUri": "https://www.lodenfrey.com/out/LF_2022/img/favicons/android-chrome-256x256.png"; + url = "https://www.lodenfrey.com/Zegna-Leinenhemd-1.html"; + } + ]; + } + { + name = "Travel"; + bookmarks = [ + { + name = "Komoot"; + #"iconUri": "https://www.komoot.de/icons/favicon.png"; + url = "https://www.komoot.de/tour/999552923/edit"; + } + { + name = "1NITE TENT - Ein Stück Jedermannsrecht; wie Couchsurfen für Zelte"; + #"iconUri": "https://1nitetent.com/app/uploads/2018/06/cropped-logo-2-192x192.png"; + url = "https://1nitetent.com/"; + } + {/* */ + name = "Top Zelt- und Stellplätze für dich | MyCabin"; + url = "https://mycabin.eu/discover?showMap=&geocoderResult=%7B%22center%22%3A%5B11.208749710165733%2C47.950313681428625%5D%2C%22place_name%22%3A%22Kartenbereich+%28Bayern%2C+Deutschland%29%22%2C%22place_type%22%3A%22map%22%2C%22bbox%22%3A%5B10.466568738270297%2C47.46760844362757%2C11.95093068206117%2C48.43301891922968%5D%7D&travelTypeTent=true&travelTypeCamper=false&travelTypeShelter=false&travelTypeHut=false&arrivalDate=&departureDate=&iAmFlexible=false&adults=1&discounted=0&shouldBeDirectBookable=false&shouldHaveToilet=false&shouldHaveWater=false&shouldHaveShower=false&shouldHavePower=false&shouldHaveFireplace=false&shouldAllowDogs=false&supportsLongVehicles=false&showFilter=&ratingAttributes=&activities=&showOnlyScoutableCabins=false&priceRangeMin=&priceRangeMax="; + } + { + name = "https://www.bergwelten.com/s/map/region/hut/8527#10.11/47.6964/11.1362"; + url = "https://www.bergwelten.com/s/map/region/hut/8527#10.11/47.6964/11.1362"; + } + ]; + } + ]; + } + { + name = "Clubs"; + bookmarks = [ + { + name = "DAV Gersthofen"; + url = "https://www.dav-gersthofen.de/programm"; + } + { + name = "ADFC - Verkehrswende mit dem Fahrrad"; + #"iconUri": "https://www.adfc.de/typo3conf/ext/adfc_website/Resources/Public/assets/img/fav-icon/android-icon-192x192.png"; + url = "https://www.adfc.de/"; + } + { + name = "Greenpeace Augsburg"; + url = "https://greenwire.greenpeace.de/group/greenpeace-augsburg/about"; + } + ]; + } + { + name = "toRead"; + bookmarks = [ + { + name = "TechnoRanma — The boobs you made for your cosplay. What material..."; + #"iconUri": "https://64.media.tumblr.com/avatar_7d1a84a40a72_128.pnj"; + url = "https://technoranma.tumblr.com/post/111435123211/the-boobs-you-made-for-your-cosplay-what-material"; + }; + { + name = "Getting Started | Valetudo"; + url = "https://valetudo.cloud/pages/general/getting-started.html"; + }; + { + name = "PixelX"; + #"iconUri": "https://w15.pixelx.cloud:8443/favicon.ico?1507716430"; + url = "https://w15.pixelx.cloud:8443/smb/"; + }; + { + name = "ChatGPT"; + #"iconUri": "https://cdn.oaistatic.com/_next/static/media/apple-touch-icon.59f2e898.png"; + url = "http://chat.openai.com/"; + }; + { + name = "PlayPhrase.me"; + url = "https://www.playphrase.me/#/search"; + } + { + name = "ME_Level.zip - Google Drive"; + #"iconUri": "https://ssl.gstatic.com/images/branding/product/1x/drive_2020q4_32dp.png"; + url = "https://drive.google.com/file/d/0B48AER7xMpf7WUNWUzlRMjZqV28/view"; + } + { + name = "Swiss Propaganda Research – Das Medienforschungsprojekt"; + #"iconUri": "https://i0.wp.com/swprs.org/wp-content/uploads/2020/08/cropped-swiss-policy-research-logo.png?fit=192%2C192&ssl=1"; + url = "https://swprs.org/"; + } + { + name = "BioHack Academy · GitHub"; + #"iconUri": "https://github.com/fluidicon.png"; + url = "https://github.com/BioHackAcademy"; + } + { + name = "MarketPlace Bundle"; + #"iconUri": "fake-favicon-uri:https://saas.templatebundle.net/dashboard"; + url = "https://saas.templatebundle.net/dashboard"; + } + { + name = "hak5 pentest"; + #"iconUri": "fake-favicon-uri:https://shop.hak5.org/"; + url = "https://shop.hak5.org/"; + } + { + name = "Psytrance Guide"; + url = "http://psytranceguide.com/"; + } + { + name = "Viddyoze"; + #"iconUri": "https://app.viddyoze.com/assets/images/favicon/android-icon-192x192.png"; + url = "https://app.viddyoze.com/templates"; + } + { + name = "Websec faq"; + #"iconUri": "https://websec.fr/static/img/favicon.png"; + url = "https://websec.fr/faq"; + } + { + name = "BigBundle-Videos"; + #"iconUri": "https://cdn01.boxcdn.net/_assets/img/favicons/android-chrome-192x192-96i97M.png"; + url = "https://grafup.app.box.com/s/nxz6ls7sc84cu0jwseh44q94zxvjoh2u/folder/49079496225"; + } + { + name = "Webmaster-Deals VIP"; + #"iconUri": "https://s3-eu-west-1.amazonaws.com/landingi-editor-uploads/2HsS2Ibf/favicon.png"; + url = "https://vip.webmaster-deals.com/thanks-90theryt?thrivecart%5Baccount_id%5D=8777&thrivecart%5Baccount_name%5D=bundle&thrivecart%5Bcustomer%5D%5Bemail%5D=robert.jeutter%40web.de&thrivecart%5Bcustomer%5D%5Bfirstname%5D=Robert&thrivecart%5Bcustomer%5D%5Blastname%5D=Jeutter&thrivecart%5Bcustomer%5D%5Baddress%5D%5Bline1%5D=Bergrat-Voigt-Stra%26szlig%3Be+21&thrivecart%5Bcustomer%5D%5Baddress%5D%5Bcity%5D=Ilmenau&thrivecart%5Bcustomer%5D%5Baddress%5D%5Bzip%5D=98693&thrivecart%5Bcustomer%5D%5Baddress%5D%5Bcountry%5D=DE&thrivecart%5Border%5D%5B0%5D%5Bt%5D=product&thrivecart%5Border%5D%5B0%5D%5Bid%5D=4&thrivecart%5Border%5D%5B0%5D%5Bn%5D=Webmaster-Deals+VIP&thrivecart%5Border%5D%5B0%5D%5Bp%5D=0&thrivecart%5Border%5D%5B0%5D%5Bq%5D=1&thrivecart%5Border%5D%5B0%5D%5Bpo%5D=30854&thrivecart%5Border%5D%5B1%5D%5Bt%5D=bump&thrivecart%5Border%5D%5B1%5D%5Bid%5D=4&thrivecart%5Border%5D%5B1%5D%5Bn%5D=Get+2%2C000+HD+and+500+4K+royalty+free+videos&thrivecart%5Border%5D%5B1%5D%5Bp%5D=0&thrivecart%5Border%5D%5B1%5D%5Bq%5D=1&thrivecart%5Border_currency%5D=USD&thrivecart%5Border_id%5D=6395923&thrivecart%5Bpayment_processor%5D=stripe&thrivecart%5Bproduct_id%5D=4&thrivecart%5Bpurchases%5D%5B0%5D=4&thrivecart%5Bpurchases%5D%5B1%5D=bump&thrivecart_hash=d261198984d6f463363a4aca99778d3b"; + } + { + name = "40K Cosplay: Armor Creation for the Sisters of Battle"; + #"iconUri": "https://www.belloflostsouls.net/wp-content/uploads/2018/03/favicon.png"; + url = "https://www.belloflostsouls.net/2019/11/40k-cosplay-armor-creation-for-the-sisters-of-battle-squad-pt-2.html"; + } + { + name = "kogakure.de - Ninja; Ninjutsu und Kampfkunst"; + url = "https://www.kogakure.de/"; + } + { + name = "Analysiere | Webbkoll - dataskydd.net"; + #"iconUri": "https://webbkoll.dataskydd.net/images/favicon-192x192.png"; + url = "https://webbkoll.dataskydd.net/de?url=http%3A%2F%2Fnorthscorp.de"; + } + { + name = "https://erpnext.com/"; + #"iconUri": "https://erpnext.com/files/ERPNext%20-%20Blue%20Background-64.png"; + url = "https://erpnext.com/"; + } + { + name = "DIY Robotic Sky Tracking Astrophotography"; + #"iconUri": "https://learn.adafruit.com/assets/favicon-11d9964de07961a3a796b93805a7a240050c6b9f27a213b4002f3ed1efbe2a44.ico"; + url = "https://learn.adafruit.com/diy-robotic-sky-tracking-astrophotography-mount/taking-pictures"; + } + { + name = "Pixpa - All-inclusive; erschwingliche Preispläne"; + url = "https://www.pixpa.com/de/pricing"; + } + { + name = "Masterposts; Collected! - Makeup for Beginners"; + url = "https://masterposter.tumblr.com/post/116605714860"; + } + { + name = "OpenAI"; + #"iconUri": "https://chat.openai.com/apple-touch-icon.png"; + url = "https://chat.openai.com/chat"; + } + { + name = "KEYOU GmbH | Smart. Simple. Sustainable. – emission-free technology."; + #"iconUri": "https://www.keyou.de/wp-content/uploads/2022/09/cropped-keyou_motorblock_transparent-1-1-192x192.png"; + url = "https://www.keyou.de/"; + } + { + name = "CUCKOO Premium Multikocher | CMC-QSB501S - 8 IN 1 MULTI COOKER | 11 COOKING PROGRAMS – CuckooMall.de"; + #"iconUri": "https://cdn.shopify.com/s/files/1/0095/6461/8812/files/logo16x16_b74130e5-41b6-416f-b49c-87519f94e3b8_32x32.png?v=1613542040"; + url = "https://www.cuckoomall.de/collections/multicooker/products/copy-of-cmc-qsb501s-premium-multikocher-icook-q5-cmc-qsb501s-premium-multi-cooker-icook-q5"; + } + { + name = "SeaFrogs 40m/130ft Underwater camera housing for Canon EOS R6 with 6\" – seafrogs"; + #"iconUri": "https://seafrogs.com.hk/cdn/shop/files/favicon_32x32.png?v=1632210049"; + url = "https://seafrogs.com.hk/collections/canon/products/seafrogs-40m-130ft-underwater-camera-housing-for-canon-eos-r6-with-6-dry-dome-port"; + } + { + name = "Why it'll be hard to tell if AI ever becomes conscious | MIT Technology Review"; + url = "https://www.technologyreview.com/2023/10/17/1081818/why-itll-be-hard-to-tell-if-ai-ever-becomes-conscious/"; + } + { + name = "Can We Stop Time in the Body? - Nautilus"; + #"iconUri": "https://nautil.us/wp-content/themes/nautilus-block-theme/images/favicon.png"; + url = "https://nautil.us/can-we-stop-time-in-the-body-377844/"; + } + { + name = "SPIRES: building structured knowledge bases from unstructured text using Large Language Models | by Monarch Initiative | Medium"; + #"iconUri": "https://miro.medium.com/v2/resize:fill:152:152/1*sHhtYhaCe2Uc3IU0IgKwIQ.png"; + url = "https://monarchinit.medium.com/spires-building-structured-knowledge-bases-from-unstructured-text-using-large-language-models-eb68c12dea75"; + } + { + name = "Falling Behind In Style – explosive and continuous growth is bad for tech | Christian Heilmann"; + #"iconUri": "https://christianheilmann.com/favicon.svg"; + url = "https://christianheilmann.com/2023/10/17/falling-behind-in-style-explosive-and-continuous-growth-is-bad-for-tech/"; + } + { + name = "Six different visions for the future of generative AI – Nocode functions - blog – The journey of an academic and app developer"; + url = "https://nocodefunctions.com/blog/visions-generative-ai/"; + } + { + name = "Your curated GitHub Universe agenda: AI; ethics; and productivity - The GitHub Blog"; + #"iconUri": "https://github.blog/wp-content/uploads/2019/01/cropped-github-favicon-512.png?fit=192%2C192"; + url = "https://github.blog/2023-10-17-your-curated-github-universe-agenda-ai-ethics-and-productivity/"; + } + { + name = "Baidu's ERNIE 4.0 turns one person into 'an AI marketing team' | VentureBeat"; + #"iconUri": "https://venturebeat.com/wp-content/themes/vb-news/img/favicon.ico"; + url = "https://venturebeat.com/ai/baidu-launches-new-llm-ernie-4-0-that-turns-one-person-into-an-ai-marketing-team/"; + } + { + name = "Converse - Your AI Powered Reading Companion for web articles; PDF documents and videos"; + url = "https://www.getconverse.com/"; + } + { + name = "Ein SaaS-Unternehmen in Deutschland bootstrappen: So habe ich's gemacht"; + #"iconUri": "https://lukashermann.dev/apple-touch-icon.png"; + url = "https://lukashermann.dev/writing/saas-unternehmen-in-deutschland-bootstrappen/"; + } + { + name = "50+ Sketchbook Inspiration Examples That Will Change The Way You Use Your Sketchbooks - How to Draw Step by Step Drawing Tutorials"; + #"iconUri": "https://www.drawinghowtodraw.com/stepbystepdrawinglessons/wp-content/uploads/2015/09/logo.png"; + url = "https://www.drawinghowtodraw.com/stepbystepdrawinglessons/2020/10/50-sketchbook-inspiration-examples-that-will-change-the-way-you-use-your-sketchbooks/"; + } + { + name = "A historic agreement aims to pave the way for large scale solar farms : NPR"; + #"iconUri": "https://media.npr.org/chrome/favicon/favicon-16x16.png"; + url = "https://www.npr.org/2023/10/13/1205855987/a-historic-agreement-aims-to-pave-the-way-for-large-scale-solar-farms"; + } + { + name = "Mindblowing dissertations – The Ideophone"; + #"iconUri": "https://ideophone.org/files/cropped-android-chrome-512x512-1-192x192.png"; + url = "https://ideophone.org/mindblowing-dissertations/"; + } + { + name = "Swarmpunk: Rough Consensus and Running Code in Brains; Machines; and Society - swarmpunk_repo.pdf"; + url = "https://jon-e.net/dissertation/assets/swarmpunk_repo.pdf"; + } + { + name = "The Recovering Programmer"; + url = "https://prog21.dadgum.com/56.html"; + } + { + name = "cpacker/MemGPT: Teaching LLMs memory management for unbounded context 📚🦙"; + #"iconUri": "https://github.com/fluidicon.png"; + url = "https://github.com/cpacker/MemGPT"; + } + { + name = "perfectionism and pragmatism"; + #"iconUri": "https://johnsillings.com/apple-touch-icon.png"; + url = "https://johnsillings.com/2021/11/25/perfectionism.html"; + } + { + name = "Introduction to Modern Statistics (2nd Ed) - 8 Linear regression with multiple predictors"; + #"iconUri": "https://openintro-ims2.netlify.app/images/openintro.png"; + url = "https://openintro-ims2.netlify.app/08-model-mlr"; + } + { + name = "One Game; By One Man; On Six Platforms: The Good; The Bad and The Ugly"; + #"iconUri": "https://ruoyusun.com/apple-touch-icon.png"; + url = "https://ruoyusun.com/2023/10/12/one-game-six-platforms.html"; + } + { + name = "LLM Inference Performance Engineering: Best Practices | Databricks Blog"; + #"iconUri": "https://www.databricks.com/en-blog-assets/icons/icon-512x512.png?v=c9b9916c3b27dc51866c46b79a6e9b88"; + url = "https://www.databricks.com/blog/llm-inference-performance-engineering-best-practices"; + } + { + name = "Why can't our tech billionaires learn anything new?"; + #"iconUri": "https://substackcdn.com/image/fetch/f_auto;q_auto:good;fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9e6d063b-0f20-41cb-8509-def5d941fa35%2Fapple-touch-icon-1024x1024.png"; + url = "https://davekarpf.substack.com/p/why-cant-our-tech-billionaires-learn"; + } + { + name = "Exploring the World of Tea: A Guide to the Types of Tea"; + #"iconUri": "https://brewteaful.com/cdn/shop/files/download.svg?crop=center&height=32&v=1697036953&width=32"; + url = "https://brewteaful.com/blogs/the-tea-brew-blog/exploring-the-world-of-tea-a-guide-to-the-types-of-tea-starbucks-serves"; + } + { + name = "Petti's Blog"; + #"iconUri": "https://assets-global.website-files.com/64e50ad3f2b2f8b3eb1e0091/651f25186008609ad826ec53_petti.blog%20webclip.png"; + url = "https://www.petti.blog/blog-posts/selling-the-first-mobile-app-i-ever-built-to-jocko"; + } + { + name = "I Am Happy Not To Be A Web Developer Anymore"; + #"iconUri": "https://thecodist.com/content/images/size/w256h256/2023/04/icon2-1.png"; + url = "https://thecodist.com/i-am-happy-not-to-be-a-web-developer-anymore/"; + } + { + name = "Business of Software 2023"; + #"iconUri": "https://www.haihai.ai/content/images/size/w256h256/2023/08/haihai_blue_texture-and-text_screen-background--1--copy.jpeg"; + url = "https://www.haihai.ai/bos/"; + } + { + name = "Getting Started with Anchor for Local Development | by Ben Burkert | Oct; 2023 | Effortless Encryption"; + url = "https://blog.anchor.dev/getting-started-with-anchor-for-local-development-6dd2cd605c08"; + } + { + name = "Every Software Business Has the Same Playbook"; + url = "https://every.to/napkin-math/every-software-business-has-the-same-playbook#"; + } + { + name = "Building a Valuable Business? It's How You Spend It That Matters - Commoncog"; + #"iconUri": "https://commoncog.com/content/images/size/w256h256/2020/09/commoncog_logo-1.png"; + url = "https://commoncog.com/build-valuable-business-how-you-spend-it/"; + } + { + name = "Depression and OSS - Balázs Orbán"; + #"iconUri": "https://balazsorban.com/favicon.ico?v=2"; + url = "https://balazsorban.com/blog/depression-and-oss"; + } + { + name = "Always cheer"; + #"iconUri": "https://world.hey.com/jason/avatar-9f11ce77d31e68e834c564594ee0bc32a005ee8d"; + url = "https://world.hey.com/jason/always-cheer-ccd76145"; + } + { + name = "Compassion Is Not About Being ‘Nice’ — Compassionate Coding"; + #"iconUri": "https://images.squarespace-cdn.com/content/v1/57966a48725e2592957c2e40/1526336432008-5WOO7JQ37SXPMZAO5KZT/favicon.ico?format=100w"; + url = "https://compassionatecoding.com/blog/2020/9/21/compassion-is-not-about-being-nice"; + } + { + name = "Why Experienced Programmers Fail Coding Interviews | by The Coding Diaries | The Coding Diaries | Medium"; + #"iconUri": "https://miro.medium.com/v2/resize:fill:152:152/1*sHhtYhaCe2Uc3IU0IgKwIQ.png"; + url = "https://medium.com/the-coding-diaries/why-experienced-programmers-fail-coding-interviews-b22210ba343"; + } + { + name = "The boy who cried risk – Ognjen Regoje • ognjen.io"; + #"iconUri": "https://ognjen.io/images/favicon-196x196.png"; + url = "https://ognjen.io/the-boy-who-cried-risk/"; + } + { + name = "Listen | No Mercy / No Malice"; + #"iconUri": "https://www.profgalloway.com/wp-content/uploads/2021/03/cropped-nmnm-favicon-192x192.png"; + url = "https://www.profgalloway.com/listen/"; + } + { + name = "Learn to never be wrong. | Irrational Exuberance"; + url = "https://lethain.com/learn-to-never-be-wrong/"; + } + { + name = "Can We Make Idiot-Proof Infrastructure pt1?"; + #"iconUri": "https://matduggan.com/content/images/size/w256h256/2021/04/gitlab-fill.png"; + url = "https://matduggan.com/idiot-proof-infrastructure/"; + } + { + name = "Generating Personalized Audio Lessons with GPT and SSML"; + #"iconUri": "https://www.amefi.no/icon?1e2ec37b29f4312e"; + url = "https://www.amefi.no/projects/gpt-tutor"; + } + { + name = "Understanding Big O Notation: A Simplified Guide for Programmers - v0rkath"; + #"iconUri": "https://www.v0rkath.com/wp-content/uploads/2023/09/v0rkath-white-logo.png"; + url = "https://www.v0rkath.com/blog/understanding-big-o-notation-a-beginnerss-guide/"; + } + { + name = "The Economics of Startup Swag"; + #"iconUri": "https://www.thediff.co/content/images/size/w256h256/2022/02/difflogo-3.png"; + url = "https://www.thediff.co/archive/the-economics-of-startup-swag/"; + } + { + name = "Create a Simple and Safe Codebase"; + #"iconUri": "https://spin.atomicobject.com/wp-content/themes/spin/images/favicon.ico"; + url = "https://spin.atomicobject.com/2023/10/24/safe-codebase/"; + } + { + name = "The Journey of Becoming a CTO"; + url = "https://shamun.dev/posts/cto-journey"; + } + { + name = "ByteByteGoHq/system-design-101: Explain complex systems using visuals and simple terms. Help you prepare for system design interviews."; + #"iconUri": "https://github.com/fluidicon.png"; + url = "https://github.com/ByteByteGoHq/system-design-101"; + } + { + name = "Tapfolio | A better link in bio"; + #"iconUri": "https://tapfol.io/favicon.png"; + url = "https://tapfol.io/account"; + } + { + name = "The Deep-Rooted Science of Habits"; + #"iconUri": "https://assets-global.website-files.com/63624335410aba3df9a7c18f/63624335410aba4a45a7c20d_webclip_256x256.png"; + url = "https://www.habitopia.app/the-deep-rooted-science-of-habits"; + } + { + name = "How To Move Fast With Rust | Matthias Endler"; + url = "https://endler.dev/2023/move-fast-rust/"; + } + { + name = "Why I have my own web site | snarfed.org"; + url = "https://snarfed.org/2012-07-25_why_i_have_my_own_web_site"; + } + { + name = "100R — computing and sustainability"; + #"iconUri": "https://100r.co/media/services/shortcut.png"; + url = "https://100r.co/site/computing_and_sustainability.html"; + } + { + name = "Do programming certifications still matter? | InfoWorld"; + #"iconUri": "https://idge.staticworld.net/ifw/IFW_logo_social_144x144.png"; + url = "https://www.infoworld.com/article/3709508/do-programming-certifications-still-matter.html"; + } + { + name = "How to name a startup"; + #"iconUri": "https://media.beehiiv.com/cdn-cgi/image/fit=scale-down;format=auto;onerror=redirect;quality=80/uploads/publication/logo/7fdac29a-5ff4-4387-811b-3e46b591a807/thumb_Fun.png"; + url = "https://marclou.beehiiv.com/p/how-to-name-a-startup"; + } + { + name = "Caricatures of Security People"; + #"iconUri": "https://static.wixstatic.com/media/683b4b_c286142602bd4073a0bd7186eb9ed91e%7Emv2.png/v1/fill/w_192%2Ch_192%2Clg_1%2Cusm_0.66_1.00_0.01/683b4b_c286142602bd4073a0bd7186eb9ed91e%7Emv2.png"; + url = "https://www.philvenables.com/post/caricatures-of-security-people"; + } + { + name = "Make Yourself Human Again"; + #"iconUri": "https://pdmedia.b-cdn.net/2018/09/logo-2-300x300.jpg"; + url = "https://www.palladiummag.com/2023/11/03/make-yourself-human-again/"; + } + { + name = "Ecological Threat Report 2023 - World | ReliefWeb"; + #"iconUri": "https://reliefweb.int/themes/custom/common_design_subtheme/favicon.ico"; + url = "https://reliefweb.int/report/world/ecological-threat-report-2023"; + } + { + name = "Gavin D. Howard"; + #"iconUri": "https://gavinhoward.com/icon.svg"; + url = "https://gavinhoward.com/"; + } + { + name = "On Solving - Adam Grant"; + #"iconUri": "https://publish.obsidian.md/favicon.ico?95d9d9d3ff25b12adb87"; + url = "https://www.adamgrant.info/Being+a+Better+Human/On+Solving"; + } + { + name = "Material | The Catalog"; + #"iconUri": "https://thecatalog.cat/android-chrome-512x512.png"; + url = "https://thecatalog.cat/Material"; + } + { + name = "Constructing knowledge graphs from text using OpenAI functions | by Tomaz Bratanic | Oct; 2023 | Medium"; + #"iconUri": "https://miro.medium.com/v2/resize:fill:152:152/1*sHhtYhaCe2Uc3IU0IgKwIQ.png"; + url = "https://bratanic-tomaz.medium.com/constructing-knowledge-graphs-from-text-using-openai-functions-096a6d010c17"; + } + { + name = "raylene/eng-handbook: A developer's guide to management: an open-sourced handbook for leading software engineering teams."; + #"iconUri": "https://github.com/fluidicon.png"; + url = "https://github.com/raylene/eng-handbook"; + } + { + name = "No Margin; No Mission"; + url = "https://every.to/no-small-plans/no-margin-no-mission"; + } + { + name = "The promise of collective superintelligence | VentureBeat"; + #"iconUri": "https://venturebeat.com/wp-content/themes/vb-news/img/favicon.ico"; + url = "https://venturebeat.com/ai/the-promise-of-collective-superintelligence/"; + } + { + name = "AddyOsmani.com - Effective Engineering Teams"; + #"iconUri": "https://addyosmani.com/assets/images/favicons/android-chrome-192x192.png"; + url = "https://addyosmani.com/blog/effective-teams/"; + } + { + name = "GrilloPress - Do the design digging"; + #"iconUri": "https://grillopress.github.io/images/me.jpg"; + url = "https://grillopress.github.io/2023/11/08/do-the-design-digging.html"; + } + { + name = "PhotoFolder/app"; + #"iconUri": "https://github.com/fluidicon.png"; + url = "https://github.com/PhotoFolder/app"; + } + { + name = "Photoshop for text — Steph Ango"; + #"iconUri": "https://stephango.com/icon.svg"; + url = "https://stephango.com/photoshop-for-text"; + } + { + name = "Aalto FITech101 Courses"; + #"iconUri": "https://fitech101.aalto.fi/favicon.svg"; + url = "https://fitech101.aalto.fi/programming-languages/rust/1-introduction/"; + } + { + name = "The Johari Window: A Guide for Leaders"; + #"iconUri": "https://www.leadingsapiens.com/content/images/size/w256h256/2022/05/LS-logo.png"; + url = "https://www.leadingsapiens.com/johari-window-complete-guide-for-leaders/"; + } + { + name = "What I Know About Community Building | by Marianna Gose Martinelli | The Startup | Medium"; + #"iconUri": "https://miro.medium.com/v2/resize:fill:152:152/1*sHhtYhaCe2Uc3IU0IgKwIQ.png"; + url = "https://medium.com/swlh/what-i-know-about-community-building-939aeac0aa7"; + } + { + name = "Super Human: Scientists enhance cognitive abilities through direct brain stimulation"; + #"iconUri": "https://static.wixstatic.com/media/e914e2_5e30284639664d1b924b2274c1a0b703%7Emv2.png/v1/fill/w_192%2Ch_192%2Clg_1%2Cusm_0.66_1.00_0.01/e914e2_5e30284639664d1b924b2274c1a0b703%7Emv2.png"; + url = "https://www.thebrighterside.news/post/super-human-scientists-enhance-cognitive-abilities-through-direct-brain-stimulation"; + } + { + name = "GPU Survival Toolkit for the AI age: The bare minimum every developer must know"; + #"iconUri": "https://journal.hexmos.com/content/images/size/w256h256/format/png/2023/05/hexmoslogo--1-.svg"; + url = "https://journal.hexmos.com/gpu-survival-toolkit/"; + } + { + name = "KnowledgeCanvas/knowledge: Knowledge is a tool for saving; searching; accessing; exploring and chatting with all of your favorite websites; documents and files."; + #"iconUri": "https://github.com/fluidicon.png"; + url = "https://github.com/KnowledgeCanvas/knowledge"; + } + { + name = "A Work Log Template for Software Engineers - The Pragmatic Engineer"; + #"iconUri": "https://blog.pragmaticengineer.com/content/images/size/w256h256/2020/10/Gergely_Orosz_BW_250x250.png"; + url = "https://blog.pragmaticengineer.com/work-log-template-for-software-engineers/"; + } + { + name = "Building a Web App in Rust - Dmitry Kudryavtsev"; + #"iconUri": "https://www.yieldcode.blog/favicon.png"; + url = "https://www.yieldcode.blog/post/building-a-webapp-in-rust/"; + } + { + name = "Aerobic exercise is good for the brain"; + #"iconUri": "https://substackcdn.com/image/fetch/f_auto;q_auto:good;fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79861cf1-a10e-4e6e-b628-72352a125d6f%2Fapple-touch-icon-1024x1024.png"; + url = "https://brainpizza.substack.com/p/why-aerobic-exercise-is-good-for"; + } + { + name = "Incomplete List of Mistakes in the Design of CSS"; + #"iconUri": "https://wiki.csswg.org/lib/tpl/csswg/images/favicon.ico"; + url = "https://wiki.csswg.org/ideas/mistakes"; + } + { + name = "Demystifying Web Push Notifications | PQVST"; + url = "https://pqvst.com/2023/11/21/web-push-notifications/"; + } + { + name = "The Bond villain compliance strategy"; + #"iconUri": "https://www.bitsaboutmoney.com/content/images/size/w256h256/2022/12/bam-logo-square-favicon.png"; + url = "https://www.bitsaboutmoney.com/archive/bond-villain-compliance-strategy/"; + } + { + name = "udlbook"; + url = "https://udlbook.github.io/udlbook/"; + } + { + name = "Get started with technical writing - OpenSource.net"; + #"iconUri": "https://i0.wp.com/opensource.net/wp-content/uploads/2023/09/cropped-2.jpg?fit=192%2C192&ssl=1"; + url = "https://opensource.net/get-started-with-technical-writing/"; + } + { + name = "About | PQVST"; + url = "https://pqvst.com/about/"; + } + { + name = "federico-busato/Modern-CPP-Programming: Modern C++ Programming Course (C++11/14/17/20)"; + #"iconUri": "https://github.com/fluidicon.png"; + url = "https://github.com/federico-busato/Modern-CPP-Programming"; + } + { + name = "A guide to home row mods"; + #"iconUri": "https://precondition.github.io/assets/images/favicon.png"; + url = "https://precondition.github.io/home-row-mods"; + } + { + name = "10 Dark Patterns in UX Design and How to Avoid Them | Dodonut"; + url = "https://dodonut.com/blog/10-dark-patterns-in-ux-design/"; + } + { + name = "Writing a file system from scratch in Rust · carlosgaldino"; + #"iconUri": "https://blog.carlosgaldino.com/public/favicon.ico"; + url = "https://blog.carlosgaldino.com/writing-a-file-system-from-scratch-in-rust.html"; + } + { + name = "Let’s learn how modern JavaScript frameworks work by building one | Read the Tea Leaves"; + #"iconUri": "https://secure.gravatar.com/blavatar/86a4db4d496aa2fad7e47b11a865e80cfbbbac38285b65ff518b9c98aa47f7d7?s=114"; + url = "https://nolanlawson.com/2023/12/02/lets-learn-how-modern-javascript-frameworks-work-by-building-one/"; + } + { + name = "A few words about Blameless culture - cat /dev/braincat /dev/brain"; + url = "https://www.gybe.ca/a-few-words-about-blameless-culture/"; + } + { + name = "Frontiers | Paper Notebooks vs. Mobile Devices: Brain Activation Differences During Memory Retrieval"; + #"iconUri": "https://3718aeafc638f96f5bd6-d4a9ca15fc46ba40e71f94dec0aad28c.ssl.cf1.rackcdn.com/favicon_16x16.ico"; + url = "https://www.frontiersin.org/articles/10.3389/fnbeh.2021.634158/full"; + } + { + name = "Chronobiologist and Nobel Laureate in Medicine Michael Rosbash: ‘Lack of sunlight during the day is worse than electric lighting at night’ | Health | EL PAÍS English"; + #"iconUri": "https://static.elpais.com/dist/resources/images/favicon.ico"; + url = "https://english.elpais.com/health/2023-12-01/chronobiologist-and-nobel-laureate-in-medicine-michael-rosbash-lack-of-sunlight-during-the-day-is-worse-than-electric-lighting-at-night.html"; + } + { + name = "Data-Oriented Design"; + url = "https://www.dataorienteddesign.com/dodbook/"; + } + { + name = "Blog"; + #"iconUri": "https://spacetimedb.com/apple-touch-icon.png"; + url = "https://spacetimedb.com/blog/databases-and-data-oriented-design"; + } + { + name = "What's lost when we photograph life instead of experiencing it?"; + #"iconUri": "https://cdn.theconversation.com/static/tc/@theconversation/ui/dist/esm/logos/web-app-logo-192x192-2d05bdd6de6328146de80245d4685946.png"; + url = "https://theconversation.com/whats-lost-when-we-photograph-life-instead-of-experiencing-it-58392"; + } + { + name = "The surprising connection between after-hours work and decreased productivity | Slack"; + #"iconUri": "https://a.slack-edge.com/80588/marketing/img/meta/favicon-32.png"; + url = "https://slack.com/intl/de-de/blog/news/the-surprising-connection-between-after-hours-work-and-decreased-productivity"; + } + { + name = "Pluralistic: “If buying isn’t owning; piracy isn’t stealing” (08 Dec 2023) – Pluralistic: Daily links from Cory Doctorow"; + #"iconUri": "https://i0.wp.com/pluralistic.net/wp-content/uploads/2020/02/cropped-guillotine-French-Revolution.jpg?fit=192%2C192&ssl=1"; + url = "https://pluralistic.net/2023/12/08/playstationed/#tyler-james-hill"; + } + { + name = "Onsites.fyi"; + url = "https://www.onsites.fyi/"; + } + { + name = "Mundane emotions: Losing yourself in boredom; time and technology - Stephen Murphy; Tim Hill; Pierre McDonagh; Amanda Flaherty; 2023"; + #"iconUri": "https://journals.sagepub.com/pb-assets/Icons/sj-apple-touch-1685528515257.png"; + url = "https://journals.sagepub.com/doi/10.1177/14705931221138617"; + } + { + name = "trustnet — alexander cobleigh / cblgh.org"; + url = "https://cblgh.org/trustnet/"; + } + { + name = "walk and talk | Derek Sivers"; + url = "https://sive.rs/wt"; + } + { + name = "User Interface Typography"; + #"iconUri": "https://imperavi.com/assets/img/favicon/favicon-16x16.png"; + url = "https://imperavi.com/books/ui-typography/"; + } + { + name = "Log • Robb Knight"; + #"iconUri": "https://rknight.me/assets/icons/apple-touch-icon.png"; + url = "https://rknight.me/log/"; + } + { + name = "Nova Mode: The Ultimate ChatGPT Custom Instruction | Nova Spivack"; + #"iconUri": "https://www.novaspivack.com/wp-content/uploads/2009/11/cropped-imageedit_28_8087443549.2-192x192.png"; + url = "https://www.novaspivack.com/technology/nova-mode-the-ultimate-chatgpt-custom-instruction"; + } + { + name = "IndieWeb Blog Posts | James' Coffee Blog"; + url = "https://jamesg.blog/indieweb/"; + } + { + name = "How to Build an Attractive Physique | Bony to Beastly"; + #"iconUri": "https://bonytobeastly.com/wp-content/uploads/2023/06/cropped-bony-to-beastly-bicep-favicon-192x192.png"; + url = "https://bonytobeastly.com/how-to-build-an-attractive-physique/"; + } + { + name = "The Illustrated GPT-2 (Visualizing Transformer Language Models) – Jay Alammar – Visualizing machine learning one concept at a time."; + url = "https://jalammar.github.io/illustrated-gpt2/"; + } + { + name = "What We Lose When Curating Follows the Money"; + #"iconUri": "https://i0.wp.com/hyperallergic-newspack.s3.amazonaws.com/uploads/2020/11/cropped-Hyperallergic-favicon.png?fit=192%2C192&quality=100&ssl=1"; + url = "https://hyperallergic.com/861508/what-we-lose-when-curating-follows-the-money-capturing-moment-tate-modern/"; + } + { + name = "Articles — Home Automation Guy"; + #"iconUri": "https://images.squarespace-cdn.com/content/v1/6403432da91078458f6aeec2/36022016-445b-4095-ae5d-f92ccf132cc5/favicon.ico?format=100w"; + url = "https://www.homeautomationguy.io/blog"; + } + { + name = "The unfortunate math behind consulting companies"; + #"iconUri": "https://longform.asmartbear.com/svg/bear-big.svg"; + url = "https://longform.asmartbear.com/consulting-company-accounting/"; + } + { + name = "Perfectionism and Procrastination: How They’re Connected and What to Do About It – Solving Procrastination"; + #"iconUri": "https://solvingprocrastination.com/wp-content/uploads/cropped-SP_favicon-2-192x192.png"; + url = "https://solvingprocrastination.com/perfectionism/"; + } + { + name = "Writing Lesson; Comment on Tom Friedman"; + #"iconUri": "https://substackcdn.com/image/fetch/f_auto;q_auto:good;fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9220d8-ce6f-4db2-af67-bdf48ad7d229%2Fapple-touch-icon-1024x1024.png"; + url = "https://www.grumpy-economist.com/p/writing-lesson-comment-on-tom-friedman"; + } + { + name = "Why you should grow and keep big muscles · Today Purpose"; + #"iconUri": "https://todaypurpose.com/apple-touch-icon-144-precomposed.png"; + url = "https://todaypurpose.com/posts/big-muscles/"; + } + { + name = "blueprint"; + #"iconUri": "https://freight.cargo.site/t/original/i/876db8ab80d57a1051068fc102a3ff1801b9f80faad465df7144b998bc419295/blueprint-favicon.ico"; + url = "https://protocol.bryanjohnson.com/"; + } + { + name = "PocketBase - Open Source backend in 1 file"; + #"iconUri": "https://pocketbase.io/images/favicon/apple-touch-icon.png"; + url = "https://pocketbase.io/"; + } + { + name = "Stm32World Wiki"; + url = "https://stm32world.com/wiki/Main_Page"; + } + { + name = "Detachable roller skates Puma CA Pro - White / Flaneurz"; + #"iconUri": "https://www.flaneurz.com/media/favicon/stores/1/FAVICON-SITEWEB-SLADES-100PX_1_.png"; + url = "https://www.flaneurz.com/en/detachable-roller-skates-puma-ca-pro-white.html"; + } + { + name = "Home - Sacred-Texts ISTA - Internet Sacred Text Archive"; + url = "https://sacred-texts.com/"; + } + { + name = "OK-Robot: What Really Matters in Integrating Open-Knowledge Models for Robotics"; + url = "https://ok-robot.github.io/"; + } + { + name = "Curated web design inspiration catalog"; + #"iconUri": "https://assets-global.website-files.com/63bd42e1e586a852754fab62/63dbbbc30006fb60dfcb3504_webclip.png"; + url = "https://www.curated.design/#"; + } + { + name = "Dead Simple Sites — Minimal Website Inspiration"; + #"iconUri": "https://framerusercontent.com/images/WFse1XAURJY5WGgW8iyziJLI.png"; + url = "https://deadsimplesites.com/"; + } + { + name = "About Ideas Now | Search 1000s of personal sites"; + url = "https://aboutideasnow.com/"; + } + { + name = "Dioxus | An elegant GUI library for Rust"; + #"iconUri": "https://dioxuslabs.com/static/favicon.png"; + url = "https://dioxuslabs.com/"; + } + { + name = "PNG to SVG (Free; Full Color) - SvgTrace"; + url = "https://svgtrace.com/png-to-svg"; + } + { + name = "Introduction / Nature of Code"; + url = "https://natureofcode.com/introduction/"; + } + { + name = "CS231n Convolutional Neural Networks for Visual Recognition"; + url = "https://cs231n.github.io/"; + } + { + name = "Ilya 30u30"; + #"iconUri": "https://arc.net/favicon.png"; + url = "https://arc.net/folder/D0472A20-9C20-4D3F-B145-D2865C0A9FEE"; + } + { + name = "Minimalisten aufgepasst: Suzuki hat den coolsten Tiny Camper | Ride MTB"; + #"iconUri": "https://www.ride-mtb.com/sites/default/files/favicons/apple-touch-icon.png"; + url = "https://www.ride-mtb.com/de/news/minimalisten-aufgepasst-suzuki-hat-den-coolsten-tiny-camper"; + } + { + name = "taubyte/tau: Open source distributed Platform as a Service (PaaS)"; + #"iconUri": "https://github.com/fluidicon.png"; + url = "https://github.com/taubyte/tau"; + } + { + name = "AnySkin: Plug-and-play Skin Sensing for Robotic Touch"; + url = "https://any-skin.github.io/"; + } + { + name = "The42.life - Your Guide to the Galaxy"; + url = "https://www.the42.life/"; + } + { + name = "Busy Status Bar – Productivity Multi-tool Device with an LED pixel screen"; + #"iconUri": "https://busy.bar/img/tild3537-6566-4933-a565-643230386161__bsb_icon_black.png"; + url = "https://busy.bar/?hn"; + } + { + name = "https://keypub.sh/"; + url = "https://keypub.sh/"; + } + { + name = "Robotics and ROS 2 Essentials - Course Announcement - Henki Robotics"; + #"iconUri": "https://henkirobotics.com/wp-content/uploads/2024/10/cropped-henki_siteicon_square_2-192x192.png"; + url = "https://henkirobotics.com/robotics-and-ros-2-essentials-course-announcement/"; + } + { + name = "Card Generator by Prod.ly"; + #"iconUri": "https://www.prod.ly/images/favicon.ico"; + url = "https://www.prod.ly/card-generator"; + } + { + name = "Paper Apps™ – Gladden Design"; + #"iconUri": "https://gladdendesign.com/cdn/shop/files/gladguy-2020-22.png?crop=center&height=32&v=1715701726&width=32"; + url = "https://gladdendesign.com/collections/paper-apps"; + } + { + name = "SilverBullet"; + #"iconUri": "https://silverbullet.md/.client/favicon.png"; + url = "https://silverbullet.md/"; + } + { + name = "Understanding Reasoning LLMs - by Sebastian Raschka; PhD"; + #"iconUri": "https://substackcdn.com/image/fetch/f_auto;q_auto:good;fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fca9744ac-726d-4947-a030-91ea0ab38e23%2Ffavicon-32x32.png"; + url = "https://magazine.sebastianraschka.com/p/understanding-reasoning-llms"; + } + { + name = "Big Packages or Many Dependencies — Sympolymathesy; by Chris Krycho"; + #"iconUri": "https://v5.chriskrycho.com/assets/images/favicon.ico"; + url = "https://v5.chriskrycho.com/notes/big-packages-or-many-dependencies/"; + } + { + name = "Life Lessons from the First Half-Century of My Career – Communications of the ACM"; + #"iconUri": "https://cacm.acm.org/wp-content/uploads/2023/11/cropped-cropped-cacm_favicon-1.png?w=192"; + url = "https://cacm.acm.org/opinion/life-lessons-from-the-first-half-century-of-my-career/"; + } + ]; + } + ]; + }; + }; + }; + + home = { + sessionVariables.BROWSER = "firefox"; + #persistence."/persist/home/wieerwill" = { + # directories = [ + # ".mozilla/firefox" + # ]; + #}; + }; + +} diff --git a/fonts.nix b/home/fonts.nix similarity index 84% rename from fonts.nix rename to home/fonts.nix index 8065bec..dd30f6e 100644 --- a/fonts.nix +++ b/home/fonts.nix @@ -1,6 +1,10 @@ { config, pkgs, lib, ... }: -{ +let + cfg = config.homeModules.fonts; +in + +lib.mkIf cfg.enable { fonts = { fontconfig = { enable = true; @@ -16,15 +20,13 @@ home.packages = with pkgs; [ emojione nerd-fonts._0xproto - #nerd-fonts.anonymice - #nerd-fonts.atkynson-mono - #nerd-fonts.code-new-roman nerd-fonts.droid-sans-mono nerd-fonts.hack nerd-fonts.noto nerd-fonts.open-dyslexic nerd-fonts.symbols-only nerd-fonts.ubuntu + nerd-fonts.jetbrains-mono ]; } diff --git a/git.nix b/home/git.nix similarity index 61% rename from git.nix rename to home/git.nix index d5aea69..ed75335 100644 --- a/git.nix +++ b/home/git.nix @@ -1,10 +1,22 @@ { config, pkgs, lib, ... }: -{ + + +#let +# gitEmailPath = "${config.xdg.configHome}/git-email"; +#in +let + cfg = config.homeModules.git; +in + +lib.mkIf cfg.enable { programs.git = { enable = true; - userName = "wie" + "erwill"; - userEmail = "robert"+ ".jeutter@" + "gmx.de"; + userName = "wieerwill"; + userEmail = "wieerwill@protonmail.com"; #lib.mkIf (builtins.pathExists gitEmailPath) ( + # lib.strings.removeSuffix "\n" (builtins.readFile gitEmailPath) + #); + lfs.enable = true; aliases = { }; #signing = { diff --git a/home/gnome.nix b/home/gnome.nix new file mode 100644 index 0000000..1ae93cf --- /dev/null +++ b/home/gnome.nix @@ -0,0 +1,114 @@ +{ config, pkgs, lib, ... }: +{ + gnome = { pkgs, ... }: { + config = { + services.xserver.enable = true; + services.xserver.displayManager.gdm.enable = true; + services.xserver.desktopManager.gnome.enable = true; + environment.gnome.excludePackages = (with pkgs; [ + gnome-photos + gnome-tour + ]) ++ (with pkgs.gnome; [ + cheese # webcam tool + gnome-music + epiphany # web browser + geary # email reader + gnome-characters + gnome-contacts + gnome-initial-setup + ]); + programs.dconf.enable = true; + environment.systemPackages = with pkgs; [ + gnome.gnome-tweaks + ] + }; + }; + + gtk = { + enable = true; + + iconTheme = { + name = "Papirus-Dark"; + package = pkgs.papirus-icon-theme; + }; + + theme = { + name = "palenight"; + package = pkgs.palenight-theme; + }; + + cursorTheme = { + name = "Numix-Cursor"; + package = pkgs.numix-cursor-theme; + }; + + gtk3.extraConfig = { + Settings = '' + gtk-application-prefer-dark-theme=1 + ''; + }; + + gtk4.extraConfig = { + Settings = '' + gtk-application-prefer-dark-theme=1 + ''; + }; + }; + + home.sessionVariables.GTK_THEME = "palenight"; + + # Use `dconf watch /` to track stateful changes you are doing, then set them here. + dconf.settings = { + # ... + "org/gnome/shell" = { + favorite-apps = [ + "firefox.desktop" + "code.desktop" + "org.gnome.Terminal.desktop" + "spotify.desktop" + "virt-manager.desktop" + "org.gnome.Nautilus.desktop" + ]; + disable-user-extensions = false; + # `gnome-extensions list` for a list + enabled-extensions = [ + "user-theme@gnome-shell-extensions.gcampax.github.com" + "trayIconsReloaded@selfmade.pl" + "Vitals@CoreCoding.com" + "dash-to-panel@jderose9.github.com" + "sound-output-device-chooser@kgshank.net" + "space-bar@luchrioh" + ]; + + }; + "org/gnome/desktop/interface" = { + color-scheme = "prefer-dark"; + enable-hot-corners = false; + }; + "org/gnome/desktop/wm/preferences" = { + workspace-names = [ "Main" ]; + }; + "org/gnome/desktop/background" = { + picture-uri = "file:///run/current-system/sw/share/backgrounds/gnome/vnc-l.png"; + picture-uri-dark = "file:///run/current-system/sw/share/backgrounds/gnome/vnc-d.png"; + }; + "org/gnome/desktop/screensaver" = { + picture-uri = "file:///run/current-system/sw/share/backgrounds/gnome/vnc-d.png"; + primary-color = "#3465a4"; + secondary-color = "#000000"; + }; + }; + + home.packages = with pkgs; [ + # ... + gnomeExtensions.user-themes + gnomeExtensions.tray-icons-reloaded + gnomeExtensions.vitals + gnomeExtensions.dash-to-panel + gnomeExtensions.sound-output-device-chooser + gnomeExtensions.space-bar + ]; + + + +} diff --git a/home/javascript.nix b/home/javascript.nix new file mode 100644 index 0000000..0a626a3 --- /dev/null +++ b/home/javascript.nix @@ -0,0 +1,70 @@ +{ config, pkgs, lib, ... }: + +let + cfg = config.homeModules.javascript; +in + +lib.mkIf cfg.enable { + home.packages = with pkgs; [ + nodejs_20 # default fallback Node.js + yarn # optional global package manager + pnpm + typescript + nodePackages.eslint + nodePackages.prettier + #nodePackages.npm-check-updates + #nodePackages.astro + #nodePackages."@angular/cli" + #nodePackages.create-react-app + #nodePackages."@next/bundle-analyzer" + #nodePackages.vite + ]; + + programs.zsh = { + shellAliases = { + nrun = "npx"; + nstart = "npm run start"; + dev = "pnpm dev || npm run dev || yarn dev"; + build = "pnpm build || npm run build || yarn build"; + }; + + initContent = '' + export NVM_DIR="$HOME/.nvm" + [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm + [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion + ''; + }; + + # nvm installed manually; Nixpkgs does not manage dynamic Node versions well + home.file.".nvm/nvm.sh".source = pkgs.fetchurl { + url = "https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/nvm.sh"; + sha256 = "sha256-EPSUbf93oq1jyzCRAZLRqkK15Y3EsA92Qpxq6mw8N1c="; + }; + + home.sessionVariables = { + NODE_ENV = "development"; + NVM_DIR = "${config.home.homeDirectory}/.nvm"; + PNPM_HOME = "${config.home.homeDirectory}/.local/share/pnpm"; + # in _home.nix PATH = lib.mkBefore "$PNPM_HOME"; + }; + + # Auto-completions and formatting helpers + programs.direnv.enable = true; + programs.direnv.nix-direnv.enable = true; + + programs.vscode = { + enable = true; + profiles.default.extensions = with pkgs.vscode-extensions; [ + esbenp.prettier-vscode + dbaeumer.vscode-eslint + astro-build.astro-vscode + angular.ng-template + ]; + profiles.default.userSettings = { + "editor.formatOnSave" = true; + "typescript.tsdk" = "node_modules/typescript/lib"; + "eslint.validate" = [ "javascript" "typescript" "javascriptreact" "typescriptreact" ]; + "prettier.requireConfig" = true; + }; + }; +} diff --git a/home/keepass.nix b/home/keepass.nix new file mode 100644 index 0000000..780fd9e --- /dev/null +++ b/home/keepass.nix @@ -0,0 +1,65 @@ +{ config, pkgs, lib, ... }: + +let + dbPath = "${config.home.homeDirectory}/Documents/Passwords/main.kdbx"; # adjust as needed + cfg = config.homeModules.keepass; +in + +lib.mkIf cfg.enable { + home.packages = with pkgs; [ + keepassxc + ]; + + # Optional: Desktop entry tweaks or custom XDG + xdg.mimeApps.defaultApplications = { + "application/x-kdbx" = "org.keepassxc.KeePassXC.desktop"; + }; + + xdg.desktopEntries.keepassxc = { + name = "KeePassXC"; + genericName = "Password Manager"; + exec = "keepassxc %f"; + terminal = false; + categories = [ "Utility" "Security" ]; + mimeType = [ "application/x-kdbx" ]; + }; + + # Autostart with KeePassXC and preload DB + systemd.user.services.keepassxc = { + Unit = { + Description = "KeePassXC Password Manager"; + After = [ "graphical-session.target" ]; + }; + Service = { + ExecStart = "${pkgs.keepassxc}/bin/keepassxc ${dbPath}"; + Restart = "on-abort"; + }; + Install.WantedBy = [ "default.target" ]; + }; + + # Optional system tray icon via environment variable + home.sessionVariables = { + KEEPASSXC_SHOW_SYSTEM_TRAY_ICON = "1"; + }; + + # Browser integration: ensure it's available and optionally install native messaging host + programs.browserpass.enable = true; + + # Optional: configure secrets sync path (e.g. synced with Syncthing) + home.file.".config/keepassxc/config.ini".text = '' + [General] + LastDatabases=${dbPath} + MinimizeToTray=true + StartMinimized=false + AutoOpenDatabasesOnStartup=true + AutoSaveOnExit=true + AutoLockDatabaseIdleMinutes=10 + AutoTypePrependMenu=true + + [Security] + ClearClipboardAfterSeconds=10 + LockDatabaseAfterIdle=true + LockDatabaseOnScreenSaver=true + LockDatabaseOnSessionLock=true + ''; +} diff --git a/home/llm.nix b/home/llm.nix new file mode 100644 index 0000000..4da86ec --- /dev/null +++ b/home/llm.nix @@ -0,0 +1,67 @@ +{ config, pkgs, lib, ... }: + +let + ollamaModelDir = "/mnt/models/ollama"; # ✅ change to your external disk or large partition + modelsToInstall = [ + "llama3" + "mistral" + "codellama" + "gemma" + ]; + cfg = config.homeModules.llm; +in + +lib.mkIf cfg.enable { + home.packages = with pkgs; [ + ollama + opencode + ]; + + # Set up environment variables + home.sessionVariables = { + OLLAMA_MODELS = ollamaModelDir; + OLLAMA_HOST = "127.0.0.1:11434"; + }; + + # Systemd user service for ollama daemon + systemd.user.services.ollama = { + Unit = { + Description = "Ollama LLM Inference Daemon"; + After = [ "network.target" ]; + }; + + Service = { + ExecStart = "${pkgs.ollama}/bin/ollama serve"; + Environment = [ + "OLLAMA_MODELS=${ollamaModelDir}" + "OLLAMA_HOST=127.0.0.1:11434" + ]; + Restart = "on-failure"; + }; + + Install = { + WantedBy = [ "default.target" ]; + }; + }; + + # Setup ollama models via activation script + home.activation.installOllamaModels = lib.hm.dag.entryAfter [ "writeBoundary" ] '' + export OLLAMA_MODELS=${ollamaModelDir} + export OLLAMA_HOST=127.0.0.1:11434 + + mkdir -p ${ollamaModelDir} + + echo "⏳ Checking and pulling ollama models..." + for model in ${builtins.toString modelsToInstall}; do + if ! ${pkgs.ollama}/bin/ollama list | grep -q "$model"; then + ${pkgs.ollama}/bin/ollama pull "$model" + fi + done + ''; + + # Optional aliases for quick usage + programs.zsh.shellAliases = { + llm = "opencode"; + ollama-ui = "xdg-open http://localhost:11434"; + }; +} diff --git a/home/logseq.nix b/home/logseq.nix new file mode 100644 index 0000000..664f7ff --- /dev/null +++ b/home/logseq.nix @@ -0,0 +1,51 @@ +{ config, pkgs, lib, ... }: + +let + notesDir = "${config.home.homeDirectory}/Logseq"; + cfg = config.homeModules.logseq; +in + +lib.mkIf cfg.enable { + home.packages = [ + pkgs.logseq + ]; + + # Ensure notes directory exists + home.file."Logseq/.keep".text = ""; + + # Shell alias + programs.zsh.shellAliases = { + logseq = "logseq ${notesDir}"; + }; + + # Create desktop entry for convenience + xdg.desktopEntries.logseq = { + name = "Logseq"; + genericName = "Markdown Knowledge Base"; + comment = "Open source outliner with local Markdown storage."; + exec = "logseq"; + icon = "logseq"; + type = "Application"; + categories = [ "Office" "NoteTaking" "Utility" ]; + }; + + home.file.".config/logseq/config.edn".text = ''{ + :preferred-theme :light + :page-width 0.7 + :custom-css-path "" + }''; + + # Create default notes directory + home.activation.createLogseqDir = lib.hm.dag.entryAfter [ "writeBoundary" ] '' + mkdir -p "${notesDir}" + ''; + + # Theme & plugins setup (manual step for user) + home.activation.logseqThemeNote = lib.hm.dag.entryAfter ["writeBoundary"] '' + echo "🎨 You can customize Logseq by placing themes and plugins in:" + echo " ${notesDir}/logseq" + echo "" + echo "💡 Example community themes and plugins:" + echo " https://github.com/logseq/awesome-logseq" + ''; +} diff --git a/home/mail.nix b/home/mail.nix new file mode 100644 index 0000000..1583306 --- /dev/null +++ b/home/mail.nix @@ -0,0 +1,72 @@ +{ config, pkgs, lib, ... }: + +let + bridgeAppImage = pkgs.appimageTools.wrapType2 { + pname = "protonmail-bridge"; + version = "3.8.0-beta.1"; + src = pkgs.fetchurl { + url = "https://proton.me/download/bridge/protonmail-bridge-3.8.0-beta.1-linux.AppImage"; + sha256 = "sha256-uhzsV0Q0I9j2y/rfweWeGif5AWe0MGrgZ/3TjpDYdGA="; + }; + }; + + wrapperScript = pkgs.writeShellScriptBin "thunderbird" '' + if ! pgrep -x "protonmail-bridge" > /dev/null; then + systemctl --user start protonmail-bridge.service + sleep 2 # Wait briefly to ensure bridge is ready + fi + exec ${pkgs.thunderbird}/bin/thunderbird "$@" + ''; + cfg = config.homeModules.mail; +in + +lib.mkIf cfg.enable { + home.packages = [ + bridgeAppImage + wrapperScript + ]; + + # Start ProtonMail Bridge as systemd service + systemd.user.services.protonmail-bridge = { + Unit = { + Description = "ProtonMail Bridge (headless)"; + After = [ "network.target" ]; + }; + Service = { + ExecStart = "${bridgeAppImage}/bin/protonmail-bridge --no-window"; + Restart = "on-failure"; + Environment = "PATH=${lib.makeBinPath [ pkgs.glibc pkgs.coreutils pkgs.bash ]}"; + }; + Install.WantedBy = [ "default.target" ]; + }; + + # Preconfigure Thunderbird profile (adjust email as needed) + home.file.".thunderbird/profiles.ini".text = '' + [Install4F96D1932C2A4F9B] + Default=default + Locked=1 + + [Profile0] + Name=default + IsRelative=1 + Path=default + Default=1 + ''; + + home.file.".thunderbird/default/prefs.js".text = '' + user_pref("mail.identity.id1.fullName", "Your Name"); + user_pref("mail.identity.id1.useremail", "your-email@protonmail.com"); + user_pref("mail.identity.id1.smtpServer", "smtp1"); + user_pref("mail.identity.id1.archive_folder", "imap://your-email@protonmail.com/Archives"); + user_pref("mail.account.account1.server", "imap1"); + user_pref("mail.account.account1.identities", "id1"); + user_pref("mail.server.imap1.hostname", "127.0.0.1"); + user_pref("mail.server.imap1.port", 1143); + user_pref("mail.server.imap1.type", "imap"); + user_pref("mail.server.imap1.userName", "your-email@protonmail.com"); + user_pref("mail.smtpserver.smtp1.hostname", "127.0.0.1"); + user_pref("mail.smtpserver.smtp1.port", 1025); + user_pref("mail.smtpserver.smtp1.authMethod", 3); + user_pref("mail.smtpserver.smtp1.username", "your-email@protonmail.com"); + ''; +} diff --git a/home/obsidian.nix b/home/obsidian.nix new file mode 100644 index 0000000..e7cc0bf --- /dev/null +++ b/home/obsidian.nix @@ -0,0 +1,60 @@ +{ config, pkgs, lib, ... }: + +let + vaultName = "main"; + notesDir = "${config.home.homeDirectory}/Obsidian"; + vaultDir = "${notesDir}/${vaultName}"; + plugins = [ + "calendar" + "advanced-tables" + "dataview" + "markdown-formatting-assistant" + ]; + pluginDir = "${vaultDir}/.obsidian/plugins"; + setupPlugins = pkgs.writeShellScriptBin "setup-obsidian-plugins" '' + set -e + mkdir -p "${pluginDir}" + cd "${pluginDir}" + + ${lib.concatMapStringsSep "\n" (plugin: + '' + if [ ! -d "${plugin}" ]; then + echo "Installing plugin: ${plugin}" + git clone --depth=1 https://github.com/obsidianmd/obsidian-releases/tree/master/community-plugins/${plugin} ${plugin} || true + fi + '' + ) plugins} + ''; + cfg = config.homeModules.obsidian; +in + +lib.mkIf cfg.enable { + home.packages = with pkgs; [ + obsidian + setupPlugins + ]; + + # Ensure Notes and vault directory exist + home.file."Obsidian/.keep".text = ""; + + # Shell alias + programs.zsh.shellAliases = { + obsidian = "obsidian ${vaultDir}"; + }; + + # Obsidian desktop entry + xdg.desktopEntries.obsidian = { + name = "Obsidian"; + genericName = "Markdown Notes"; + comment = "A powerful knowledge base with Markdown and local storage."; + exec = "obsidian ${vaultDir}"; + icon = "obsidian"; + type = "Application"; + categories = [ "Office" "TextEditor" "Utility" ]; + }; + + # Reminder to run plugin setup + home.activation.obsidianPluginSetup = lib.hm.dag.entryAfter ["writeBoundary"] '' + echo "💡 Run 'setup-obsidian-plugins' to install default plugins into ${pluginDir}" + ''; +} diff --git a/programs.nix b/home/programs.nix similarity index 76% rename from programs.nix rename to home/programs.nix index 2aa3e43..5aafbbd 100644 --- a/programs.nix +++ b/home/programs.nix @@ -4,25 +4,19 @@ # The home.packages option allows you to install # Nix packages into your environment. home.packages = with pkgs; [ - # List of programs thunderbird - # utility - #ranger vimiv-qt zip unzip signal-desktop - #vscodium vlc keepassxc logseq okular - #firefox borgbackup discord - # utility pulsemixer brightnessctl gammastep # color temperature @@ -36,12 +30,13 @@ # secret management age sops - - # steam deck touch compability in non-steam games - #caribou - #evtest # for input key testing + ]; + programs.nvm = { + enable = true; + }; + programs.direnv.enable = true; } diff --git a/home/redshift.nix b/home/redshift.nix new file mode 100644 index 0000000..a54523a --- /dev/null +++ b/home/redshift.nix @@ -0,0 +1,22 @@ +{ config, pkgs, lib, ... }: + +let + cfg = config.homeModules.redshift; +in + +lib.mkIf cfg.enable { + + services.redshift = { + enable = true; + settings.redshift = { + brightness-day = "1"; + brightness-night = "1"; + }; + temperature = { + day = 5500; + night = 3000; + }; + latitude = "48.864716"; + longitude = "2.349014"; + }; +} \ No newline at end of file diff --git a/home/secrets.nix b/home/secrets.nix new file mode 100644 index 0000000..95b3510 --- /dev/null +++ b/home/secrets.nix @@ -0,0 +1,20 @@ +{ config, lib, pkgs, ... }: + +{ + #imports = [ + # sops-nix.homeManagerModules.sops + #]; + + home.packages = with pkgs; [ sops age ]; + + #sops = { + # enable = true; + # defaultSopsFile = ../secrets/secrets.enc.yaml; + # age.keyFile = "${config.home.homeDirectory}/.config/sops/age/keys.txt"; + + # secrets.test = { + # sopsFile = ../secrets/secrets.enc.yaml; + # path = "%r/test.txt"; # will resolve to $XDG_RUNTIME_DIR/test.txt + # }; + #}; +} diff --git a/home/security.nix b/home/security.nix new file mode 100644 index 0000000..4459ba5 --- /dev/null +++ b/home/security.nix @@ -0,0 +1,26 @@ +{ config, pkgs, lib, ... }: + +let + cfg = config.homeModules.security; +in + +lib.mkIf cfg.enable { + + programs.gpg = { + enable = true; + mutableKeys = true; # allow changes in keys or trust + mutableTrust = true; + #publicKeys = [ + # { + # source = ""; #./path/to/key.a; + # trust = "ultimate"; + # } + #]; + }; + + programs.ssh = { + enable = true; + addKeysToAgent = "yes"; # let home manager manage ssh keys + }; + +} diff --git a/home/social.nix b/home/social.nix new file mode 100644 index 0000000..d558cad --- /dev/null +++ b/home/social.nix @@ -0,0 +1,60 @@ +{ config, pkgs, lib, ... }: + +let + cfg = config.homeModules.social; +in + +lib.mkIf cfg.enable { + home.packages = with pkgs; [ + # WhatsApp (via webapp in browser or Electron wrapper) + whatsapp-for-linux + + # Telegram Desktop client + telegram-desktop + + # Signal + signal-desktop + + # Discord + discord + + # Zoom (unfree) + zoom-us + + # Mastodon (via browser or desktop client) + #tootle # or choose “sengi” or “mastodon” Electron client if preferred + + # Matrix client + element-desktop + ]; + + # Optional: associate default browser-based apps + xdg.mimeApps = { + enable = true; + defaultApplications = { + "x-scheme-handler/https" = [ "firefox.desktop" ]; + "x-scheme-handler/http" = [ "firefox.desktop" ]; + }; + }; + + # Optional: start messaging apps on login + systemd.user.services = { + signal-desktop = { + Unit.Description = "Signal Desktop"; + Service = { + ExecStart = "${pkgs.signal-desktop}/bin/signal-desktop"; + Restart = "on-failure"; + }; + Install.WantedBy = [ "default.target" ]; + }; + + telegram-desktop = { + Unit.Description = "Telegram Desktop"; + Service = { + ExecStart = "${pkgs.telegram-desktop}/bin/telegram-desktop"; + Restart = "on-failure"; + }; + Install.WantedBy = [ "default.target" ]; + }; + }; +} diff --git a/home/sway.nix b/home/sway.nix new file mode 100644 index 0000000..217bbfa --- /dev/null +++ b/home/sway.nix @@ -0,0 +1,142 @@ +{ config, pkgs, lib, ... }: + +let + display1 = "card0-eDP-1"; + workspace1 = "1:Web"; + workspace2 = "2:App"; + workspace3 = "3:Chat"; + workspace4 = "4:Read"; + workspace5 = "5:Code"; + workspace6 = "6:Password"; + workspace7 = "7:Shell"; + workspace8 = "8:Media"; + cfg = config.homeModules.sway; +in + +lib.mkIf cfg.enable { + wayland.windowManager.sway = { + enable = true; + wrapperFeatures.gtk = true; + config = rec { + modifier = "Mod4"; # Windows key + terminal = "alacritty"; + menu = "bemenu-run"; + + startup = [ + { command = "swaymsg workspace ${workspace5}; exec nvim"; } + { command = "keepassxc"; } + { command = "logseq"; } + { command = "dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP XDG_SESSION_TYPE NIXOS_OZONE_WL XCURSOR_THEME XCURSOR_SIZE PATH"; } + { command = "systemctl --user start sway-session.target"; } + { command = "swaymsg workspace ${workspace7}; exec ${terminal}"; } + ]; + + input = { + "type:keyboard" = { + xkb_layout = "de"; + repeat_delay = "600"; + repeat_rate = "25"; + }; + + "type:pointer" = { + natural_scroll = "false"; + left_handed = "false"; + middle_emulation = "true"; + }; + + "*" = { + xkb_layout = "de"; + }; + }; + + output = { + "${display1}" = { + res = "1920x1080"; + pos = "0 0"; + scale = "1"; + }; + + "*" = { + scale = "1"; + }; + }; + + keybindings = { + # Launch terminal and menu + "${modifier}+Return" = "exec ${terminal}"; + "${modifier}+d" = "exec ${menu}"; + + # Kill focused window + "${modifier}+Shift+q" = "kill"; + + # Reload and exit sway + "${modifier}+Shift+c" = "reload"; + "${modifier}+Shift+e" = "exec 'swaynag -t warning -m \"Exit Sway?\" -b \"Yes\" \"swaymsg exit\"'"; + + # Lock screen manually + "${modifier}+l" = "exec swaylock"; + + # Screenshot tools + "Print" = "exec grimshot save area"; + "${modifier}+Shift+s" = "exec grimshot save window"; + "${modifier}+s" = "exec grimshot save screen"; + + # Workspace switching + "${modifier}+1" = "workspace ${workspace1}"; + "${modifier}+2" = "workspace ${workspace2}"; + "${modifier}+3" = "workspace ${workspace3}"; + "${modifier}+4" = "workspace ${workspace4}"; + "${modifier}+5" = "workspace ${workspace5}"; + "${modifier}+6" = "workspace ${workspace6}"; + "${modifier}+7" = "workspace ${workspace7}"; + "${modifier}+8" = "workspace ${workspace8}"; + + # Move focused container to a workspace + "${modifier}+Shift+1" = "move container to workspace ${workspace1}"; + "${modifier}+Shift+2" = "move container to workspace ${workspace2}"; + "${modifier}+Shift+3" = "move container to workspace ${workspace3}"; + "${modifier}+Shift+4" = "move container to workspace ${workspace4}"; + "${modifier}+Shift+5" = "move container to workspace ${workspace5}"; + "${modifier}+Shift+6" = "move container to workspace ${workspace6}"; + "${modifier}+Shift+7" = "move container to workspace ${workspace7}"; + "${modifier}+Shift+8" = "move container to workspace ${workspace8}"; + }; + + workspaceOutputAssign = [ + { + workspace = workspace1; + output = display1; + } + ]; + + assigns = { + "${workspace1}" = [ { app_id = "firefox"; } ]; + "${workspace3}" = [ { class = "Signal"; } ]; + "${workspace5}" = [ { class = "nvim"; } ]; + "${workspace6}" = [ { app_id = "org.keepassxc.KeePassXC"; } ]; + "${workspace7}" = [ { app_id = "Alacritty"; } ]; + }; + }; + }; + + services.swayidle = { + enable = true; + timeouts = [ + { + timeout = 300; + command = lib.getExe config.programs.swaylock.package; + } + ]; + }; + + programs.swaylock = { + enable = true; + settings = { + font = "JetBrainsMono Nerd Font"; + screenshots = true; + clock = true; + show-failed-attempts = true; + indicator-idle-visible = true; + }; + }; +} diff --git a/home/syncthing.nix b/home/syncthing.nix new file mode 100644 index 0000000..b52657c --- /dev/null +++ b/home/syncthing.nix @@ -0,0 +1,101 @@ +{ config, pkgs, lib, ... }: + +let + syncthingFolderBase = "${config.home.homeDirectory}/"; # default sync dir + cfg = config.homeModules.syncthing; +in + +lib.mkIf cfg.enable { + services.syncthing = { + enable = true; + tray = { + enable = true; + package = pkgs.syncthingtray; # optional: GUI tray indicator + }; + guiAddress = "127.0.0.1:8384"; + settings = { + # get id with: syncthing --device-id + devices = { + t440p = { + id = "DEVICE-ID-T440P"; # replace with actual Syncthing device ID + name = "ThinkPad T440p"; + }; + steamdeck = { + id = "DEVICE-ID-STEAMDECK"; # replace with actual device ID + name = "SteamDeck"; + }; + xaorus = { + id = "4XQWZB6-OTRCS2M-QOZ4HYK-KEKBARC-X7ELITX-HF4RZA2-X7NFK74-VBI4BAU"; + name = "Xaorus"; + introducer = true; + }; + }; + + folders = { + "logseq" = { + enable = true; + path = "${syncthingFolderBase}/logseq"; + devices = [ "t440p" "steamdeck" "xaorus" ]; + label = "LogSeq"; + fsWatcherEnabled = true; + rescanInterval = 60; + ignorePerms = true; + ignore = [ + "*.swp" + ".cache" + ]; + versioning = { + type = "trashcan"; + params.cleanoutDays = "1000"; + }; + }; + + "projects" = { + path = "${syncthingFolderBase}/projects"; + devices = [ "t440p" "xaorus" ]; + label = "Projects"; + ignorePerms = true; + versioning = null; + ignore = [ + ".stversions" + ".git" + "node_modules" + "target" + "*.lock" + "dist" + "out" + ".DS_Store" + "thumbs.db" + ]; + }; + + # PublicMemes + + #"screenshots" = { + # path = "${syncthingFolderBase}/screenshots"; + # devices = [ "steamdeck" ]; + # label = "Screenshots"; + #}; + }; + + options = { + urAccepted = -1; # telemetry disabled + listenAddresses = [ + "tcp://0.0.0.0:22000" + "quic://0.0.0.0:22000" + ]; + globalAnnounceEnabled = false; + localAnnounceEnabled = true; + relaysEnabled = true; + natEnabled = true; + startBrowser = false; + autoAcceptFolders = false; + maxFolderConcurrency = 3; + minHomeDiskFree = { + unit = "%"; + value = 3; + }; + }; + }; + }; +} diff --git a/home/terminal.nix b/home/terminal.nix new file mode 100644 index 0000000..3ae635a --- /dev/null +++ b/home/terminal.nix @@ -0,0 +1,146 @@ +{ config, pkgs, lib, ... }: + +let + cfg = config.homeModules.terminal; +in + +lib.mkIf cfg.enable { + # ─── Terminal Emulator ──────────────────────────────────────────────── + programs.alacritty = { + enable = true; + settings = { + font = { + normal = { + family = "JetBrainsMono Nerd Font"; + style = "Regular"; + }; + size = 12; + }; + colors.primary = { + foreground = "#d8d8d8"; + background = "#181818"; + dim_foreground = "#828482"; + }; + # Optional: shell integration + shell = { + program = "${pkgs.zsh}/bin/zsh"; + args = [ "-l" ]; + }; + window.opacity = 1; + }; + }; + + # ─── Zsh Shell ──────────────────────────────────────────────────────── + programs.zsh = { + enable = true; + enableCompletion = true; + autosuggestion = { + enable = true; + strategy = [ "history" ]; + }; + syntaxHighlighting = { + enable = true; + highlighters = [ "main" "brackets" "cursor" ]; + patterns = { + "rm -rf *" = "fg=white,bold,bg=red"; + }; + }; + enableVteIntegration = true; + autocd = true; + history = { + save = 10000; + share = true; + ignoreDups = true; + ignoreAllDups = true; + expireDuplicatesFirst = true; + ignorePatterns = [ "rm *" "pkill *" ]; + }; + shellAliases = { + ll = "ls -lh"; + la = "ls -a"; + ".." = "cd .."; + update = "sudo nixos-rebuild switch"; + gc = "sudo nix-collect-garbage -d"; + edit = "sudo -e"; + nixlog = "journalctl -xe -u nixos-rebuild"; + }; + sessionVariables = { + ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE = "fg=8"; + EDITOR = "nvim"; + PAGER = "less"; + }; + + oh-my-zsh = { + enable = true; + theme = "dst"; # Or "jonathan", "robbyrussell", etc. + plugins = [ + "git" + "sudo" + "z" + "vi-mode" + "alias-finder" + "docker" + "colored-man-pages" + "history" + "direnv" + "node" + "zsh-autosuggestions" + "zsh-syntax-highlighting" + "docker" + "rust" + ]; + }; + }; + + # ─── Modern System Monitors ─────────────────────────────────────────── + programs.btop = { + enable = true; + settings = { + color_theme = "tokyo-night"; + truecolor = true; + rounded_corners = true; + }; + }; + + programs.htop.enable = true; + + # ─── Extras ─────────────────────────────────────────────────────────── + programs.direnv = { + enable = true; + nix-direnv.enable = true; + }; + + programs.zoxide = { + enable = true; # Better cd + enableZshIntegration = true; + }; + + programs.fzf = { + enable = true; + enableZshIntegration = true; + }; + + programs.starship = { + enable = true; + enableZshIntegration = true; + }; + + programs.eza = { + enable = true; + enableZshIntegration = true; + }; + + home.packages = with pkgs; [ + ripgrep + fd + bat + git + jq + unzip + gnupg + neofetch + lsd + delta + bottom + ]; +} diff --git a/home/tor.nix b/home/tor.nix new file mode 100644 index 0000000..020c55c --- /dev/null +++ b/home/tor.nix @@ -0,0 +1,40 @@ +{ config, pkgs, lib, ... }: + +let + cfg = config.homeModules.tor; +in + +lib.mkIf cfg.enable { + home.packages = with pkgs; [ + tor-browser-bundle-bin + onionshare + qbittorrent + torsocks + qbittorrent + ]; + + systemd.user.services.tor-browser = { + Unit = { + Description = "Launch Tor Browser"; + }; + Service = { + ExecStart = "${pkgs.tor-browser-bundle-bin}/bin/tor-browser"; + Restart = "always"; + }; + Install = { + WantedBy = [ "default.target" ]; + }; + }; + + # Optionally allow torsocks usage system-wide + #environment.variables = { + # This allows tools to use torsocks if invoked manually + # You may prefer wrapping apps instead + # TOR_SOCKS_PORT = "9050"; + #}; + + # Optional CLI wrapper for routing traffic through Tor + home.shellAliases = { + torify = "torsocks"; + }; +} diff --git a/vim.nix b/home/vim.nix similarity index 79% rename from vim.nix rename to home/vim.nix index f498ed4..5c87945 100644 --- a/vim.nix +++ b/home/vim.nix @@ -1,5 +1,10 @@ { config, pkgs, lib, ... }: -{ + +let + cfg = config.homeModules.vim; +in + +lib.mkIf cfg.enable { programs.neovim = { enable = true; @@ -8,7 +13,9 @@ vimdiffAlias = true; defaultEditor = true; extraConfig = '' - set number relativenumber + lua << EOF + require('lspconfig').rust_analyzer.setup{} + EOF ''; plugins = let @@ -42,14 +49,14 @@ ]); in with pkgs.vimPlugins; [ - # vim-nerdtree?? - #vim-rainbrow vim-colors-solarized - # vim-lightline - # syntastic vim-nix nvim-lspconfig nvim-treesitter-with-plugins + rust-tools-nvim + nvim-cmp + cmp-nvim-lsp + nvim-treesitter.withAllGrammars ]; }; diff --git a/home/vpn-pia.nix b/home/vpn-pia.nix new file mode 100644 index 0000000..7252dba --- /dev/null +++ b/home/vpn-pia.nix @@ -0,0 +1,53 @@ +{ config, pkgs, lib, ... }: + +let + # Optional: create a runtime directory for pia-manager to store configs + piaDir = "${config.home.homeDirectory}/.config/pia"; + cfg = config.homeModules.vpnpia; +in + +lib.mkIf cfg.enable { + home.packages = with pkgs; [ + openvpn + #pia-manager + wireguard-tools + jq + systemd + ]; + + home.file.".config/pia/config.json".text = builtins.toJSON { + token = "REPLACE_WITH_YOUR_PIA_TOKEN"; + region = "DE Frankfurt"; # Adjust to your preferred location + protocol = "wireguard"; # or "openvpn_udp"/"openvpn_tcp" + dns = true; + port_forward = false; + }; + + systemd.user.services.pia-vpn = { + Unit = { + Description = "Private Internet Access VPN"; + After = [ "network.target" ]; + }; + + Service = { + Type = "simple"; + #ExecStart = "${pkgs.pia-manager}/bin/pia-manager up --config ${piaDir}/config.json"; + #ExecStop = "${pkgs.pia-manager}/bin/pia-manager down"; + Restart = "on-failure"; + }; + + Install = { + WantedBy = [ "default.target" ]; + }; + }; + + # Enable service on login + systemd.user.startServices = true; + + # Optional: add a shell alias for manual control + programs.zsh.shellAliases = { + vpn-up = "systemctl --user start pia-vpn"; + vpn-down = "systemctl --user stop pia-vpn"; + vpn-status = "systemctl --user status pia-vpn"; + }; +} diff --git a/vscode.nix b/home/vscode.nix similarity index 76% rename from vscode.nix rename to home/vscode.nix index f7d8ef0..51babf0 100644 --- a/vscode.nix +++ b/home/vscode.nix @@ -1,9 +1,25 @@ { config, pkgs, lib, ... }: -{ +{ + ### VSCode Server ### + imports = [ + "${fetchTarball { + url = "https://github.com/msteen/nixos-vscode-server/tarball/master"; + sha256 = "1rdn70jrg5mxmkkrpy2xk8lydmlc707sk0zb35426v1yxxka10by"; + }}/modules/vscode-server/home.nix" + ]; + + config = lib.mkIf config.homeModules.vscode.enable { + + services.vscode-server.enable = true; + # Optional: extra settings + # services.vscode-server.enableFHS = true; + # services.vscode-server.nodejsPackage = pkgs.nodejs_20; + + ### VSCode Editor ### programs.vscode = { enable = true; - + profiles.default = { enableUpdateCheck = false; enableExtensionUpdateCheck = false; @@ -26,6 +42,7 @@ "workbench.startupEditor" = "none"; "workbench.tree.indent" = 16; "rust-analyzer.lens.implementations.enable" = false; + "chat.agent.enabled" = false; "[typescript]" = { "editor.defaultFormatter" = "esbenp.prettier-vscode"; @@ -47,46 +64,28 @@ extensions = with pkgs.vscode-extensions; [ # Nix bbenoist.nix - jnoortheen.nix-ide - #kamadorueda.alejandra # Rust rust-lang.rust-analyzer tamasfe.even-better-toml - ## ? probe-rs.probe-rs-debugger - # Swellaby.vscode-rust-test-adapter - - # Python - ms-python.python - ms-python.debugpy # JS/TS -# codeandstuff.package-json-upgrade dbaeumer.vscode-eslint esbenp.prettier-vscode -# Vue.volar astro-build.astro-vscode # Misc yzhang.markdown-all-in-one - unifiedjs.vscode-mdx -# James-Yu.latex-workshop - fill-labs.dependi - alefragnani.project-manager foxundermoon.shell-format - usernamehw.errorlens # Git waderyan.gitblame - mhutchie.git-graph + #mhutchie.git-graph donjayamanne.githistory -# felipecaputo.git-project-manager codezombiech.gitignore - - # Theme -# RobbOwen.synthwave-vscode -# PKief.material-icon-theme ]; + }; + }; }; } diff --git a/home/zen-browser.nix b/home/zen-browser.nix new file mode 100644 index 0000000..9457a83 --- /dev/null +++ b/home/zen-browser.nix @@ -0,0 +1,67 @@ +{ config, pkgs, lib, zen-browser, ... }: + +let + cfg = config.homeModules.zenbrowser; +in + +lib.mkIf cfg.enable { + imports = [ + # You can choose one of the following: + # inputs.zen-browser.homeModules.beta + # inputs.zen-browser.homeModules.twilight + zen-browser.homeModules.twilight-official + ]; + + programs.zen-browser = { + enable = true; + + policies = { + AutofillAddressEnabled = true; + AutofillCreditCardEnabled = false; + DisableAppUpdate = true; + DisableFeedbackCommands = true; + DisableFirefoxStudies = true; + DisablePocket = true; + DisableTelemetry = true; + DontCheckDefaultBrowser = true; + NoDefaultBookmarks = true; + OfferToSaveLogins = false; + EnableTrackingProtection = { + Value = true; + Locked = true; + Cryptomining = true; + Fingerprinting = true; + }; + }; + + nativeMessagingHosts = [ + pkgs.firefoxpwa + ]; + }; + + xdg.mimeApps = let + value = inputs.zen-browser.packages.${pkgs.system}.twilight.meta.desktopFileName; + associations = builtins.listToAttrs (map (name: { + inherit name value; + }) [ + "application/x-extension-shtml" + "application/x-extension-xhtml" + "application/x-extension-html" + "application/x-extension-xht" + "application/x-extension-htm" + "x-scheme-handler/unknown" + "x-scheme-handler/mailto" + "x-scheme-handler/chrome" + "x-scheme-handler/about" + "x-scheme-handler/https" + "x-scheme-handler/http" + "application/xhtml+xml" + "application/json" + "text/plain" + "text/html" + ]); + in { + associations.added = associations; + defaultApplications = associations; + }; +} diff --git a/hosts/steamdeck/configuration.nix b/hosts/steamdeck/configuration.nix new file mode 100644 index 0000000..25cc2a0 --- /dev/null +++ b/hosts/steamdeck/configuration.nix @@ -0,0 +1,110 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page +# and in the NixOS manual (accessible by running ‘nixos-help’). + +{ config, pkgs, ... }: + +{ + imports = [ # Include the results of the hardware scan. + ./hardware-configuration.nix + ./../../modules/desktop.nix + ./../../modules/secrets.nix + ./../../modules/security.nix + ./../../modules/unfree.nix + ./../../modules/users.nix + #./../../modules/wifi.nix + ( + #let revision = "e74e57a37de55ecfdc62f49fe5a7463b2a52499a"; in + let revision = "98a61cf0708885abddebc6938ca7282928981d5e"; in + builtins.fetchTarball { + url = "https://github.com/Jovian-Experiments/Jovian-NixOS/archive/${revision}.tar.gz"; + sha256 = "sha256:0f1c3ilr9rm6jrs3nfhvf8ni0jccfy1810s6a94iywa9416w1k7c"; + } + "/modules" + ) + ]; + + networking.hostName = "decky"; + networking.networkmanager.enable = true; + + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + boot.initrd.luks.devices."luks-1c04b05d-0ddf-429a-95c3-1f5fdb570207".device = "/dev/disk/by-uuid/1c04b05d-0ddf-429a-95c3-1f5fdb570207"; + + # Set time zone and internationalisation + time.timeZone = "Europe/Berlin"; + i18n.defaultLocale = "de_DE.UTF-8"; + i18n.extraLocaleSettings = { + LC_ADDRESS = "de_DE.UTF-8"; + LC_IDENTIFICATION = "de_DE.UTF-8"; + LC_MEASUREMENT = "de_DE.UTF-8"; + LC_MONETARY = "de_DE.UTF-8"; + LC_NAME = "de_DE.UTF-8"; + LC_NUMERIC = "de_DE.UTF-8"; + LC_PAPER = "de_DE.UTF-8"; + LC_TELEPHONE = "de_DE.UTF-8"; + LC_TIME = "de_DE.UTF-8"; + }; + + # Configure console keymap + console.keyMap = "de"; + + # List packages installed in system profile. + # To search, run: $ nix search wget + environment.systemPackages = with pkgs; [ + wget + curl + git + vim + ]; + + jovian = { + devices.steamdeck = { + enable = true; + autoUpdate = false; + enableGyroDsuService = true; + }; + steam = { + enable = true; + autoStart = true; + user = "wieerwill"; + desktopSession = "sway"; + updater.splash = "jovian"; + }; + decky-loader = { + enable = false; + #extraPackages = [pkgs.curl pkgs.unzip]; + #user = "wieerwill"; + }; + }; + + # Enable sound with pipewire. + services.pulseaudio.enable = false; + security.rtkit.enable = true; + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + # If you want to use JACK applications, uncomment this + #jack.enable = true; + }; + + hardware.bluetooth = { + enable = true; + powerOnBoot = true; + settings = { + General = { + Experimental = true; + }; + }; + }; + + # This value determines the NixOS release from which the default + # settings for stateful data, like file locations and database versions + # on your system were taken. It‘s perfectly fine and recommended to leave + # this value at the release version of the first install of this system. + # Before changing this value read the documentation for this option + # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). + system.stateVersion = "25.05"; # Did you read the comment? + +} diff --git a/hosts/steamdeck/hardware-configuration.nix b/hosts/steamdeck/hardware-configuration.nix new file mode 100644 index 0000000..9fb7593 --- /dev/null +++ b/hosts/steamdeck/hardware-configuration.nix @@ -0,0 +1,40 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "usbhid" "sdhci_pci" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-amd" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/ceb735f5-6728-4fb6-9d25-3bbf7d198b49"; + fsType = "ext4"; + }; + + fileSystems."/boot" = + { device = "/dev/disk/by-uuid/E8E8-9A4B"; + fsType = "vfat"; + options = [ "fmask=0077" "dmask=0077" ]; + }; + + swapDevices = + [ { device = "/dev/disk/by-uuid/d1808b85-6f98-40f3-a06a-62836aee3809"; } + ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.enp4s0f3u1.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/hosts/steamdeck/home.nix b/hosts/steamdeck/home.nix new file mode 100644 index 0000000..ada92fc --- /dev/null +++ b/hosts/steamdeck/home.nix @@ -0,0 +1,36 @@ +{ inputs, ... }: { + imports = [ ../../home/_home.nix ]; + + homeModules = { + #androidstudio.enable = true; + #backup.enable = true; + chromium.enable = true; + #design.enable = true; + embedded.enable = true; + fonts.enable = true; + git.enable = true; + #javascript.enable = true; + keepass.enable = true; + #llm.enable = true; + logseq.enable = true; + #mail.enable = true; + #obsidian.enable = true; + redshift.enable = true; + secrets.enable = true; + security.enable = true; + #social.enable = true; + sway.enable = true; + syncthing.enable = true; + terminal.enable = true; + #tor.enable = true; + vim.enable = true; + #vpnpia.enable = true; + vscode.enable = false; + #zenbrowser.enable = true; + }; + + _module.args = { + #sops-nix = inputs.sops-nix; + zen-browser = inputs.zen-browser; + }; +} diff --git a/sway.nix b/hosts/steamdeck/old_sway.nix similarity index 100% rename from sway.nix rename to hosts/steamdeck/old_sway.nix diff --git a/hosts/t440p/configuration.nix b/hosts/t440p/configuration.nix new file mode 100644 index 0000000..9f4c99b --- /dev/null +++ b/hosts/t440p/configuration.nix @@ -0,0 +1,60 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page +# and in the NixOS manual (accessible by running ‘nixos-help’). + +{ config, pkgs, lib, ... }: + +{ + imports = [ # Include the results of the hardware scan and modules + ./hardware-configuration.nix + ./../../modules/desktop.nix + ./../../modules/secrets.nix + ./../../modules/security.nix + ./../../modules/unfree.nix + ./../../modules/users.nix + #./../../modules/wifi.nix + ]; + + networking.hostName = "t440p"; + networking.networkmanager.enable = true; + + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + boot.initrd.luks.devices."luks-1c04b05d-0ddf-429a-95c3-1f5fdb570207".device = "/dev/disk/by-uuid/1c04b05d-0ddf-429a-95c3-1f5fdb570207"; + + # Set time zone and internationalisation + time.timeZone = "Europe/Berlin"; + i18n.defaultLocale = "de_DE.UTF-8"; + i18n.extraLocaleSettings = { + LC_ADDRESS = "de_DE.UTF-8"; + LC_IDENTIFICATION = "de_DE.UTF-8"; + LC_MEASUREMENT = "de_DE.UTF-8"; + LC_MONETARY = "de_DE.UTF-8"; + LC_NAME = "de_DE.UTF-8"; + LC_NUMERIC = "de_DE.UTF-8"; + LC_PAPER = "de_DE.UTF-8"; + LC_TELEPHONE = "de_DE.UTF-8"; + LC_TIME = "de_DE.UTF-8"; + }; + + console.keyMap = "de"; + + # List packages installed in system profile. + # To search, run: $ nix search wget + environment.systemPackages = with pkgs; [ + wget + curl + git + vim + tree + ]; + + # This value determines the NixOS release from which the default + # settings for stateful data, like file locations and database versions + # on your system were taken. It‘s perfectly fine and recommended to leave + # this value at the release version of the first install of this system. + # Before changing this value read the documentation for this option + # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). + system.stateVersion = "25.05"; # Did you read the comment? + +} diff --git a/hosts/t440p/hardware-configuration.nix b/hosts/t440p/hardware-configuration.nix new file mode 100644 index 0000000..50f8f96 --- /dev/null +++ b/hosts/t440p/hardware-configuration.nix @@ -0,0 +1,43 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "xhci_pci" "ehci_pci" "ahci" "usb_storage" "sd_mod" "rtsx_pci_sdmmc" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/48e4d114-d841-4506-862b-eb4ba2101767"; + fsType = "ext4"; + }; + + boot.initrd.luks.devices."luks-153f407e-269d-4a10-9544-4d2946a49824".device = "/dev/disk/by-uuid/153f407e-269d-4a10-9544-4d2946a49824"; + + fileSystems."/boot" = + { device = "/dev/disk/by-uuid/1747-74BD"; + fsType = "vfat"; + options = [ "fmask=0077" "dmask=0077" ]; + }; + + swapDevices = + [ { device = "/dev/disk/by-uuid/64dcaac6-e355-4ca7-aa0c-40b1184baf18"; } + ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.enp0s25.useDHCP = lib.mkDefault true; + # networking.interfaces.wlp3s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/hosts/t440p/home.nix b/hosts/t440p/home.nix new file mode 100644 index 0000000..ada92fc --- /dev/null +++ b/hosts/t440p/home.nix @@ -0,0 +1,36 @@ +{ inputs, ... }: { + imports = [ ../../home/_home.nix ]; + + homeModules = { + #androidstudio.enable = true; + #backup.enable = true; + chromium.enable = true; + #design.enable = true; + embedded.enable = true; + fonts.enable = true; + git.enable = true; + #javascript.enable = true; + keepass.enable = true; + #llm.enable = true; + logseq.enable = true; + #mail.enable = true; + #obsidian.enable = true; + redshift.enable = true; + secrets.enable = true; + security.enable = true; + #social.enable = true; + sway.enable = true; + syncthing.enable = true; + terminal.enable = true; + #tor.enable = true; + vim.enable = true; + #vpnpia.enable = true; + vscode.enable = false; + #zenbrowser.enable = true; + }; + + _module.args = { + #sops-nix = inputs.sops-nix; + zen-browser = inputs.zen-browser; + }; +} diff --git a/hosts/t440p/sway-hardware.nix b/hosts/t440p/sway-hardware.nix new file mode 100644 index 0000000..8b73f79 --- /dev/null +++ b/hosts/t440p/sway-hardware.nix @@ -0,0 +1,21 @@ +{ config, pkgs, lib, ... }: + +{ + wayland.windowManager.sway.config = { + output = { + "eDP-1" = { + pos = "0 0"; + scale = "1"; + }; + }; + + input = { + "type:keyboard" = { + xkb_layout = "de"; + }; + "*" = { + xkb_layout = "de"; + }; + }; + }; +} diff --git a/hosts/vps04_08/home.nix b/hosts/vps04_08/home.nix new file mode 100644 index 0000000..89a4a1f --- /dev/null +++ b/hosts/vps04_08/home.nix @@ -0,0 +1,85 @@ +{ config, pkgs, ... }: + +{ + imports = [ ../../home/_home.nix ]; + + home.username = "wieerwill"; + home.homeDirectory = "/home/wieerwill"; + programs.home-manager.enable = true; + home.stateVersion = "25.05"; + + # Basic packages + home.packages = with pkgs; [ + neovim + git + curl + gnupg + bash-completion + sops + ]; + + # Harden SSH known_hosts, prevent password auth + programs.ssh = { + enable = true; + extraConfig = '' + PasswordAuthentication no + PermitRootLogin no + ''; + }; + + # Optional: Docker CLI tools (remote management only!) + home.file.".docker/config.json".text = builtins.toJSON { + detachKeys = "ctrl-e,e"; + }; + + # Automatic updates + systemd.user.services."autoupdate-nix" = { + Unit = { + Description = "Regular nix flake update"; + }; + Service = { + ExecStart = "${pkgs.nix}/bin/nix flake update --commit-lock-file"; + }; + Install.WantedBy = [ "default.target" ]; + }; + + # Hardened Bash profile + programs.bash = { + enable = true; + enableCompletion = true; + initExtra = '' + set -o errexit + set -o nounset + set -o pipefail + ''; + }; + + + homeModules = { + #androidstudio.enable = true; + #backup.enable = true; + #chromium.enable = true; + #design.enable = true; + #embedded.enable = true; + fonts.enable = true; + #git.enable = true; + #javascript.enable = true; + #keepass.enable = true; + #llm.enable = true; + #logseq.enable = true; + #mail.enable = true; + #obsidian.enable = true; + #redshift.enable = true; + secrets.enable = true; + #security.enable = true; + #social.enable = true; + #sway.enable = true; + #syncthing.enable = true; + terminal.enable = true; + #tor.enable = true; + #vim.enable = true; + #vpnpia.enable = true; + #vscode.enable = false; + #zenbrowser.enable = true; + }; +} diff --git a/hosts/xaorus/home.nix b/hosts/xaorus/home.nix new file mode 100644 index 0000000..ce412e4 --- /dev/null +++ b/hosts/xaorus/home.nix @@ -0,0 +1,70 @@ +{ config, pkgs, ... }: + +{ + imports = [ ../../home/_home.nix ]; + + home.username = "wieerwill"; + home.homeDirectory = "/home/wieerwill"; + #home-manager.users.wieerwill.networking.hostName = "xaorus"; + home.stateVersion = "25.05"; + + programs.home-manager.enable = true; + + # create soft links from source to target + home.file = { + "nixConig".source = "/home/wieerwill/Dokumente/GitHub/NixHomeManager"; + "logseq".source = "/home/wieerwill/Dokumente/logseq"; + "projects".source = "/home/wieerwill/Dokumente/projects"; + "vereine".source = "/home/wieerwill/Dokumente/vereine"; + #"Downloads".source = "/home/wieerwill/Dokumente/Downloads"; + }; + + #programs.gnome-terminal.enable = true; + + # Optional: apps for GNOME desktop + home.packages = with pkgs; [ + #gnome.gnome-tweaks + #gnome.dconf-editor + ]; + + # XDG integration + #xdg.enable = true; + + # Fonts and GTK themes + #fonts.fontconfig.enable = true; + + #gtk = { + # enable = true; + # theme.name = "Adwaita-dark"; + # iconTheme.name = "Papirus"; + # cursorTheme.name = "Adwaita"; + #}; + + homeModules = { + #androidstudio.enable = true; + #backup.enable = true; + #chromium.enable = true; + #design.enable = true; + #embedded.enable = true; + fonts.enable = true; + #git.enable = true; + #javascript.enable = true; + #keepass.enable = true; + #llm.enable = true; + #logseq.enable = true; + #mail.enable = true; + #obsidian.enable = true; + #redshift.enable = true; + secrets.enable = true; + #security.enable = true; + #social.enable = true; + #sway.enable = true; + syncthing.enable = true; + #terminal.enable = true; + #tor.enable = true; + #vim.enable = true; + #vpnpia.enable = true; + #vscode.enable = false; + #zenbrowser.enable = true; + }; +} diff --git a/modules/desktop.nix b/modules/desktop.nix new file mode 100644 index 0000000..e7eaddd --- /dev/null +++ b/modules/desktop.nix @@ -0,0 +1,41 @@ +{ config, pkgs, lib, ... }: + +let + systemd = pkgs.systemd; + sway = pkgs.sway; +in { + programs.sway = { + enable = true; + wrapperFeatures.gtk = true; + }; + + # Enable CUPS to print documents. + services.printing.enable = true; + + # Enable the X11 windowing system. + programs.xwayland.enable = true; # For compatibility with apps needing X + services.xserver.enable = false; + services.libinput.enable = true; # Touchpad, mouse, input devices + programs.light.enable = true; # For backlight control + security.polkit.enable = true; + + # Configure keymap + services.xserver.xkb = { + layout = "de"; + variant = ""; + }; + + environment.systemPackages = with pkgs; [ + swaylock + swayidle + wl-clipboard + brightnessctl + bemenu + xwayland + + (writers.writeDashBin "sway-logout" '' + ${systemd}/bin/systemctl --user unset-environment WAYLAND_DISPLAY SWAYSOCK + ${sway}/bin/swaymsg exit + '') + ]; +} diff --git a/modules/qbittorrent.nix b/modules/qbittorrent.nix new file mode 100644 index 0000000..c51df25 --- /dev/null +++ b/modules/qbittorrent.nix @@ -0,0 +1,21 @@ +{ config, pkgs, ... }: + +{ + services.qbittorrent = { + enable = true; + user = "wieerwill"; # or a dedicated service user + group = "users"; + webuiPort = 8080; + torrentingPort = 51413; + profileDir = "/var/lib/qbittorrent"; + openFirewall = true; + + serverConfig = { + Preferences = { + Connection.PortRangeMin = 51413; + Downloads.SavePath = "/home/wieerwill/torrents"; + WebUI.Port = 8080; + }; + }; + }; +} \ No newline at end of file diff --git a/modules/secrets.nix b/modules/secrets.nix new file mode 100644 index 0000000..ada53f2 --- /dev/null +++ b/modules/secrets.nix @@ -0,0 +1,18 @@ +{ config, lib, pkgs, ... }: + +{ + environment.systemPackages = with pkgs; [ + sops + age + ]; + + sops = { + #defaultSopsFile = ./../secrets/secrets.enc.yaml; + age.keyFile = "/home/wieerwill/.config/sops/age/keys.txt"; + }; + + #sops.secrets.git-email = { + # owner = "wieerwill"; + # path = "/home/wieerwill/.config/git-email"; + #}; +} diff --git a/modules/security.nix b/modules/security.nix new file mode 100644 index 0000000..ef026a2 --- /dev/null +++ b/modules/security.nix @@ -0,0 +1,43 @@ +{ config, pkgs, ... }: + +{ + services.openssh = { + enable = true; + ports = [ 22 ]; + settings = { + AllowUsers = [ "wieerwill" ]; + X11Forwarding = false; + PasswordAuthentication = false; + PermitRootLogin = "prohibit-password"; + KbdInteractiveAuthentication = false; + }; + }; + + networking.firewall = { + enable = true; + allowedTCPPorts = [ + 22 # SSH + 80 # HTTP + 443 # HTTPS + 22000 # Syncthing + 9050 # Tor SOCKS + 9051 # Tor Control + 5353 # Tor DNS (if using virtual DNS) + ]; + allowedUDPPorts = [ ]; + }; + + services.fail2ban = { + enable = true; + maxretry = 3; # Ban IP after 3 failures + bantime = "24h"; # Ban IPs for one day on the first ban + bantime-increment = { + enable = true; # increment of bantime after each violation + #formula = "ban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)"; + multipliers = "1 2 4 8 16 32 64"; + maxtime = "168h"; # Do not ban for more than 1 week + overalljails = true; # bantime based on all violations + }; + }; + +} diff --git a/modules/unfree.nix b/modules/unfree.nix new file mode 100644 index 0000000..6ba4414 --- /dev/null +++ b/modules/unfree.nix @@ -0,0 +1,68 @@ +{ config, pkgs, lib, ... }: + +{ + + nixpkgs.config = { + allowUnfree = false; + allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ + # allow for android sdk + "android-sdk-cmdline-tools" + "android-sdk-emulator" + "android-sdk-build-tools" + "android-sdk-platforms" + "android-sdk-platform-tools" + "android-sdk-tools" + "android-sdk-ndk" + "platform-tools" + "platforms" + "build-tools" + "ndk" + "cmdline-tools" + "android-sdk-system-image-32-google_apis-arm64-v8a-system-image-32-google_apis-x86_64" + "android-sdk-system-image-32-google_apis_playstore-arm64-v8a-system-image-32-google_apis_playstore-x86_64" + "android-sdk-system-image-33-google_apis-arm64-v8a-system-image-33-google_apis-x86_64" + "android-sdk-system-image-33-google_apis_playstore-arm64-v8a-system-image-33-google_apis_playstore-x86_64" + "android-sdk-system-image-34-google_apis-arm64-v8a-system-image-34-google_apis-x86_64" + "android-sdk-system-image-34-google_apis_playstore-arm64-v8a-system-image-34-google_apis_playstore-x86_64" + "android-sdk-system-image-35-google_apis-arm64-v8a-system-image-35-google_apis-x86_64" + "android-sdk-system-image-35-google_apis_playstore-arm64-v8a-system-image-35-google_apis_playstore-x86_64" + "android-sdk-system-image-36-google_apis-arm64-v8a-system-image-36-google_apis-x86_64" + "android-sdk-system-image-36-google_apis_playstore-arm64-v8a-system-image-36-google_apis_playstore-x86_64" + "system-image-32-google_apis-x86_64" + "system-image-32-google_apis-arm64-v8a" + "system-image-32-google_apis_playstore-x86_64" + "system-image-32-google_apis_playstore-arm64-v8a" + "system-image-33-google_apis-x86_64" + "system-image-33-google_apis-arm64-v8a" + "system-image-33-google_apis_playstore-x86_64" + "system-image-33-google_apis_playstore-arm64-v8a" + "system-image-34-google_apis-x86_64" + "system-image-34-google_apis-arm64-v8a" + "system-image-34-google_apis_playstore-x86_64" + "system-image-34-google_apis_playstore-arm64-v8a" + "system-image-35-google_apis-x86_64" + "system-image-35-google_apis-arm64-v8a" + "system-image-35-google_apis_playstore-x86_64" + "system-image-35-google_apis_playstore-arm64-v8a" + "system-image-36-google_apis-x86_64" + "system-image-36-google_apis-arm64-v8a" + "system-image-36-google_apis_playstore-x86_64" + "system-image-36-google_apis_playstore-arm64-v8a" + "emulator" + "tools" + "cmake" + "android-studio-stable" + + # other packages + "discord" + "obsidian" + "vscode" + "zoom" + "steam" + "steamdeck-hw-theme" + "steam-jupiter-unwrapped" + ]; + android_sdk.accept_license = true; + }; + +} diff --git a/modules/users.nix b/modules/users.nix new file mode 100644 index 0000000..2815fd8 --- /dev/null +++ b/modules/users.nix @@ -0,0 +1,44 @@ +{ config, pkgs, lib, ... }: + +{ + users.mutableUsers = false; + + # Enable automatic login for the user. + services.getty.autologinUser = "wieerwill"; + + users.users.wieerwill = { + isNormalUser = true; + description = "wieerwill"; + home = "/home/wieerwill"; + createHome = true; + + extraGroups = [ + "wheel" # sudo access + "networkmanager" # network config + "audio" "video" # media and graphics support + "docker" # container management + "libvirtd" # virtualization + "input" # gamepad / touchscreen + "plugdev" # udev/USB access + "git" + ]; + + # leave empty if managed externally (passwd or sops) + initialHashedPassword = ""; + + #openssh.authorizedKeys.keys = [ + # # Replace with your actual SSH pubkey + # "ssh-ed25519 AAAAC3Nz... user@machine" + #]; + + packages = with pkgs; [ + zsh + ]; + shell = pkgs.zsh; + }; + programs.zsh.enable = true; + + # Optional system-wide group definition for shared development tools + users.groups.git.gid = 998; + users.groups.plugdev = { }; +} diff --git a/modules/wifi.nix b/modules/wifi.nix new file mode 100644 index 0000000..5472855 --- /dev/null +++ b/modules/wifi.nix @@ -0,0 +1,41 @@ +{ config, lib, pkgs, ... }: + +# easy way: nmcli dev wifi connect "MySSID" password "your-password" + +{ + networking.networkmanager = { + enable = true; + connections = { + "MyHomeWiFi" = { + type = "wifi"; + interface = "wlan0"; # or leave out for automatic interface + uuid = "123e4567-e89b-12d3-a456-426614174000"; # optional but recommended + id = "HeimwehLan"; + autoconnect = true; + wifi = { + ssid = "HeimwehLan"; + mode = "infrastructure"; + }; + wifi-security = { + key-mgmt = "wpa-psk"; + psk = "+++++++"; + }; + ipv4 = { + method = "auto"; + }; + ipv6 = { + method = "ignore"; + }; + }; + + "MyWorkWiFi" = { + type = "wifi"; + id = "MyWorkWiFi"; + autoconnect = false; + wifi.ssid = "CorpNet"; + wifi-security.psk = "CorpSecret"; + ipv4.method = "auto"; + }; + }; + }; +} diff --git a/scripts/check-home-manager.sh b/scripts/check-home-manager.sh new file mode 100755 index 0000000..7d7578b --- /dev/null +++ b/scripts/check-home-manager.sh @@ -0,0 +1,120 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "🔍 Checking if Nix is installed..." +if ! command -v nix &> /dev/null; then + echo "❌ Nix is not installed. Install it from https://nixos.org/download.html" + exit 1 +fi +echo "✅ Nix is installed." + +echo "🔍 Checking for conflicting Home Manager installations..." + +HM_DIR="$HOME/.config/home-manager" +HM_BIN="$HOME/.nix-profile/bin/home-manager" + +if [ -e "$HM_DIR/home.nix" ]; then + echo "⚠️ Found existing Home Manager config at: $HM_DIR" + echo " This may conflict with your flake-based setup. Consider backing it up or removing it." +fi + +if [ -x "$HM_BIN" ]; then + echo "⚠️ Found existing Home Manager binary in nix-profile: $HM_BIN" + echo " Ensure it's not managing your home separately from your flake config." +fi + +echo "📦 Gathering APT-installed packages..." +apt list --manual-installed 2>/dev/null | awk -F/ '{print tolower($1)}' | sort > /tmp/apt-installed.txt + +echo "📦 Gathering Home Manager packages from flake..." +if ! nix --extra-experimental-features "nix-command flakes" eval \ + ".#homeConfigurations.$(hostname).config.home.packages" \ + --json > /tmp/hm-pkgs.json 2>/dev/null; then + echo "❌ Failed to evaluate Home Manager flake packages. Is the attribute name $(hostname) correct?" + exit 1 +fi + +jq -r '.[]' /tmp/hm-pkgs.json | sed -E 's|.*/||' | sed -E 's|^[a-z0-9]{32}-||' | sed -E 's|-[0-9][^-]*$||' | sort -u > /tmp/home-manager-packages.txt + +echo "apt count: $(wc -l < /tmp/apt-installed.txt)" +echo "hm count: $(wc -l < /tmp/home-manager-packages.txt)" + +echo "🔁 Comparing package lists..." +comm -12 /tmp/apt-installed.txt /tmp/home-manager-packages.txt > /tmp/duplicate-packages.txt + +echo "🔎 Looking for fuzzy matches..." +if [ -s /tmp/apt-installed.txt ] && [ -s /tmp/home-manager-packages.txt ]; then + grep -Fxf /tmp/apt-installed.txt /tmp/home-manager-packages.txt > /tmp/exact-matches.txt || touch /tmp/exact-matches.txt +else + touch /tmp/exact-matches.txt +fi + +echo "Additional fuzzy checking (slow but useful)" +if [ -s /tmp/home-manager-packages.txt ] && [ -s /tmp/apt-installed.txt ]; then + grep -Fif /tmp/home-manager-packages.txt /tmp/apt-installed.txt > /tmp/fuzzy-matches.txt || touch /tmp/fuzzy-matches.txt +else + touch /tmp/fuzzy-matches.txt +fi + +echo +if [ -s /tmp/duplicate-packages.txt ] || [ -s /tmp/exact-matches.txt ] || [ -s /tmp/fuzzy-matches.txt ]; then + echo "⚠️ Possible duplicate packages installed via APT and Home Manager:" + cat /tmp/duplicate-packages.txt /tmp/exact-matches.txt /tmp/fuzzy-matches.txt | sort -u + echo + echo "📝 You can manually remove these APT packages to avoid duplication and save space." + echo +else + echo "✅ No conflicting packages found between APT and Home Manager." +fi +# Clean up +rm /tmp/apt-installed.txt +rm /tmp/home-manager-packages.txt +rm /tmp/duplicate-packages.txt +rm /tmp/exact-matches.txt +rm /tmp/fuzzy-matches.txt + +# check username and home dir +EXPECTED_USERNAME="wieerwill" +EXPECTED_HOME="/home/$EXPECTED_USERNAME" +CURRENT_USERNAME=$(whoami) +CURRENT_HOME="$HOME" +echo +echo "🔍 Current username: $CURRENT_USERNAME" +echo "📁 Current home directory: $CURRENT_HOME" +echo "🔄 Target username: $EXPECTED_USERNAME" +echo "📁 Target home directory: $EXPECTED_HOME" +echo "" +if [[ "$CURRENT_USERNAME" == "$EXPECTED_USERNAME" && "$CURRENT_HOME" == "$EXPECTED_HOME" ]]; then + echo "✅ Your username and home directory already match the Nix configuration." +else + echo "⚠️ Your system username or home directory do not match your Nix config." + echo + echo "To safely rename your user, follow these steps from a different admin user (e.g. tempadmin):" + echo + echo "$ sudo usermod -l $EXPECTED_USERNAME $CURRENT_USERNAME" + echo "$ sudo groupmod -n $EXPECTED_USERNAME $CURRENT_USERNAME" + echo "$ sudo mv /home/$CURRENT_USERNAME /home/$EXPECTED_USERNAME" + echo "$ sudo usermod -d /home/$EXPECTED_USERNAME -m $EXPECTED_USERNAME" + echo "$ sudo chown -R $EXPECTED_USERNAME:$EXPECTED_USERNAME /home/$EXPECTED_USERNAME" + echo + echo "Optional: Rename any hardcoded paths or config. Search with:" + echo "$ grep -r '$CURRENT_USERNAME' /home/$EXPECTED_USERNAME/.config" + echo "" + echo "🚨 Don't run these while logged in as $CURRENT_USERNAME!" + echo "🛠️ Create a temporary admin user first if needed:" + echo "$ sudo adduser tempadmin" + echo "$ sudo usermod -aG sudo tempadmin" + echo + echo "After renaming, log in as $EXPECTED_USERNAME and run this check script again." + exit 0 +fi + +echo +read -r -p "🚀 Do you want to apply the Home Manager configuration for $(hostname) now? [y/N] " confirm +if [[ "$confirm" =~ ^[Yy]$ ]]; then + echo "🔧 Applying Home Manager configuration..." + nix run --extra-experimental-features "nix-command flakes" --impure \ + .#homeConfigurations.$(hostname).activationPackage +else + echo "❌ Skipping Home Manager activation." +fi diff --git a/scripts/nix-check.sh b/scripts/nix-check.sh new file mode 100755 index 0000000..9ad8700 --- /dev/null +++ b/scripts/nix-check.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# Set required experimental features +export NIX_CONFIG="experimental-features = nix-command flakes" + +FLAKE_PATH="." + +# List systems and type: nixos or home-manager +# Format: [hostname]=type:user +declare -A SYSTEMS=( + [t440p]="nixos:wieerwill" + [steamdeck]="nixos:wieerwill" + [xaorus]="home:wieerwill" + [vps04_08]="home:wieerwill" +) + +echo "🔍 Checking Nix flake at: $FLAKE_PATH" +echo + +# Check flake syntax and structure +echo "🧪 Running: nix flake check" +if nix flake check "$FLAKE_PATH" --show-trace; then + echo "✅ Flake syntax and outputs look good!" +else + echo "❌ Flake check failed!" + exit 1 +fi + +echo + +# Check each system based on type +for HOST in "${!SYSTEMS[@]}"; do + IFS=":" read -r TYPE USER <<< "${SYSTEMS[$HOST]}" + echo "🔎 Checking $TYPE system: $USER@$HOST" + + if [[ "$TYPE" == "nixos" ]]; then + ATTR="nixosConfigurations.${HOST}.config.system.build.toplevel" + elif [[ "$TYPE" == "home" ]]; then + ATTR="homeConfigurations.${HOST}.activationPackage" + else + echo "❌ Unknown system type for $HOST. Skipping..." + continue + fi + + if OUTPUT=$(nix eval "$FLAKE_PATH"#"$ATTR" 2>&1); then + echo "✅ $HOST: $TYPE configuration is valid." + else + echo "❌ $HOST: $TYPE configuration check failed!" + echo "🔍 Error output:" + echo "$OUTPUT" + fi + + echo +done diff --git a/scripts/nix-maintain.sh b/scripts/nix-maintain.sh new file mode 100755 index 0000000..a212f3f --- /dev/null +++ b/scripts/nix-maintain.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +set -e + +HOST=$(hostname) +FLAKE_PATH="${HOME}/nixConfig" + +echo "🔁 Rebuilding system for host: $HOST" +sudo nixos-rebuild switch --flake "$FLAKE_PATH#$HOST" + +echo "🧹 Collecting garbage..." +sudo nix-collect-garbage -d +nix store gc + +echo "✅ System rebuilt and cleaned." diff --git a/secrets/.sops.yaml b/secrets/.sops.yaml new file mode 100644 index 0000000..e3abd11 --- /dev/null +++ b/secrets/.sops.yaml @@ -0,0 +1,3 @@ +creation_rules: + - age: + - age1wjvdck3ec0ac49xcckqazv2hswgut90t6nlwu72fs6hm7fzr7ejqz73pe8 diff --git a/secrets/secrets.enc.yaml b/secrets/secrets.enc.yaml new file mode 100644 index 0000000..dde5599 --- /dev/null +++ b/secrets/secrets.enc.yaml @@ -0,0 +1,18 @@ +git: + email: ENC[AES256_GCM,data:8x8TWD8pSyIXn4WvhqmvJbu/q5+EWe5Y,iv:BQBfuwqV004khGh9aTB4fkxHfuJ1ts+gRpKGe2+0Mw4=,tag:AY0DN+d6PivpZoeFFwElJA==,type:str] + username: ENC[AES256_GCM,data:iZeo9T70G3lY,iv:K8mseg1oXyZ+PiB3WDUdRUaQEa92IM64Mm9ev9TerhQ=,tag:DjLtiVgnsTj5CpXQvSQ+Gw==,type:str] +sops: + age: + - recipient: age1wjvdck3ec0ac49xcckqazv2hswgut90t6nlwu72fs6hm7fzr7ejqz73pe8 + enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBGOHlmWkRXY0pVOWkwd0FK + QU5xakViMEMwbk9HV1doaFAvTDIvMXZBVWdZCkZhZGRoYnp3bHp3ZThVU3ZpMG5O + V1FmY2hmZWltRnM2MDQxK01TOXVkVnMKLS0tIEg5ZHdFblljWjAvRVRFYURHUnVG + Rkt3UWxTR280QUtlWWRwaXIzb3NBTmsKuGd7nv8f+PcEfk0GDlIn/6EKLtGm26XS + 8yemHsU1V0L/U1X7QWQacr5TU/8902ZdNqCc8RGpP4owmWjyDmEHKg== + -----END AGE ENCRYPTED FILE----- + lastmodified: "2025-11-21T14:33:12Z" + mac: ENC[AES256_GCM,data:JBcTefJk8ShmpOkammTtp4Awbid/2lqVZGI3uFRd5KWl46hgxoQRaZ9BoQswfhs3+kVAG5mwojt2/E2DTm8E5CuKmNq+YGTem1lPV51J0Yvyc5FKlVEsVxLWEiSQ/MTL5SjvgYZvTGl2VDwvyEsmSKBx/47G5uuzWiq7Jcfk9gI=,iv:KbJF5djS9CvyXZ9nDvf+Hjqg4crl6LBfG9s/0vE9SZE=,tag:6cQ015Gl6n7F7XB1cOzniQ==,type:str] + unencrypted_suffix: _unencrypted + version: 3.11.0 diff --git a/security.nix b/security.nix deleted file mode 100644 index ea59205..0000000 --- a/security.nix +++ /dev/null @@ -1,50 +0,0 @@ -{ config, pkgs, lib, ... }: -{ - - #networking.firewall = { - # enable = true; - # allowedTCPPorts = [ 22 ]; - #}; - - #services.fail2ban = { - # enable = true; - # maxretry = 3; # Ban IP after 3 failures - # bantime = "24h"; # Ban IPs for one day on the first ban - # bantime-increment = { - # enable = true; # increment of bantime after each violation - # formula = "ban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)"; - # multipliers = "1 2 4 8 16 32 64"; - # maxtime = "168h"; # Do not ban for more than 1 week - # overalljails = true; # bantime based on all violations - # }; - #}; - - programs.gpg = { - enable = true; - mutableKeys = true; # allow changes in keys or trust - mutableTrust = true; - #publicKeys = [ - # { - # source = ""; #./path/to/key.a; - # trust = "ultimate"; - # } - #]; - }; - - programs.ssh = { - enable = true; - addKeysToAgent = "yes"; # let home manager manage ssh keys - }; - - #services.openssh = { - # enable = true; - # ##Ports = [ 5432 ]; - # settings = { - # PasswordAuthentication = false; - # KbdInteractiveAuthentication = false; - # PermitRootLogin = "no"; - # #AllowUsers = [ "wieerwill" ] - # }; - #}; - -} diff --git a/sway_inputs.txt b/sway_inputs.txt deleted file mode 100644 index ddb48ff..0000000 --- a/sway_inputs.txt +++ /dev/null @@ -1,180 +0,0 @@ -[ - { - "identifier": "1133:45943:Pebble_K380s", - "name": "Pebble K380s", - "type": "keyboard", - "repeat_delay": 600, - "repeat_rate": 25, - "xkb_layout_names": [ - "German" - ], - "xkb_active_layout_index": 0, - "xkb_active_layout_name": "German", - "libinput": { - "send_events": "enabled" - }, - "vendor": 1133, - "product": 45943 - }, - { - "identifier": "1:1:AT_Translated_Set_2_keyboard", - "name": "AT Translated Set 2 keyboard", - "type": "keyboard", - "repeat_delay": 600, - "repeat_rate": 25, - "xkb_layout_names": [ - "German" - ], - "xkb_active_layout_index": 0, - "xkb_active_layout_name": "German", - "libinput": { - "send_events": "enabled" - }, - "vendor": 1, - "product": 1 - }, - { - "identifier": "10248:4117:FTS3528:00_2808:1015_UNKNOWN", - "name": "FTS3528:00 2808:1015 UNKNOWN", - "type": "tablet_tool", - "libinput": { - "send_events": "enabled", - "accel_speed": 0.0, - "accel_profile": "none", - "left_handed": "disabled" - }, - "vendor": 10248, - "product": 4117 - }, - { - "identifier": "10248:4117:FTS3528:00_2808:1015", - "name": "FTS3528:00 2808:1015", - "type": "touch", - "libinput": { - "send_events": "disabled", - "calibration_matrix": [ - 1.0, - 0.0, - 0.0, - 0.0, - 1.0, - 0.0 - ] - }, - "vendor": 10248, - "product": 4117 - }, - { - "identifier": "0:0:sof-nau8821-max_Headset_Jack", - "name": "sof-nau8821-max Headset Jack", - "type": "keyboard", - "repeat_delay": 600, - "repeat_rate": 25, - "xkb_layout_names": [ - "German" - ], - "xkb_active_layout_index": 0, - "xkb_active_layout_name": "German", - "libinput": { - "send_events": "enabled" - }, - "vendor": 0, - "product": 0 - }, - { - "identifier": "10462:4613:Valve_Software_Steam_Controller", - "name": "Valve Software Steam Controller", - "type": "keyboard", - "repeat_delay": 600, - "repeat_rate": 25, - "xkb_layout_names": [ - "German" - ], - "xkb_active_layout_index": 0, - "xkb_active_layout_name": "German", - "libinput": { - "send_events": "enabled" - }, - "vendor": 10462, - "product": 4613 - }, - { - "identifier": "10462:4613:Valve_Software_Steam_Controller", - "name": "Valve Software Steam Controller", - "type": "pointer", - "scroll_factor": 1.0, - "libinput": { - "send_events": "enabled", - "accel_speed": 0.0, - "accel_profile": "adaptive", - "natural_scroll": "disabled", - "left_handed": "disabled", - "scroll_method": "none", - "scroll_button": 273, - "scroll_button_lock": "disabled" - }, - "vendor": 10462, - "product": 4613 - }, - { - "identifier": "0:5:Lid_Switch", - "name": "Lid Switch", - "type": "switch", - "libinput": { - "send_events": "enabled" - }, - "vendor": 0, - "product": 5 - }, - { - "identifier": "0:1:Power_Button", - "name": "Power Button", - "type": "keyboard", - "repeat_delay": 600, - "repeat_rate": 25, - "xkb_layout_names": [ - "German" - ], - "xkb_active_layout_index": 0, - "xkb_active_layout_name": "German", - "libinput": { - "send_events": "enabled" - }, - "vendor": 0, - "product": 1 - }, - { - "identifier": "0:6:Video_Bus", - "name": "Video Bus", - "type": "keyboard", - "repeat_delay": 600, - "repeat_rate": 25, - "xkb_layout_names": [ - "German" - ], - "xkb_active_layout_index": 0, - "xkb_active_layout_name": "German", - "libinput": { - "send_events": "enabled" - }, - "vendor": 0, - "product": 6 - }, - { - "identifier": "0:1:Power_Button", - "name": "Power Button", - "type": "keyboard", - "repeat_delay": 600, - "repeat_rate": 25, - "xkb_layout_names": [ - "German" - ], - "xkb_active_layout_index": 0, - "xkb_active_layout_name": "German", - "libinput": { - "send_events": "enabled" - }, - "vendor": 0, - "product": 1 - } -] diff --git a/terminal.nix b/terminal.nix deleted file mode 100644 index 7aba074..0000000 --- a/terminal.nix +++ /dev/null @@ -1,84 +0,0 @@ -{ config, pkgs, lib, ... }: -{ - - programs.alacritty = { - enable = true; - settings = { - font.normal = { family = "hack"; style = "Regular"; }; - size = "12"; - colors.primary = { - foreground = "#d8d8d8"; # RRGGBB - background = "#181818"; - dim_foreground = "#828482"; - }; - #shell = { program = "/bin/zsh", args = ["-l"] }; - }; - }; - - programs.zsh = { - enable = true; - enableCompletion = true; - autosuggestion.enable = true; - #autosuggestion.highlight = null; # Custom styles for autosuggestion highlighting - syntaxHighlighting = { - enable = true; - highlighters = [ "main" "brackets" "cursor" ]; - patterns = { "rm -rf *" = "fg=white,bold,bg=red"; }; - }; - enableVteIntegration = true; # let the terminal track the current working directory - autocd = null; # Automatically enter into a directory if typed directly into shell. - sessionVariables = { # Environment variables that will be set for zsh session - isZSH = true; - }; - - oh-my-zsh = { - # enable = true; - # plugins = [ - # "alias-finder" # learn alias easier - # "colorize" - # "cp" - # "direnv" - # "git" - # "git-extras" - # "git-lfs" - # "history" - # "rust" - # "ssh" - # "sudo" - # "vscode" - # "z" - # ]; - # theme = "jonathan"; # "amuse"; #"robbyrussell"; - }; - - shellAliases = { - ll = "ls -l"; - edit = "sudo -e"; - ".." = "cd .."; - update = "sudo nixos-rebuild switch"; - }; - - history = { - ignoreAllDups = true; - expireDuplicatesFirst = true; - ignorePatterns = ["rm *" "pkill *"]; - save = 10000; # number of history lines - }; - #setOptions = [ - # "HIST_IGNORE_ALL_DUPS" - #]; - }; - - programs.btop = { - enable = true; - settings = { - color_theme = "tokyo-night"; # "Default"; - truecolor = true; - }; - }; - - programs.htop = { - enable = true; - }; - -}