summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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
+