summary refs log tree commit diff
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2024-10-14 22:15:32 +0200
committerMel <einebeere@gmail.com>2024-10-14 22:15:32 +0200
commit7bca7fb6cac0a3d6479ee8dd8fb5f13fa0261a51 (patch)
treeced025aff19ffe1a9a040f3e8034a48a88285b3a
downloadminerals-7bca7fb6cac0a3d6479ee8dd8fb5f13fa0261a51.tar.zst
minerals-7bca7fb6cac0a3d6479ee8dd8fb5f13fa0261a51.zip
Break up configuration for multiple machines
Signed-off-by: Mel <einebeere@gmail.com>
-rw-r--r--config.nix4
-rw-r--r--configs/.vimrc60
-rw-r--r--flake.lock66
-rw-r--r--flake.nix49
-rw-r--r--home.nix42
-rw-r--r--machines/devices/grimoire.nix68
-rw-r--r--machines/grimoire.nix14
-rw-r--r--machines/hardware/grimoire.nix39
-rw-r--r--modules/common.nix90
-rw-r--r--modules/flatpak.nix12
-rw-r--r--modules/fonts.nix15
-rw-r--r--modules/gnome.nix64
-rw-r--r--modules/libreoffice.nix11
-rw-r--r--modules/locale.nix27
-rw-r--r--modules/nix-ld.nix59
-rw-r--r--modules/user.nix27
-rw-r--r--pkgs/default.nix11
-rw-r--r--pkgs/electron-wayland-wrappers.nix42
-rw-r--r--pkgs/ghidra/default.nix15
-rw-r--r--pkgs/ghidra/ui-scale.patch11
20 files changed, 726 insertions, 0 deletions
diff --git a/config.nix b/config.nix
new file mode 100644
index 0000000..28cc9d1
--- /dev/null
+++ b/config.nix
@@ -0,0 +1,4 @@
+{
+  allowUnfree = true;
+  input-fonts.acceptLicense = true;
+}
diff --git a/configs/.vimrc b/configs/.vimrc
new file mode 100644
index 0000000..79ae89a
--- /dev/null
+++ b/configs/.vimrc
@@ -0,0 +1,60 @@
+" NECESSITIES:
+
+" disable vi compatability, if still on for some reason
+set nocompatible
+
+" enable syntax highlight
+syntax on
+
+" indent settings
+set autoindent
+set smarttab
+set smartindent
+set expandtab
+set tabstop=4
+set softtabstop=4
+set shiftwidth=4
+set shiftround
+
+" disable text wrapping
+set nowrap
+
+" allow backspace over everything, default is dumb
+set backspace=indent,eol,start
+
+" never hide statusbar
+set laststatus=2
+
+" search settings
+set incsearch
+set hlsearch
+set smartcase
+set ignorecase
+" map CTRL+L to remove search highlights
+nnoremap <silent> <C-L> :noh<C-R><CR><CR><C-L>
+
+" open windows below and to the right of current (why is the default opposite lol)
+set splitbelow splitright
+
+" show unfinished command in the last line (like 4dd)
+set showcmd
+
+" show relative numbers and absolute number for current line
+set number relativenumber
+
+" COLOR:
+
+" temporary default color scheme
+colorscheme habamax
+
+" dont change default background color
+highlight Normal ctermbg=NONE
+
+" CUSTOMIZATION:
+
+" disable arrow keys, use hjkl instead
+noremap <Up> <Nop>
+noremap <Down> <Nop>
+noremap <Left> <Nop>
+noremap <Right> <Nop>
+
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 0000000..a8e0775
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,66 @@
+{
+  "nodes": {
+    "home-manager": {
+      "inputs": {
+        "nixpkgs": [
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1726989464,
+        "narHash": "sha256-Vl+WVTJwutXkimwGprnEtXc/s/s8sMuXzqXaspIGlwM=",
+        "owner": "nix-community",
+        "repo": "home-manager",
+        "rev": "2f23fa308a7c067e52dfcc30a0758f47043ec176",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "ref": "release-24.05",
+        "repo": "home-manager",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1728740863,
+        "narHash": "sha256-u+rxA79a0lyhG+u+oPBRtTDtzz8kvkc9a6SWSt9ekVc=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "a3f9ad65a0bf298ed5847629a57808b97e6e8077",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-24.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-unstable": {
+      "locked": {
+        "lastModified": 1728492678,
+        "narHash": "sha256-9UTxR8eukdg+XZeHgxW5hQA9fIKHsKCdOIUycTryeVw=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "5633bcff0c6162b9e4b5f1264264611e950c8ec7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "home-manager": "home-manager",
+        "nixpkgs": "nixpkgs",
+        "nixpkgs-unstable": "nixpkgs-unstable"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000..a37fc66
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,49 @@
+{
+  inputs = {
+    nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.05";
+
+    nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable";
+
+    home-manager = {
+      url = "github:nix-community/home-manager/release-24.05";
+      inputs.nixpkgs.follows = "nixpkgs";
+    };
+  };
+
+  outputs = inputs @ { self, nixpkgs, nixpkgs-unstable, home-manager }:
+  let
+    system = "x86_64-linux";
+
+    machines = [
+      "grimoire"
+      "bismuth"
+    ];
+    
+    packageSets = let
+      pkgsInputs = { inherit system; config = import ./config.nix; };
+    in rec {
+      pkgs = import nixpkgs pkgsInputs;
+      unstablePkgs = import nixpkgs-unstable pkgsInputs;
+      auxiliaryPkgs = import ./pkgs { inherit pkgs unstablePkgs; };
+    };
+
+  in {
+    nixosConfigurations = nixpkgs.lib.genAttrs machines
+      (machine: nixpkgs.lib.nixosSystem {
+        inherit system;
+
+        specialArgs = inputs // packageSets;
+
+        modules = [
+          ./machines/${machine}.nix
+        
+          home-manager.nixosModules.home-manager {
+            home-manager.useGlobalPkgs = true;
+            home-manager.useUserPackages = true;
+            home-manager.users.mel = import ./home.nix;
+          }
+        ];
+      }
+    );
+  };
+}
diff --git a/home.nix b/home.nix
new file mode 100644
index 0000000..f13eb88
--- /dev/null
+++ b/home.nix
@@ -0,0 +1,42 @@
+{ pkgs, ... }:
+
+{
+  programs = {
+    git = {
+      enable = true;
+      userName = "Mel";
+      userEmail = "einebeere@gmail.com";
+      signing = { 
+        key = "D75A C286 ACA7 00B4 D8EC 377D 2082 F8EC 11CC 009B";
+        signByDefault = true;
+      };
+      extraConfig.init.defaultBranch = "main";
+    };
+
+    tmux = {
+      enable = true;
+      mouse = true;
+      keyMode = "vi";
+      plugins = with pkgs.tmuxPlugins; [
+        yank fpp open fuzzback
+      ];
+    };
+
+    fish = {
+      enable = true;
+      interactiveShellInit = ''
+        set fish_greeting
+      '';
+    };
+
+    zoxide = { enable = true; enableFishIntegration = true; };
+    starship = { enable = true; enableFishIntegration = true; };
+    direnv = { enable = true; };
+  };
+
+  home.sessionPath = [
+    "$HOME/.local/share/JetBrains/Toolbox/scripts"
+  ];
+
+  home.stateVersion = "24.05";
+}
diff --git a/machines/devices/grimoire.nix b/machines/devices/grimoire.nix
new file mode 100644
index 0000000..f8b7631
--- /dev/null
+++ b/machines/devices/grimoire.nix
@@ -0,0 +1,68 @@
+{ config, pkgs, ... }:
+
+{
+  hardware = {
+    enableAllFirmware = true;
+    enableRedistributableFirmware = true;
+  };
+
+  # boot settings
+  boot = {
+    loader.systemd-boot.enable = true;
+    loader.efi.canTouchEfiVariables = true;
+
+    plymouth.enable = true;
+  
+    initrd.systemd.enable = true; 
+  };
+
+  # swap
+  swapDevices = [{
+    device = "/var/swapfile";
+    size = 8 * 1024;
+  }];
+
+  # internet
+  networking = {
+    networkmanager = {
+      enable = true;
+      # needed so that network chip wakes up after a longer suspend
+      # https://bbs.archlinux.org/viewtopic.php?id=270819
+      wifi = {
+        powersave = false;
+        scanRandMacAddress = false;
+      };
+    };
+  };
+
+  # sound 
+  sound.enable = true;
+  hardware.pulseaudio.enable = false;
+  security.rtkit.enable = true;
+  services.pipewire = {
+    enable = true;
+    alsa = { enable = true; support32Bit = true; };
+    pulse.enable = true;
+    jack.enable = true;
+  };
+
+  # bluetooth
+  hardware.bluetooth = {
+    enable = true;
+    powerOnBoot = true;
+  };
+
+  # printing
+  services.printing = {
+    enable = true;
+    stateless = true;
+    startWhenNeeded = true;
+  };
+
+  services.avahi.enable = false;
+  #services.avahi = {
+  #  enable = true;
+  #  nssmdns4 = true;
+  #  openFirewall = true;
+  #};
+}
diff --git a/machines/grimoire.nix b/machines/grimoire.nix
new file mode 100644
index 0000000..4af614d
--- /dev/null
+++ b/machines/grimoire.nix
@@ -0,0 +1,14 @@
+{ ... }:
+
+{
+  imports = [
+    ../modules/common.nix
+
+    ./hardware/grimoire.nix
+    ./devices/grimoire.nix
+  ];
+
+  networking.hostName = "Grimoire";
+
+  system.stateVersion = "24.05";
+}
diff --git a/machines/hardware/grimoire.nix b/machines/hardware/grimoire.nix
new file mode 100644
index 0000000..c8fc7c6
--- /dev/null
+++ b/machines/hardware/grimoire.nix
@@ -0,0 +1,39 @@
+# 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 + "/hardware/network/broadcom-43xx.nix")
+      (modulesPath + "/installer/scan/not-detected.nix")
+    ];
+
+  boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" ];
+  boot.initrd.kernelModules = [ ];
+  boot.kernelModules = [ "kvm-intel" ];
+  boot.extraModulePackages = [ ];
+
+  fileSystems."/" =
+    { device = "/dev/disk/by-uuid/e03c7434-31d7-474b-9c8b-45b044b1492c";
+      fsType = "ext4";
+    };
+
+  fileSystems."/boot" =
+    { device = "/dev/disk/by-uuid/67E3-17ED";
+      fsType = "vfat";
+      options = [ "fmask=0077" "dmask=0077" ];
+    };
+
+  swapDevices = [ ];
+
+  # 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.<interface>.useDHCP`.
+  networking.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/modules/common.nix b/modules/common.nix
new file mode 100644
index 0000000..447e3e9
--- /dev/null
+++ b/modules/common.nix
@@ -0,0 +1,90 @@
+{ config, pkgs, unstablePkgs, auxiliaryPkgs, ... }:
+
+{
+  imports = [
+    ./user.nix
+    ./locale.nix
+    ./gnome.nix
+    ./fonts.nix
+    ./flatpak.nix
+    ./libreoffice.nix
+    ./nix-ld.nix
+  ];
+
+  boot.kernelPackages = pkgs.linuxPackages_latest;
+
+  nix.settings.experimental-features = [ "flakes" "nix-command" ];
+
+  services.envfs.enable = true;
+  virtualisation.libvirtd.enable = true;
+
+  services = {
+    acpid.enable = true;
+    sysprof.enable = true;
+    tailscale = {
+      enable = true;
+      useRoutingFeatures = "both";
+      extraUpFlags = [ "--ssh" ];
+    };
+  
+    # sometimes needed for gnupg
+    pcscd.enable = true;
+  };
+ 
+  programs = {
+    steam = {
+      enable = true;
+      remotePlay.openFirewall = true;
+    };
+    virt-manager.enable = true;
+    vim = {
+      defaultEditor = true;
+      package = pkgs.vim_configurable.customize {
+        vimrcFile = ./configs/.vimrc;
+      };
+    };
+    fish.enable = true;
+    git.enable = true;
+    tmux.enable = true;
+
+    adb.enable = true;
+    
+    gnupg.agent = {
+      enable = true;
+      enableSSHSupport = true;
+      pinentryPackage = pkgs.pinentry-gnome3;
+    };
+  };
+
+  environment.systemPackages = (with pkgs; [
+    file unzip jq dig htop wget gnupg pinentry-gnome3
+    inetutils pciutils lshw inxi iw pmutils acpi acpid
+    sysprof wireshark hardinfo
+    vlc celluloid foliate calibre
+    yt-dlp ffmpeg_7-full handbrake subtitlecomposer mpv helvum
+    gimp krita aseprite blender inkscape obs-studio darktable
+    audacity musescore reaper bitwig-studio
+    lagrange
+    qemu_full virtiofsd
+
+    openvpn openvpn3 update-resolv-conf
+    
+    xorg.xeyes wl-clipboard
+
+    ripgrep gnumake gdb gcc clang
+    go gopls delve go-task
+    meson cmake
+    nil direnv
+
+    wineWowPackages.stagingFull winetricks bottles
+    scrcpy apfs-fuse
+
+    prismlauncher
+  ]) ++ (with unstablePkgs; [
+    davinci-resolve
+  ]) ++ (with auxiliaryPkgs; [
+    ghidra
+  ]);
+
+  environment.etc.openvpn.source = "${pkgs.update-resolv-conf}/libexec/openvpn";
+}
diff --git a/modules/flatpak.nix b/modules/flatpak.nix
new file mode 100644
index 0000000..1751fcf
--- /dev/null
+++ b/modules/flatpak.nix
@@ -0,0 +1,12 @@
+{ config, pkgs, ... }:
+
+{
+  # Flatpak is used for some packages that don't work
+  # nicely on NixOS, like Handbrake.
+  services.flatpak.enable = true;
+
+  environment.systemPackages = (with pkgs; [
+    # Add GUI for Flatpak installation.
+    gnome.gnome-software
+  ]);
+}
diff --git a/modules/fonts.nix b/modules/fonts.nix
new file mode 100644
index 0000000..b500b2e
--- /dev/null
+++ b/modules/fonts.nix
@@ -0,0 +1,15 @@
+{ config, pkgs, ... }:
+
+{
+  fonts = {
+    enableDefaultPackages = true;
+
+    packages = with pkgs; [
+      jetbrains-mono
+      meslo-lg
+      input-fonts
+      fira fira-math fira-code
+      corefonts vistafonts
+    ];
+  };
+}
diff --git a/modules/gnome.nix b/modules/gnome.nix
new file mode 100644
index 0000000..7fde00d
--- /dev/null
+++ b/modules/gnome.nix
@@ -0,0 +1,64 @@
+{ config, pkgs, ... }:
+
+{
+  services.xserver.enable = true;
+
+  # i dont like how the icon looks :)
+  services.xserver.excludePackages = [ pkgs.xterm ];
+
+  services.xserver.displayManager.gdm.enable = true;
+  services.xserver.desktopManager.gnome.enable = true;
+
+  environment.gnome.excludePackages = with pkgs; [
+    gnome-console
+  ];
+
+  environment.systemPackages = (with pkgs.gnome; [
+    gnome-terminal gnome-tweaks dconf-editor
+  ]) ++ (with pkgs.gnomeExtensions; [
+    runcat vitals
+  ]);
+
+  # legacy apps dark mode support
+  services.xserver.desktopManager.gnome.extraGSettingsOverrides = ''
+    # set dark theme for legacy applications
+    [org.gnome.desktop.interface]
+    gtk-theme="Adwaita"
+
+    # minimize windows when middle-clicking on titlebar
+    [org.gnome.desktop.wm.preferences]
+    action-middle-click-titlebar="minimize"
+  '';
+
+  environment.etc = {
+    "xdg/gtk-2.0/gtkrc".text = ''
+      gtk-application-prefer-dark-theme = 1
+    '';
+    "xdg/gtk-3.0/settings.ini".text = ''
+      [Settings]
+      gtk-application-prefer-dark-theme = 1
+    '';
+    "xdg/gtk-4.0/settings.ini".text = ''
+      [Settings]
+      gtk-application-prefer-dark-theme = 1
+    '';
+  };
+
+  # enable triple buffering which makes mutter supposedly feel smoother
+  nixpkgs.overlays = [
+    # GNOME 46: triple-buffering-v4-46
+    (final: prev: {
+      gnome = prev.gnome.overrideScope (gnomeFinal: gnomePrev: {
+        mutter = gnomePrev.mutter.overrideAttrs (old: {
+          src = pkgs.fetchFromGitLab  {
+            domain = "gitlab.gnome.org";
+            owner = "vanvugt";
+            repo = "mutter";
+            rev = "triple-buffering-v4-46";
+            hash = "sha256-C2VfW3ThPEZ37YkX7ejlyumLnWa9oij333d5c4yfZxc=";
+          };
+        });
+      });
+    })
+  ];
+}
diff --git a/modules/libreoffice.nix b/modules/libreoffice.nix
new file mode 100644
index 0000000..8aad8e2
--- /dev/null
+++ b/modules/libreoffice.nix
@@ -0,0 +1,11 @@
+{ config, pkgs, ... }:
+
+{
+  environment.systemPackages = (with pkgs; [
+    libreoffice-fresh
+
+    hunspell
+  ]) ++ (with pkgs.hunspellDicts; [
+    en_US-large en_GB-large de_DE ru_RU
+  ]);
+}
diff --git a/modules/locale.nix b/modules/locale.nix
new file mode 100644
index 0000000..2a4f45b
--- /dev/null
+++ b/modules/locale.nix
@@ -0,0 +1,27 @@
+{ config, pkgs, ... }:
+
+{
+  # Set your time zone.
+  time.timeZone = "Europe/Berlin";
+
+  # Select internationalisation properties.
+  i18n.defaultLocale = "en_US.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 keymap in X11
+  services.xserver.xkb = {
+    layout = "us";
+    variant = "";
+  };
+}
diff --git a/modules/nix-ld.nix b/modules/nix-ld.nix
new file mode 100644
index 0000000..2ab5df5
--- /dev/null
+++ b/modules/nix-ld.nix
@@ -0,0 +1,59 @@
+{ config, pkgs, ... }:
+
+{
+  programs.nix-ld.enable = true;
+
+  programs.nix-ld.libraries = with pkgs; [
+    alsa-lib
+    at-spi2-atk
+    at-spi2-core
+    atk
+    cairo
+    cups
+    curl
+    dbus
+    expat
+    fontconfig
+    freetype
+    fuse3
+    gdk-pixbuf
+    glib
+    gtk3
+    icu
+    libGL
+    libappindicator-gtk3
+    libdrm
+    libglvnd
+    libnotify
+    libpulseaudio
+    libunwind
+    libusb1
+    libuuid
+    libxkbcommon
+    libxml2
+    mesa
+    nspr
+    nss
+    openssl
+    pango
+    pipewire
+    stdenv.cc.cc
+    systemd
+    vulkan-loader
+    xorg.libX11
+    xorg.libXScrnSaver
+    xorg.libXcomposite
+    xorg.libXcursor
+    xorg.libXdamage
+    xorg.libXext
+    xorg.libXfixes
+    xorg.libXi
+    xorg.libXrandr
+    xorg.libXrender
+    xorg.libXtst
+    xorg.libxcb
+    xorg.libxkbfile
+    xorg.libxshmfence
+    zlib
+  ];
+}
diff --git a/modules/user.nix b/modules/user.nix
new file mode 100644
index 0000000..624756b
--- /dev/null
+++ b/modules/user.nix
@@ -0,0 +1,27 @@
+{ config, pkgs, unstablePkgs, auxiliaryPkgs, ... }:
+
+{
+  users.mutableUsers = false;
+  users.users.mel = {
+    isNormalUser = true;
+    description = "Mel";
+    shell = pkgs.fish;
+    extraGroups = [ "networkmanager" "wheel" ];
+    hashedPassword = "$y$j9T$4wGl.YJizIpcfFv0LyvLU0$7LLEkjIFWBOV.XXynReCOczBYNX0EZfMPIDB/bmmhhC";
+    
+    packages = (with pkgs; [
+      firefox
+      thunderbird
+      tor-browser
+      transmission_4-gtk
+      jetbrains-toolbox
+    ]) ++ (with unstablePkgs; [
+      godot_4
+    ]) ++ (with auxiliaryPkgs; [
+      discord
+      element-desktop
+      obsidian
+      vscode
+    ]);
+  };
+}
diff --git a/pkgs/default.nix b/pkgs/default.nix
new file mode 100644
index 0000000..5f87431
--- /dev/null
+++ b/pkgs/default.nix
@@ -0,0 +1,11 @@
+{ pkgs, unstablePkgs, ... }:
+
+rec {
+  inherit (pkgs.callPackages ./electron-wayland-wrappers.nix {})
+    discord
+    obsidian
+    vscode
+    element-desktop;
+
+  ghidra = unstablePkgs.callPackage ./ghidra {};
+}
diff --git a/pkgs/electron-wayland-wrappers.nix b/pkgs/electron-wayland-wrappers.nix
new file mode 100644
index 0000000..b83f258
--- /dev/null
+++ b/pkgs/electron-wayland-wrappers.nix
@@ -0,0 +1,42 @@
+{
+  symlinkJoin, makeWrapper,
+  
+  discord, obsidian, vscode, element-desktop
+}:
+
+let
+  goodFlags = ''
+    --ozone-platform=wayland \
+    --force-device-scale=2 \
+    --enable-features=UseOzonePlatform,WaylandWindowDecorations \
+    --disable-features=WaylandFractionalScaleV1
+  '';
+
+  badFlags = ''
+    --ozone-platform=x11 \
+    --no-sandbox
+  '';
+
+  makeElectronWrapper = {
+    name,
+    binary ? name,
+    package,
+    bad ? false
+  }: let
+    flags = if bad then badFlags else goodFlags;
+  in symlinkJoin {
+    name = name;
+    paths = [ package ];
+    buildInputs = [ makeWrapper ];
+    postBuild = ''
+      wrapProgram $out/bin/${binary} \
+        --add-flags "${flags}"
+    '';
+  };
+in
+{
+  discord = makeElectronWrapper { name = "Discord"; package = discord; bad = true; };
+  obsidian = makeElectronWrapper { name = "obsidian"; package = obsidian; };
+  vscode = makeElectronWrapper { name = "vscode"; binary = "code"; package = vscode.fhs; };
+  element-desktop = makeElectronWrapper { name = "element-desktop"; package = element-desktop; };
+}
diff --git a/pkgs/ghidra/default.nix b/pkgs/ghidra/default.nix
new file mode 100644
index 0000000..79e61e5
--- /dev/null
+++ b/pkgs/ghidra/default.nix
@@ -0,0 +1,15 @@
+{ ghidra }:
+
+let
+  ghidra-patched = ghidra.overrideAttrs (finalAttrs: previousAttrs: { 
+    patches = previousAttrs.patches ++ [ ./ui-scale.patch ];
+  });
+in
+ghidra-patched.withExtensions (extensions: with extensions; [
+  gnudisassembler
+  machinelearning
+  ghidraninja-ghidra-scripts
+  lightkeeper
+  ret-sync
+  ghidra-delinker-extension
+])
diff --git a/pkgs/ghidra/ui-scale.patch b/pkgs/ghidra/ui-scale.patch
new file mode 100644
index 0000000..6ebac8d
--- /dev/null
+++ b/pkgs/ghidra/ui-scale.patch
@@ -0,0 +1,11 @@
+--- a/Ghidra/RuntimeScripts/Common/support/launch.properties
++++ b/Ghidra/RuntimeScripts/Common/support/launch.properties
+@@ -20,7 +20,7 @@
+ VMARGS=-Dsun.java2d.opengl=false
+ VMARGS_LINUX=-Dsun.java2d.pmoffscreen=false
+ VMARGS_LINUX=-Dsun.java2d.xrender=true
+-VMARGS_LINUX=-Dsun.java2d.uiScale=1
++VMARGS_LINUX=-Dsun.java2d.uiScale=2
+ VMARGS_LINUX=-Dawt.useSystemAAFontSettings=on
+ VMARGS_WINDOWS=-Dsun.java2d.d3d=false
+