about summary refs log tree commit diff
path: root/nixos
diff options
context:
space:
mode:
Diffstat (limited to 'nixos')
-rw-r--r--nixos/LICENSE13
-rw-r--r--nixos/README3
-rw-r--r--nixos/config/coc-settings.json18
-rw-r--r--nixos/config/dmenu.patch19
-rw-r--r--nixos/config/dmscripts-conf261
-rw-r--r--nixos/config/ghci1
-rw-r--r--nixos/config/kitty.conf2535
-rw-r--r--nixos/config/neovim/init.lua2
-rw-r--r--nixos/config/neovim/lua/plugins/autopairs.lua3
-rw-r--r--nixos/config/neovim/lua/plugins/catppuccin.lua29
-rw-r--r--nixos/config/neovim/lua/plugins/codeium.lua1
-rw-r--r--nixos/config/neovim/lua/plugins/colorizer.lua1
-rw-r--r--nixos/config/neovim/lua/plugins/dashboard.lua58
-rw-r--r--nixos/config/neovim/lua/plugins/harpoon.lua10
-rw-r--r--nixos/config/neovim/lua/plugins/init.lua11
-rw-r--r--nixos/config/neovim/lua/plugins/lastplace.lua1
-rw-r--r--nixos/config/neovim/lua/plugins/lsp.lua40
-rw-r--r--nixos/config/neovim/lua/plugins/lualine.lua13
-rw-r--r--nixos/config/neovim/lua/plugins/telescope.lua7
-rw-r--r--nixos/config/neovim/lua/plugins/treesitter.lua17
-rw-r--r--nixos/config/neovim/lua/venomade/clipboard.lua14
-rw-r--r--nixos/config/neovim/lua/venomade/config.lua41
-rw-r--r--nixos/config/neovim/lua/venomade/init.lua5
-rw-r--r--nixos/config/neovim/lua/venomade/lazy.lua42
-rw-r--r--nixos/config/neovim/lua/venomade/neovide.lua20
-rw-r--r--nixos/config/neovim/lua/venomade/remap.lua7
-rw-r--r--nixos/config/picom.conf423
-rw-r--r--nixos/config/rc.conf2
-rw-r--r--nixos/config/vimrc302
-rw-r--r--nixos/config/xmobarrc122
-rw-r--r--nixos/config/xmonad.hs304
-rw-r--r--nixos/config/zshrc34
-rw-r--r--nixos/configuration.nix281
-rw-r--r--nixos/flake.lock48
-rw-r--r--nixos/flake.nix28
-rw-r--r--nixos/hardware-configuration.nix39
-rw-r--r--nixos/home.nix117
-rwxr-xr-xnixos/scripts/_dm-helper.sh196
-rwxr-xr-xnixos/scripts/dm-dictionary96
-rwxr-xr-xnixos/scripts/dm-documents54
-rwxr-xr-xnixos/scripts/dm-hub119
-rwxr-xr-xnixos/scripts/dm-man57
-rwxr-xr-xnixos/scripts/dm-note61
-rwxr-xr-xnixos/scripts/dm-pipewire-out-switcher51
-rwxr-xr-xnixos/scripts/dm-spellcheck38
-rwxr-xr-xnixos/scripts/dm-weather43
-rwxr-xr-xnixos/scripts/dm-websearch54
-rwxr-xr-xnixos/scripts/dm-wifi42
-rwxr-xr-xnixos/scripts/dm-youtube87
-rwxr-xr-xnixos/scripts/get-battery39
-rwxr-xr-xnixos/scripts/get-brightness22
-rwxr-xr-xnixos/scripts/get-volume22
-rw-r--r--nixos/wallpapers/PastelPinkLightning.jpgbin0 -> 2842087 bytes
53 files changed, 5853 insertions, 0 deletions
diff --git a/nixos/LICENSE b/nixos/LICENSE
new file mode 100644
index 0000000..5c93f45
--- /dev/null
+++ b/nixos/LICENSE
@@ -0,0 +1,13 @@
+            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+                    Version 2, December 2004
+
+ Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
+
+ Everyone is permitted to copy and distribute verbatim or modified
+ copies of this license document, and changing it is allowed as long
+ as the name is changed.
+
+            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. You just DO WHAT THE FUCK YOU WANT TO.
diff --git a/nixos/README b/nixos/README
new file mode 100644
index 0000000..c632a22
--- /dev/null
+++ b/nixos/README
@@ -0,0 +1,3 @@
+NIXOS DOTFILES
+
+Dotfiles for my personal NixOS
diff --git a/nixos/config/coc-settings.json b/nixos/config/coc-settings.json
new file mode 100644
index 0000000..1a8159e
--- /dev/null
+++ b/nixos/config/coc-settings.json
@@ -0,0 +1,18 @@
+{
+  "suggest.noselect": true,
+  "clangd.semanticHighlighting": true,
+  "coc.preferences.semanticTokensHighlights": false,
+  "languageserver": {
+    "haskell": {
+      "command": "haskell-language-server-wrapper",
+      "args": ["--lsp"],
+      "rootPatterns": ["*.cabal", "stack.yaml", "cabal.project", "package.yaml", "hie.yaml"],
+      "filetypes": ["haskell", "lhaskell"]
+    },
+    "nix": {
+      "command": "nil",
+      "filetypes": ["nix"],
+      "rootPatterns":  ["flake.nix"]
+    }
+  }
+}
diff --git a/nixos/config/dmenu.patch b/nixos/config/dmenu.patch
new file mode 100644
index 0000000..decfda0
--- /dev/null
+++ b/nixos/config/dmenu.patch
@@ -0,0 +1,19 @@
+--- dmenu-5.2/config.def.h	2022-10-04 18:36:58.000000000 +0100
++++ dmenu/config.h	2024-01-06 00:56:33.000000000 +0000
+@@ -4,13 +4,13 @@
+ static int topbar = 1;                      /* -b  option; if 0, dmenu appears at bottom     */
+ /* -fn option overrides fonts[0]; default X11 font or font set */
+ static const char *fonts[] = {
+-	"monospace:size=10"
++	"FantasqueSansM Nerd Font:size=12"
+ };
+ static const char *prompt      = NULL;      /* -p  option; prompt to the left of input field */
+ static const char *colors[SchemeLast][2] = {
+ 	/*     fg         bg       */
+-	[SchemeNorm] = { "#bbbbbb", "#222222" },
+-	[SchemeSel] = { "#eeeeee", "#005577" },
++	[SchemeNorm] = { "#cdd6f4", "#1e1e2e" },
++	[SchemeSel] = { "#cdd6f4", "#907F9B" },
+ 	[SchemeOut] = { "#000000", "#00ffff" },
+ };
+ /* -l option; if nonzero, dmenu uses vertical list with given number of lines */
diff --git a/nixos/config/dmscripts-conf b/nixos/config/dmscripts-conf
new file mode 100644
index 0000000..cda0ef3
--- /dev/null
+++ b/nixos/config/dmscripts-conf
@@ -0,0 +1,261 @@
+#!/usr/bin/env bash
+# shellcheck disable=SC2034
+# This issue is ignored because it is part of a larger file that calls upon all variables listed
+
+# To edit this file copy it to `${HOME}/.config/dmscripts/config`
+# `cp /etc/dmscripts/config ${HOME}/.config/dmscripts/config`
+
+# Defined variables, modify anything in quotes to your prefered software
+
+# IMPORTANT! Keep the '-p' flag at the end of the DMENU and RMENU variables.
+# Also, keep the '--prompt' flag at the end of the FMENU variable.
+# These are needed as we use prompts in the scripts.
+DMENU="dmenu -i -l 20 -p"
+RMENU="rofi -dmenu -p"
+
+# the bind must stay, why is this not the default? idk
+FMENU="fzf --bind=enter:replace-query+print-query --border=rounded --margin=5% --color=dark --height 100% --reverse --header=$(basename "$0") --info=hidden --header-first --prompt"
+
+
+PDF_VIEWER="zathura"
+
+DMBROWSER="firefox"
+# DMBROWSER="qutebrowser"
+
+# DMTERM="st -e"
+DMTERM="kitty -e"
+
+# DMEDITOR="emacsclient -c -a emacs"
+DMEDITOR="${DMTERM} vim"
+
+# TODO: Rename this variable to something more traditional
+logout_locker='slock'
+# logout_locker='dm-tool lock'
+
+# dmscripts will notify you if your configuration is outdated, to shut it up uncomment this.
+# comment it back out if you want dmscripts to nag at you
+# DM_SHUTUP="something" # NOTICE: This is currently experimental and will not work in (most) programs
+
+# set this variable up to a real file if you want dmscripts to provide a log of when and what has changed
+# in your config (this can be an alternative to the notifications)
+DM_CONFIG_DIFF_LOGFILE="/dev/stderr" # NOTICE: experimental
+
+# This case statement lets you change what the DMENU variable is for different scripts, so if you
+# want a unique variable for each script you can
+# syntax is as follows:
+# "<ending-of-script>") DMENU="your variable here"
+# *) should be left blank, global variables are defined above
+
+# include -p in standard dmenu as we use prompts by default
+case "${0##*-}" in
+#  "colpick") DMENU="dmenu -i -p";;
+#  "confedit") DMENU="dmenu -i -l 30 -p";;
+#  "youtube") DMBROWSER="firefox";;
+  *);;
+esac
+
+# "${0##*-}" means grab the 0th argument (which is always the path to the program) starting from the
+# last dash. This gives us the word after the - which is what we are searching for in the case
+# statement. ie dm-man -> man
+
+# An awk equivalent is:
+# awk -F"-" '{print $NF}'
+# Sadly cut has no easy equivalent
+
+# TODO: Move almost all of these variables into the case statement
+# TODO: Make some of the more useful ones general variables
+# IE a pictures directory, an audio directory, config locations, etc
+
+# dm-bookman
+bookman_show_source=1
+
+# dm-sounds
+sounds_dir="${HOME}/.config/dmscripts/dmsounds"
+
+# dm-setbg
+setbg_dir="${HOME}/Pictures/Papes"
+# Set this to 1 if you want to use imv and wayland, 0 if you want to use sxiv
+# Note that sxiv is X11 only, you need to mark the image you want to use.
+use_imv=0
+
+# dm-maim
+maim_dir="${HOME}/Screenshots"
+maim_file_prefix="maim"
+
+# dm-note
+note_dir="${HOME}/.config/dmscripts/dmnote"
+
+# dm-confedit
+# no means it will use only static entries
+confedit_isdynamic="yes"
+
+# a list of directories to exclude in conf edit
+# as an example: to exclude anything from the folder .config/foo and .config/bar, put "foo|bar"
+# It takes any regexp and is case insensitive
+confedit_exclude_dirs="BraveSoftware"
+
+
+# If this variable is blank or is defined as "find", then it uses find
+# Examples:
+# locate: locate
+# fd: fd .
+# find: find
+# etc
+# Note that there is no need to include any arguments excluding directories, that is handled autmatically
+confedit_find_prog="find"
+
+# We must declare all lists with the -g option
+
+# a list of static config files that may not be in the expected places
+declare -Ag confedit_list
+confedit_list[confedit]="$HOME/.config/dmscripts/config"
+confedit_list[alacritty]="$HOME/.config/alacritty/alacritty.yml"
+confedit_list[awesome]="$HOME/.config/awesome/rc.lua"
+confedit_list[bash]="$HOME/.bashrc"
+confedit_list[broot]="$HOME/.config/broot/conf.toml"
+confedit_list[bspwm]="$HOME/.config/bspwm/bspwmrc"
+confedit_list[doom emacs config.el]="$HOME/.config/doom/config.el"
+confedit_list[doom emacs config.org]="$HOME/.config/doom/config.org"
+confedit_list[doom emacs init.el]="$HOME/.config/doom/init.el"
+confedit_list[doom emacs packages.el]="$HOME/.config/doom/packages.el"
+confedit_list[dunst]="$HOME/.config/dunst/dunstrc"
+confedit_list[dwm]="$HOME/dwm-distrotube/config.def.h"
+confedit_list[dwmblocks]="$HOME/dwmblocks-distrotube/blocks.def.h"
+confedit_list[fish]="$HOME/.config/fish/config.fish"
+confedit_list[herbstluftwm]="$HOME/.config/herbstluftwm/autostart"
+confedit_list[i3]="$HOME/.config/i3/config"
+confedit_list[ncmpcpp]="$HOME/.config/ncmpcpp/config"
+confedit_list[neovim init.vim]="$HOME/.config/nvim/init.vim"
+confedit_list[neovim init.lua]="$HOME/.config/nvim/init.lua"
+confedit_list[picom]="$HOME/.config/picom/picom.conf"
+confedit_list[polybar]="$HOME/.config/polybar/config"
+confedit_list[qtile]="$HOME/.config/qtile/config.py"
+confedit_list[qutebrowser bookmarks]="$HOME/.config/qutebrowser/bookmarks/urls"
+confedit_list[qutebrowser quickmarks]="$HOME/.config/qutebrowser/quickmarks"
+confedit_list[qutebrowser config.py]="$HOME/.config/qutebrowser/config.py"
+confedit_list[spectrwm]="$HOME/.spectrwm.conf"
+confedit_list[ssh]="$HOME/.ssh/config"
+confedit_list[st]="$HOME/st-distrotube/config.def.h"
+confedit_list[stumpwm]="$HOME/.config/stumpwm/config"
+confedit_list[surf]="$HOME/surf-distrotube/config.def.h"
+confedit_list[sxhkd]="$HOME/.config/sxhkd/sxhkdrc"
+confedit_list[tabbed]="$HOME/tabbed-distrotube/config.def.h"
+confedit_list[vifm]="$HOME/.config/vifm/vifmrc"
+confedit_list[vim]="$HOME/.vimrc"
+confedit_list[xmonad]="$HOME/.xmonad/README.org"
+confedit_list[xinitrc]="$HOME/.xinitrc"
+confedit_list[xresources]="$HOME/.Xresources"
+confedit_list[zsh]="$HOME/.zshrc"
+
+# dm-reddit config
+declare -ag reddit_list=(
+"r/thedeprogram"
+"r/linuxmasterrace"
+)
+
+# Search engine config
+declare -Ag websearch
+# Syntax:
+# websearch[name]="https://www.example.com/search?q="
+
+# Search Engines
+websearch[brave]="https://search.brave.com/search?q="
+websearch[duckduckgo]="https://duckduckgo.com/?q="
+websearch[google]="https://www.google.com/search?q="
+websearch[yandex]="https://yandex.com/search/?text="
+# Information/News
+websearch[wikipedia]="https://en.wikipedia.org/w/index.php?search="
+# Social Media
+websearch[reddit]="https://www.reddit.com/search/?q="
+websearch[odysee]="https://odysee.com/$/search?q="
+websearch[youtube]="https://www.youtube.com/results?search_query="
+# Online Shopping
+websearch[amazon]="https://www.amazon.com/s?k="
+websearch[ebay]="https://www.ebay.com/sch/i.html?&_nkw="
+# Linux
+websearch[archwiki]="https://wiki.archlinux.org/index.php?search="
+websearch[debian_pkgs]="https://packages.debian.org/search?suite=default&section=all&arch=any&searchon=names&keywords="
+websearch[flathub]="https://flathub.org/search/public?channel=stable&query="
+websearch[fedora_pkgs]="https://packages.fedoraproject.org/search?query="
+# NixOS
+websearch[nix_pkgs]="https://search.nixos.org/packages?query="
+websearch[nix_opts]="https://search.nixos.org/options?query="
+websearch[nix_hm_opts]="https://mipmip.github.io/home-manager-option-search/?query="
+# Development
+websearch[github]="https://github.com/search?q="
+websearch[gitlab]="https://gitlab.com/search?search="
+websearch[stackoverflow]="https://stackoverflow.com/search?q="
+websearch[hoogle]="https://hoogle.haskell.org/?hoogle="
+# Misc
+websearch[books]="https://ravebooksearch.com/#gsc.tab=0&gsc.sort=&gsc.q="
+
+# dm-youtube config
+# Think of these as your "subscribed channels", name the channel in the square brackets then put the channel URL in the quotation marks
+# Syntax: youtube_channels[name]="https://www.youtube.com/link/to/channel"
+
+declare -Ag youtube_channels
+youtube_channels[distrotube]="https://www.youtube.com/@DistroTube/videos"
+youtube_channels[alexchristoforou]="https://www.youtube.com/@AlexChristoforou/videos"
+youtube_channels[alexandermercouris]="https://www.youtube.com/@AlexMercouris/videos"
+youtube_channels[duran]="https://www.youtube.com/@TheDuran/videos"
+youtube_channels[isorrowproductions]="https://www.youtube.com/@iSorrowproductions/videos"
+youtube_channels[geopoliticaleconomyreport]="https://www.youtube.com/@GeopoliticalEconomyReport/videos"
+youtube_channels[secondwindgroup]="https://www.youtube.com/@SecondWindGroup/videos"
+youtube_channels[videogamedunkey]="https://www.youtube.com/@videogamedunkey/videos"
+youtube_channels[yogscast]="https://www.youtube.com/@yogscast/videos"
+youtube_channels[thelinuxexperiment]="https://www.youtube.com/@TheLinuxEXP/videos"
+
+# dm-radio config
+# Your list of online radio stations for the dm-radio script.
+# Syntax: radio_stations[name]="https://www.zeno.fm/radio/your-station"
+# dmradio-volume ranges between -1 and 100 (for mplayer) or 0-100 (for mpv)
+
+DMRADIOVOLUME="100"
+declare -Ag radio_stations
+radio_stations[Oldies Radio 50s-60s]="https://zeno.fm/radio/oldies-radio-50s-60s/"
+radio_stations[Oldies Radio 70s]="https://zeno.fm/radio/oldies-radio-70s/"
+radio_stations[Unlimited 80s]="https://zeno.fm/radio/unlimited80s/"
+radio_stations[80s Hits]="https://zeno.fm/radio/80shits/"
+radio_stations[90s Hits]="https://zeno.fm/radio/90s_HITS/"
+radio_stations[2000s Pop]="https://zeno.fm/radio/2000s-pop/"
+radio_stations[The 2000s]="https://zeno.fm/radio/the-2000s/"
+radio_stations[Hits 2010s]="https://zeno.fm/radio/helia-hits-2010/"
+radio_stations[Classical Radio]="https://zeno.fm/radio/classical-radio/"
+radio_stations[Classical Relaxation]="https://zeno.fm/radio/radio-christmas-non-stop-classical/"
+radio_stations[Classic Rock]="https://zeno.fm/radio/classic-rockdnb2sav8qs8uv/"
+radio_stations[Gangsta49]="https://zeno.fm/radio/gangsta49/"
+radio_stations[HipHop49]="https://zeno.fm/radio/hiphop49/"
+radio_stations[Madhouse Country Radio]="https://zeno.fm/radio/madhouse-country-radio/"
+radio_stations[PopMusic]="https://zeno.fm/radio/popmusic74vyurvmug0uv/"
+radio_stations[PopStars]="https://zeno.fm/radio/popstars/"
+radio_stations[RadioMetal]="https://zeno.fm/radio/radio-metal/"
+radio_stations[RocknRoll Radio]="https://zeno.fm/radio/rocknroll-radio994c7517qs8uv/"
+
+# dm-colpick config
+declare -Ag colpick_list
+colpick_list[black]="#282a36"
+colpick_list[red]="#ff5555"
+colpick_list[green]="#5af78e"
+colpick_list[yellow]="#f1fa8c"
+colpick_list[blue]="#57c7ff"
+colpick_list[magenta]="#ff6ac1"
+colpick_list[cyan]="#8be9fd"
+colpick_list[white]="#f1f1f0"
+colpick_list[orange]="#ffb86c"
+colpick_list[purple]="#bd9cf9"
+
+# dm-weather config
+
+# Example: set the default search parameters to Texas, Paris and Moscow
+# weather_locations="Texas, United States
+# Paris, France
+# Moscow, Russia"
+weather_locations="Haverhill, United Kingdom"
+
+# use the weather_opts variable to set additional flags:
+# weather_opts="flag1&flag2&flag3=somevalue"
+
+# for full details see: https://github.com/chubin/wttr.in
+
+# current revision (do not touch unless you know what you're doing)
+_revision=26
diff --git a/nixos/config/ghci b/nixos/config/ghci
new file mode 100644
index 0000000..31f559e
--- /dev/null
+++ b/nixos/config/ghci
@@ -0,0 +1 @@
+:set prompt "λ "
diff --git a/nixos/config/kitty.conf b/nixos/config/kitty.conf
new file mode 100644
index 0000000..7ed0e46
--- /dev/null
+++ b/nixos/config/kitty.conf
@@ -0,0 +1,2535 @@
+# vim:fileencoding=utf-8:foldmethod=marker
+
+#: Fonts {{{
+
+#: kitty has very powerful font management. You can configure
+#: individual font faces and even specify special fonts for particular
+#: characters.
+
+font_family      FantasqueSansM Nerd Font
+# bold_font        auto
+# italic_font      auto
+# bold_italic_font auto
+
+#: You can specify different fonts for the bold/italic/bold-italic
+#: variants. To get a full list of supported fonts use the `kitty
+#: +list-fonts` command. By default they are derived automatically, by
+#: the OSes font system. When bold_font or bold_italic_font is set to
+#: auto on macOS, the priority of bold fonts is semi-bold, bold,
+#: heavy. Setting them manually is useful for font families that have
+#: many weight variants like Book, Medium, Thick, etc. For example::
+
+#:     font_family      Operator Mono Book
+#:     bold_font        Operator Mono Medium
+#:     italic_font      Operator Mono Book Italic
+#:     bold_italic_font Operator Mono Medium Italic
+
+font_size 12.0
+
+#: Font size (in pts)
+
+# force_ltr no
+
+#: kitty does not support BIDI (bidirectional text), however, for RTL
+#: scripts, words are automatically displayed in RTL. That is to say,
+#: in an RTL script, the words "HELLO WORLD" display in kitty as
+#: "WORLD HELLO", and if you try to select a substring of an RTL-
+#: shaped string, you will get the character that would be there had
+#: the string been LTR. For example, assuming the Hebrew word ירושלים,
+#: selecting the character that on the screen appears to be ם actually
+#: writes into the selection buffer the character י. kitty's default
+#: behavior is useful in conjunction with a filter to reverse the word
+#: order, however, if you wish to manipulate RTL glyphs, it can be
+#: very challenging to work with, so this option is provided to turn
+#: it off. Furthermore, this option can be used with the command line
+#: program GNU FriBidi <https://github.com/fribidi/fribidi#executable>
+#: to get BIDI support, because it will force kitty to always treat
+#: the text as LTR, which FriBidi expects for terminals.
+
+# symbol_map
+
+#: E.g. symbol_map U+E0A0-U+E0A3,U+E0C0-U+E0C7 PowerlineSymbols
+
+#: Map the specified Unicode codepoints to a particular font. Useful
+#: if you need special rendering for some symbols, such as for
+#: Powerline. Avoids the need for patched fonts. Each Unicode code
+#: point is specified in the form `U+<code point in hexadecimal>`. You
+#: can specify multiple code points, separated by commas and ranges
+#: separated by hyphens. This option can be specified multiple times.
+#: The syntax is::
+
+#:     symbol_map codepoints Font Family Name
+
+# narrow_symbols
+
+#: E.g. narrow_symbols U+E0A0-U+E0A3,U+E0C0-U+E0C7 1
+
+#: Usually, for Private Use Unicode characters and some symbol/dingbat
+#: characters, if the character is followed by one or more spaces,
+#: kitty will use those extra cells to render the character larger, if
+#: the character in the font has a wide aspect ratio. Using this
+#: option you can force kitty to restrict the specified code points to
+#: render in the specified number of cells (defaulting to one cell).
+#: This option can be specified multiple times. The syntax is::
+
+#:     narrow_symbols codepoints [optionally the number of cells]
+
+# disable_ligatures never
+
+#: Choose how you want to handle multi-character ligatures. The
+#: default is to always render them. You can tell kitty to not render
+#: them when the cursor is over them by using cursor to make editing
+#: easier, or have kitty never render them at all by using always, if
+#: you don't like them. The ligature strategy can be set per-window
+#: either using the kitty remote control facility or by defining
+#: shortcuts for it in kitty.conf, for example::
+
+#:     map alt+1 disable_ligatures_in active always
+#:     map alt+2 disable_ligatures_in all never
+#:     map alt+3 disable_ligatures_in tab cursor
+
+#: Note that this refers to programming ligatures, typically
+#: implemented using the calt OpenType feature. For disabling general
+#: ligatures, use the font_features option.
+
+# font_features
+
+#: E.g. font_features none
+
+#: Choose exactly which OpenType features to enable or disable. This
+#: is useful as some fonts might have features worthwhile in a
+#: terminal. For example, Fira Code includes a discretionary feature,
+#: zero, which in that font changes the appearance of the zero (0), to
+#: make it more easily distinguishable from Ø. Fira Code also includes
+#: other discretionary features known as Stylistic Sets which have the
+#: tags ss01 through ss20.
+
+#: For the exact syntax to use for individual features, see the
+#: HarfBuzz documentation <https://harfbuzz.github.io/harfbuzz-hb-
+#: common.html#hb-feature-from-string>.
+
+#: Note that this code is indexed by PostScript name, and not the font
+#: family. This allows you to define very precise feature settings;
+#: e.g. you can disable a feature in the italic font but not in the
+#: regular font.
+
+#: On Linux, font features are first read from the FontConfig database
+#: and then this option is applied, so they can be configured in a
+#: single, central place.
+
+#: To get the PostScript name for a font, use `kitty +list-fonts
+#: --psnames`:
+
+#: .. code-block:: sh
+
+#:     $ kitty +list-fonts --psnames | grep Fira
+#:     Fira Code
+#:     Fira Code Bold (FiraCode-Bold)
+#:     Fira Code Light (FiraCode-Light)
+#:     Fira Code Medium (FiraCode-Medium)
+#:     Fira Code Regular (FiraCode-Regular)
+#:     Fira Code Retina (FiraCode-Retina)
+
+#: The part in brackets is the PostScript name.
+
+#: Enable alternate zero and oldstyle numerals::
+
+#:     font_features FiraCode-Retina +zero +onum
+
+#: Enable only alternate zero in the bold font::
+
+#:     font_features FiraCode-Bold +zero
+
+#: Disable the normal ligatures, but keep the calt feature which (in
+#: this font) breaks up monotony::
+
+#:     font_features TT2020StyleB-Regular -liga +calt
+
+#: In conjunction with force_ltr, you may want to disable Arabic
+#: shaping entirely, and only look at their isolated forms if they
+#: show up in a document. You can do this with e.g.::
+
+#:     font_features UnifontMedium +isol -medi -fina -init
+
+# modify_font
+
+#: Modify font characteristics such as the position or thickness of
+#: the underline and strikethrough. The modifications can have the
+#: suffix px for pixels or % for percentage of original value. No
+#: suffix means use pts. For example::
+
+#:     modify_font underline_position -2
+#:     modify_font underline_thickness 150%
+#:     modify_font strikethrough_position 2px
+
+#: Additionally, you can modify the size of the cell in which each
+#: font glyph is rendered and the baseline at which the glyph is
+#: placed in the cell. For example::
+
+#:     modify_font cell_width 80%
+#:     modify_font cell_height -2px
+#:     modify_font baseline 3
+
+#: Note that modifying the baseline will automatically adjust the
+#: underline and strikethrough positions by the same amount.
+#: Increasing the baseline raises glyphs inside the cell and
+#: decreasing it lowers them. Decreasing the cell size might cause
+#: rendering artifacts, so use with care.
+
+# box_drawing_scale 0.001, 1, 1.5, 2
+
+#: The sizes of the lines used for the box drawing Unicode characters.
+#: These values are in pts. They will be scaled by the monitor DPI to
+#: arrive at a pixel value. There must be four values corresponding to
+#: thin, normal, thick, and very thick lines.
+
+# undercurl_style thin-sparse
+
+#: The style with which undercurls are rendered. This option takes the
+#: form (thin|thick)-(sparse|dense). Thin and thick control the
+#: thickness of the undercurl. Sparse and dense control how often the
+#: curl oscillates. With sparse the curl will peak once per character,
+#: with dense twice.
+
+# text_composition_strategy platform
+
+#: Control how kitty composites text glyphs onto the background color.
+#: The default value of platform tries for text rendering as close to
+#: "native" for the platform kitty is running on as possible.
+
+#: A value of legacy uses the old (pre kitty 0.28) strategy for how
+#: glyphs are composited. This will make dark text on light
+#: backgrounds look thicker and light text on dark backgrounds
+#: thinner. It might also make some text appear like the strokes are
+#: uneven.
+
+#: You can fine tune the actual contrast curve used for glyph
+#: composition by specifying up to two space-separated numbers for
+#: this setting.
+
+#: The first number is the gamma adjustment, which controls the
+#: thickness of dark text on light backgrounds. Increasing the value
+#: will make text appear thicker. The default value for this is 1.0 on
+#: Linux and 1.7 on macOS. Valid values are 0.01 and above. The result
+#: is scaled based on the luminance difference between the background
+#: and the foreground. Dark text on light backgrounds receives the
+#: full impact of the curve while light text on dark backgrounds is
+#: affected very little.
+
+#: The second number is an additional multiplicative contrast. It is
+#: percentage ranging from 0 to 100. The default value is 0 on Linux
+#: and 30 on macOS.
+
+#: If you wish to achieve similar looking thickness in light and dark
+#: themes, a good way to experiment is start by setting the value to
+#: 1.0 0 and use a dark theme. Then adjust the second parameter until
+#: it looks good. Then switch to a light theme and adjust the first
+#: parameter until the perceived thickness matches the dark theme.
+
+# text_fg_override_threshold 0
+
+#: The minimum accepted difference in luminance between the foreground
+#: and background color, below which kitty will override the
+#: foreground color. It is percentage ranging from 0 to 100. If the
+#: difference in luminance of the foreground and background is below
+#: this threshold, the foreground color will be set to white if the
+#: background is dark or black if the background is light. The default
+#: value is 0, which means no overriding is performed. Useful when
+#: working with applications that use colors that do not contrast well
+#: with your preferred color scheme.
+
+#: WARNING: Some programs use characters (such as block characters)
+#: for graphics display and may expect to be able to set the
+#: foreground and background to the same color (or similar colors).
+#: If you see unexpected stripes, dots, lines, incorrect color, no
+#: color where you expect color, or any kind of graphic display
+#: problem try setting text_fg_override_threshold to 0 to see if this
+#: is the cause of the problem.
+
+#: }}}
+
+#: Cursor customization {{{
+
+# cursor #cccccc
+
+#: Default cursor color. If set to the special value none the cursor
+#: will be rendered with a "reverse video" effect. It's color will be
+#: the color of the text in the cell it is over and the text will be
+#: rendered with the background color of the cell. Note that if the
+#: program running in the terminal sets a cursor color, this takes
+#: precedence. Also, the cursor colors are modified if the cell
+#: background and foreground colors have very low contrast.
+
+# cursor_text_color #111111
+
+#: The color of text under the cursor. If you want it rendered with
+#: the background color of the cell underneath instead, use the
+#: special keyword: background. Note that if cursor is set to none
+#: then this option is ignored.
+
+cursor_shape beam
+
+#: The cursor shape can be one of block, beam, underline. Note that
+#: when reloading the config this will be changed only if the cursor
+#: shape has not been set by the program running in the terminal. This
+#: sets the default cursor shape, applications running in the terminal
+#: can override it. In particular, shell integration
+#: <https://sw.kovidgoyal.net/kitty/shell-integration/> in kitty sets
+#: the cursor shape to beam at shell prompts. You can avoid this by
+#: setting shell_integration to no-cursor.
+
+# cursor_beam_thickness 1.5
+
+#: The thickness of the beam cursor (in pts).
+
+# cursor_underline_thickness 2.0
+
+#: The thickness of the underline cursor (in pts).
+
+# cursor_blink_interval -1
+
+#: The interval to blink the cursor (in seconds). Set to zero to
+#: disable blinking. Negative values mean use system default. Note
+#: that the minimum interval will be limited to repaint_delay.
+
+# cursor_stop_blinking_after 15.0
+
+#: Stop blinking cursor after the specified number of seconds of
+#: keyboard inactivity. Set to zero to never stop blinking.
+
+#: }}}
+
+#: Scrollback {{{
+
+# scrollback_lines 2000
+
+#: Number of lines of history to keep in memory for scrolling back.
+#: Memory is allocated on demand. Negative numbers are (effectively)
+#: infinite scrollback. Note that using very large scrollback is not
+#: recommended as it can slow down performance of the terminal and
+#: also use large amounts of RAM. Instead, consider using
+#: scrollback_pager_history_size. Note that on config reload if this
+#: is changed it will only affect newly created windows, not existing
+#: ones.
+
+# scrollback_pager less --chop-long-lines --RAW-CONTROL-CHARS +INPUT_LINE_NUMBER
+
+#: Program with which to view scrollback in a new window. The
+#: scrollback buffer is passed as STDIN to this program. If you change
+#: it, make sure the program you use can handle ANSI escape sequences
+#: for colors and text formatting. INPUT_LINE_NUMBER in the command
+#: line above will be replaced by an integer representing which line
+#: should be at the top of the screen. Similarly CURSOR_LINE and
+#: CURSOR_COLUMN will be replaced by the current cursor position or
+#: set to 0 if there is no cursor, for example, when showing the last
+#: command output.
+
+# scrollback_pager_history_size 0
+
+#: Separate scrollback history size (in MB), used only for browsing
+#: the scrollback buffer with pager. This separate buffer is not
+#: available for interactive scrolling but will be piped to the pager
+#: program when viewing scrollback buffer in a separate window. The
+#: current implementation stores the data in UTF-8, so approximately
+#: 10000 lines per megabyte at 100 chars per line, for pure ASCII,
+#: unformatted text. A value of zero or less disables this feature.
+#: The maximum allowed size is 4GB. Note that on config reload if this
+#: is changed it will only affect newly created windows, not existing
+#: ones.
+
+# scrollback_fill_enlarged_window no
+
+#: Fill new space with lines from the scrollback buffer after
+#: enlarging a window.
+
+# wheel_scroll_multiplier 5.0
+
+#: Multiplier for the number of lines scrolled by the mouse wheel.
+#: Note that this is only used for low precision scrolling devices,
+#: not for high precision scrolling devices on platforms such as macOS
+#: and Wayland. Use negative numbers to change scroll direction. See
+#: also wheel_scroll_min_lines.
+
+# wheel_scroll_min_lines 1
+
+#: The minimum number of lines scrolled by the mouse wheel. The scroll
+#: multiplier wheel_scroll_multiplier only takes effect after it
+#: reaches this number. Note that this is only used for low precision
+#: scrolling devices like wheel mice that scroll by very small amounts
+#: when using the wheel. With a negative number, the minimum number of
+#: lines will always be added.
+
+# touch_scroll_multiplier 1.0
+
+#: Multiplier for the number of lines scrolled by a touchpad. Note
+#: that this is only used for high precision scrolling devices on
+#: platforms such as macOS and Wayland. Use negative numbers to change
+#: scroll direction.
+
+#: }}}
+
+#: Mouse {{{
+
+# mouse_hide_wait 3.0
+
+#: Hide mouse cursor after the specified number of seconds of the
+#: mouse not being used. Set to zero to disable mouse cursor hiding.
+#: Set to a negative value to hide the mouse cursor immediately when
+#: typing text. Disabled by default on macOS as getting it to work
+#: robustly with the ever-changing sea of bugs that is Cocoa is too
+#: much effort.
+
+# url_color #0087bd
+# url_style curly
+
+#: The color and style for highlighting URLs on mouse-over. url_style
+#: can be one of: none, straight, double, curly, dotted, dashed.
+
+# open_url_with default
+
+#: The program to open clicked URLs. The special value default with
+#: first look for any URL handlers defined via the open_actions
+#: <https://sw.kovidgoyal.net/kitty/open_actions/> facility and if non
+#: are found, it will use the Operating System's default URL handler
+#: (open on macOS and xdg-open on Linux).
+
+# url_prefixes file ftp ftps gemini git gopher http https irc ircs kitty mailto news sftp ssh
+
+#: The set of URL prefixes to look for when detecting a URL under the
+#: mouse cursor.
+
+# detect_urls yes
+
+#: Detect URLs under the mouse. Detected URLs are highlighted with an
+#: underline and the mouse cursor becomes a hand over them. Even if
+#: this option is disabled, URLs are still clickable. See also the
+#: underline_hyperlinks option to control how hyperlinks (as opposed
+#: to plain text URLs) are displayed.
+
+# url_excluded_characters
+
+#: Additional characters to be disallowed from URLs, when detecting
+#: URLs under the mouse cursor. By default, all characters that are
+#: legal in URLs are allowed. Additionally, newlines are allowed (but
+#: stripped). This is to accommodate programs such as mutt that add
+#: hard line breaks even for continued lines. \n can be added to this
+#: option to disable this behavior. Special characters can be
+#: specified using backslash escapes, to specify a backslash use a
+#: double backslash.
+
+# show_hyperlink_targets no
+
+#: When the mouse hovers over a terminal hyperlink, show the actual
+#: URL that will be activated when the hyperlink is clicked.
+
+# underline_hyperlinks hover
+
+#: Control how hyperlinks are underlined. They can either be
+#: underlined on mouse hover, always (i.e. permanently underlined) or
+#: never which means that kitty will not apply any underline styling
+#: to hyperlinks. Uses the url_style and url_color settings for the
+#: underline style. Note that reloading the config and changing this
+#: value to/from always will only affect text subsequently received by
+#: kitty.
+
+# copy_on_select no
+
+#: Copy to clipboard or a private buffer on select. With this set to
+#: clipboard, selecting text with the mouse will cause the text to be
+#: copied to clipboard. Useful on platforms such as macOS that do not
+#: have the concept of primary selection. You can instead specify a
+#: name such as a1 to copy to a private kitty buffer. Map a shortcut
+#: with the paste_from_buffer action to paste from this private
+#: buffer. For example::
+
+#:     copy_on_select a1
+#:     map shift+cmd+v paste_from_buffer a1
+
+#: Note that copying to the clipboard is a security risk, as all
+#: programs, including websites open in your browser can read the
+#: contents of the system clipboard.
+
+# paste_actions quote-urls-at-prompt,confirm
+
+#: A comma separated list of actions to take when pasting text into
+#: the terminal. The supported paste actions are:
+
+#: quote-urls-at-prompt:
+#:     If the text being pasted is a URL and the cursor is at a shell prompt,
+#:     automatically quote the URL (needs shell_integration).
+#: replace-dangerous-control-codes
+#:     Replace dangerous control codes from pasted text, without confirmation.
+#: replace-newline
+#:     Replace the newline character from pasted text, without confirmation.
+#: confirm:
+#:     Confirm the paste if the text to be pasted contains any terminal control codes
+#:     as this can be dangerous, leading to code execution if the shell/program running
+#:     in the terminal does not properly handle these.
+#: confirm-if-large
+#:     Confirm the paste if it is very large (larger than 16KB) as pasting
+#:     large amounts of text into shells can be very slow.
+#: filter:
+#:     Run the filter_paste() function from the file paste-actions.py in
+#:     the kitty config directory on the pasted text. The text returned by the
+#:     function will be actually pasted.
+
+# strip_trailing_spaces never
+
+#: Remove spaces at the end of lines when copying to clipboard. A
+#: value of smart will do it when using normal selections, but not
+#: rectangle selections. A value of always will always do it.
+
+# select_by_word_characters @-./_~?&=%+#
+
+#: Characters considered part of a word when double clicking. In
+#: addition to these characters any character that is marked as an
+#: alphanumeric character in the Unicode database will be matched.
+
+# select_by_word_characters_forward
+
+#: Characters considered part of a word when extending the selection
+#: forward on double clicking. In addition to these characters any
+#: character that is marked as an alphanumeric character in the
+#: Unicode database will be matched.
+
+#: If empty (default) select_by_word_characters will be used for both
+#: directions.
+
+# click_interval -1.0
+
+#: The interval between successive clicks to detect double/triple
+#: clicks (in seconds). Negative numbers will use the system default
+#: instead, if available, or fallback to 0.5.
+
+# focus_follows_mouse no
+
+#: Set the active window to the window under the mouse when moving the
+#: mouse around. On macOS, this will also cause the OS Window under
+#: the mouse to be focused automatically when the mouse enters it.
+
+# pointer_shape_when_grabbed arrow
+
+#: The shape of the mouse pointer when the program running in the
+#: terminal grabs the mouse.
+
+# default_pointer_shape beam
+
+#: The default shape of the mouse pointer.
+
+# pointer_shape_when_dragging beam
+
+#: The default shape of the mouse pointer when dragging across text.
+
+#: Mouse actions {{{
+
+#: Mouse buttons can be mapped to perform arbitrary actions. The
+#: syntax is:
+
+#: .. code-block:: none
+
+#:     mouse_map button-name event-type modes action
+
+#: Where button-name is one of left, middle, right, b1 ... b8 with
+#: added keyboard modifiers. For example: ctrl+shift+left refers to
+#: holding the Ctrl+Shift keys while clicking with the left mouse
+#: button. The value b1 ... b8 can be used to refer to up to eight
+#: buttons on a mouse.
+
+#: event-type is one of press, release, doublepress, triplepress,
+#: click, doubleclick. modes indicates whether the action is performed
+#: when the mouse is grabbed by the program running in the terminal,
+#: or not. The values are grabbed or ungrabbed or a comma separated
+#: combination of them. grabbed refers to when the program running in
+#: the terminal has requested mouse events. Note that the click and
+#: double click events have a delay of click_interval to disambiguate
+#: from double and triple presses.
+
+#: You can run kitty with the kitty --debug-input command line option
+#: to see mouse events. See the builtin actions below to get a sense
+#: of what is possible.
+
+#: If you want to unmap an action, map it to no_op. For example, to
+#: disable opening of URLs with a plain click::
+
+#:     mouse_map left click ungrabbed no_op
+
+#: See all the mappable actions including mouse actions here
+#: <https://sw.kovidgoyal.net/kitty/actions/>.
+
+#: .. note::
+#:     Once a selection is started, releasing the button that started it will
+#:     automatically end it and no release event will be dispatched.
+
+# clear_all_mouse_actions no
+
+#: Remove all mouse action definitions up to this point. Useful, for
+#: instance, to remove the default mouse actions.
+
+#: Click the link under the mouse or move the cursor
+
+# mouse_map left click ungrabbed mouse_handle_click selection link prompt
+
+#::  First check for a selection and if one exists do nothing. Then
+#::  check for a link under the mouse cursor and if one exists, click
+#::  it. Finally check if the click happened at the current shell
+#::  prompt and if so, move the cursor to the click location. Note
+#::  that this requires shell integration
+#::  <https://sw.kovidgoyal.net/kitty/shell-integration/> to work.
+
+#: Click the link under the mouse or move the cursor even when grabbed
+
+# mouse_map shift+left click grabbed,ungrabbed mouse_handle_click selection link prompt
+
+#::  Same as above, except that the action is performed even when the
+#::  mouse is grabbed by the program running in the terminal.
+
+#: Click the link under the mouse cursor
+
+# mouse_map ctrl+shift+left release grabbed,ungrabbed mouse_handle_click link
+
+#::  Variant with Ctrl+Shift is present because the simple click based
+#::  version has an unavoidable delay of click_interval, to
+#::  disambiguate clicks from double clicks.
+
+#: Discard press event for link click
+
+# mouse_map ctrl+shift+left press grabbed discard_event
+
+#::  Prevent this press event from being sent to the program that has
+#::  grabbed the mouse, as the corresponding release event is used to
+#::  open a URL.
+
+#: Paste from the primary selection
+
+# mouse_map middle release ungrabbed paste_from_selection
+
+#: Start selecting text
+
+# mouse_map left press ungrabbed mouse_selection normal
+
+#: Start selecting text in a rectangle
+
+# mouse_map ctrl+alt+left press ungrabbed mouse_selection rectangle
+
+#: Select a word
+
+# mouse_map left doublepress ungrabbed mouse_selection word
+
+#: Select a line
+
+# mouse_map left triplepress ungrabbed mouse_selection line
+
+#: Select line from point
+
+# mouse_map ctrl+alt+left triplepress ungrabbed mouse_selection line_from_point
+
+#::  Select from the clicked point to the end of the line. If you
+#::  would like to select the word at the point and then extend to the
+#::  rest of the line, change line_from_point to
+#::  word_and_line_from_point.
+
+#: Extend the current selection
+
+# mouse_map right press ungrabbed mouse_selection extend
+
+#::  If you want only the end of the selection to be moved instead of
+#::  the nearest boundary, use move-end instead of extend.
+
+#: Paste from the primary selection even when grabbed
+
+# mouse_map shift+middle release ungrabbed,grabbed paste_selection
+# mouse_map shift+middle press grabbed discard_event
+
+#: Start selecting text even when grabbed
+
+# mouse_map shift+left press ungrabbed,grabbed mouse_selection normal
+
+#: Start selecting text in a rectangle even when grabbed
+
+# mouse_map ctrl+shift+alt+left press ungrabbed,grabbed mouse_selection rectangle
+
+#: Select a word even when grabbed
+
+# mouse_map shift+left doublepress ungrabbed,grabbed mouse_selection word
+
+#: Select a line even when grabbed
+
+# mouse_map shift+left triplepress ungrabbed,grabbed mouse_selection line
+
+#: Select line from point even when grabbed
+
+# mouse_map ctrl+shift+alt+left triplepress ungrabbed,grabbed mouse_selection line_from_point
+
+#::  Select from the clicked point to the end of the line even when
+#::  grabbed. If you would like to select the word at the point and
+#::  then extend to the rest of the line, change line_from_point to
+#::  word_and_line_from_point.
+
+#: Extend the current selection even when grabbed
+
+# mouse_map shift+right press ungrabbed,grabbed mouse_selection extend
+
+#: Show clicked command output in pager
+
+# mouse_map ctrl+shift+right press ungrabbed mouse_show_command_output
+
+#::  Requires shell integration
+#::  <https://sw.kovidgoyal.net/kitty/shell-integration/> to work.
+
+#: }}}
+
+#: }}}
+
+#: Performance tuning {{{
+
+# repaint_delay 10
+
+#: Delay between screen updates (in milliseconds). Decreasing it,
+#: increases frames-per-second (FPS) at the cost of more CPU usage.
+#: The default value yields ~100 FPS which is more than sufficient for
+#: most uses. Note that to actually achieve 100 FPS, you have to
+#: either set sync_to_monitor to no or use a monitor with a high
+#: refresh rate. Also, to minimize latency when there is pending input
+#: to be processed, this option is ignored.
+
+# input_delay 3
+
+#: Delay before input from the program running in the terminal is
+#: processed (in milliseconds). Note that decreasing it will increase
+#: responsiveness, but also increase CPU usage and might cause flicker
+#: in full screen programs that redraw the entire screen on each loop,
+#: because kitty is so fast that partial screen updates will be drawn.
+
+# sync_to_monitor yes
+
+#: Sync screen updates to the refresh rate of the monitor. This
+#: prevents screen tearing
+#: <https://en.wikipedia.org/wiki/Screen_tearing> when scrolling.
+#: However, it limits the rendering speed to the refresh rate of your
+#: monitor. With a very high speed mouse/high keyboard repeat rate,
+#: you may notice some slight input latency. If so, set this to no.
+
+#: }}}
+
+#: Terminal bell {{{
+
+enable_audio_bell no
+
+#: The audio bell. Useful to disable it in environments that require
+#: silence.
+
+# visual_bell_duration 0.0
+
+#: The visual bell duration (in seconds). Flash the screen when a bell
+#: occurs for the specified number of seconds. Set to zero to disable.
+
+# visual_bell_color none
+
+#: The color used by visual bell. Set to none will fall back to
+#: selection background color. If you feel that the visual bell is too
+#: bright, you can set it to a darker color.
+
+# window_alert_on_bell yes
+
+#: Request window attention on bell. Makes the dock icon bounce on
+#: macOS or the taskbar flash on linux.
+
+# bell_on_tab "🔔 "
+
+#: Some text or a Unicode symbol to show on the tab if a window in the
+#: tab that does not have focus has a bell. If you want to use leading
+#: or trailing spaces, surround the text with quotes. See
+#: tab_title_template for how this is rendered.
+
+#: For backwards compatibility, values of yes, y and true are
+#: converted to the default bell symbol and no, n, false and none are
+#: converted to the empty string.
+
+# command_on_bell none
+
+#: Program to run when a bell occurs. The environment variable
+#: KITTY_CHILD_CMDLINE can be used to get the program running in the
+#: window in which the bell occurred.
+
+# bell_path none
+
+#: Path to a sound file to play as the bell sound. If set to none, the
+#: system default bell sound is used. Must be in a format supported by
+#: the operating systems sound API, such as WAV or OGA on Linux
+#: (libcanberra) or AIFF, MP3 or WAV on macOS (NSSound)
+
+# linux_bell_theme __custom
+
+#: The XDG Sound Theme kitty will use to play the bell sound. Defaults
+#: to the custom theme name used by GNOME and Budgie, falling back to
+#: the default freedesktop theme if it does not exist. This option may
+#: be removed if Linux ever provides desktop-agnostic support for
+#: setting system sound themes.
+
+#: }}}
+
+#: Window layout {{{
+
+# remember_window_size  yes
+# initial_window_width  640
+# initial_window_height 400
+
+#: If enabled, the OS Window size will be remembered so that new
+#: instances of kitty will have the same size as the previous
+#: instance. If disabled, the OS Window will initially have size
+#: configured by initial_window_width/height, in pixels. You can use a
+#: suffix of "c" on the width/height values to have them interpreted
+#: as number of cells instead of pixels.
+
+# enabled_layouts *
+
+#: The enabled window layouts. A comma separated list of layout names.
+#: The special value all means all layouts. The first listed layout
+#: will be used as the startup layout. Default configuration is all
+#: layouts in alphabetical order. For a list of available layouts, see
+#: the layouts <https://sw.kovidgoyal.net/kitty/overview/#layouts>.
+
+# window_resize_step_cells 2
+# window_resize_step_lines 2
+
+#: The step size (in units of cell width/cell height) to use when
+#: resizing kitty windows in a layout with the shortcut
+#: start_resizing_window. The cells value is used for horizontal
+#: resizing, and the lines value is used for vertical resizing.
+
+# window_border_width 0.5pt
+
+#: The width of window borders. Can be either in pixels (px) or pts
+#: (pt). Values in pts will be rounded to the nearest number of pixels
+#: based on screen resolution. If not specified, the unit is assumed
+#: to be pts. Note that borders are displayed only when more than one
+#: window is visible. They are meant to separate multiple windows.
+
+# draw_minimal_borders yes
+
+#: Draw only the minimum borders needed. This means that only the
+#: borders that separate the window from a neighbor are drawn. Note
+#: that setting a non-zero window_margin_width overrides this and
+#: causes all borders to be drawn.
+
+# window_margin_width 0
+
+#: The window margin (in pts) (blank area outside the border). A
+#: single value sets all four sides. Two values set the vertical and
+#: horizontal sides. Three values set top, horizontal and bottom. Four
+#: values set top, right, bottom and left.
+
+# single_window_margin_width -1
+
+#: The window margin to use when only a single window is visible (in
+#: pts). Negative values will cause the value of window_margin_width
+#: to be used instead. A single value sets all four sides. Two values
+#: set the vertical and horizontal sides. Three values set top,
+#: horizontal and bottom. Four values set top, right, bottom and left.
+
+# window_padding_width 0
+
+#: The window padding (in pts) (blank area between the text and the
+#: window border). A single value sets all four sides. Two values set
+#: the vertical and horizontal sides. Three values set top, horizontal
+#: and bottom. Four values set top, right, bottom and left.
+
+# single_window_padding_width -1
+
+#: The window padding to use when only a single window is visible (in
+#: pts). Negative values will cause the value of window_padding_width
+#: to be used instead. A single value sets all four sides. Two values
+#: set the vertical and horizontal sides. Three values set top,
+#: horizontal and bottom. Four values set top, right, bottom and left.
+
+# placement_strategy center
+
+#: When the window size is not an exact multiple of the cell size, the
+#: cell area of the terminal window will have some extra padding on
+#: the sides. You can control how that padding is distributed with
+#: this option. Using a value of center means the cell area will be
+#: placed centrally. A value of top-left means the padding will be
+#: only at the bottom and right edges.
+
+# active_border_color #00ff00
+
+#: The color for the border of the active window. Set this to none to
+#: not draw borders around the active window.
+
+# inactive_border_color #cccccc
+
+#: The color for the border of inactive windows.
+
+# bell_border_color #ff5a00
+
+#: The color for the border of inactive windows in which a bell has
+#: occurred.
+
+# inactive_text_alpha 1.0
+
+#: Fade the text in inactive windows by the specified amount (a number
+#: between zero and one, with zero being fully faded).
+
+# hide_window_decorations no
+
+#: Hide the window decorations (title-bar and window borders) with
+#: yes. On macOS, titlebar-only and titlebar-and-corners can be used
+#: to only hide the titlebar and the rounded corners. Whether this
+#: works and exactly what effect it has depends on the window
+#: manager/operating system. Note that the effects of changing this
+#: option when reloading config are undefined. When using titlebar-
+#: only, it is useful to also set window_margin_width and
+#: placement_strategy to prevent the rounded corners from clipping
+#: text. Or use titlebar-and-corners.
+
+# window_logo_path none
+
+#: Path to a logo image. Must be in PNG format. Relative paths are
+#: interpreted relative to the kitty config directory. The logo is
+#: displayed in a corner of every kitty window. The position is
+#: controlled by window_logo_position. Individual windows can be
+#: configured to have different logos either using the launch action
+#: or the remote control <https://sw.kovidgoyal.net/kitty/remote-
+#: control/> facility.
+
+# window_logo_position bottom-right
+
+#: Where to position the window logo in the window. The value can be
+#: one of: top-left, top, top-right, left, center, right, bottom-left,
+#: bottom, bottom-right.
+
+# window_logo_alpha 0.5
+
+#: The amount the logo should be faded into the background. With zero
+#: being fully faded and one being fully opaque.
+
+# resize_debounce_time 0.1 0.5
+
+#: The time to wait before redrawing the screen during a live resize
+#: of the OS window, when no new resize events have been received,
+#: i.e. when resizing is either paused or finished. On platforms such
+#: as macOS, where the operating system sends events corresponding to
+#: the start and end of a live resize, the second number is used for
+#: redraw-after-pause since kitty can distinguish between a pause and
+#: end of resizing.  On such systems the first number is ignored and
+#: redraw is immediate after end of resize.  On other systems the
+#: first number is used so that kitty is "ready" quickly after the end
+#: of resizing, while not also continuously redrawing, to save energy.
+
+# resize_in_steps no
+
+#: Resize the OS window in steps as large as the cells, instead of
+#: with the usual pixel accuracy. Combined with initial_window_width
+#: and initial_window_height in number of cells, this option can be
+#: used to keep the margins as small as possible when resizing the OS
+#: window. Note that this does not currently work on Wayland.
+
+# visual_window_select_characters 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+#: The list of characters for visual window selection. For example,
+#: for selecting a window to focus on with focus_visible_window. The
+#: value should be a series of unique numbers or alphabets, case
+#: insensitive, from the set 0-9A-Z\-=[];',./\\`. Specify your
+#: preference as a string of characters.
+
+# confirm_os_window_close -1
+
+#: Ask for confirmation when closing an OS window or a tab with at
+#: least this number of kitty windows in it by window manager (e.g.
+#: clicking the window close button or pressing the operating system
+#: shortcut to close windows) or by the close_tab action. A value of
+#: zero disables confirmation. This confirmation also applies to
+#: requests to quit the entire application (all OS windows, via the
+#: quit action). Negative values are converted to positive ones,
+#: however, with shell_integration enabled, using negative values
+#: means windows sitting at a shell prompt are not counted, only
+#: windows where some command is currently running. Note that if you
+#: want confirmation when closing individual windows, you can map the
+#: close_window_with_confirmation action.
+
+#: }}}
+
+#: Tab bar {{{
+
+# tab_bar_edge bottom
+
+#: The edge to show the tab bar on, top or bottom.
+
+# tab_bar_margin_width 0.0
+
+#: The margin to the left and right of the tab bar (in pts).
+
+# tab_bar_margin_height 0.0 0.0
+
+#: The margin above and below the tab bar (in pts). The first number
+#: is the margin between the edge of the OS Window and the tab bar.
+#: The second number is the margin between the tab bar and the
+#: contents of the current tab.
+
+# tab_bar_style fade
+
+#: The tab bar style, can be one of:
+
+#: fade
+#:     Each tab's edges fade into the background color. (See also tab_fade)
+#: slant
+#:     Tabs look like the tabs in a physical file.
+#: separator
+#:     Tabs are separated by a configurable separator. (See also
+#:     tab_separator)
+#: powerline
+#:     Tabs are shown as a continuous line with "fancy" separators.
+#:     (See also tab_powerline_style)
+#: custom
+#:     A user-supplied Python function called draw_tab is loaded from the file
+#:     tab_bar.py in the kitty config directory. For examples of how to
+#:     write such a function, see the functions named draw_tab_with_* in
+#:     kitty's source code: kitty/tab_bar.py. See also
+#:     this discussion <https://github.com/kovidgoyal/kitty/discussions/4447>
+#:     for examples from kitty users.
+#: hidden
+#:     The tab bar is hidden. If you use this, you might want to create
+#:     a mapping for the select_tab action which presents you with a list of
+#:     tabs and allows for easy switching to a tab.
+
+# tab_bar_align left
+
+#: The horizontal alignment of the tab bar, can be one of: left,
+#: center, right.
+
+# tab_bar_min_tabs 2
+
+#: The minimum number of tabs that must exist before the tab bar is
+#: shown.
+
+# tab_switch_strategy previous
+
+#: The algorithm to use when switching to a tab when the current tab
+#: is closed. The default of previous will switch to the last used
+#: tab. A value of left will switch to the tab to the left of the
+#: closed tab. A value of right will switch to the tab to the right of
+#: the closed tab. A value of last will switch to the right-most tab.
+
+# tab_fade 0.25 0.5 0.75 1
+
+#: Control how each tab fades into the background when using fade for
+#: the tab_bar_style. Each number is an alpha (between zero and one)
+#: that controls how much the corresponding cell fades into the
+#: background, with zero being no fade and one being full fade. You
+#: can change the number of cells used by adding/removing entries to
+#: this list.
+
+# tab_separator " ┇"
+
+#: The separator between tabs in the tab bar when using separator as
+#: the tab_bar_style.
+
+# tab_powerline_style angled
+
+#: The powerline separator style between tabs in the tab bar when
+#: using powerline as the tab_bar_style, can be one of: angled,
+#: slanted, round.
+
+# tab_activity_symbol none
+
+#: Some text or a Unicode symbol to show on the tab if a window in the
+#: tab that does not have focus has some activity. If you want to use
+#: leading or trailing spaces, surround the text with quotes. See
+#: tab_title_template for how this is rendered.
+
+# tab_title_max_length 0
+
+#: The maximum number of cells that can be used to render the text in
+#: a tab. A value of zero means that no limit is applied.
+
+# tab_title_template "{fmt.fg.red}{bell_symbol}{activity_symbol}{fmt.fg.tab}{title}"
+
+#: A template to render the tab title. The default just renders the
+#: title with optional symbols for bell and activity. If you wish to
+#: include the tab-index as well, use something like: {index}:{title}.
+#: Useful if you have shortcuts mapped for goto_tab N. If you prefer
+#: to see the index as a superscript, use {sup.index}. All data
+#: available is:
+
+#: title
+#:     The current tab title.
+#: index
+#:     The tab index usable with goto_tab N goto_tab shortcuts.
+#: layout_name
+#:     The current layout name.
+#: num_windows
+#:     The number of windows in the tab.
+#: num_window_groups
+#:     The number of window groups (a window group is a window and all of its overlay windows) in the tab.
+#: tab.active_wd
+#:     The working directory of the currently active window in the tab
+#:     (expensive, requires syscall). Use active_oldest_wd to get
+#:     the directory of the oldest foreground process rather than the newest.
+#: tab.active_exe
+#:     The name of the executable running in the foreground of the currently
+#:     active window in the tab (expensive, requires syscall). Use
+#:     active_oldest_exe for the oldest foreground process.
+#: max_title_length
+#:     The maximum title length available.
+
+#: Note that formatting is done by Python's string formatting
+#: machinery, so you can use, for instance, {layout_name[:2].upper()}
+#: to show only the first two letters of the layout name, upper-cased.
+#: If you want to style the text, you can use styling directives, for
+#: example:
+#: `{fmt.fg.red}red{fmt.fg.tab}normal{fmt.bg._00FF00}greenbg{fmt.bg.tab}`.
+#: Similarly, for bold and italic:
+#: `{fmt.bold}bold{fmt.nobold}normal{fmt.italic}italic{fmt.noitalic}`.
+#: Note that for backward compatibility, if {bell_symbol} or
+#: {activity_symbol} are not present in the template, they are
+#: prepended to it.
+
+# active_tab_title_template none
+
+#: Template to use for active tabs. If not specified falls back to
+#: tab_title_template.
+
+# active_tab_foreground   #000
+# active_tab_background   #eee
+# active_tab_font_style   bold-italic
+# inactive_tab_foreground #444
+# inactive_tab_background #999
+# inactive_tab_font_style normal
+
+#: Tab bar colors and styles.
+
+# tab_bar_background none
+
+#: Background color for the tab bar. Defaults to using the terminal
+#: background color.
+
+# tab_bar_margin_color none
+
+#: Color for the tab bar margin area. Defaults to using the terminal
+#: background color for margins above and below the tab bar. For side
+#: margins the default color is chosen to match the background color
+#: of the neighboring tab.
+
+#: }}}
+
+#: Color scheme {{{
+
+# foreground #dddddd
+# background #000000
+
+#: The foreground and background colors.
+
+background_opacity 0.85
+
+#: The opacity of the background. A number between zero and one, where
+#: one is opaque and zero is fully transparent. This will only work if
+#: supported by the OS (for instance, when using a compositor under
+#: X11). Note that it only sets the background color's opacity in
+#: cells that have the same background color as the default terminal
+#: background, so that things like the status bar in vim, powerline
+#: prompts, etc. still look good. But it means that if you use a color
+#: theme with a background color in your editor, it will not be
+#: rendered as transparent. Instead you should change the default
+#: background color in your kitty config and not use a background
+#: color in the editor color scheme. Or use the escape codes to set
+#: the terminals default colors in a shell script to launch your
+#: editor. Be aware that using a value less than 1.0 is a (possibly
+#: significant) performance hit. When using a low value for this
+#: setting, it is desirable that you set the background color to a
+#: color the matches the general color of the desktop background, for
+#: best text rendering.  If you want to dynamically change
+#: transparency of windows, set dynamic_background_opacity to yes
+#: (this is off by default as it has a performance cost). Changing
+#: this option when reloading the config will only work if
+#: dynamic_background_opacity was enabled in the original config.
+
+# background_blur 0
+
+#: Set to a positive value to enable background blur (blurring of the
+#: visuals behind a transparent window) on platforms that support it.
+#: Only takes effect when background_opacity is less than one. On
+#: macOS, this will also control the blur radius (amount of blurring).
+#: Setting it to too high a value will cause severe performance issues
+#: and/or rendering artifacts. Usually, values up to 64 work well.
+#: Note that this might cause performance issues, depending on how the
+#: platform implements it, so use with care. Currently supported on
+#: macOS and KDE under X11.
+
+# background_image none
+
+#: Path to a background image. Must be in PNG format.
+
+# background_image_layout tiled
+
+#: Whether to tile, scale or clamp the background image. The value can
+#: be one of tiled, mirror-tiled, scaled, clamped, centered or
+#: cscaled. The scaled and cscaled values scale the image to the
+#: window size, with cscaled preserving the image aspect ratio.
+
+# background_image_linear no
+
+#: When background image is scaled, whether linear interpolation
+#: should be used.
+
+# dynamic_background_opacity no
+
+#: Allow changing of the background_opacity dynamically, using either
+#: keyboard shortcuts (increase_background_opacity and
+#: decrease_background_opacity) or the remote control facility.
+#: Changing this option by reloading the config is not supported.
+
+# background_tint 0.0
+
+#: How much to tint the background image by the background color. This
+#: option makes it easier to read the text. Tinting is done using the
+#: current background color for each window. This option applies only
+#: if background_opacity is set and transparent windows are supported
+#: or background_image is set.
+
+# background_tint_gaps 1.0
+
+#: How much to tint the background image at the window gaps by the
+#: background color, after applying background_tint. Since this is
+#: multiplicative with background_tint, it can be used to lighten the
+#: tint over the window gaps for a *separated* look.
+
+# dim_opacity 0.4
+
+#: How much to dim text that has the DIM/FAINT attribute set. One
+#: means no dimming and zero means fully dimmed (i.e. invisible).
+
+# selection_foreground #000000
+# selection_background #fffacd
+
+#: The foreground and background colors for text selected with the
+#: mouse. Setting both of these to none will cause a "reverse video"
+#: effect for selections, where the selection will be the cell text
+#: color and the text will become the cell background color. Setting
+#: only selection_foreground to none will cause the foreground color
+#: to be used unchanged. Note that these colors can be overridden by
+#: the program running in the terminal.
+
+#: The color table {{{
+
+#: The 256 terminal colors. There are 8 basic colors, each color has a
+#: dull and bright version, for the first 16 colors. You can set the
+#: remaining 240 colors as color16 to color255.
+
+# color0 #000000
+# color8 #767676
+
+#: black
+
+# color1 #cc0403
+# color9 #f2201f
+
+#: red
+
+# color2  #19cb00
+# color10 #23fd00
+
+#: green
+
+# color3  #cecb00
+# color11 #fffd00
+
+#: yellow
+
+# color4  #0d73cc
+# color12 #1a8fff
+
+#: blue
+
+# color5  #cb1ed1
+# color13 #fd28ff
+
+#: magenta
+
+# color6  #0dcdcd
+# color14 #14ffff
+
+#: cyan
+
+# color7  #dddddd
+# color15 #ffffff
+
+#: white
+
+# mark1_foreground black
+
+#: Color for marks of type 1
+
+# mark1_background #98d3cb
+
+#: Color for marks of type 1 (light steel blue)
+
+# mark2_foreground black
+
+#: Color for marks of type 2
+
+# mark2_background #f2dcd3
+
+#: Color for marks of type 1 (beige)
+
+# mark3_foreground black
+
+#: Color for marks of type 3
+
+# mark3_background #f274bc
+
+#: Color for marks of type 3 (violet)
+
+#: }}}
+
+#: }}}
+
+#: Advanced {{{
+
+# shell .
+
+#: The shell program to execute. The default value of . means to use
+#: whatever shell is set as the default shell for the current user.
+#: Note that on macOS if you change this, you might need to add
+#: --login and --interactive to ensure that the shell starts in
+#: interactive mode and reads its startup rc files. Environment
+#: variables are expanded in this setting.
+
+# editor .
+
+#: The terminal based text editor (such as vim or nano) to use when
+#: editing the kitty config file or similar tasks.
+
+#: The default value of . means to use the environment variables
+#: VISUAL and EDITOR in that order. If these variables aren't set,
+#: kitty will run your shell ($SHELL -l -i -c env) to see if your
+#: shell startup rc files set VISUAL or EDITOR. If that doesn't work,
+#: kitty will cycle through various known editors (vim, emacs, etc.)
+#: and take the first one that exists on your system.
+
+# close_on_child_death no
+
+#: Close the window when the child process (shell) exits. With the
+#: default value no, the terminal will remain open when the child
+#: exits as long as there are still processes outputting to the
+#: terminal (for example disowned or backgrounded processes). When
+#: enabled with yes, the window will close as soon as the child
+#: process exits. Note that setting it to yes means that any
+#: background processes still using the terminal can fail silently
+#: because their stdout/stderr/stdin no longer work.
+
+# remote_control_password
+
+#: Allow other programs to control kitty using passwords. This option
+#: can be specified multiple times to add multiple passwords. If no
+#: passwords are present kitty will ask the user for permission if a
+#: program tries to use remote control with a password. A password can
+#: also *optionally* be associated with a set of allowed remote
+#: control actions. For example::
+
+#:     remote_control_password "my passphrase" get-colors set-colors focus-window focus-tab
+
+#: Only the specified actions will be allowed when using this
+#: password. Glob patterns can be used too, for example::
+
+#:     remote_control_password "my passphrase" set-tab-* resize-*
+
+#: To get a list of available actions, run::
+
+#:     kitten @ --help
+
+#: A set of actions to be allowed when no password is sent can be
+#: specified by using an empty password. For example::
+
+#:     remote_control_password "" *-colors
+
+#: Finally, the path to a python module can be specified that provides
+#: a function is_cmd_allowed that is used to check every remote
+#: control command. For example::
+
+#:     remote_control_password "my passphrase" my_rc_command_checker.py
+
+#: Relative paths are resolved from the kitty configuration directory.
+#: See rc_custom_auth <https://sw.kovidgoyal.net/kitty/remote-
+#: control/#rc-custom-auth> for details.
+
+# allow_remote_control no
+
+#: Allow other programs to control kitty. If you turn this on, other
+#: programs can control all aspects of kitty, including sending text
+#: to kitty windows, opening new windows, closing windows, reading the
+#: content of windows, etc. Note that this even works over SSH
+#: connections. The default setting of no prevents any form of remote
+#: control. The meaning of the various values are:
+
+#: password
+#:     Remote control requests received over both the TTY device and the socket
+#:     are confirmed based on passwords, see remote_control_password.
+
+#: socket-only
+#:     Remote control requests received over a socket are accepted
+#:     unconditionally. Requests received over the TTY are denied.
+#:     See listen_on.
+
+#: socket
+#:     Remote control requests received over a socket are accepted
+#:     unconditionally. Requests received over the TTY are confirmed based on
+#:     password.
+
+#: no
+#:     Remote control is completely disabled.
+
+#: yes
+#:     Remote control requests are always accepted.
+
+# listen_on none
+
+#: Listen to the specified socket for remote control connections. Note
+#: that this will apply to all kitty instances. It can be overridden
+#: by the kitty --listen-on command line option. For UNIX sockets,
+#: such as unix:${TEMP}/mykitty or unix:@mykitty (on Linux).
+#: Environment variables are expanded and relative paths are resolved
+#: with respect to the temporary directory. If {kitty_pid} is present,
+#: then it is replaced by the PID of the kitty process, otherwise the
+#: PID of the kitty process is appended to the value, with a hyphen.
+#: For TCP sockets such as tcp:localhost:0 a random port is always
+#: used even if a non-zero port number is specified.  See the help for
+#: kitty --listen-on for more details. Note that this will be ignored
+#: unless allow_remote_control is set to either: yes, socket or
+#: socket-only. Changing this option by reloading the config is not
+#: supported.
+
+# env
+
+#: Specify the environment variables to be set in all child processes.
+#: Using the name with an equal sign (e.g. env VAR=) will set it to
+#: the empty string. Specifying only the name (e.g. env VAR) will
+#: remove the variable from the child process' environment. Note that
+#: environment variables are expanded recursively, for example::
+
+#:     env VAR1=a
+#:     env VAR2=${HOME}/${VAR1}/b
+
+#: The value of VAR2 will be <path to home directory>/a/b.
+
+# watcher
+
+#: Path to python file which will be loaded for watchers
+#: <https://sw.kovidgoyal.net/kitty/launch/#watchers>. Can be
+#: specified more than once to load multiple watchers. The watchers
+#: will be added to every kitty window. Relative paths are resolved
+#: relative to the kitty config directory. Note that reloading the
+#: config will only affect windows created after the reload.
+
+# exe_search_path
+
+#: Control where kitty finds the programs to run. The default search
+#: order is: First search the system wide PATH, then ~/.local/bin and
+#: ~/bin. If still not found, the PATH defined in the login shell
+#: after sourcing all its startup files is tried. Finally, if present,
+#: the PATH specified by the env option is tried.
+
+#: This option allows you to prepend, append, or remove paths from
+#: this search order. It can be specified multiple times for multiple
+#: paths. A simple path will be prepended to the search order. A path
+#: that starts with the + sign will be append to the search order,
+#: after ~/bin above. A path that starts with the - sign will be
+#: removed from the entire search order. For example::
+
+#:     exe_search_path /some/prepended/path
+#:     exe_search_path +/some/appended/path
+#:     exe_search_path -/some/excluded/path
+
+# update_check_interval 24
+
+#: The interval to periodically check if an update to kitty is
+#: available (in hours). If an update is found, a system notification
+#: is displayed informing you of the available update. The default is
+#: to check every 24 hours, set to zero to disable. Update checking is
+#: only done by the official binary builds. Distro packages or source
+#: builds do not do update checking. Changing this option by reloading
+#: the config is not supported.
+
+# startup_session none
+
+#: Path to a session file to use for all kitty instances. Can be
+#: overridden by using the kitty --session =none command line option
+#: for individual instances. See sessions
+#: <https://sw.kovidgoyal.net/kitty/overview/#sessions> in the kitty
+#: documentation for details. Note that relative paths are interpreted
+#: with respect to the kitty config directory. Environment variables
+#: in the path are expanded. Changing this option by reloading the
+#: config is not supported.
+
+# clipboard_control write-clipboard write-primary read-clipboard-ask read-primary-ask
+
+#: Allow programs running in kitty to read and write from the
+#: clipboard. You can control exactly which actions are allowed. The
+#: possible actions are: write-clipboard, read-clipboard, write-
+#: primary, read-primary, read-clipboard-ask, read-primary-ask. The
+#: default is to allow writing to the clipboard and primary selection
+#: and to ask for permission when a program tries to read from the
+#: clipboard. Note that disabling the read confirmation is a security
+#: risk as it means that any program, even the ones running on a
+#: remote server via SSH can read your clipboard. See also
+#: clipboard_max_size.
+
+# clipboard_max_size 512
+
+#: The maximum size (in MB) of data from programs running in kitty
+#: that will be stored for writing to the system clipboard. A value of
+#: zero means no size limit is applied. See also clipboard_control.
+
+# file_transfer_confirmation_bypass
+
+#: The password that can be supplied to the file transfer kitten
+#: <https://sw.kovidgoyal.net/kitty/kittens/transfer/> to skip the
+#: transfer confirmation prompt. This should only be used when
+#: initiating transfers from trusted computers, over trusted networks
+#: or encrypted transports, as it allows any programs running on the
+#: remote machine to read/write to the local filesystem, without
+#: permission.
+
+# allow_hyperlinks yes
+
+#: Process hyperlink escape sequences (OSC 8). If disabled OSC 8
+#: escape sequences are ignored. Otherwise they become clickable
+#: links, that you can click with the mouse or by using the hints
+#: kitten <https://sw.kovidgoyal.net/kitty/kittens/hints/>. The
+#: special value of ask means that kitty will ask before opening the
+#: link when clicked.
+
+# shell_integration enabled
+
+#: Enable shell integration on supported shells. This enables features
+#: such as jumping to previous prompts, browsing the output of the
+#: previous command in a pager, etc. on supported shells. Set to
+#: disabled to turn off shell integration, completely. It is also
+#: possible to disable individual features, set to a space separated
+#: list of these values: no-rc, no-cursor, no-title, no-cwd, no-
+#: prompt-mark, no-complete, no-sudo. See Shell integration
+#: <https://sw.kovidgoyal.net/kitty/shell-integration/> for details.
+
+# allow_cloning ask
+
+#: Control whether programs running in the terminal can request new
+#: windows to be created. The canonical example is clone-in-kitty
+#: <https://sw.kovidgoyal.net/kitty/shell-integration/#clone-shell>.
+#: By default, kitty will ask for permission for each clone request.
+#: Allowing cloning unconditionally gives programs running in the
+#: terminal (including over SSH) permission to execute arbitrary code,
+#: as the user who is running the terminal, on the computer that the
+#: terminal is running on.
+
+# clone_source_strategies venv,conda,env_var,path
+
+#: Control what shell code is sourced when running clone-in-kitty in
+#: the newly cloned window. The supported strategies are:
+
+#: venv
+#:     Source the file $VIRTUAL_ENV/bin/activate. This is used by the
+#:     Python stdlib venv module and allows cloning venvs automatically.
+#: conda
+#:     Run conda activate $CONDA_DEFAULT_ENV. This supports the virtual
+#:     environments created by conda.
+#: env_var
+#:     Execute the contents of the environment variable
+#:     KITTY_CLONE_SOURCE_CODE with eval.
+#: path
+#:     Source the file pointed to by the environment variable
+#:     KITTY_CLONE_SOURCE_PATH.
+
+#: This option must be a comma separated list of the above values.
+#: Only the first valid match, in the order specified, is sourced.
+
+# term xterm-kitty
+
+#: The value of the TERM environment variable to set. Changing this
+#: can break many terminal programs, only change it if you know what
+#: you are doing, not because you read some advice on "Stack Overflow"
+#: to change it. The TERM variable is used by various programs to get
+#: information about the capabilities and behavior of the terminal. If
+#: you change it, depending on what programs you run, and how
+#: different the terminal you are changing it to is, various things
+#: from key-presses, to colors, to various advanced features may not
+#: work. Changing this option by reloading the config will only affect
+#: newly created windows.
+
+# forward_stdio no
+
+#: Forward STDOUT and STDERR of the kitty process to child processes
+#: as file descriptors 3 and 4. This is useful for debugging as it
+#: allows child processes to print to kitty's STDOUT directly. For
+#: example, echo hello world >&3 in a shell will print to the parent
+#: kitty's STDOUT. When enabled, this also sets the
+#: KITTY_STDIO_FORWARDED=3 environment variable so child processes
+#: know about the forwarding.
+
+# menu_map
+
+#: Specify entries for various menus in kitty. Currently only the
+#: global menubar on macOS is supported. For example::
+
+#:    menu_map global "Actions::Launch something special" launch --hold --type=os-window sh -c "echo hello world"
+
+#: This will create a menu entry named "Launch something special" in
+#: an "Actions" menu in the macOS global menubar. Sub-menus can be
+#: created by adding more levels separated by ::.
+
+#: }}}
+
+#: OS specific tweaks {{{
+
+# wayland_titlebar_color system
+
+#: The color of the kitty window's titlebar on Wayland systems with
+#: client side window decorations such as GNOME. A value of system
+#: means to use the default system color, a value of background means
+#: to use the background color of the currently active window and
+#: finally you can use an arbitrary color, such as #12af59 or red.
+
+# macos_titlebar_color system
+
+#: The color of the kitty window's titlebar on macOS. A value of
+#: system means to use the default system color, light or dark can
+#: also be used to set it explicitly. A value of background means to
+#: use the background color of the currently active window and finally
+#: you can use an arbitrary color, such as #12af59 or red. WARNING:
+#: This option works by using a hack when arbitrary color (or
+#: background) is configured, as there is no proper Cocoa API for it.
+#: It sets the background color of the entire window and makes the
+#: titlebar transparent. As such it is incompatible with
+#: background_opacity. If you want to use both, you are probably
+#: better off just hiding the titlebar with hide_window_decorations.
+
+# macos_option_as_alt no
+
+#: Use the Option key as an Alt key on macOS. With this set to no,
+#: kitty will use the macOS native Option+Key to enter Unicode
+#: character behavior. This will break any Alt+Key keyboard shortcuts
+#: in your terminal programs, but you can use the macOS Unicode input
+#: technique. You can use the values: left, right or both to use only
+#: the left, right or both Option keys as Alt, instead. Note that
+#: kitty itself always treats Option the same as Alt. This means you
+#: cannot use this option to configure different kitty shortcuts for
+#: Option+Key vs. Alt+Key. Also, any kitty shortcuts using
+#: Option/Alt+Key will take priority, so that any such key presses
+#: will not be passed to terminal programs running inside kitty.
+#: Changing this option by reloading the config is not supported.
+
+# macos_hide_from_tasks no
+
+#: Hide the kitty window from running tasks on macOS (⌘+Tab and the
+#: Dock). Changing this option by reloading the config is not
+#: supported.
+
+# macos_quit_when_last_window_closed no
+
+#: Have kitty quit when all the top-level windows are closed on macOS.
+#: By default, kitty will stay running, even with no open windows, as
+#: is the expected behavior on macOS.
+
+# macos_window_resizable yes
+
+#: Disable this if you want kitty top-level OS windows to not be
+#: resizable on macOS.
+
+# macos_thicken_font 0
+
+#: Draw an extra border around the font with the given width, to
+#: increase legibility at small font sizes on macOS. For example, a
+#: value of 0.75 will result in rendering that looks similar to sub-
+#: pixel antialiasing at common font sizes. Note that in modern kitty,
+#: this option is obsolete (although still supported). Consider using
+#: text_composition_strategy instead.
+
+# macos_traditional_fullscreen no
+
+#: Use the macOS traditional full-screen transition, that is faster,
+#: but less pretty.
+
+# macos_show_window_title_in all
+
+#: Control where the window title is displayed on macOS. A value of
+#: window will show the title of the currently active window at the
+#: top of the macOS window. A value of menubar will show the title of
+#: the currently active window in the macOS global menu bar, making
+#: use of otherwise wasted space. A value of all will show the title
+#: in both places, and none hides the title. See
+#: macos_menubar_title_max_length for how to control the length of the
+#: title in the menu bar.
+
+# macos_menubar_title_max_length 0
+
+#: The maximum number of characters from the window title to show in
+#: the macOS global menu bar. Values less than one means that there is
+#: no maximum limit.
+
+# macos_custom_beam_cursor no
+
+#: Use a custom mouse cursor for macOS that is easier to see on both
+#: light and dark backgrounds. Nowadays, the default macOS cursor
+#: already comes with a white border. WARNING: this might make your
+#: mouse cursor invisible on dual GPU machines. Changing this option
+#: by reloading the config is not supported.
+
+# macos_colorspace srgb
+
+#: The colorspace in which to interpret terminal colors. The default
+#: of srgb will cause colors to match those seen in web browsers. The
+#: value of default will use whatever the native colorspace of the
+#: display is. The value of displayp3 will use Apple's special
+#: snowflake display P3 color space, which will result in over
+#: saturated (brighter) colors with some color shift. Reloading
+#: configuration will change this value only for newly created OS
+#: windows.
+
+# linux_display_server auto
+
+#: Choose between Wayland and X11 backends. By default, an appropriate
+#: backend based on the system state is chosen automatically. Set it
+#: to x11 or wayland to force the choice. Changing this option by
+#: reloading the config is not supported.
+
+#: }}}
+
+#: Keyboard shortcuts {{{
+
+#: Keys are identified simply by their lowercase Unicode characters.
+#: For example: a for the A key, [ for the left square bracket key,
+#: etc. For functional keys, such as Enter or Escape, the names are
+#: present at Functional key definitions
+#: <https://sw.kovidgoyal.net/kitty/keyboard-protocol/#functional>.
+#: For modifier keys, the names are ctrl (control, ⌃), shift (⇧), alt
+#: (opt, option, ⌥), super (cmd, command, ⌘). See also: GLFW mods
+#: <https://www.glfw.org/docs/latest/group__mods.html>
+
+#: On Linux you can also use XKB key names to bind keys that are not
+#: supported by GLFW. See XKB keys
+#: <https://github.com/xkbcommon/libxkbcommon/blob/master/include/xkbcommon/xkbcommon-
+#: keysyms.h> for a list of key names. The name to use is the part
+#: after the XKB_KEY_ prefix. Note that you can only use an XKB key
+#: name for keys that are not known as GLFW keys.
+
+#: Finally, you can use raw system key codes to map keys, again only
+#: for keys that are not known as GLFW keys. To see the system key
+#: code for a key, start kitty with the kitty --debug-input option,
+#: kitty will output some debug text for every key event. In that text
+#: look for native_code, the value of that becomes the key name in the
+#: shortcut. For example:
+
+#: .. code-block:: none
+
+#:     on_key_input: glfw key: 0x61 native_code: 0x61 action: PRESS mods: none text: 'a'
+
+#: Here, the key name for the A key is 0x61 and you can use it with::
+
+#:     map ctrl+0x61 something
+
+#: to map Ctrl+A to something.
+
+#: You can use the special action no_op to unmap a keyboard shortcut
+#: that is assigned in the default configuration::
+
+#:     map kitty_mod+space no_op
+
+#: If you would like kitty to completely ignore a key event, not even
+#: sending it to the program running in the terminal, map it to
+#: discard_event::
+
+#:     map kitty_mod+f1 discard_event
+
+#: You can combine multiple actions to be triggered by a single
+#: shortcut with combine action, using the syntax below::
+
+#:     map key combine <separator> action1 <separator> action2 <separator> action3 ...
+
+#: For example::
+
+#:     map kitty_mod+e combine : new_window : next_layout
+
+#: This will create a new window and switch to the next available
+#: layout.
+
+#: You can use multi-key shortcuts with the syntax shown below::
+
+#:     map key1>key2>key3 action
+
+#: For example::
+
+#:     map ctrl+f>2 set_font_size 20
+
+#: The full list of actions that can be mapped to key presses is
+#: available here <https://sw.kovidgoyal.net/kitty/actions/>.
+
+# kitty_mod ctrl+shift
+
+#: Special modifier key alias for default shortcuts. You can change
+#: the value of this option to alter all default shortcuts that use
+#: kitty_mod.
+
+# clear_all_shortcuts no
+
+#: Remove all shortcut definitions up to this point. Useful, for
+#: instance, to remove the default shortcuts.
+
+# action_alias
+
+#: E.g. action_alias launch_tab launch --type=tab --cwd=current
+
+#: Define action aliases to avoid repeating the same options in
+#: multiple mappings. Aliases can be defined for any action and will
+#: be expanded recursively. For example, the above alias allows you to
+#: create mappings to launch a new tab in the current working
+#: directory without duplication::
+
+#:     map f1 launch_tab vim
+#:     map f2 launch_tab emacs
+
+#: Similarly, to alias kitten invocation::
+
+#:     action_alias hints kitten hints --hints-offset=0
+
+# kitten_alias
+
+#: E.g. kitten_alias hints hints --hints-offset=0
+
+#: Like action_alias above, but specifically for kittens. Generally,
+#: prefer to use action_alias. This option is a legacy version,
+#: present for backwards compatibility. It causes all invocations of
+#: the aliased kitten to be substituted. So the example above will
+#: cause all invocations of the hints kitten to have the --hints-
+#: offset=0 option applied.
+
+#: Clipboard {{{
+
+#: Copy to clipboard
+
+# map kitty_mod+c copy_to_clipboard
+# map cmd+c       copy_to_clipboard
+
+#::  There is also a copy_or_interrupt action that can be optionally
+#::  mapped to Ctrl+C. It will copy only if there is a selection and
+#::  send an interrupt otherwise. Similarly,
+#::  copy_and_clear_or_interrupt will copy and clear the selection or
+#::  send an interrupt if there is no selection.
+
+#: Paste from clipboard
+
+# map kitty_mod+v paste_from_clipboard
+# map cmd+v       paste_from_clipboard
+
+#: Paste from selection
+
+# map kitty_mod+s  paste_from_selection
+# map shift+insert paste_from_selection
+
+#: Pass selection to program
+
+# map kitty_mod+o pass_selection_to_program
+
+#::  You can also pass the contents of the current selection to any
+#::  program with pass_selection_to_program. By default, the system's
+#::  open program is used, but you can specify your own, the selection
+#::  will be passed as a command line argument to the program. For
+#::  example::
+
+#::      map kitty_mod+o pass_selection_to_program firefox
+
+#::  You can pass the current selection to a terminal program running
+#::  in a new kitty window, by using the @selection placeholder::
+
+#::      map kitty_mod+y new_window less @selection
+
+#: }}}
+
+#: Scrolling {{{
+
+#: Scroll line up
+
+# map kitty_mod+up    scroll_line_up
+# map kitty_mod+k     scroll_line_up
+# map opt+cmd+page_up scroll_line_up
+# map cmd+up          scroll_line_up
+
+#: Scroll line down
+
+# map kitty_mod+down    scroll_line_down
+# map kitty_mod+j       scroll_line_down
+# map opt+cmd+page_down scroll_line_down
+# map cmd+down          scroll_line_down
+
+#: Scroll page up
+
+# map kitty_mod+page_up scroll_page_up
+# map cmd+page_up       scroll_page_up
+
+#: Scroll page down
+
+# map kitty_mod+page_down scroll_page_down
+# map cmd+page_down       scroll_page_down
+
+#: Scroll to top
+
+# map kitty_mod+home scroll_home
+# map cmd+home       scroll_home
+
+#: Scroll to bottom
+
+# map kitty_mod+end scroll_end
+# map cmd+end       scroll_end
+
+#: Scroll to previous shell prompt
+
+# map kitty_mod+z scroll_to_prompt -1
+
+#::  Use a parameter of 0 for scroll_to_prompt to scroll to the last
+#::  jumped to or the last clicked position. Requires shell
+#::  integration <https://sw.kovidgoyal.net/kitty/shell-integration/>
+#::  to work.
+
+#: Scroll to next shell prompt
+
+# map kitty_mod+x scroll_to_prompt 1
+
+#: Browse scrollback buffer in pager
+
+# map kitty_mod+h show_scrollback
+
+#::  You can pipe the contents of the current screen and history
+#::  buffer as STDIN to an arbitrary program using launch --stdin-
+#::  source. For example, the following opens the scrollback buffer in
+#::  less in an overlay window::
+
+#::      map f1 launch --stdin-source=@screen_scrollback --stdin-add-formatting --type=overlay less +G -R
+
+#::  For more details on piping screen and buffer contents to external
+#::  programs, see launch <https://sw.kovidgoyal.net/kitty/launch/>.
+
+#: Browse output of the last shell command in pager
+
+# map kitty_mod+g show_last_command_output
+
+#::  You can also define additional shortcuts to get the command
+#::  output. For example, to get the first command output on screen::
+
+#::      map f1 show_first_command_output_on_screen
+
+#::  To get the command output that was last accessed by a keyboard
+#::  action or mouse action::
+
+#::      map f1 show_last_visited_command_output
+
+#::  You can pipe the output of the last command run in the shell
+#::  using the launch action. For example, the following opens the
+#::  output in less in an overlay window::
+
+#::      map f1 launch --stdin-source=@last_cmd_output --stdin-add-formatting --type=overlay less +G -R
+
+#::  To get the output of the first command on the screen, use
+#::  @first_cmd_output_on_screen. To get the output of the last jumped
+#::  to command, use @last_visited_cmd_output.
+
+#::  Requires shell integration
+#::  <https://sw.kovidgoyal.net/kitty/shell-integration/> to work.
+
+#: }}}
+
+#: Window management {{{
+
+#: New window
+
+# map kitty_mod+enter new_window
+# map cmd+enter       new_window
+
+#::  You can open a new kitty window running an arbitrary program, for
+#::  example::
+
+#::      map kitty_mod+y launch mutt
+
+#::  You can open a new window with the current working directory set
+#::  to the working directory of the current window using::
+
+#::      map ctrl+alt+enter launch --cwd=current
+
+#::  You can open a new window that is allowed to control kitty via
+#::  the kitty remote control facility with launch --allow-remote-
+#::  control. Any programs running in that window will be allowed to
+#::  control kitty. For example::
+
+#::      map ctrl+enter launch --allow-remote-control some_program
+
+#::  You can open a new window next to the currently active window or
+#::  as the first window, with::
+
+#::      map ctrl+n launch --location=neighbor
+#::      map ctrl+f launch --location=first
+
+#::  For more details, see launch
+#::  <https://sw.kovidgoyal.net/kitty/launch/>.
+
+#: New OS window
+
+# map kitty_mod+n new_os_window
+# map cmd+n       new_os_window
+
+#::  Works like new_window above, except that it opens a top-level OS
+#::  window. In particular you can use new_os_window_with_cwd to open
+#::  a window with the current working directory.
+
+#: Close window
+
+# map kitty_mod+w close_window
+# map shift+cmd+d close_window
+
+#: Next window
+
+# map kitty_mod+] next_window
+
+#: Previous window
+
+# map kitty_mod+[ previous_window
+
+#: Move window forward
+
+# map kitty_mod+f move_window_forward
+
+#: Move window backward
+
+# map kitty_mod+b move_window_backward
+
+#: Move window to top
+
+# map kitty_mod+` move_window_to_top
+
+#: Start resizing window
+
+# map kitty_mod+r start_resizing_window
+# map cmd+r       start_resizing_window
+
+#: First window
+
+# map kitty_mod+1 first_window
+# map cmd+1       first_window
+
+#: Second window
+
+# map kitty_mod+2 second_window
+# map cmd+2       second_window
+
+#: Third window
+
+# map kitty_mod+3 third_window
+# map cmd+3       third_window
+
+#: Fourth window
+
+# map kitty_mod+4 fourth_window
+# map cmd+4       fourth_window
+
+#: Fifth window
+
+# map kitty_mod+5 fifth_window
+# map cmd+5       fifth_window
+
+#: Sixth window
+
+# map kitty_mod+6 sixth_window
+# map cmd+6       sixth_window
+
+#: Seventh window
+
+# map kitty_mod+7 seventh_window
+# map cmd+7       seventh_window
+
+#: Eighth window
+
+# map kitty_mod+8 eighth_window
+# map cmd+8       eighth_window
+
+#: Ninth window
+
+# map kitty_mod+9 ninth_window
+# map cmd+9       ninth_window
+
+#: Tenth window
+
+# map kitty_mod+0 tenth_window
+
+#: Visually select and focus window
+
+# map kitty_mod+f7 focus_visible_window
+
+#::  Display overlay numbers and alphabets on the window, and switch
+#::  the focus to the window when you press the key. When there are
+#::  only two windows, the focus will be switched directly without
+#::  displaying the overlay. You can change the overlay characters and
+#::  their order with option visual_window_select_characters.
+
+#: Visually swap window with another
+
+# map kitty_mod+f8 swap_with_window
+
+#::  Works like focus_visible_window above, but swaps the window.
+
+#: }}}
+
+#: Tab management {{{
+
+#: Next tab
+
+# map kitty_mod+right next_tab
+# map shift+cmd+]     next_tab
+# map ctrl+tab        next_tab
+
+#: Previous tab
+
+# map kitty_mod+left previous_tab
+# map shift+cmd+[    previous_tab
+# map ctrl+shift+tab previous_tab
+
+#: New tab
+
+# map kitty_mod+t new_tab
+# map cmd+t       new_tab
+
+#: Close tab
+
+# map kitty_mod+q close_tab
+# map cmd+w       close_tab
+
+#: Close OS window
+
+# map shift+cmd+w close_os_window
+
+#: Move tab forward
+
+# map kitty_mod+. move_tab_forward
+
+#: Move tab backward
+
+# map kitty_mod+, move_tab_backward
+
+#: Set tab title
+
+# map kitty_mod+alt+t set_tab_title
+# map shift+cmd+i     set_tab_title
+
+
+#: You can also create shortcuts to go to specific tabs, with 1 being
+#: the first tab, 2 the second tab and -1 being the previously active
+#: tab, and any number larger than the last tab being the last tab::
+
+#:     map ctrl+alt+1 goto_tab 1
+#:     map ctrl+alt+2 goto_tab 2
+
+#: Just as with new_window above, you can also pass the name of
+#: arbitrary commands to run when using new_tab and new_tab_with_cwd.
+#: Finally, if you want the new tab to open next to the current tab
+#: rather than at the end of the tabs list, use::
+
+#:     map ctrl+t new_tab !neighbor [optional cmd to run]
+#: }}}
+
+#: Layout management {{{
+
+#: Next layout
+
+# map kitty_mod+l next_layout
+
+
+#: You can also create shortcuts to switch to specific layouts::
+
+#:     map ctrl+alt+t goto_layout tall
+#:     map ctrl+alt+s goto_layout stack
+
+#: Similarly, to switch back to the previous layout::
+
+#:     map ctrl+alt+p last_used_layout
+
+#: There is also a toggle_layout action that switches to the named
+#: layout or back to the previous layout if in the named layout.
+#: Useful to temporarily "zoom" the active window by switching to the
+#: stack layout::
+
+#:     map ctrl+alt+z toggle_layout stack
+#: }}}
+
+#: Font sizes {{{
+
+#: You can change the font size for all top-level kitty OS windows at
+#: a time or only the current one.
+
+#: Increase font size
+
+# map kitty_mod+equal  change_font_size all +2.0
+# map kitty_mod+plus   change_font_size all +2.0
+# map kitty_mod+kp_add change_font_size all +2.0
+# map cmd+plus         change_font_size all +2.0
+# map cmd+equal        change_font_size all +2.0
+# map shift+cmd+equal  change_font_size all +2.0
+
+#: Decrease font size
+
+# map kitty_mod+minus       change_font_size all -2.0
+# map kitty_mod+kp_subtract change_font_size all -2.0
+# map cmd+minus             change_font_size all -2.0
+# map shift+cmd+minus       change_font_size all -2.0
+
+#: Reset font size
+
+# map kitty_mod+backspace change_font_size all 0
+# map cmd+0               change_font_size all 0
+
+
+#: To setup shortcuts for specific font sizes::
+
+#:     map kitty_mod+f6 change_font_size all 10.0
+
+#: To setup shortcuts to change only the current OS window's font
+#: size::
+
+#:     map kitty_mod+f6 change_font_size current 10.0
+#: }}}
+
+#: Select and act on visible text {{{
+
+#: Use the hints kitten to select text and either pass it to an
+#: external program or insert it into the terminal or copy it to the
+#: clipboard.
+
+#: Open URL
+
+# map kitty_mod+e open_url_with_hints
+
+#::  Open a currently visible URL using the keyboard. The program used
+#::  to open the URL is specified in open_url_with.
+
+#: Insert selected path
+
+# map kitty_mod+p>f kitten hints --type path --program -
+
+#::  Select a path/filename and insert it into the terminal. Useful,
+#::  for instance to run git commands on a filename output from a
+#::  previous git command.
+
+#: Open selected path
+
+# map kitty_mod+p>shift+f kitten hints --type path
+
+#::  Select a path/filename and open it with the default open program.
+
+#: Insert selected line
+
+# map kitty_mod+p>l kitten hints --type line --program -
+
+#::  Select a line of text and insert it into the terminal. Useful for
+#::  the output of things like: `ls -1`.
+
+#: Insert selected word
+
+# map kitty_mod+p>w kitten hints --type word --program -
+
+#::  Select words and insert into terminal.
+
+#: Insert selected hash
+
+# map kitty_mod+p>h kitten hints --type hash --program -
+
+#::  Select something that looks like a hash and insert it into the
+#::  terminal. Useful with git, which uses SHA1 hashes to identify
+#::  commits.
+
+#: Open the selected file at the selected line
+
+# map kitty_mod+p>n kitten hints --type linenum
+
+#::  Select something that looks like filename:linenum and open it in
+#::  vim at the specified line number.
+
+#: Open the selected hyperlink
+
+# map kitty_mod+p>y kitten hints --type hyperlink
+
+#::  Select a hyperlink (i.e. a URL that has been marked as such by
+#::  the terminal program, for example, by `ls --hyperlink=auto`).
+
+
+#: The hints kitten has many more modes of operation that you can map
+#: to different shortcuts. For a full description see hints kitten
+#: <https://sw.kovidgoyal.net/kitty/kittens/hints/>.
+#: }}}
+
+#: Miscellaneous {{{
+
+#: Show documentation
+
+# map kitty_mod+f1 show_kitty_doc overview
+
+#: Toggle fullscreen
+
+# map kitty_mod+f11 toggle_fullscreen
+# map ctrl+cmd+f    toggle_fullscreen
+
+#: Toggle maximized
+
+# map kitty_mod+f10 toggle_maximized
+
+#: Toggle macOS secure keyboard entry
+
+# map opt+cmd+s toggle_macos_secure_keyboard_entry
+
+#: Unicode input
+
+# map kitty_mod+u    kitten unicode_input
+# map ctrl+cmd+space kitten unicode_input
+
+#: Edit config file
+
+# map kitty_mod+f2 edit_config_file
+# map cmd+,        edit_config_file
+
+#: Open the kitty command shell
+
+# map kitty_mod+escape kitty_shell window
+
+#::  Open the kitty shell in a new window / tab / overlay / os_window
+#::  to control kitty using commands.
+
+#: Increase background opacity
+
+# map kitty_mod+a>m set_background_opacity +0.1
+
+#: Decrease background opacity
+
+# map kitty_mod+a>l set_background_opacity -0.1
+
+#: Make background fully opaque
+
+# map kitty_mod+a>1 set_background_opacity 1
+
+#: Reset background opacity
+
+# map kitty_mod+a>d set_background_opacity default
+
+#: Reset the terminal
+
+# map kitty_mod+delete clear_terminal reset active
+# map opt+cmd+r        clear_terminal reset active
+
+#::  You can create shortcuts to clear/reset the terminal. For
+#::  example::
+
+#::      # Reset the terminal
+#::      map f1 clear_terminal reset active
+#::      # Clear the terminal screen by erasing all contents
+#::      map f1 clear_terminal clear active
+#::      # Clear the terminal scrollback by erasing it
+#::      map f1 clear_terminal scrollback active
+#::      # Scroll the contents of the screen into the scrollback
+#::      map f1 clear_terminal scroll active
+#::      # Clear everything up to the line with the cursor
+#::      map f1 clear_terminal to_cursor active
+
+#::  If you want to operate on all kitty windows instead of just the
+#::  current one, use all instead of active.
+
+#::  Some useful functions that can be defined in the shell rc files
+#::  to perform various kinds of clearing of the current window:
+
+#::  .. code-block:: sh
+
+#::      clear-only-screen() {
+#::          printf "\e[H\e[2J"
+#::      }
+
+#::      clear-screen-and-scrollback() {
+#::          printf "\e[H\e[3J"
+#::      }
+
+#::      clear-screen-saving-contents-in-scrollback() {
+#::          printf "\e[H\e[22J"
+#::      }
+
+#::  For instance, using these escape codes, it is possible to remap
+#::  Ctrl+L to both scroll the current screen contents into the
+#::  scrollback buffer and clear the screen, instead of just clearing
+#::  the screen. For ZSH, in ~/.zshrc, add:
+
+#::  .. code-block:: zsh
+
+#::      ctrl_l() {
+#::          builtin print -rn -- $'\r\e[0J\e[H\e[22J' >"$TTY"
+#::          builtin zle .reset-prompt
+#::          builtin zle -R
+#::      }
+#::      zle -N ctrl_l
+#::      bindkey '^l' ctrl_l
+
+#: Clear up to cursor line
+
+# map cmd+k clear_terminal to_cursor active
+
+#: Reload kitty.conf
+
+# map kitty_mod+f5 load_config_file
+# map ctrl+cmd+,   load_config_file
+
+#::  Reload kitty.conf, applying any changes since the last time it
+#::  was loaded. Note that a handful of options cannot be dynamically
+#::  changed and require a full restart of kitty. Particularly, when
+#::  changing shortcuts for actions located on the macOS global menu
+#::  bar, a full restart is needed. You can also map a keybinding to
+#::  load a different config file, for example::
+
+#::      map f5 load_config /path/to/alternative/kitty.conf
+
+#::  Note that all options from the original kitty.conf are discarded,
+#::  in other words the new configuration *replace* the old ones.
+
+#: Debug kitty configuration
+
+# map kitty_mod+f6 debug_config
+# map opt+cmd+,    debug_config
+
+#::  Show details about exactly what configuration kitty is running
+#::  with and its host environment. Useful for debugging issues.
+
+#: Send arbitrary text on key presses
+
+#::  E.g. map ctrl+shift+alt+h send_text all Hello World
+
+#::  You can tell kitty to send arbitrary (UTF-8) encoded text to the
+#::  client program when pressing specified shortcut keys. For
+#::  example::
+
+#::      map ctrl+alt+a send_text all Special text
+
+#::  This will send "Special text" when you press the Ctrl+Alt+A key
+#::  combination. The text to be sent decodes ANSI C escapes
+#::  <https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-
+#::  Quoting.html> so you can use escapes like \e to send control
+#::  codes or \u21fb to send Unicode characters (or you can just input
+#::  the Unicode characters directly as UTF-8 text). You can use
+#::  `kitten show_key` to get the key escape codes you want to
+#::  emulate.
+
+#::  The first argument to send_text is the keyboard modes in which to
+#::  activate the shortcut. The possible values are normal,
+#::  application, kitty or a comma separated combination of them. The
+#::  modes normal and application refer to the DECCKM cursor key mode
+#::  for terminals, and kitty refers to the kitty extended keyboard
+#::  protocol. The special value all means all of them.
+
+#::  Some more examples::
+
+#::      # Output a word and move the cursor to the start of the line (like typing and pressing Home)
+#::      map ctrl+alt+a send_text normal Word\e[H
+#::      map ctrl+alt+a send_text application Word\eOH
+#::      # Run a command at a shell prompt (like typing the command and pressing Enter)
+#::      map ctrl+alt+a send_text normal,application some command with arguments\r
+
+#: Open kitty Website
+
+# map shift+cmd+/ open_url https://sw.kovidgoyal.net/kitty/
+
+#: Hide macOS kitty application
+
+# map cmd+h hide_macos_app
+
+#: Hide macOS other applications
+
+# map opt+cmd+h hide_macos_other_apps
+
+#: Minimize macOS window
+
+# map cmd+m minimize_macos_window
+
+#: Quit kitty
+
+# map cmd+q quit
+
+#: }}}
+
+#: }}}
+
+#: Tokyo Night {{{
+
+# Tokyo Night color scheme for kitty terminal emulator
+# https://github.com/davidmathers/tokyo-night-kitty-theme
+#
+# Based on Tokyo Night color theme for Visual Studio Code
+# https://github.com/enkia/tokyo-night-vscode-theme
+
+foreground #a9b1d6
+background #1a1b26
+
+# Black
+color0 #414868
+color8 #414868
+
+# Red
+color1 #f7768e
+color9 #f7768e
+
+# Green
+color2  #73daca
+color10 #73daca
+
+# Yellow
+color3  #e0af68
+color11 #e0af68
+
+# Blue
+color4  #7aa2f7
+color12 #7aa2f7
+
+# Magenta
+color5  #bb9af7
+color13 #bb9af7
+
+# Cyan
+color6  #7dcfff
+color14 #7dcfff
+
+# White
+color7  #c0caf5
+color15 #c0caf5
+
+# Cursor
+cursor #c0caf5
+cursor_text_color #1a1b26
+
+# Selection highlight
+selection_foreground none
+selection_background #28344a
+
+# The color for highlighting URLs on mouse-over
+url_color #9ece6a
+
+# Window borders
+active_border_color #3d59a1
+inactive_border_color #101014
+bell_border_color #e0af68
+
+# Tab bar
+tab_bar_style fade
+tab_fade 1
+active_tab_foreground   #3d59a1
+active_tab_background   #16161e
+active_tab_font_style   bold
+inactive_tab_foreground #787c99
+inactive_tab_background #16161e
+inactive_tab_font_style bold
+tab_bar_background #101014
+
+# Title bar
+macos_titlebar_color #16161e
+
+# Storm
+# background #24283b
+# cursor_text_color #24283b
+# active_tab_background   #1f2335
+# inactive_tab_background #1f2335
+# macos_titlebar_color #1f2335
+
+#: }}}
diff --git a/nixos/config/neovim/init.lua b/nixos/config/neovim/init.lua
new file mode 100644
index 0000000..4118b3f
--- /dev/null
+++ b/nixos/config/neovim/init.lua
@@ -0,0 +1,2 @@
+require("venomade")
+require("plugins")
diff --git a/nixos/config/neovim/lua/plugins/autopairs.lua b/nixos/config/neovim/lua/plugins/autopairs.lua
new file mode 100644
index 0000000..261f664
--- /dev/null
+++ b/nixos/config/neovim/lua/plugins/autopairs.lua
@@ -0,0 +1,3 @@
+require('nvim-autopairs').setup({
+  disable_filetype = { "TelescopePrompt" , "vim" },
+})
diff --git a/nixos/config/neovim/lua/plugins/catppuccin.lua b/nixos/config/neovim/lua/plugins/catppuccin.lua
new file mode 100644
index 0000000..be28c77
--- /dev/null
+++ b/nixos/config/neovim/lua/plugins/catppuccin.lua
@@ -0,0 +1,29 @@
+require("catppuccin").setup({
+    flavour = "mocha",
+    transparent_background = true,
+    term_colors = true,
+    dim_inactive = {
+        enabled = true,
+        shade = "dark",
+        percentage = 0.15,
+    },
+    styles = {
+        comments = { "italic" },
+        conditionals = { "italic" },
+        loops = {},
+        functions = {},
+        keywords = {},
+        strings = {},
+        variables = {},
+        numbers = {},
+        booleans = { "bold" },
+        properties = {},
+        types = {},
+        operators = {},
+    },
+    integrations = {
+        treesitter = true,
+    },
+})
+
+vim.cmd.colorscheme "catppuccin"
diff --git a/nixos/config/neovim/lua/plugins/codeium.lua b/nixos/config/neovim/lua/plugins/codeium.lua
new file mode 100644
index 0000000..b5fe92d
--- /dev/null
+++ b/nixos/config/neovim/lua/plugins/codeium.lua
@@ -0,0 +1 @@
+require("codeium").setup({})
diff --git a/nixos/config/neovim/lua/plugins/colorizer.lua b/nixos/config/neovim/lua/plugins/colorizer.lua
new file mode 100644
index 0000000..1bd1636
--- /dev/null
+++ b/nixos/config/neovim/lua/plugins/colorizer.lua
@@ -0,0 +1 @@
+require('colorizer').setup()
diff --git a/nixos/config/neovim/lua/plugins/dashboard.lua b/nixos/config/neovim/lua/plugins/dashboard.lua
new file mode 100644
index 0000000..0e719c7
--- /dev/null
+++ b/nixos/config/neovim/lua/plugins/dashboard.lua
@@ -0,0 +1,58 @@
+local alpha = require('alpha')
+local dashboard = require('alpha.themes.dashboard')
+
+local header = {
+    type = 'text',
+    val = 'Neovim',
+    opts = {
+        position = 'center',
+    }
+}
+
+local buttons = {
+    type = 'group',
+    val = {
+        {
+            type = 'text',
+            val = 'Quick actions',
+            opts = { position = 'center' }
+        },
+        {
+            type = 'padding',
+            val = 1,
+        },
+        dashboard.button('<leader>n', '  New File',
+                         ':enew | NvimTreeFocus<CR>',
+                         { desc = 'New file' }),
+        dashboard.button('<leader>o', '  Old Files',
+                         ':Telescope oldfiles<CR>',
+                         { desc = 'Old files' }),
+        dashboard.button('<leader>ff', '  Find File',
+                         ':Telescope find_files<CR>'),
+        dashboard.button('<leader>fg', '  Find in files')
+    }
+}
+
+alpha.setup {
+    layout = {
+        {
+            type = 'padding',
+            val = 2,
+        },
+        header,
+        {
+            type = 'padding',
+            val = 2,
+        },
+        buttons,
+        {
+            type = 'padding',
+            val = 2,
+        },
+    },
+}
+
+--	vim.api.nvim_create_autocmd("User", {
+--	    pattern = "AlphaReady",
+--	    command = "set showtabline=0 | set laststatus=0",
+--	})
diff --git a/nixos/config/neovim/lua/plugins/harpoon.lua b/nixos/config/neovim/lua/plugins/harpoon.lua
new file mode 100644
index 0000000..dc1b3ce
--- /dev/null
+++ b/nixos/config/neovim/lua/plugins/harpoon.lua
@@ -0,0 +1,10 @@
+local mark = require("harpoon.mark")
+local ui = require("harpoon.ui")
+
+vim.keymap.set("n", "<leader>a", mark.add_file)
+vim.keymap.set("n", "<C-h>", ui.toggle_quick_menu)
+
+vim.keymap.set("n", "<C-n>", function() ui.nav_file(1) end)
+vim.keymap.set("n", "<C-e>", function() ui.nav_file(2) end)
+vim.keymap.set("n", "<C-i>", function() ui.nav_file(3) end)
+vim.keymap.set("n", "<C-o>", function() ui.nav_file(4) end)
diff --git a/nixos/config/neovim/lua/plugins/init.lua b/nixos/config/neovim/lua/plugins/init.lua
new file mode 100644
index 0000000..c781738
--- /dev/null
+++ b/nixos/config/neovim/lua/plugins/init.lua
@@ -0,0 +1,11 @@
+require("plugins.lsp")
+require("plugins.catppuccin")
+require("plugins.treesitter")
+require("plugins.telescope")
+require("plugins.harpoon")
+require("plugins.dashboard")
+require("plugins.codeium")
+require("plugins.lualine")
+require("plugins.autopairs")
+require("plugins.colorizer")
+require("plugins.lastplace")
diff --git a/nixos/config/neovim/lua/plugins/lastplace.lua b/nixos/config/neovim/lua/plugins/lastplace.lua
new file mode 100644
index 0000000..52d96cc
--- /dev/null
+++ b/nixos/config/neovim/lua/plugins/lastplace.lua
@@ -0,0 +1 @@
+require('nvim-lastplace').setup()
diff --git a/nixos/config/neovim/lua/plugins/lsp.lua b/nixos/config/neovim/lua/plugins/lsp.lua
new file mode 100644
index 0000000..b9c5d3c
--- /dev/null
+++ b/nixos/config/neovim/lua/plugins/lsp.lua
@@ -0,0 +1,40 @@
+local lsp_zero = require("lsp-zero")
+
+lsp_zero.on_attach(function(client,buffer)
+	lsp_zero.default_keymaps({buffer = bufnr})
+  lsp_zero.buffer_autoformat()
+end)
+
+require'lspconfig'.clangd.setup{}
+require'lspconfig'.hls.setup{}
+require'lspconfig'.nil_ls.setup{}
+require'lspconfig'.rust_analyzer.setup{}
+
+local lspkind = require('lspkind')
+local cmp = require('cmp')
+local cmp_action = require('lsp-zero').cmp_action()
+
+cmp.setup({
+  preselect = 'none',
+	completion = {
+		completeopt = 'menu,menuone,noinsert,noselect'
+	},
+  formatting = {
+    format = lspkind.cmp_format({
+      mode = 'symbol',
+      maxwidth = 50,
+      ellipsis_char = '...',
+      symbol_map = { Codeium = '' },
+    })
+  },
+  mapping = cmp.mapping.preset.insert({
+    ['<CR>'] = cmp.mapping.confirm({select = false}),
+		['<Tab>'] = cmp_action.tab_complete(),
+		['<S-Tab>'] = cmp_action.select_prev_or_fallback(),
+    ['<C-Space>'] = cmp.mapping.complete(),
+  }),
+	sources = {
+		{ name = "nvim_lsp" },
+		{ name = "codeium" }
+	}
+})
diff --git a/nixos/config/neovim/lua/plugins/lualine.lua b/nixos/config/neovim/lua/plugins/lualine.lua
new file mode 100644
index 0000000..5c6c2c0
--- /dev/null
+++ b/nixos/config/neovim/lua/plugins/lualine.lua
@@ -0,0 +1,13 @@
+require('lualine').setup{
+  options = {
+    theme = 'palenight',
+  },
+  tabline = {
+    lualine_a = {'buffers'},
+    lualine_b = {},
+    lualine_c = {},
+    lualine_x = {},
+    lualine_y = {},
+    lualine_z = {},
+  },
+}
diff --git a/nixos/config/neovim/lua/plugins/telescope.lua b/nixos/config/neovim/lua/plugins/telescope.lua
new file mode 100644
index 0000000..a54f9de
--- /dev/null
+++ b/nixos/config/neovim/lua/plugins/telescope.lua
@@ -0,0 +1,7 @@
+local builtin = require('telescope.builtin')
+vim.keymap.set('n', '<leader>ff', builtin.find_files, {})
+vim.keymap.set('n', '<leader>fb', builtin.buffers, {})
+vim.keymap.set('n', '<leader>fh', builtin.help_tags, {})
+vim.keymap.set('n', '<leader>fg', function()
+	builtin.grep_string({ search = vim.fn.input("Grep > ") });
+end)
diff --git a/nixos/config/neovim/lua/plugins/treesitter.lua b/nixos/config/neovim/lua/plugins/treesitter.lua
new file mode 100644
index 0000000..db84143
--- /dev/null
+++ b/nixos/config/neovim/lua/plugins/treesitter.lua
@@ -0,0 +1,17 @@
+require'nvim-treesitter.configs'.setup {
+  -- A list of parser names, or "all" (the five listed parsers should always be installed)
+  ensure_installed = { "c", "lua", "vim", "vimdoc", "query", "go", "rust", "haskell" },
+
+  -- Install parsers synchronously (only applied to `ensure_installed`)
+  sync_install = false,
+
+  -- Automatically install missing parsers when entering buffer
+  -- Recommendation: set to false if you don't have `tree-sitter` CLI installed locally
+  auto_install = true,
+
+  highlight = {
+    enable = true,
+
+    additional_vim_regex_highlighting = false,
+  },
+}
diff --git a/nixos/config/neovim/lua/venomade/clipboard.lua b/nixos/config/neovim/lua/venomade/clipboard.lua
new file mode 100644
index 0000000..0a53a29
--- /dev/null
+++ b/nixos/config/neovim/lua/venomade/clipboard.lua
@@ -0,0 +1,14 @@
+vim.cmd('set clipboard+=unnamedplus')
+
+function CopyToClipboard()
+    local selected_text = vim.fn.getline("'<,'>")
+    vim.fn.setreg("+", selected_text)
+end
+
+function PasteFromClipboard()
+    local clipboard_text = vim.fn.getreg("+")
+    vim.fn.setline('.', clipboard_text)
+end
+
+vim.api.nvim_set_keymap('x', '<Leader>y', [[:lua CopyToClipboard()<CR>]], { noremap = true, silent = true })
+vim.api.nvim_set_keymap('n', '<Leader>p', [[:lua PasteFromClipboard()<CR>]], { noremap = true, silent = true })
diff --git a/nixos/config/neovim/lua/venomade/config.lua b/nixos/config/neovim/lua/venomade/config.lua
new file mode 100644
index 0000000..635f403
--- /dev/null
+++ b/nixos/config/neovim/lua/venomade/config.lua
@@ -0,0 +1,41 @@
+vim.opt.nu = true
+vim.opt.rnu = true
+
+vim.opt.tabstop = 2
+vim.opt.softtabstop = 2
+vim.opt.shiftwidth = 2
+vim.opt.expandtab = true
+vim.opt.autoindent = true
+
+vim.opt.smartindent = true
+
+vim.opt.wrap = false
+
+vim.opt.swapfile = false
+vim.opt.backup = false
+vim.opt.undodir = os.getenv("HOME") .. "/.vim/undodir"
+vim.opt.undofile = true
+
+vim.opt.hlsearch = false
+vim.opt.incsearch = true
+
+vim.opt.termguicolors = true
+
+vim.opt.scrolloff = 5
+
+vim.opt.updatetime = 50
+
+vim.opt.splitbelow = true
+vim.opt.splitright = true
+
+vim.opt.encoding = "utf-8"
+
+vim.opt.shell = "zsh"
+
+vim.opt.ignorecase = true
+vim.opt.smartcase = true
+vim.opt.incsearch = true
+
+vim.opt.title = true
+
+vim.cmd "set showtabline=0 | set laststatus=0"
diff --git a/nixos/config/neovim/lua/venomade/init.lua b/nixos/config/neovim/lua/venomade/init.lua
new file mode 100644
index 0000000..590b6c8
--- /dev/null
+++ b/nixos/config/neovim/lua/venomade/init.lua
@@ -0,0 +1,5 @@
+require("venomade.remap")
+require("venomade.lazy")
+require("venomade.config")
+require("venomade.clipboard")
+require("venomade.neovide")
diff --git a/nixos/config/neovim/lua/venomade/lazy.lua b/nixos/config/neovim/lua/venomade/lazy.lua
new file mode 100644
index 0000000..3d5bebe
--- /dev/null
+++ b/nixos/config/neovim/lua/venomade/lazy.lua
@@ -0,0 +1,42 @@
+local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
+if not vim.loop.fs_stat(lazypath) then
+  vim.fn.system({
+    "git",
+    "clone",
+    "--filter=blob:none",
+    "https://github.com/folke/lazy.nvim.git",
+    "--branch=stable",
+    lazypath,
+  })
+end
+vim.opt.rtp:prepend(lazypath)
+
+require("lazy").setup({
+	-- Telescope Fuzzy Finder
+	{'nvim-telescope/telescope.nvim', tag = '0.1.3', dependencies = {'nvim-lua/plenary.nvim'}},
+	-- Catppuccin color scheme
+	{"catppuccin/nvim", name = "catppuccin", priority = 1000},
+	-- Treesitter syntax highlighting
+	{"nvim-treesitter/nvim-treesitter", build = ":TSUpdate"},
+	-- Harpoon bookmarking
+	{"theprimeagen/harpoon"},
+	-- LSP ZERO
+	{'VonHeikemen/lsp-zero.nvim', branch = 'v3.x'},
+	{'neovim/nvim-lspconfig', dependencies = {'hrsh7th/cmp-nvim-lsp'}},
+	{'hrsh7th/nvim-cmp', dependencies = {'L3MON4D3/LuaSnip'}},
+	-- Codeium AI Completion
+	{'Exafunction/codeium.nvim', dependencies = {'nvim-lua/plenary.nvim', 'hrsh7th/nvim-cmp'}},
+	-- Dashboard
+	{'goolord/alpha-nvim', dependencies = {'nvim-tree/nvim-web-devicons'}},
+  -- LSP Icons
+  {'onsails/lspkind.nvim'},
+  -- Bufferline
+  {'nvim-lualine/lualine.nvim', dependencies = {'nvim-tree/nvim-web-devicons'}},
+  -- Autoparis
+  {'windwp/nvim-autopairs'},
+  -- Color Highlighting
+  {'norcalli/nvim-colorizer.lua'},
+  -- Return to last edit position
+  {'ethanholz/nvim-lastplace'},
+})
+
diff --git a/nixos/config/neovim/lua/venomade/neovide.lua b/nixos/config/neovim/lua/venomade/neovide.lua
new file mode 100644
index 0000000..16f5ffb
--- /dev/null
+++ b/nixos/config/neovim/lua/venomade/neovide.lua
@@ -0,0 +1,20 @@
+if vim.g.neovide then
+  vim.opt.guifont = { "FantasqueSansM Nerd Font", ":h12" }
+
+  vim.g.neovide_scale_factor = 1.0
+
+  --Transparency
+  -- Helper function for transparency formatting
+  local alpha = function()
+    return string.format("%x", math.floor(255 * vim.g.transparency or 0.8))
+  end
+
+  vim.g.neovide_transparency = 0.92
+  vim.g.transparency = 0.92
+  -- vim.g.neovide_background_color = "#1e1e2e" .. alpha()
+
+  vim.g.neovide_window_blurred = true
+  vim.g.neovide_floating_blur_amount_x = 2.0
+  vim.g.neovide_floating_blur_amount_y = 2.0
+
+end
diff --git a/nixos/config/neovim/lua/venomade/remap.lua b/nixos/config/neovim/lua/venomade/remap.lua
new file mode 100644
index 0000000..a81ba80
--- /dev/null
+++ b/nixos/config/neovim/lua/venomade/remap.lua
@@ -0,0 +1,7 @@
+vim.g.mapleader = " "
+vim.keymap.set("n", "<leader>pv", vim.cmd.Ex)
+
+-- Buffers
+vim.keymap.set("n", "<leader>bk", vim.cmd.bdelete)
+vim.keymap.set("n", "<leader>bn", vim.cmd.bnext)
+vim.keymap.set("n", "<leader>bp", vim.cmd.bprev)
diff --git a/nixos/config/picom.conf b/nixos/config/picom.conf
new file mode 100644
index 0000000..3de6da8
--- /dev/null
+++ b/nixos/config/picom.conf
@@ -0,0 +1,423 @@
+#################################
+#             Shadows           #
+#################################
+
+
+# Enabled client-side shadows on windows. Note desktop windows
+# (windows with '_NET_WM_WINDOW_TYPE_DESKTOP') never get shadow,
+# unless explicitly requested using the wintypes option.
+#
+# shadow = false
+shadow = true;
+
+# The blur radius for shadows, in pixels. (defaults to 12)
+# shadow-radius = 12
+shadow-radius = 7;
+
+# The opacity of shadows. (0.0 - 1.0, defaults to 0.75)
+# shadow-opacity = .75
+
+# The left offset for shadows, in pixels. (defaults to -15)
+# shadow-offset-x = -15
+shadow-offset-x = -7;
+
+# The top offset for shadows, in pixels. (defaults to -15)
+# shadow-offset-y = -15
+shadow-offset-y = -7;
+
+# Red color value of shadow (0.0 - 1.0, defaults to 0).
+# shadow-red = 0
+
+# Green color value of shadow (0.0 - 1.0, defaults to 0).
+# shadow-green = 0
+
+# Blue color value of shadow (0.0 - 1.0, defaults to 0).
+# shadow-blue = 0
+
+# Hex string color value of shadow (#000000 - #FFFFFF, defaults to #000000). This option will override options set shadow-(red/green/blue)
+# shadow-color = "#000000"
+
+# Specify a list of conditions of windows that should have no shadow.
+#
+# examples:
+#   shadow-exclude = "n:e:Notification";
+#
+# shadow-exclude = []
+shadow-exclude = [
+  "name = 'Notification'",
+  "class_g ?= 'Notify-osd'",
+  "_GTK_FRAME_EXTENTS@:c"
+];
+
+# Specify a list of conditions of windows that should have no shadow painted over, such as a dock window.
+# clip-shadow-above = []
+
+# Specify a X geometry that describes the region in which shadow should not
+# be painted in, such as a dock window region. Use
+#    shadow-exclude-reg = "x10+0+0"
+# for example, if the 10 pixels on the bottom of the screen should not have shadows painted on.
+#
+# shadow-exclude-reg = ""
+
+# Crop shadow of a window fully on a particular Xinerama screen to the screen.
+# xinerama-shadow-crop = false
+
+
+#################################
+#           Fading              #
+#################################
+
+
+# Fade windows in/out when opening/closing and when opacity changes,
+#  unless no-fading-openclose is used.
+# fading = false
+fading = true;
+
+# Opacity change between steps while fading in. (0.01 - 1.0, defaults to 0.028)
+# fade-in-step = 0.028
+fade-in-step = 0.2;
+
+# Opacity change between steps while fading out. (0.01 - 1.0, defaults to 0.03)
+# fade-out-step = 0.03
+fade-out-step = 0.2;
+
+# The time between steps in fade step, in milliseconds. (> 0, defaults to 10)
+# fade-delta = 10
+
+# Specify a list of conditions of windows that should not be faded.
+# fade-exclude = []
+
+# Do not fade on window open/close.
+# no-fading-openclose = false
+
+# Do not fade destroyed ARGB windows with WM frame. Workaround of bugs in Openbox, Fluxbox, etc.
+# no-fading-destroyed-argb = false
+
+
+#################################
+#   Transparency / Opacity      #
+#################################
+
+
+# Opacity of inactive windows. (0.1 - 1.0, defaults to 1.0)
+# inactive-opacity = 1
+
+# Opacity of window titlebars and borders. (0.1 - 1.0, disabled by default)
+# frame-opacity = 1.0
+
+# Let inactive opacity set by -i override the '_NET_WM_WINDOW_OPACITY' values of windows.
+# inactive-opacity-override = true
+inactive-opacity-override = false;
+
+# Default opacity for active windows. (0.0 - 1.0, defaults to 1.0)
+# active-opacity = 1.0
+
+# Dim inactive windows. (0.0 - 1.0, defaults to 0.0)
+# inactive-dim = 0.0
+
+# Specify a list of conditions of windows that should never be considered focused.
+# focus-exclude = []
+
+# Use fixed inactive dim value, instead of adjusting according to window opacity.
+# inactive-dim-fixed = 1.0
+
+# Specify a list of opacity rules, in the format `PERCENT:PATTERN`,
+# like `50:name *= "Firefox"`. picom-trans is recommended over this.
+# Note we don't make any guarantee about possible conflicts with other
+# programs that set '_NET_WM_WINDOW_OPACITY' on frame or client windows.
+# example:
+#    opacity-rule = [ "80:class_g = 'URxvt'" ];
+#
+# opacity-rule = []
+
+
+#################################
+#           Corners             #
+#################################
+
+# Sets the radius of rounded window corners. When > 0, the compositor will
+# round the corners of windows. Does not interact well with
+# `transparent-clipping`.
+corner-radius = 4
+
+# Exclude conditions for rounded corners.
+rounded-corners-exclude = [
+  "window_type = 'dock'",
+  "window_type = 'desktop'"
+];
+
+
+#################################
+#     Background-Blurring       #
+#################################
+
+
+# Parameters for background blurring, see the *BLUR* section for more information.
+blur-method = "dual_kawase"
+blur-size = 12
+#
+# blur-deviation = false
+#
+blur-strength = 5
+
+# Blur background of semi-transparent / ARGB windows.
+# Bad in performance, with driver-dependent behavior.
+# The name of the switch may change without prior notifications.
+#
+# blur-background = false
+
+# Blur background of windows when the window frame is not opaque.
+# Implies:
+#    blur-background
+# Bad in performance, with driver-dependent behavior. The name may change.
+#
+# blur-background-frame = false
+
+
+# Use fixed blur strength rather than adjusting according to window opacity.
+# blur-background-fixed = false
+
+
+# Specify the blur convolution kernel, with the following format:
+# example:
+#   blur-kern = "5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1";
+#
+# blur-kern = ""
+blur-kern = "3x3box";
+
+
+# Exclude conditions for background blur.
+# blur-background-exclude = []
+blur-background-exclude = [
+  "window_type = 'dock'",
+  "window_type = 'desktop'",
+  "_GTK_FRAME_EXTENTS@:c"
+];
+
+#################################
+#       General Settings        #
+#################################
+
+# Enable remote control via D-Bus. See the man page for more details.
+# dbus = true
+
+# Daemonize process. Fork to background after initialization. Causes issues with certain (badly-written) drivers.
+# daemon = false
+
+# Specify the backend to use: `xrender`, `glx`, or `xr_glx_hybrid`.
+# `xrender` is the default one.
+#
+# backend = "glx"
+backend = "glx";
+
+# Enable/disable VSync.
+# vsync = false
+vsync = true;
+
+# Enable remote control via D-Bus. See the *D-BUS API* section below for more details.
+# dbus = false
+
+# Try to detect WM windows (a non-override-redirect window with no
+# child that has 'WM_STATE') and mark them as active.
+#
+# mark-wmwin-focused = false
+mark-wmwin-focused = true;
+
+# Mark override-redirect windows that doesn't have a child window with 'WM_STATE' focused.
+# mark-ovredir-focused = false
+mark-ovredir-focused = true;
+
+# Try to detect windows with rounded corners and don't consider them
+# shaped windows. The accuracy is not very high, unfortunately.
+#
+# detect-rounded-corners = false
+detect-rounded-corners = true;
+
+# Detect '_NET_WM_WINDOW_OPACITY' on client windows, useful for window managers
+# not passing '_NET_WM_WINDOW_OPACITY' of client windows to frame windows.
+#
+# detect-client-opacity = false
+detect-client-opacity = true;
+
+# Use EWMH '_NET_ACTIVE_WINDOW' to determine currently focused window,
+# rather than listening to 'FocusIn'/'FocusOut' event. Might have more accuracy,
+# provided that the WM supports it.
+#
+# use-ewmh-active-win = false
+
+# Unredirect all windows if a full-screen opaque window is detected,
+# to maximize performance for full-screen windows. Known to cause flickering
+# when redirecting/unredirecting windows.
+#
+# unredir-if-possible = false
+
+# Delay before unredirecting the window, in milliseconds. Defaults to 0.
+# unredir-if-possible-delay = 0
+
+# Conditions of windows that shouldn't be considered full-screen for unredirecting screen.
+# unredir-if-possible-exclude = []
+
+# Use 'WM_TRANSIENT_FOR' to group windows, and consider windows
+# in the same group focused at the same time.
+#
+# detect-transient = false
+detect-transient = true;
+
+# Use 'WM_CLIENT_LEADER' to group windows, and consider windows in the same
+# group focused at the same time. This usually means windows from the same application
+# will be considered focused or unfocused at the same time.
+# 'WM_TRANSIENT_FOR' has higher priority if detect-transient is enabled, too.
+#
+# detect-client-leader = false
+
+# Resize damaged region by a specific number of pixels.
+# A positive value enlarges it while a negative one shrinks it.
+# If the value is positive, those additional pixels will not be actually painted
+# to screen, only used in blur calculation, and such. (Due to technical limitations,
+# with use-damage, those pixels will still be incorrectly painted to screen.)
+# Primarily used to fix the line corruption issues of blur,
+# in which case you should use the blur radius value here
+# (e.g. with a 3x3 kernel, you should use `--resize-damage 1`,
+# with a 5x5 one you use `--resize-damage 2`, and so on).
+# May or may not work with *--glx-no-stencil*. Shrinking doesn't function correctly.
+#
+# resize-damage = 1
+
+# Specify a list of conditions of windows that should be painted with inverted color.
+# Resource-hogging, and is not well tested.
+#
+# invert-color-include = []
+
+# GLX backend: Avoid using stencil buffer, useful if you don't have a stencil buffer.
+# Might cause incorrect opacity when rendering transparent content (but never
+# practically happened) and may not work with blur-background.
+# My tests show a 15% performance boost. Recommended.
+#
+# glx-no-stencil = false
+
+# GLX backend: Avoid rebinding pixmap on window damage.
+# Probably could improve performance on rapid window content changes,
+# but is known to break things on some drivers (LLVMpipe, xf86-video-intel, etc.).
+# Recommended if it works.
+#
+# glx-no-rebind-pixmap = false
+
+# Disable the use of damage information.
+# This cause the whole screen to be redrawn every time, instead of the part of the screen
+# has actually changed. Potentially degrades the performance, but might fix some artifacts.
+# The opposing option is use-damage
+#
+# no-use-damage = false
+use-damage = true;
+
+# Use X Sync fence to sync clients' draw calls, to make sure all draw
+# calls are finished before picom starts drawing. Needed on nvidia-drivers
+# with GLX backend for some users.
+#
+# xrender-sync-fence = false
+
+# GLX backend: Use specified GLSL fragment shader for rendering window
+# contents. Read the man page for a detailed explanation of the interface.
+#
+# window-shader-fg = "default"
+
+# Use rules to set per-window shaders. Syntax is SHADER_PATH:PATTERN, similar
+# to opacity-rule. SHADER_PATH can be "default". This overrides window-shader-fg.
+#
+# window-shader-fg-rule = [
+#   "my_shader.frag:window_type != 'dock'"
+# ]
+
+# Force all windows to be painted with blending. Useful if you
+# have a glx-fshader-win that could turn opaque pixels transparent.
+#
+# force-win-blend = false
+
+# Do not use EWMH to detect fullscreen windows.
+# Reverts to checking if a window is fullscreen based only on its size and coordinates.
+#
+# no-ewmh-fullscreen = false
+
+# Dimming bright windows so their brightness doesn't exceed this set value.
+# Brightness of a window is estimated by averaging all pixels in the window,
+# so this could comes with a performance hit.
+# Setting this to 1.0 disables this behaviour. Requires --use-damage to be disabled. (default: 1.0)
+#
+# max-brightness = 1.0
+
+# Make transparent windows clip other windows like non-transparent windows do,
+# instead of blending on top of them.
+#
+# transparent-clipping = false
+
+# Specify a list of conditions of windows that should never have transparent
+# clipping applied. Useful for screenshot tools, where you need to be able to
+# see through transparent parts of the window.
+#
+# transparent-clipping-exclude = []
+
+# Set the log level. Possible values are:
+#  "trace", "debug", "info", "warn", "error"
+# in increasing level of importance. Case doesn't matter.
+# If using the "TRACE" log level, it's better to log into a file
+# using *--log-file*, since it can generate a huge stream of logs.
+#
+# log-level = "debug"
+log-level = "warn";
+
+# Set the log file.
+# If *--log-file* is never specified, logs will be written to stderr.
+# Otherwise, logs will to written to the given file, though some of the early
+# logs might still be written to the stderr.
+# When setting this option from the config file, it is recommended to use an absolute path.
+#
+# log-file = "/path/to/your/log/file"
+
+# Show all X errors (for debugging)
+# show-all-xerrors = false
+
+# Write process ID to a file.
+# write-pid-path = "/path/to/your/log/file"
+
+# Window type settings
+#
+# 'WINDOW_TYPE' is one of the 15 window types defined in EWMH standard:
+#     "unknown", "desktop", "dock", "toolbar", "menu", "utility",
+#     "splash", "dialog", "normal", "dropdown_menu", "popup_menu",
+#     "tooltip", "notification", "combo", and "dnd".
+#
+# Following per window-type options are available: ::
+#
+#   fade, shadow:::
+#     Controls window-type-specific shadow and fade settings.
+#
+#   opacity:::
+#     Controls default opacity of the window type.
+#
+#   focus:::
+#     Controls whether the window of this type is to be always considered focused.
+#     (By default, all window types except "normal" and "dialog" has this on.)
+#
+#   full-shadow:::
+#     Controls whether shadow is drawn under the parts of the window that you
+#     normally won't be able to see. Useful when the window has parts of it
+#     transparent, and you want shadows in those areas.
+#
+#   clip-shadow-above:::
+#     Controls whether shadows that would have been drawn above the window should
+#     be clipped. Useful for dock windows that should have no shadow painted on top.
+#
+#   redir-ignore:::
+#     Controls whether this type of windows should cause screen to become
+#     redirected again after been unredirected. If you have unredir-if-possible
+#     set, and doesn't want certain window to cause unnecessary screen redirection,
+#     you can set this to `true`.
+#
+wintypes:
+{
+  tooltip = { fade = true; shadow = true; opacity = 0.75; focus = true; full-shadow = false; };
+  dock = { shadow = false; clip-shadow-above = true; }
+  dnd = { shadow = false; }
+  popup_menu = { opacity = 0.8; }
+  dropdown_menu = { opacity = 0.8; }
+};
diff --git a/nixos/config/rc.conf b/nixos/config/rc.conf
new file mode 100644
index 0000000..5d88e29
--- /dev/null
+++ b/nixos/config/rc.conf
@@ -0,0 +1,2 @@
+set preview_images true
+set preview_images_method kitty
diff --git a/nixos/config/vimrc b/nixos/config/vimrc
new file mode 100644
index 0000000..43b39ac
--- /dev/null
+++ b/nixos/config/vimrc
@@ -0,0 +1,302 @@
+" This is Venomade's vimrc
+
+" Install Vim Plug
+let data_dir = has('nvim') ? stdpath('data') . '/site' : '~/.vim'
+if empty(glob(data_dir . '/autoload/plug.vim'))
+  silent execute '!curl -fLo '.data_dir.'/autoload/plug.vim --create-dirs  https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
+  autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
+endif
+
+" PLUGins
+call plug#begin('~/.vim/plugged')
+
+" Maybe replace with fzf in future
+Plug 'ctrlpvim/ctrlp.vim'
+
+" COC because YCM is too hard
+Plug 'neoclide/coc.nvim', {'branch': 'release'}
+
+" Pretty Colors
+Plug 'jackguo380/vim-lsp-cxx-highlight'
+"put this into coc-settings.json
+"{
+    "suggest.noselect": true,
+    "clangd.semanticHighlighting": true,
+    "coc.preferences.semanticTokensHighlights": false
+"}
+
+" λ Mathematical Crowbars λ
+Plug 'neovimhaskell/haskell-vim'
+
+" I'm too lazy to actually program
+Plug 'Exafunction/codeium.vim'
+
+" Getting Gruuvy
+Plug 'dkasak/gruvbox'
+
+" Space then... ummm
+Plug 'liuchengxu/vim-which-key'
+
+" Ahhh a lovely #00ff00 field
+Plug 'chrisbra/Colorizer'
+
+" Customize the flight path
+Plug 'vim-airline/vim-airline'
+
+"          \("^_^")/
+Plug 'LunarWatcher/auto-pairs'
+
+" So take me back in time!!!
+Plug 'farmergreg/vim-lastplace'
+
+" One  please! Oooh and a   too!
+" Plug 'ryanoasis/vim-devicons'
+
+call plug#end()
+
+" Colorscheme
+colorscheme gruvbox
+set bg=dark
+
+" Undo History
+set undofile
+set undodir=~/.vim/undodir
+
+" Common Settings
+syntax on
+filetype plugin indent on
+set ts=2 sts=2 sw=4 et ai si
+set nu rnu
+set nowrap
+set formatoptions-=cro
+set splitbelow splitright
+set encoding=UTF-8
+set shell=zsh
+set ignorecase
+set smartcase
+set incsearch
+
+" Cursor Shapes
+let &t_SI = "\<Esc>[6 q"
+let &t_SR = "\<Esc>[4 q"
+let &t_EI = "\<Esc>[2 q"
+
+" Terminal Title
+autocmd BufEnter * let &titlestring = '' . expand("%:t")
+set title
+
+" Airline Config
+let g:airline#extensions#tabline#enabled = 1
+let g:airline#extensions#codeium#enabled = 1
+let g:airline#extensions#tabline#formatter = 'unique_tail'
+let g:airline_powerline_fonts = 1
+let g:airline#extensions#coc#enabled = 1
+let g:airline#extensions#coc#show_coc_status = 1
+
+
+" Haskell Highlighting
+let g:haskell_enable_quantification = 1   " to enable highlighting of `forall`
+let g:haskell_enable_recursivedo = 1      " to enable highlighting of `mdo` and `rec`
+let g:haskell_enable_arrowsyntax = 1      " to enable highlighting of `proc`
+let g:haskell_enable_pattern_synonyms = 1 " to enable highlighting of `pattern`
+let g:haskell_enable_typeroles = 1        " to enable highlighting of type roles
+let g:haskell_enable_static_pointers = 1  " to enable highlighting of `static`
+let g:haskell_backpack = 1                " to enable highlighting of backpack keywords
+
+" Color Highlighting
+set termguicolors
+let g:colorizer_auto_color = 1
+
+" AutoPairs
+let g:AutoPairsMapBS = 1
+
+" Recentre view on slow move
+nnoremap j jzz
+nnoremap k kzz
+
+" Same for mouse
+set mouse=a
+map <ScrollWheelDown> 2jzz
+map <ScrollWheelUp> 2kzz
+
+" Leader Key
+let mapleader = " "
+
+" WhichKey
+nnoremap <silent> <leader> :WhichKey '<Space>'<CR>
+
+" Quick split movement
+map <C-h> <C-w>h
+map <C-j> <C-w>j
+map <C-k> <C-w>k
+map <C-l> <C-w>l
+
+" Terminal Buffer
+map <leader>t :term<CR>
+
+" Fuzzy Find
+map <leader>ff :CtrlP<CR>
+map <leader>fb :CtrlPBuffer<CR>
+map <leader>fa :CtrlPMixed<CR>
+
+" Copy and Paste from System Clipboard
+noremap <Leader>y "*y
+noremap <Leader>p "*p
+
+" Quick Add/Remove Semicolon
+map <leader>; :s/\v(.)$/\=submatch(1)==';' ? '' : submatch(1).';'<CR>
+
+" Buffers
+map <leader>bk :bd<CR>
+map <leader>bn :bn<CR>
+map <leader>bp :bp<CR>
+
+" Clang Build Individual File (No Includes)
+" map <leader>bf :!clang -Werror % -o out/%:r && ./out/%:r <CR>
+
+" Haskell Run File
+map <leader>rh :!runhaskell %<CR>
+
+" Remove Trailing Whitespaces on Save
+autocmd BufWritePre * %s/\s\+$//e
+
+" Codeium Config
+let g:codeium_disable_bindings = 1
+inoremap <silent><script><expr> <C-space> codeium#Accept()
+
+" ----------
+" COC Config
+" ----------
+set encoding=utf-8
+
+set nobackup "DANGER
+set nowritebackup "But it's needed :/
+
+set updatetime=300
+set signcolumn=yes
+
+function! CheckBackspace() abort
+  let col = col('.') - 1
+  return !col || getline('.')[col - 1]  =~# '\s'
+endfunction
+
+inoremap <silent><expr> <TAB>
+      \ coc#pum#visible() ? coc#pum#next(1) :
+      \ CheckBackspace() ? "\<Tab>" :
+      \ coc#refresh()
+inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "\<C-h>"
+
+inoremap <silent><expr> <c-@> coc#refresh()
+
+" GoTo code navigation
+nmap <silent> gd <Plug>(coc-definition)
+nmap <silent> gy <Plug>(coc-type-definition)
+nmap <silent> gi <Plug>(coc-implementation)
+nmap <silent> gr <Plug>(coc-references)
+
+" Use K to show documentation in preview window
+nnoremap <silent> K :call ShowDocumentation()<CR>
+
+function! ShowDocumentation()
+  if CocAction('hasProvider', 'hover')
+    call CocActionAsync('doHover')
+  else
+    call feedkeys('K', 'in')
+  endif
+endfunction
+
+" Highlight the symbol and its references when holding the cursor
+autocmd CursorHold * silent call CocActionAsync('highlight')
+
+" Symbol renaming
+nmap <leader>cn <Plug>(coc-rename)
+
+" Formatting selected code
+xmap <leader>cf  <Plug>(coc-format-selected)
+nmap <leader>cf  <Plug>(coc-format-selected)
+
+augroup mygroup
+  autocmd!
+  " Setup formatexpr specified filetype(s)
+  autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')
+  " Update signature help on jump placeholder
+  autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
+augroup end
+
+" Applying code actions to the selected code block
+" Example: `<leader>aap` for current paragraph
+xmap <leader>caa  <Plug>(coc-codeaction-selected)
+nmap <leader>caa  <Plug>(coc-codeaction-selected)
+
+" Remap keys for applying code actions at the cursor position
+nmap <leader>cac  <Plug>(coc-codeaction-cursor)
+" Remap keys for apply code actions affect whole buffer
+nmap <leader>cs  <Plug>(coc-codeaction-source)
+" Apply the most preferred quickfix action to fix diagnostic on the current line
+nmap <leader>qf  <Plug>(coc-fix-current)
+
+" Remap keys for applying refactor code actions
+nmap <silent> <leader>cre <Plug>(coc-codeaction-refactor)
+xmap <silent> <leader>crs  <Plug>(coc-codeaction-refactor-selected)
+nmap <silent> <leader>crs  <Plug>(coc-codeaction-refactor-selected)
+
+" Run the Code Lens action on the current line
+nmap <leader>cl  <Plug>(coc-codelens-action)
+
+" Map function and class text objects
+" NOTE: Requires 'textDocument.documentSymbol' support from the language server
+xmap if <Plug>(coc-funcobj-i)
+omap if <Plug>(coc-funcobj-i)
+xmap af <Plug>(coc-funcobj-a)
+omap af <Plug>(coc-funcobj-a)
+xmap ic <Plug>(coc-classobj-i)
+omap ic <Plug>(coc-classobj-i)
+xmap ac <Plug>(coc-classobj-a)
+omap ac <Plug>(coc-classobj-a)
+
+" Remap <C-f> and <C-b> to scroll float windows/popups
+if has('nvim-0.4.0') || has('patch-8.2.0750')
+  nnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
+  nnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
+  inoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(1)\<cr>" : "\<Right>"
+  inoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(0)\<cr>" : "\<Left>"
+  vnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
+  vnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
+endif
+
+" Use CTRL-S for selections ranges
+" Requires 'textDocument/selectionRange' support of language server
+nmap <silent> <C-s> <Plug>(coc-range-select)
+xmap <silent> <C-s> <Plug>(coc-range-select)
+
+" Add `:Format` command to format current buffer
+command! -nargs=0 Format :call CocActionAsync('format')
+
+" Add `:Fold` command to fold current buffer
+command! -nargs=? Fold :call     CocAction('fold', <f-args>)
+
+" Add `:OR` command for organize imports of the current buffer
+command! -nargs=0 OR   :call     CocActionAsync('runCommand', 'editor.action.organizeImport')
+
+" Add (Neo)Vim's native statusline support
+" NOTE: Please see `:h coc-status` for integrations with external plugins that
+" provide custom statusline: lightline.vim, vim-airline
+set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}
+
+" Mappings for CoCList
+" Show all diagnostics
+nnoremap <silent><nowait> <space>cd  :<C-u>CocList diagnostics<cr>
+" Manage extensions
+nnoremap <silent><nowait> <space>ce  :<C-u>CocList extensions<cr>
+" Show commands
+nnoremap <silent><nowait> <space>cc  :<C-u>CocList commands<cr>
+" Find symbol of current document
+nnoremap <silent><nowait> <space>co  :<C-u>CocList outline<cr>
+" Search workspace symbols
+nnoremap <silent><nowait> <space>cs  :<C-u>CocList -I symbols<cr>
+" Do default action for next item
+nnoremap <silent><nowait> <space>cj  :<C-u>CocNext<CR>
+" Do default action for previous item
+nnoremap <silent><nowait> <space>ck  :<C-u>CocPrev<CR>
+" Resume latest coc list
+nnoremap <silent><nowait> <space>cp  :<C-u>CocListResume<CR>
diff --git a/nixos/config/xmobarrc b/nixos/config/xmobarrc
new file mode 100644
index 0000000..6f923e7
--- /dev/null
+++ b/nixos/config/xmobarrc
@@ -0,0 +1,122 @@
+Config {
+
+   -- appearance
+     font =         "FantasqueSansM Nerd Font Bold 12"
+   , bgColor =      "#1e1e2e"
+   , fgColor =      "#cdd6f4"
+   , position =     TopH 24
+   , border =       BottomB
+   , borderColor =  "#646464"
+
+   -- layout
+   , sepChar =  "%"   -- delineator between plugin names and straight text
+   , alignSep = "}{"  -- separator between left-right alignment
+   , template = "   %StdinReader% }{ %mpris2% | %get-volume% | %get-brightness% | %get-battery% | %date% "
+
+   -- general behavior
+   , lowerOnStart =     True    -- send to bottom of window stack on start
+   , hideOnStart =      False   -- start with window unmapped (hidden)
+   , allDesktops =      True    -- show on all desktops
+   , overrideRedirect = True    -- set the Override Redirect flag (Xlib)
+   , pickBroadest =     False   -- choose widest display (multi-monitor)
+   , persistent =       True    -- enable/disable hiding (True = disabled)
+
+   -- plugins
+   --   Numbers can be automatically colored according to their value. xmobar
+   --   decides color based on a three-tier/two-cutoff system, controlled by
+   --   command options:
+   --     --Low sets the low cutoff
+   --     --High sets the high cutoff
+   --
+   --     --low sets the color below --Low cutoff
+   --     --normal sets the color between --Low and --High cutoffs
+   --     --High sets the color above --High cutoff
+   --
+   --   The --template option controls how the plugin is displayed. Text
+   --   color can be set by enclosing in <fc></fc> tags. For more details
+   --   see http://projects.haskell.org/xmobar/#system-monitor-plugins.
+   , commands =
+
+        -- weather monitor
+        [ Run Weather "EGSC" [ "--template", "<skyCondition> @ <fc=#549ab8><tempC></fc>°C"
+                             ] 36000
+        -- StdinReader
+        , Run StdinReader
+
+        -- network activity monitor (dynamic interface resolution)
+        , Run DynNetwork     [ "--template" , "Net: 󰁝 <tx>kB/s 󰁅 <rx>kB/s"
+                             , "--Low"      , "1000000"       -- units: B/s
+                             , "--High"     , "5000000"       -- units: B/s
+                             , "--low"      , "darkgreen"
+                             , "--normal"   , "darkorange"
+                             , "--high"     , "darkred"
+                             ] 10
+
+        -- cpu activity monitor
+        -- , Run MultiCpu       [ "--template" , "Cpu: <total0>%|<total1>%"
+        , Run MultiCpu       [ "--template" , "Cpu: <total0>%|<total1>%"
+                             , "--Low"      , "50"         -- units: %
+                             , "--High"     , "85"         -- units: %
+                             , "--low"      , "darkgreen"
+                             , "--normal"   , "darkorange"
+                             , "--high"     , "darkred"
+                             ] 10
+
+        -- cpu core temperature monitor
+        , Run CoreTemp       [ "--template" , "Temp: <core0>°C|<core1>°C"
+                             , "--Low"      , "70"        -- units: °C
+                             , "--High"     , "80"        -- units: °C
+                             , "--low"      , "darkgreen"
+                             , "--normal"   , "darkorange"
+                             , "--high"     , "darkred"
+                             ] 50
+
+        -- memory usage monitor
+        , Run Memory         [ "--template" ,"Mem: <usedratio>%"
+                             , "--Low"      , "20"        -- units: %
+                             , "--High"     , "90"        -- units: %
+                             , "--low"      , "darkgreen"
+                             , "--normal"   , "darkorange"
+                             , "--high"     , "darkred"
+                             ] 10
+
+        -- battery monitor
+        , Run Battery        [ "--template" , "Batt: <acstatus>"
+                             , "--Low"      , "10"        -- units: %
+                             , "--High"     , "80"        -- units: %
+                             , "--low"      , "darkred"
+                             , "--normal"   , "darkorange"
+                             , "--high"     , "darkgreen"
+
+                             , "--" -- battery specific options
+                                       -- discharging status
+                                       , "-o"	, "<left>% (<timeleft>)"
+                                       -- AC "on" status
+                                       , "-O"	, "<fc=#dAA520>Charging</fc>"
+                                       -- charged status
+                                       , "-i"	, "<fc=#006000>Charged</fc>"
+                             ] 50
+
+        -- time and date indicator
+        --   (%F = y-m-d date, %a = day of week, %T = h:m:s time)
+        -- , Run Date           "<fc=#ABABAB>%F (%a) %T</fc>" "date" 10
+        , Run Date "%a %b %_d <fc=#eca8f1>%H:%M</fc>" "date" 10
+
+        , Run Mpris2 "playerctld" ["-t", "<fc=#907F9B><artist></fc> - <fc=#C7B2D3><title></fc>"] 10
+
+        , Run Com "tomato" ["-t"] "tomato" 10
+
+        -- , Run Volume "default" "Master" ["--on", "󰕾", "--off", "󰝟"] 2
+
+        , Run Com "/home/venomade/.local/bin/get-volume" [] "get-volume" 5
+
+        , Run Com "/home/venomade/.local/bin/get-brightness" [] "get-brightness" 5
+
+        , Run Com "/home/venomade/.local/bin/get-battery" [] "get-battery" 10
+
+        -- keyboard layout indicator
+        , Run Kbd            [ ("us(dvorak)" , "<fc=#00008B>DV</fc>")
+                             , ("us"         , "<fc=#8B0000>US</fc>")
+                             ]
+        ]
+   }
diff --git a/nixos/config/xmonad.hs b/nixos/config/xmonad.hs
new file mode 100644
index 0000000..ba14611
--- /dev/null
+++ b/nixos/config/xmonad.hs
@@ -0,0 +1,304 @@
+-- IMPORTS
+
+import Data.Map qualified as M
+import Data.Monoid
+import Graphics.X11.ExtraTypes.XF86
+import System.Exit
+import XMonad
+import XMonad.Hooks.DynamicLog
+import XMonad.Hooks.EwmhDesktops
+import XMonad.Hooks.ManageDocks
+import XMonad.Layout.Gaps
+import XMonad.Layout.Spacing
+import XMonad.Layout.ThreeColumns
+import XMonad.StackSet qualified as W
+import XMonad.Util.Run (spawnPipe)
+import XMonad.Util.SpawnOnce (spawnOnce)
+
+-- Terminal
+myTerminal = "kitty"
+
+-- Whether focus follows the mouse pointer.
+myFocusFollowsMouse :: Bool
+myFocusFollowsMouse = True
+
+-- Whether clicking on a window to focus also passes the click to the window
+myClickJustFocuses :: Bool
+myClickJustFocuses = False
+
+-- Mod Key (1=Alt 4=Super)
+myModMask = mod4Mask
+
+-- The default number of workspaces (virtual screens) and their names.
+-- By default we use numeric strings, but any string may be used as a
+-- workspace name. The number of workspaces is determined by the length
+-- of this list.
+--
+-- A tagging example:
+--
+-- > workspaces = ["web", "irc", "code" ] ++ map show [4..9]
+--
+myWorkspaces = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
+
+-- Width of the window border in pixels.
+myBorderWidth = 2
+
+-- Border colors for unfocused and focused windows, respectively.
+myNormalBorderColor = "#594C62"
+
+myFocusedBorderColor = "#C7B2D3"
+
+------------------------------------------------------------------------
+-- Key bindings. Add, modify or remove key bindings here.
+--
+myKeys conf@(XConfig {XMonad.modMask = modm}) =
+  M.fromList $
+    -- launch a terminal
+    [ ((modm .|. shiftMask, xK_Return), spawn $ XMonad.terminal conf),
+      -- launch dmenu
+      ((modm, xK_d), spawn "j4-dmenu-desktop --dmenu='dmenu -i'"),
+      -- launch dm-scripts menu
+      ((modm .|. shiftMask, xK_d), spawn "dmenu_run"),
+      -- launch clipboard menu
+      ((modm, xK_v), spawn "clipmenu"),
+      -- close focused window
+      ((modm .|. shiftMask, xK_q), kill),
+      -- Brightness Up
+      ((0, xF86XK_MonBrightnessUp), spawn "brightnessctl s 5%+"),
+      -- Brightness Down
+      ((0, xF86XK_MonBrightnessDown), spawn "brightnessctl s 5%-"),
+      -- Volume Up
+      ((0, xF86XK_AudioRaiseVolume), spawn "pactl set-sink-volume @DEFAULT_SINK@ +5%"),
+      -- Volume Down
+      ((0, xF86XK_AudioLowerVolume), spawn "pactl set-sink-volume @DEFAULT_SINK@ -5%"),
+      -- Volume Mute
+      ((0, xF86XK_AudioMute), spawn "pactl set-sink-mute @DEFAULT_SINK@ toggle"),
+      -- Rotate through the available layout algorithms
+      ((modm, xK_space), sendMessage NextLayout),
+      --  Reset the layouts on the current workspace to default
+      ((modm .|. shiftMask, xK_space), setLayout $ XMonad.layoutHook conf),
+      -- Resize viewed windows to the correct size
+      -- , ((modm,               xK_n     ), refresh)
+
+      -- Move focus to the next window
+      ((modm, xK_Tab), windows W.focusDown),
+      -- Move focus to the next window
+      ((modm, xK_e), windows W.focusDown),
+      -- Move focus to the previous window
+      ((modm, xK_i), windows W.focusUp),
+      -- Move focus to the master window
+      ((modm, xK_m), windows W.focusMaster),
+      -- Swap the focused window and the master window
+      ((modm, xK_Return), windows W.swapMaster),
+      -- Swap the focused window with the next window
+      ((modm .|. shiftMask, xK_e), windows W.swapDown),
+      -- Swap the focused window with the previous window
+      ((modm .|. shiftMask, xK_i), windows W.swapUp),
+      -- Shrink the master area
+      ((modm, xK_n), sendMessage Shrink),
+      -- Expand the master area
+      ((modm, xK_o), sendMessage Expand),
+      -- Push window back into tiling
+      ((modm, xK_t), withFocused $ windows . W.sink),
+      -- Increment the number of windows in the master area
+      ((modm, xK_comma), sendMessage (IncMasterN 1)),
+      -- Deincrement the number of windows in the master area
+      ((modm, xK_period), sendMessage (IncMasterN (-1))),
+      -- Toggle the status bar gap
+      -- Use this binding with avoidStruts from Hooks.ManageDocks.
+      -- See also the statusBar function from Hooks.DynamicLog.
+      --
+      -- , ((modm              , xK_b     ), sendMessage ToggleStruts)
+
+      -- Quit xmonad
+      ((modm .|. shiftMask, xK_c), io (exitWith ExitSuccess)),
+      -- Restart xmonad
+      -- , ((modm              , xK_q     ), spawn "xmonad --recompile; pkill xmobar; xmonad --restart")
+      ((modm, xK_q), spawn "pkill xmobar; xmonad --restart"),
+      -- Run xmessage with a summary of the default keybindings (useful for beginners)
+      ((modm .|. shiftMask, xK_slash), spawn ("echo \"" ++ help ++ "\" | xmessage -file -"))
+    ]
+      ++
+      --
+      -- mod-[1..9], Switch to workspace N
+      -- mod-shift-[1..9], Move client to workspace N
+      --
+      [ ((m .|. modm, k), windows $ f i)
+        | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9],
+          (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]
+      ]
+
+-- ++
+
+--
+-- mod-{w,e,r}, Switch to physical/Xinerama screens 1, 2, or 3
+-- mod-shift-{w,e,r}, Move client to screen 1, 2, or 3
+--
+-- [((m .|. modm, key), screenWorkspace sc >>= flip whenJust (windows . f))
+--     | (key, sc) <- zip [xK_w, xK_e, xK_r] [0..]
+--     , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]]
+
+------------------------------------------------------------------------
+-- Mouse bindings: default actions bound to mouse events
+--
+myMouseBindings (XConfig {XMonad.modMask = modm}) =
+  M.fromList $
+    -- mod-button1, Set the window to floating mode and move by dragging
+    [ ( (modm, button1),
+        ( \w ->
+            focus w
+              >> mouseMoveWindow w
+              >> windows W.shiftMaster
+        )
+      ),
+      -- mod-button2, Raise the window to the top of the stack
+      ((modm, button2), (\w -> focus w >> windows W.shiftMaster)),
+      -- mod-button3, Set the window to floating mode and resize by dragging
+      ( (modm, button3),
+        ( \w ->
+            focus w
+              >> mouseResizeWindow w
+              >> windows W.shiftMaster
+        )
+      )
+      -- you may also bind events to the mouse scroll wheel (button4 and button5)
+    ]
+
+------------------------------------------------------------------------
+-- Layouts:
+
+-- You can specify and transform your layouts by modifying these values.
+-- If you change layout bindings be sure to use 'mod-shift-space' after
+-- restarting (with 'mod-q') to reset your layout state to the new
+-- defaults, as xmonad preserves your old layout settings by default.
+--
+-- The available layouts.  Note that each layout is separated by |||,
+-- which denotes layout choice.
+--
+myLayout = avoidStruts $ spacingWithEdge 3 $ tiled ||| ThreeColMid 1 (3 / 100) (1 / 2) ||| Full
+  where
+    -- myLayout = gaps [(U,20), (D,20), (L,20), (R,20)] $ avoidStruts tiled ||| Mirror tiled ||| Full
+
+    -- default tiling algorithm partitions the screen into two panes
+    tiled = Tall nmaster delta ratio
+
+    -- The default number of windows in the master pane
+    nmaster = 1
+
+    -- Default proportion of screen occupied by master pane
+    ratio = 1 / 2
+
+    -- Percent of screen to increment by when resizing panes
+    delta = 3 / 100
+
+------------------------------------------------------------------------
+-- Window rules:
+
+-- Execute arbitrary actions and WindowSet manipulations when managing
+-- a new window. You can use this to, for example, always float a
+-- particular program, or have a client always appear on a particular
+-- workspace.
+--
+-- To find the property name associated with a program, use
+-- > xprop | grep WM_CLASS
+-- and click on the client you're interested in.
+--
+-- To match on the WM_NAME, you can use 'title' in the same way that
+-- 'className' and 'resource' are used below.
+--
+myManageHook =
+  composeAll
+    [ className =? "mpv" --> doFloat,
+      resource =? "desktop_window" --> doIgnore
+    ]
+
+------------------------------------------------------------------------
+-- Event handling
+
+-- * EwmhDesktops users should change this to ewmhDesktopsEventHook
+
+--
+-- Defines a custom handler function for X Events. The function should
+-- return (All True) if the default handler is to be run afterwards. To
+-- combine event hooks use mappend or mconcat from Data.Monoid.
+--
+-- myEventHook = mempty
+myEventHook = docksEventHook <+> handleEventHook def <+> fullscreenEventHook
+
+------------------------------------------------------------------------
+-- Status bars and logging
+
+-- Perform an arbitrary action on each internal state change or X event.
+-- See the 'XMonad.Hooks.DynamicLog' extension for examples.
+--
+myLogHook = return ()
+
+------------------------------------------------------------------------
+-- Startup hook
+
+-- Perform an arbitrary action each time xmonad starts or is restarted
+-- with mod-q.  Used by, e.g., XMonad.Layout.PerWorkspace to initialize
+-- per-workspace layout choices.
+--
+-- By default, do nothing.
+myStartupHook = do
+  spawnOnce "setxkbmap -layout us -variant colemak -option caps:escape"
+  spawnOnce "xsetroot -cursor_name left_ptr"
+  spawnOnce "feh --bg-scale ~/.wallpapers/PastelPinkLightning.jpg &"
+  spawnOnce "picom &"
+  spawnOnce "clipmenud &"
+
+------------------------------------------------------------------------
+-- XMobar
+
+myPP =
+  xmobarPP
+    { ppCurrent = xmobarColor "#907F9B" "" . wrap "" "",
+      ppTitle = xmobarColor "#C7B2D3" "" . shorten 100,
+      ppSep = " | ",
+      ppOrder = \(ws : _ : t : _) -> [ws, t]
+    }
+
+toggleStrutsKey XConfig {XMonad.modMask = modMask} = (modMask, xK_b)
+
+------------------------------------------------------------------------
+-- Now run xmonad with all the defaults we set up.
+
+-- Run xmonad with the settings you specify. No need to modify this.
+--
+-- main = do
+-- 	xmproc <- spawnPipe "xmobar -x 0 /home/venomade/.xmobarrc"
+-- 	xmonad $ docks defaults
+main = xmonad =<< statusBar "xmobar" myPP toggleStrutsKey defaults
+
+-- A structure containing your configuration settings, overriding
+-- fields in the default config. Any you don't override, will
+-- use the defaults defined in xmonad/XMonad/Config.hs
+--
+-- No need to modify this.
+--
+defaults =
+  def
+    { -- simple stuff
+      terminal = myTerminal,
+      focusFollowsMouse = myFocusFollowsMouse,
+      clickJustFocuses = myClickJustFocuses,
+      borderWidth = myBorderWidth,
+      modMask = myModMask,
+      workspaces = myWorkspaces,
+      normalBorderColor = myNormalBorderColor,
+      focusedBorderColor = myFocusedBorderColor,
+      -- key bindings
+      keys = myKeys,
+      mouseBindings = myMouseBindings,
+      -- hooks, layouts
+      layoutHook = myLayout,
+      manageHook = myManageHook,
+      handleEventHook = myEventHook,
+      logHook = myLogHook,
+      startupHook = myStartupHook
+    }
+
+-- | Finally, a copy of the default bindings in simple textual tabular format.
+help :: String
+help = unlines ["Read xmonad.hs"]
diff --git a/nixos/config/zshrc b/nixos/config/zshrc
new file mode 100644
index 0000000..7c2e8cb
--- /dev/null
+++ b/nixos/config/zshrc
@@ -0,0 +1,34 @@
+autoload -U compinit
+compinit
+
+setopt COMPLETE_IN_WORD
+
+eval "$(starship init zsh)"
+
+#source /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
+#source /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh
+
+DISABLE_AUTO_TITLE="true"
+
+function set_terminal_title() {
+  echo -en "\e]2;$@\a"
+}
+
+HISTFILE=~/.zsh_history
+HISTSIZE=10000
+SAVEHIST=10000
+setopt appendhistory
+setopt SHARE_HISTORY
+
+bindkey  "^[[H"   beginning-of-line
+bindkey  "^[[F"   end-of-line
+bindkey  "^[[3~"  delete-char
+
+alias l=eza
+alias ls="eza -T"
+
+alias vim=nvim
+
+export path=($HOME/.local/bin $path)
+
+[ -f "/home/venomade/.ghcup/env" ] && source "/home/venomade/.ghcup/env" # ghcup-env
diff --git a/nixos/configuration.nix b/nixos/configuration.nix
new file mode 100644
index 0000000..4848515
--- /dev/null
+++ b/nixos/configuration.nix
@@ -0,0 +1,281 @@
+# 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, inputs, ... }:
+
+{
+  imports =
+    [ # Include the results of the hardware scan.
+      ./hardware-configuration.nix
+      inputs.home-manager.nixosModules.default
+    ];
+
+  # Bootloader.
+  boot.loader.systemd-boot.enable = true;
+  boot.loader.efi.canTouchEfiVariables = true;
+
+  networking.hostName = "thinkpad"; # Define your hostname.
+  # networking.wireless.enable = true;  # Enables wireless support via wpa_supplicant.
+
+  # Configure network proxy if necessary
+  # networking.proxy.default = "http://user:password@proxy:port/";
+  # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";
+
+  # Enable networking
+  networking.networkmanager.enable = true;
+
+  # Set your time zone.
+  time.timeZone = "Europe/London";
+
+  # Select internationalisation properties.
+  i18n.defaultLocale = "en_US.UTF-8";
+
+  i18n.extraLocaleSettings = {
+    LC_ADDRESS = "en_GB.UTF-8";
+    LC_IDENTIFICATION = "en_GB.UTF-8";
+    LC_MEASUREMENT = "en_GB.UTF-8";
+    LC_MONETARY = "en_GB.UTF-8";
+    LC_NAME = "en_GB.UTF-8";
+    LC_NUMERIC = "en_GB.UTF-8";
+    LC_PAPER = "en_GB.UTF-8";
+    LC_TELEPHONE = "en_GB.UTF-8";
+    LC_TIME = "en_GB.UTF-8";
+  };
+
+  # Enable the X11 windowing system.
+  services.xserver.enable = true;
+  services.xserver.excludePackages = [
+    pkgs.xterm
+  ];
+
+  # Enable the GNOME Desktop Environment.
+  services.xserver.displayManager.gdm.enable = true;
+  services.xserver.desktopManager.gnome.enable = true;
+  environment.gnome.excludePackages = with pkgs; [
+    epiphany
+    gnome-connections
+    gnome-tour
+    gnome.geary
+    gnome.gnome-characters
+    gnome.gnome-contacts
+    gnome.gnome-maps
+    gnome.gnome-music
+    gnome.simple-scan
+    gnome.totem
+    gnome.yelp
+    snapshot
+  ];
+
+  services.xserver.libinput = {
+      enable = true;
+      touchpad = {
+        naturalScrolling = true;
+      };
+  };
+
+  services.xserver.displayManager = {
+      defaultSession = "none+xmonad";
+      #lightdm = {
+      #    enable = true;
+      #    greeter.enable = false;
+      #};
+      #autoLogin = {
+      #    enable = true;
+      #    user = "venomade";
+      #};
+  };
+
+  services.xserver.windowManager.xmonad = {
+      enable = true;
+      enableContribAndExtras = true;
+      config = builtins.readFile config/xmonad.hs;
+  };
+
+  services.picom = {
+      enable = true;
+      settings = {
+          shadow = true;
+          shadow-radius = 7;
+          shadow-offset-x = -7;
+          shadow-offset-y = -7;
+          fading = true;
+          fade-in-step = 0.2;
+          fade-out-step = 0.2;
+          inactive-opacity-override = false;
+          corner-radius = 4;
+          rounded-corners-exclude = [
+            "window_type = 'dock'"
+            "window_type = 'desktop'"
+          ];
+          blur-method = "dual_kawase";
+          blur-size = 12;
+          blur-strength = 5;
+          blur-kern = "3x3box";
+          backend = "glx";
+          vsync = true;
+          mark-wmwin-focused = true;
+          mark-ovredir-focused = true;
+          detect-rounded-corners = true;
+          detect-client-opacity = true;
+          detect-transient = true;
+          use-damage = true;
+      };
+  };
+
+  # Location (It's approximate)
+  location = {
+      provider = "manual";
+      longitude = 52.2;
+      latitude = 0.1;
+  };
+
+  # Redshift
+  services.redshift = {
+      enable = true;
+      brightness = {
+          day = "1";
+          night = "1";
+      };
+      temperature = {
+          day = 5500;
+          night = 3700;
+      };
+  };
+
+  # Configure keymap in X11
+  services.xserver = {
+    layout = "us";
+    xkbVariant = "colemak";
+    xkbOptions = "caps:escape";
+  };
+
+  # Enable sound with pipewire.
+  sound.enable = true;
+  hardware.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;
+
+    # use the example session manager (no others are packaged yet so this is enabled by default,
+    # no need to redefine it in your config for now)
+    #media-session.enable = true;
+  };
+
+  # Enable touchpad support (enabled default in most desktopManager).
+  # services.xserver.libinput.enable = true;
+
+  # Define a user account. Don't forget to set a password with ‘passwd’.
+  users.users.venomade = {
+    isNormalUser = true;
+    description = "Venomade";
+    extraGroups = [ "networkmanager" "wheel" ];
+    shell = pkgs.zsh;
+    packages = with pkgs; [
+      clang-tools
+      eza
+      firefox
+      gcc
+      ghc
+      haskellPackages.haskell-language-server
+      hut
+      musikcube
+      neovim
+      nil
+      nodejs_21
+      protonvpn-cli_2
+      starship
+      zsh
+    ];
+  };
+
+  programs.zsh = {
+    enable = true;
+    autosuggestions.enable = true;
+    syntaxHighlighting.enable = true;
+  };
+
+  home-manager = {
+    # also pass inputs to home-manager modules
+    extraSpecialArgs = {inherit inputs;};
+    users = {
+      "venomade" = import ./home.nix;
+    };
+  };
+
+  # Allow unfree packages
+  nixpkgs.config.allowUnfree = true;
+
+  # List packages installed in system profile. To search, run:
+  # $ nix search wget
+  environment.systemPackages = with pkgs; [
+    git
+    vim
+    wget
+    # XMonad
+    (dmenu.override {
+        patches = [
+          config/dmenu.patch
+        ];
+     })
+    feh
+    haskellPackages.xmobar
+    j4-dmenu-desktop
+    kitty
+    ncpamixer
+    nerdfonts
+    playerctl
+    pulseaudio
+    tomato-c
+    zathura
+    ranger
+    redshift
+    # DMScripts
+    clipmenu
+    didyoumean
+    jq
+    xclip
+    translate-shell
+    # Laptop
+    brightnessctl
+    # NixOS is not linux
+    steam-run
+  ];
+
+  nix.settings.experimental-features = [ "nix-command" "flakes" ];
+
+  # NixOS is not linux
+
+  # Some programs need SUID wrappers, can be configured further or are
+  # started in user sessions.
+  # programs.mtr.enable = true;
+  # programs.gnupg.agent = {
+  #   enable = true;
+  #   enableSSHSupport = true;
+  # };
+
+  # List services that you want to enable:
+
+  # Enable the OpenSSH daemon.
+  # services.openssh.enable = true;
+
+  # Open ports in the firewall.
+  # networking.firewall.allowedTCPPorts = [ ... ];
+  # networking.firewall.allowedUDPPorts = [ ... ];
+  # Or disable the firewall altogether.
+  # networking.firewall.enable = false;
+
+  # 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 = "23.11"; # Did you read the comment?
+
+}
diff --git a/nixos/flake.lock b/nixos/flake.lock
new file mode 100644
index 0000000..7442090
--- /dev/null
+++ b/nixos/flake.lock
@@ -0,0 +1,48 @@
+{
+  "nodes": {
+    "home-manager": {
+      "inputs": {
+        "nixpkgs": [
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1704980804,
+        "narHash": "sha256-lPNNKdPqIYcjhhYIVwlajNt/HqVWbMOoSdNnwCvOP04=",
+        "owner": "nix-community",
+        "repo": "home-manager",
+        "rev": "93e804e7f8a1eb88bde6117cd5046501e66aa4bd",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "home-manager",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1704722960,
+        "narHash": "sha256-mKGJ3sPsT6//s+Knglai5YflJUF2DGj7Ai6Ynopz0kI=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "317484b1ead87b9c1b8ac5261a8d2dd748a0492d",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "home-manager": "home-manager",
+        "nixpkgs": "nixpkgs"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/nixos/flake.nix b/nixos/flake.nix
new file mode 100644
index 0000000..921f28b
--- /dev/null
+++ b/nixos/flake.nix
@@ -0,0 +1,28 @@
+{
+  description = "Nixos config flake";
+
+  inputs = {
+    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
+
+    home-manager = {
+      url = "github:nix-community/home-manager";
+      inputs.nixpkgs.follows = "nixpkgs";
+    };
+  };
+
+  outputs = { self, nixpkgs, ... }@inputs:
+    let
+      system = "x86_64-linux";
+      pkgs = nixpkgs.legacyPackages.${system};
+    in
+    {
+    
+      nixosConfigurations.default = nixpkgs.lib.nixosSystem {
+          specialArgs = {inherit inputs;};
+          modules = [ 
+            ./configuration.nix
+            inputs.home-manager.nixosModules.default
+          ];
+        };
+    };
+}
diff --git a/nixos/hardware-configuration.nix b/nixos/hardware-configuration.nix
new file mode 100644
index 0000000..c2e9413
--- /dev/null
+++ b/nixos/hardware-configuration.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 + "/installer/scan/not-detected.nix")
+    ];
+
+  boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "usb_storage" "sd_mod" "rtsx_pci_sdmmc" ];
+  boot.initrd.kernelModules = [ ];
+  boot.kernelModules = [ "kvm-amd" ];
+  boot.extraModulePackages = [ ];
+
+  fileSystems."/" =
+    { device = "/dev/disk/by-uuid/01b1bbcb-ffab-488b-932a-f30551cb8d73";
+      fsType = "ext4";
+    };
+
+  fileSystems."/boot" =
+    { device = "/dev/disk/by-uuid/EA66-E4EE";
+      fsType = "vfat";
+    };
+
+  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.enp2s0f0.useDHCP = lib.mkDefault true;
+  # networking.interfaces.enp5s0.useDHCP = lib.mkDefault true;
+  # networking.interfaces.wlp3s0.useDHCP = lib.mkDefault true;
+
+  nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
+  hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
+}
diff --git a/nixos/home.nix b/nixos/home.nix
new file mode 100644
index 0000000..cfc4090
--- /dev/null
+++ b/nixos/home.nix
@@ -0,0 +1,117 @@
+{ config, pkgs, ... }:
+
+{
+  # Home Manager needs a bit of information about you and the paths it should
+  # manage.
+  home.username = "venomade";
+  home.homeDirectory = "/home/venomade";
+
+  # This value determines the Home Manager release that your configuration is
+  # compatible with. This helps avoid breakage when a new Home Manager release
+  # introduces backwards incompatible changes.
+  #
+  # You should not change this value, even if you update Home Manager. If you do
+  # want to update the value, then make sure to first check the Home Manager
+  # release notes.
+  home.stateVersion = "23.11"; # Please read the comment before changing.
+
+  # The home.packages option allows you to install Nix packages into your
+  # environment.
+  home.packages = [
+    # # Adds the 'hello' command to your environment. It prints a friendly
+    # # "Hello, world!" when run.
+    # pkgs.hello
+
+    # # It is sometimes useful to fine-tune packages, for example, by applying
+    # # overrides. You can do that directly here, just don't forget the
+    # # parentheses. Maybe you want to install Nerd Fonts with a limited number of
+    # # fonts?
+    # (pkgs.nerdfonts.override { fonts = [ "FantasqueSansMono" ]; })
+
+    # # You can also create simple shell scripts directly inside your
+    # # configuration. For example, this adds a command 'my-hello' to your
+    # # environment:
+    # (pkgs.writeShellScriptBin "my-hello" ''
+    #   echo "Hello, ${config.home.username}!"
+    # '')
+  ];
+
+  # Home Manager is pretty good at managing dotfiles. The primary way to manage
+  # plain files is through 'home.file'.
+  home.file = {
+    # # Building this configuration will create a copy of 'dotfiles/screenrc' in
+    # # the Nix store. Activating the configuration will then make '~/.screenrc' a
+    # # symlink to the Nix store copy.
+    # ".screenrc".source = dotfiles/screenrc;
+
+    # # You can also set the file content immediately.
+    # ".gradle/gradle.properties".text = ''
+    #   org.gradle.console=verbose
+    #   org.gradle.daemon.idletimeout=3600000
+    # '';
+    ".config/dmscripts/config".source = config/dmscripts-conf;
+    ".config/kitty/kitty.conf".source = config/kitty.conf;
+    ".config/picom/picom.conf".source = config/picom.conf;
+    ".config/ranger/rc.conf".source   = config/rc.conf;
+    ".ghci".source                    = config/ghci;
+    ".vim/coc-settings.json".source   = config/coc-settings.json;
+    ".vimrc".source                   = config/vimrc;
+    ".xmobarrc".source                = config/xmobarrc;
+    ".zshrc".source                   = config/zshrc;
+  };
+
+  home.file."neovim" = {
+      source = ./config/neovim;
+      target = ".config/nvim";
+      recursive = true;
+  };
+
+  home.file."scripts" = {
+      source = ./scripts;
+      target = ".local/bin";
+      recursive = true;
+  };
+
+  home.file."wallpapers" = {
+      source = ./wallpapers;
+      target = ".wallpapers";
+      recursive = true;
+  };
+
+  home.file.".icons/default".source = "${pkgs.vanilla-dmz}/share/icons/Vanilla-DMZ";
+
+  # Home Manager can also manage your environment variables through
+  # 'home.sessionVariables'. If you don't want to manage your shell through Home
+  # Manager then you have to manually source 'hm-session-vars.sh' located at
+  # either
+  #
+  #  ~/.nix-profile/etc/profile.d/hm-session-vars.sh
+  #
+  # or
+  #
+  #  ~/.local/state/nix/profiles/profile/etc/profile.d/hm-session-vars.sh
+  #
+  # or
+  #
+  #  /etc/profiles/per-user/venomade/etc/profile.d/hm-session-vars.sh
+  #
+  home.sessionVariables = {
+    # EDITOR = "emacs";
+  };
+
+  programs.git = {
+    enable = true;
+    userEmail = "venomade@venomade.com";
+    userName = "venomade";
+  };
+
+  # Configure X11 Cursor
+  xsession.pointerCursor = {
+        package = pkgs.gnome.adwaita-icon-theme;
+        name = "Adwaita";
+        size = 38;
+    };
+
+  # Let Home Manager install and manage itself.
+  programs.home-manager.enable = true;
+}
diff --git a/nixos/scripts/_dm-helper.sh b/nixos/scripts/_dm-helper.sh
new file mode 100755
index 0000000..78a33d0
--- /dev/null
+++ b/nixos/scripts/_dm-helper.sh
@@ -0,0 +1,196 @@
+#!/usr/bin/env bash
+
+# Script name: _dm-helper
+# Description: A helper script for the other scripts in the collection.
+# Dependencies:
+# GitLab: https://www.gitlab.com/dwt1/dmscripts
+# License: https://www.gitlab.com/dwt1/dmscripts/LICENSE
+# Contributors: Simon Ingelsson
+#               HostGrady
+#               aryak1
+
+set -euo pipefail
+
+if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
+    echo "This is a helper-script it does not do anything on its own."
+    exit 1
+fi
+
+######################
+#   Error handling   #
+######################
+
+# Simple warn function
+warn() {
+    printf 'Warn: %s\n' "$1"
+}
+
+# Simple error function
+err() {
+    printf 'Error: %s\n' "$1"
+    exit 1
+}
+
+############################
+#   Dislay server checks   #
+############################
+
+# Boiler code for if you want to do something with display servers
+
+#function() {
+#  case "$XDG_SESSION_TYPE" in
+#    'x11') something with x;;
+#    'wayland') something with wayland;;
+#    *) err "Unknown display server";;
+#  esac
+#}
+
+# Function to copy to clipboard with different tools depending on the display server
+cp2cb() {
+    case "$XDG_SESSION_TYPE" in
+    'x11') xclip -r -selection clipboard ;;
+    'wayland') wl-copy -n ;;
+    *) err "Unknown display server" ;;
+    esac
+}
+
+grep-desktop() {
+    case "$XDG_SESSION_TYPE" in
+    'x11') grep "Name=" /usr/share/xsessions/*.desktop | cut -d'=' -f2 ;;
+    'wayland') grep "Name=" /usr/share/wayland-sessions/*.desktop | cut -d'=' -f2 || grep "Name=" /usr/share/xsessions/*.desktop | grep -i "wayland" | cut -d'=' -f2 | cut -d' ' -f1 ;;
+    *) err "Unknown display server" ;;
+    esac
+}
+
+###############
+#   Parsing   #
+###############
+
+# simple function which provides a key-value pair in the form of the DM_XML_TAG and DM_XML_VALUE varaibles
+xmlgetnext() {
+    local IFS='>'
+    # we need to mangle backslashes for this to work (SC2162)
+    # The DM_XML_* variables are global variables and are expected to be read and dealt with by someone else (SC2034)
+    # shellcheck disable=SC2162,SC2034
+    read -d '<' DM_XML_TAG DM_XML_VALUE
+}
+
+#################
+# Help Function #
+#################
+
+# Every script has a '-h' option that displays the following information.
+help() {
+    printf '%s%s%s\n' "Usage: $(basename "$0") [options]
+$(grep '^# Description: ' "$0" | sed 's/# Description: /Description: /g')
+$(grep '^# Dependencies: ' "$0" | sed 's/# Dependencies: /Dependencies: /g')
+
+The folowing OPTIONS are accepted:
+    -h  displays this help page
+    -d  runs the script using 'dmenu'
+    -f  runs the script using 'fzf'
+    -r  runs the script using 'rofi'
+
+Running" " $(basename "$0") " "without any argument defaults to using 'dmenu'
+Run 'man dmscripts' for more information" >/dev/stderr
+}
+
+####################
+# Handle Arguments #
+####################
+
+# this function is a simple parser designed to get the menu program and then exit prematurally
+get_menu_program() {
+    # If script is run with '-d', it will use 'dmenu'
+    # If script is run with '-f', it will use 'fzf'
+    # If script is run with '-r', it will use 'rofi'
+    while getopts "dfrh" arg 2>/dev/null; do
+        case "${arg}" in
+        d) # shellcheck disable=SC2153
+            echo "${DMENU}"
+            return 0
+            ;;
+        f) # shellcheck disable=SC2153
+            echo "${FMENU}"
+            return 0
+            ;;
+        r) # shellcheck disable=SC2153
+            echo "${RMENU}"
+            return 0
+            ;;
+        h)
+            help
+            return 1
+            ;;
+        *)
+            echo "invalid option:
+Type $(basename "$0") -h for help" >/dev/stderr
+            return 1
+            ;;
+        esac
+    done
+    echo "Did not find menu argument, using \${DMENU}" >/dev/stderr
+    # shellcheck disable=SC2153
+    echo "${DMENU}"
+}
+
+####################
+# Boilerplate Code #
+####################
+
+# this function will source the dmscripts config files in the order specified below:
+#
+# Config priority (in order of which code takes precendent over the other):
+# 1. Git repository config - For developers
+# 2. $XDG_CONFIG_HOME/dmscripts/config || $HOME/.config/dmscripts/config - For local edits
+# 3. /etc/dmscripts/config - For the gloabl/default configuration
+#
+# Only 1 file is ever sourced
+
+# this warning is simply not necessary anywhere in the scope
+# shellcheck disable=SC1091
+source_dmscripts_configs() {
+    # this is to ensure this variable is defined
+    XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-}"
+
+    [ -f "../config/config" ] && source "../config/config" && return 0
+    [ -z "$XDG_CONFIG_HOME" ] && [ -f "$HOME/.config/dmscripts/config" ] && source "$HOME/.config/dmscripts/config" && return 0
+    [ -n "$XDG_CONFIG_HOME" ] && [ -f "$XDG_CONFIG_HOME/dmscripts/config" ] && source "$XDG_CONFIG_HOME/dmscripts/config" && return 0
+    [ -f "/etc/dmscripts/config" ] && source "/etc/dmscripts/config"
+}
+
+# checks the base configuration file and compares it with the local configuration file
+# if the numbers are different then the code will return 0, else 1
+#
+# this does not check the git config as it doesn't make sense
+configs_are_different() {
+    local _base_file=""
+    local _config_file=""
+
+    # DM_SHUTUP is a variable in the dmscript config that is intended to silence the notifications.
+    DM_SHUTUP="${DM_SHUTUP:-}"
+
+    # it cannot determine if the files are different if it does not exist
+    [ -f "/etc/dmscripts/config" ] && _base_file="/etc/dmscripts/config" || return 1
+
+    # this is essentially the same idea as seen previous just with different variable names
+    local _xdg_config_home="${XDG_CONFIG_HOME:-}"
+
+    [ -z "$_xdg_config_home" ] && [ -f "$HOME/.config/dmscripts/config" ] && _config_file="$HOME/.config/dmscripts/config"
+    [ -n "$_xdg_config_home" ] && [ -f "$XDG_CONFIG_HOME/dmscripts/config" ] && _config_file="$XDG_CONFIG_HOME/dmscripts/config"
+
+    # if there is no other config files then just exit.
+    [ -z "$_config_file" ] && return 1
+
+    _config_file_revision=$(grep "^_revision=" "${_config_file}")
+    _base_file_revision=$(grep "^_revision=" "${_base_file}")
+
+    if [[ ! "${_config_file_revision}" == "${_base_file_revision}" ]]; then
+        if [ -z "$DM_SHUTUP" ]; then
+            notify-send "dmscripts configuration outdated" "Review the differences of /etc/dmscripts/config and your local config and apply changes accordingly (dont forget to bump the revision number)"
+        fi
+        return 0
+    fi
+
+    return 1
+}
diff --git a/nixos/scripts/dm-dictionary b/nixos/scripts/dm-dictionary
new file mode 100755
index 0000000..e9b60e2
--- /dev/null
+++ b/nixos/scripts/dm-dictionary
@@ -0,0 +1,96 @@
+#!/usr/bin/env bash
+#
+# Script name: dm-dictionary
+# Description: Uses the translate package as a dictionary.
+# Dependencies: dmenu, fzf, rofi, translate-shell, didyoumean
+# GitLab: https://www.gitlab.com/dwt1/dmscripts
+# License: https://www.gitlab.com/dwt1/dmscripts/LICENSE
+# Contributors: Francesco Prem Solidoro
+#               Derek Taylor
+
+# Set with the flags "-e", "-u","-o pipefail" cause the script to fail
+# if certain things happen, which is a good thing.  Otherwise, we can
+# get hidden bugs that are hard to discover.
+
+set -euo pipefail
+
+# shellcheck disable=SC1091
+source ./_dm-helper.sh 2>/dev/null || source _dm-helper.sh 2>/dev/null
+
+source_dmscripts_configs
+
+if configs_are_different; then
+    echo "$(date): configs are different" >>"$DM_CONFIG_DIFF_LOGFILE"
+    sleep 1
+fi
+
+main() {
+    # dmenu expects some sort of input piped into it.
+    # The echo to /dev/null is just a hacky way of giving
+    # dmenu some input without really giving any input.
+    # shellcheck disable=SC2260
+    word="$(echo "" >/dev/null | ${MENU} "Enter word to lookup:")"
+    testword="$(dym -c -n=1 "$word")"
+
+    if [ "$word" != "$testword" ]; then
+        keyword=$(dym -c "$word" | ${MENU} "was $word a misspelling?(select/no)")
+        if [ "$keyword" = "no" ] || [ "$keyword" = "n" ]; then
+            keyword="$word"
+        fi
+    else
+        keyword="$word"
+    fi
+
+    if ! [ "${keyword}" ]; then
+        printf 'No word inserted\n' >&2
+        exit 0
+    fi
+    $DMTERM trans -v -d "$keyword"
+}
+
+mainfzf() {
+    # shellcheck disable=SC2260
+    word="$(echo " " | fzf --bind 'return:print-query' --prompt "Enter word to lookup:")"
+    testword="$(dym -c -n=1 "$word")"
+
+    if [ "$word" != "$testword" ]; then
+        # shellcheck disable=SC2153
+        keyword=$(dym -c "$word" | ${FMENU} "was $word a misspelling?(select/no)")
+        if [ "$keyword" = "no" ] || [ "$keyword" = "n" ]; then
+            keyword="$word"
+        fi
+    else
+        keyword="$word"
+    fi
+
+    if ! [ "${keyword}" ]; then
+        printf 'No word inserted\n' >&2
+        exit 0
+    fi
+    $DMTERM trans -v -d "$keyword"
+}
+
+no_opt=1
+# If script is run with '-d', it will use 'dmenu'
+# If script is run with '-f', it will use 'fzf'
+# If script is run with '-d', it will use 'rofi'
+while getopts "dfrh" arg 2>/dev/null; do
+    case "${arg}" in
+    d) # shellcheck disable=SC2153
+        MENU=${DMENU}
+        [[ "${BASH_SOURCE[0]}" == "${0}" ]] && main
+        ;;
+    f) # shellcheck disable=SC2153
+        [[ "${BASH_SOURCE[0]}" == "${0}" ]] && mainfzf ;;
+    r) # shellcheck disable=SC2153
+        MENU=${RMENU}
+        [[ "${BASH_SOURCE[0]}" == "${0}" ]] && main "@"
+        ;;
+    h) help ;;
+    *) printf '%s\n' "Error: invalid option" "Type $(basename "$0") -h for help" ;;
+    esac
+    no_opt=0
+done
+
+# If script is run with NO argument, it will use 'dmenu'
+[ $no_opt = 1 ] && MENU=${DMENU} && [[ "${BASH_SOURCE[0]}" == "${0}" ]] && main "$@"
diff --git a/nixos/scripts/dm-documents b/nixos/scripts/dm-documents
new file mode 100755
index 0000000..6cece6c
--- /dev/null
+++ b/nixos/scripts/dm-documents
@@ -0,0 +1,54 @@
+#!/bin/bash
+#
+# Script name: dm-documents
+# Description: Search for PDFs to open.
+# Dependencies: dmenu, fzf, rofi, zathura
+# GitLab: https://www.gitlab.com/dwt1/dmscripts
+# License: https://www.gitlab.com/dwt1/dmscripts/LICENSE
+# Contributors: Derek Taylor
+#               HostGrady
+
+# Set with the flags "-e", "-u","-o pipefail" cause the script to fail
+# if certain things happen, which is a good thing.  Otherwise, we can
+# get hidden bugs that are hard to discover.
+
+set -euo pipefail
+
+# shellcheck disable=SC1091
+source ./_dm-helper.sh 2>/dev/null || source _dm-helper.sh 2>/dev/null
+
+source_dmscripts_configs
+
+if configs_are_different; then
+    echo "$(date): configs are different" >>"$DM_CONFIG_DIFF_LOGFILE"
+    sleep 1
+fi
+
+main() {
+    # PDF_VIEWER=zathura
+    files="$(find "$HOME" -maxdepth 4 -iname "*.pdf")"
+    choice=$(printf '%s\n' "${files[@]}" \
+        | cut -d '/' -f4- \
+        | sed -e 's/Documents/Dcs/g' \
+            -e 's/Downloads/Dwn/g' \
+            -e 's/Pictures/Pic/g' \
+            -e 's/Images/Img/g' \
+            -e 's/.pdf//g' \
+        | sort -g \
+        | ${MENU} "File: ") || exit 1
+    if [ "$choice" ]; then
+        file=$(
+            printf '%s' "$choice" \
+                | sed -e 's/Dcs/Documents/g' \
+                    -e 's/Dwn/Downloads/g' \
+                    -e 's/Pic/Pictures/g' \
+                    -e 's/Img/Images/g'
+        )
+        "${PDF_VIEWER}" "$HOME/${file}.pdf"
+    else
+        echo "Program Terminated." && exit 0
+    fi
+}
+
+MENU="$(get_menu_program "$@")"
+[[ "${BASH_SOURCE[0]}" == "${0}" ]] && main
diff --git a/nixos/scripts/dm-hub b/nixos/scripts/dm-hub
new file mode 100755
index 0000000..39f37c9
--- /dev/null
+++ b/nixos/scripts/dm-hub
@@ -0,0 +1,119 @@
+#!/usr/bin/env bash
+#
+# Script name: dm-hub
+# Description: A hub allowing you to execute all the other dmscripts.
+# Dependencies: dmenu, fzf, rofi
+# GitLab: https://www.gitlab.com/dwt1/dmscripts
+# License: https://www.gitlab.com/dwt1/dmscripts/LICENSE
+# Contributors: n-e0
+#               Simon Ingelsson
+#               Derek Taylor
+
+# Set with the flags "-e", "-u","-o pipefail" cause the script to fail
+# if certain things happen, which is a good thing.  Otherwise, we can
+# get hidden bugs that are hard to discover.
+set -euo pipefail
+
+_path=$(dirname "$(realpath "$0")")
+
+# shellcheck disable=SC1091
+source ./_dm-helper.sh 2>/dev/null || source _dm-helper.sh 2>/dev/null
+
+source_dmscripts_configs
+
+if configs_are_different; then
+    echo "$(date): configs are different" >>"$DM_CONFIG_DIFF_LOGFILE"
+    sleep 1
+fi
+
+function maindmenu() {
+    local _self
+    declare -A _scripts
+
+    _self=$(basename "$0")
+
+    while IFS= read -r -d '' script; do
+        # Every 'dmscript' should contain a line that begins with "# Description: ".
+        # Let's take that description and add it next to the script name in the dmenu.
+        script_name=$(echo "$(basename "${script}") $(grep '^# Description: ' "${script}")" | sed 's/# Description: /- /g')
+        [[ "${script_name}" == "${_self}" ]] && continue
+        _scripts[${script_name}]="${script}"
+    done < <(find "${_path}" -type f -regex ".*/dm-.*" -print0)
+
+    choice=$(printf '%s\n' "${!_scripts[@]}" | sort | grep ".*dm.*" | ${DMENU} 'Run Script:' "$@")
+
+    if [ "${choice}" ]; then
+        thecommand="$(printf '%s' "${_scripts["${choice}"]}" | awk '{print $1}')"
+        bash "$thecommand" -d "$@"
+    else
+        echo "Program terminated." && exit 0
+    fi
+}
+
+function mainfzf() {
+    local _self
+    declare -A _scripts
+
+    _self=$(basename "$0")
+
+    while IFS= read -r -d '' script; do
+        # Every 'dmscript' should contain a line that begins with "# Description: ".
+        # Let's take that description and add it next to the script name in the dmenu.
+        script_name=$(echo "$(basename "${script}") $(grep '^# Description: ' "${script}")" | sed 's/# Description: /- /g')
+        [[ "${script_name}" == "${_self}" ]] && continue
+        _scripts[${script_name}]="${script}"
+    done < <(find "${_path}" -type f -regex ".*/dm-.*" -print0)
+
+    choice=$(printf '%s\n' "${!_scripts[@]}" | sort | grep ".*dm.*" | ${FMENU} 'Run Script:')
+
+    if [ "${choice}" ]; then
+        thecommand="$(printf '%s' "${_scripts["${choice}"]}" | awk '{print $1}')"
+        bash "$thecommand" -f
+    else
+        echo "Program terminated." && exit 0
+    fi
+}
+
+function mainrofi() {
+    local _self
+    declare -A _scripts
+
+    _self=$(basename "$0")
+
+    while IFS= read -r -d '' script; do
+        # Every 'dmscript' should contain a line that begins with "# Description: ".
+        # Let's take that description and add it next to the script name in the dmenu.
+        script_name=$(echo "$(basename "${script}") $(grep '^# Description: ' "${script}")" | sed 's/# Description: /- /g')
+        [[ "${script_name}" == "${_self}" ]] && continue
+        _scripts[${script_name}]="${script}"
+    done < <(find "${_path}" -type f -regex ".*/dm-.*" -print0)
+
+    choice=$(printf '%s\n' "${!_scripts[@]}" | sort | grep ".*dm.*" | ${RMENU} 'Run Script:' "$@")
+
+    if [ "${choice}" ]; then
+        thecommand="$(printf '%s' "${_scripts["${choice}"]}" | awk '{print $1}')"
+        bash "$thecommand" -r "$@"
+    else
+        echo "Program terminated." && exit 0
+    fi
+}
+
+no_opt=1
+# If script is run with '-d', it will use 'dmenu'
+# If script is run with '-f', it will use 'fzf'
+# If script is run with '-d', it will use 'rofi'
+while getopts "dfrh" arg 2>/dev/null; do
+    case "${arg}" in
+    d) [[ "${BASH_SOURCE[0]}" == "${0}" ]] && maindmenu ;;
+    f) [[ "${BASH_SOURCE[0]}" == "${0}" ]] && mainfzf ;;
+    r) [[ "${BASH_SOURCE[0]}" == "${0}" ]] && mainrofi "$@" ;;
+    h) help ;;
+    *) printf '%s\n' "Error: invalid option" "Type $(basename "$0") -h for help" ;;
+    esac
+    no_opt=0
+done
+
+# If script is run with NO argument, it will use 'dmenu'
+[ $no_opt = 1 ] && [[ "${BASH_SOURCE[0]}" == "${0}" ]] && maindmenu "$@"
+
+# TODO: for some reason dm-template is broken with this script, needs investigating
diff --git a/nixos/scripts/dm-man b/nixos/scripts/dm-man
new file mode 100755
index 0000000..2b4688b
--- /dev/null
+++ b/nixos/scripts/dm-man
@@ -0,0 +1,57 @@
+#!/usr/bin/env bash
+#
+# Script name: dm-man
+# Description: Search for a manpage or get a random one.
+# Dependencies: dmenu, fzf, rofi, alacritty (edit DMTERM in dmscripts config if using another terminal)
+# GitLab: https://www.gitlab.com/dwt1/dmscripts
+# License: https://www.gitlab.com/dwt1/dmscripts/LICENSE
+# Contributors: Derek Taylor
+#               Simon Ingelsson
+
+# Set with the flags "-e", "-u","-o pipefail" cause the script to fail
+# if certain things happen, which is a good thing.  Otherwise, we can
+# get hidden bugs that are hard to discover.
+set -euo pipefail
+
+# shellcheck disable=SC1091
+source ./_dm-helper.sh 2>/dev/null || source _dm-helper.sh 2>/dev/null
+
+source_dmscripts_configs
+
+if configs_are_different; then
+    echo "$(date): configs are different" >>"$DM_CONFIG_DIFF_LOGFILE"
+    sleep 1
+fi
+
+main() {
+    # An array of options to choose.
+    local _options=("Search manpages" "Random manpage" "Quit")
+    # Piping the above array into dmenu.
+    # We use "printf '%s\n'" to format the array one item to a line.
+    choice=$(printf '%s\n' "${_options[@]}" | ${MENU} 'Manpages:')
+
+    # What to do when/if we choose one of the options.
+    case "$choice" in
+    'Search manpages')
+        # shellcheck disable=SC2086
+        man -k . | awk '{$3="-"; print $0}' \
+            | ${MENU} 'Search for:' \
+            | awk '{print $2, $1}' | tr -d '()' | xargs $DMTERM man
+        ;;
+    'Random manpage')
+        # shellcheck disable=SC2086
+        man -k . | cut -d' ' -f1 | shuf -n 1 \
+            | ${MENU} 'Random manpage:' | xargs $DMTERM man
+        ;;
+    'Quit')
+        echo "Program terminated." && exit 0
+        ;;
+    *)
+        exit 0
+        ;;
+    esac
+
+}
+
+MENU="$(get_menu_program "$@")"
+[[ "${BASH_SOURCE[0]}" == "${0}" ]] && main
diff --git a/nixos/scripts/dm-note b/nixos/scripts/dm-note
new file mode 100755
index 0000000..318c613
--- /dev/null
+++ b/nixos/scripts/dm-note
@@ -0,0 +1,61 @@
+#!/usr/bin/env bash
+#
+# Script name: dm-note
+# Description: Store multiple one-line texts or codes and copy one of them when needed.
+# Dependencies: dmenu, fzf, rofi, xclip
+# GitLab: https://www.gitlab.com/dwt1/dmscripts
+# License: https://www.gitlab.com/dwt1/dmscripts/LICENSE
+# Contributors: Fawzakin
+#               Derek Taylor
+
+# Set with the flags "-e", "-u","-o pipefail" cause the script to fail
+# if certain things happen, which is a good thing.  Otherwise, we can
+# get hidden bugs that are hard to discover.
+set -euo pipefail
+
+# shellcheck disable=SC1091
+source ./_dm-helper.sh 2>/dev/null || source _dm-helper.sh 2>/dev/null
+
+source_dmscripts_configs
+
+if configs_are_different; then
+    echo "$(date): configs are different" >>"$DM_CONFIG_DIFF_LOGFILE"
+    sleep 1
+fi
+
+# TODO: Program is broken with FZF, fix later.
+main() {
+    # Picking our options.
+    choice=$(printf 'Copy note\nNew note\nDelete note\nQuit' | ${MENU} 'Notes:')
+
+    # Choose what we should do with our choice.
+    case "$choice" in
+    'Copy note')
+        # shellcheck disable=SC2154
+        note_pick=$(${MENU} 'Copy:' <"${note_dir}")
+        [ -n "${note_pick}" ] && echo "${note_pick}" | cp2cb && notify-send -u normal "Note copied" "${note_pick}"
+        ;;
+    'New note')
+        note_new=$(echo "" | ${MENU} 'Enter new note:')
+        # Making sure the input is not empty and not already exist in note_dir.
+        # The sed command should prevent grep from taking certain characters as a regex input.
+        [ -n "$note_new" ] && ! grep -q "^$(echo "${note_new}" | sed -e 's/\[/\\[/g;s/\]/\\]/g')\$" "${note_dir}" \
+            && echo "${note_new}" >>"${note_dir}" && notify-send -u normal "Note created" "${note_new}"
+        ;;
+    'Delete note')
+        note_del=$(${MENU} 'Delete:' <"${note_dir}")
+        # grep should always returns 0 regardless what happens.
+        grep -v "^$(echo "${note_del}" | sed -e 's/\[/\\[/g;s/\]/\\]/g')\$" "${note_dir}" >"/tmp/dmnote" || true
+        [ -n "${note_del}" ] && cp -f "/tmp/dmnote" "${note_dir}" && notify-send -u normal "Note deleted" "${note_del}"
+        ;;
+    'Quit')
+        echo "Program terminated." && exit 0
+        ;;
+    *)
+        exit 0
+        ;;
+    esac
+}
+
+MENU="$(get_menu_program "$@")"
+[[ "${BASH_SOURCE[0]}" == "${0}" ]] && main
diff --git a/nixos/scripts/dm-pipewire-out-switcher b/nixos/scripts/dm-pipewire-out-switcher
new file mode 100755
index 0000000..8023671
--- /dev/null
+++ b/nixos/scripts/dm-pipewire-out-switcher
@@ -0,0 +1,51 @@
+#!/usr/bin/env bash
+#
+# Script name: dm-pipewire-out-switcher
+# Description: Switch default output for pipewire.
+# Dependencies: dmenu, fzf, rofi, pipewire, jq, pactl
+# GitLab: https://www.gitlab.com/dwt1/dmscripts
+# License: https://www.gitlab.com/dwt1/dmscripts/LICENSE
+# Contributors: Simon Ingelsson
+#               Derek Taylor
+
+# Set with the flags "-e", "-u","-o pipefail" cause the script to fail
+# if certain things happen, which is a good thing.  Otherwise, we can
+# get hidden bugs that are hard to discover.
+set -euo pipefail
+
+# shellcheck disable=SC1091
+source ./_dm-helper.sh 2>/dev/null || source _dm-helper.sh 2>/dev/null
+
+source_dmscripts_configs
+
+if configs_are_different; then
+    echo "$(date): configs are different" >>"$DM_CONFIG_DIFF_LOGFILE"
+    sleep 1
+fi
+
+get_default_sink() {
+    pactl --format=json info | jq -r .default_sink_name
+}
+get_all_sinks() {
+    pactl --format=json list short sinks \
+        | current=$(get_default_sink) jq -r '.[] | if .name == env.current then .state="* " else .state="" end | .state + .name'
+}
+
+main() {
+    choice=$(printf '%s\n' "$(get_all_sinks)" \
+        | sort \
+        | ${MENU} 'Sink: ') || exit 1
+
+    if [ "$choice" ]; then
+        if [[ "${choice}" == "* $(get_default_sink)" ]]; then
+            exit 0
+        fi
+        pactl set-default-sink "${choice}"
+        notify-send "Sink is now: ${choice}"
+    else
+        echo "Program terminated." && exit 0
+    fi
+}
+
+MENU="$(get_menu_program "$@")"
+[[ "${BASH_SOURCE[0]}" == "${0}" ]] && main
diff --git a/nixos/scripts/dm-spellcheck b/nixos/scripts/dm-spellcheck
new file mode 100755
index 0000000..9626438
--- /dev/null
+++ b/nixos/scripts/dm-spellcheck
@@ -0,0 +1,38 @@
+#!/usr/bin/env bash
+#
+# Script name: dm-dictionary
+# Description: Uses didyoumean as a spellchecker.
+# Dependencies: dmenu, fzf, rofi, didyoumean
+# GitLab: https://www.gitlab.com/dwt1/dmscripts
+# License: https://www.gitlab.com/dwt1/dmscripts/LICENSE
+# Contributors: Francesco Prem Solidoro
+#               Derek Taylor
+
+# Set with the flags "-e", "-u","-o pipefail" cause the script to fail
+# if certain things happen, which is a good thing.  Otherwise, we can
+# get hidden bugs that are hard to discover.
+set -euo pipefail
+
+# shellcheck disable=SC1091
+source ./_dm-helper.sh 2>/dev/null || source _dm-helper.sh 2>/dev/null
+
+source_dmscripts_configs
+
+if configs_are_different; then
+    echo "$(date): configs are different" >>"$DM_CONFIG_DIFF_LOGFILE"
+    sleep 1
+fi
+
+main() {
+    WORD="$(printf '%s' "" | ${MENU} "Enter Word:")"
+
+    if ! [ "${WORD}" ] || [ "${WORD}" = "quit" ]; then
+        printf 'No word inserted\n' >&2
+        exit 0
+    fi
+
+    dym -c "$WORD" | ${MENU} "Select Correct Spelling:" | xclip -selection clipboard
+}
+
+MENU="$(get_menu_program "$@")"
+[[ "${BASH_SOURCE[0]}" == "${0}" ]] && main
diff --git a/nixos/scripts/dm-weather b/nixos/scripts/dm-weather
new file mode 100755
index 0000000..b2dd34f
--- /dev/null
+++ b/nixos/scripts/dm-weather
@@ -0,0 +1,43 @@
+#!/usr/bin/env bash
+#
+# Script name: dm-weather
+# Description: Simple graphical weather app
+# Dependencies: dmenu, curl, yad
+# GitLab: https://www.gitlab.com/dwt1/dmscripts
+# License: https://www.gitlab.com/dwt1/dmscripts/LICENSE
+# Contributors: HostGrady
+#               Derek Taylor
+
+# Set with the flags "-e", "-u","-o pipefail" cause the script to fail
+# if certain things happen, which is a good thing.  Otherwise, we can
+# get hidden bugs that are hard to discover.
+set -euo pipefail
+
+# shellcheck disable=SC1091
+source ./_dm-helper.sh 2>/dev/null || source _dm-helper.sh 2>/dev/null
+
+source_dmscripts_configs
+
+if configs_are_different; then
+    echo "$(date): configs are different" >>"$DM_CONFIG_DIFF_LOGFILE"
+    sleep 1
+fi
+
+main() {
+    # Here we obtain the location from the list in the config
+    # As this is loaded from other file it is technically not defined
+    # shellcheck disable=SC2154
+    _location="$(printf '%s\n' "${weather_locations}" | ${MENU} "Where do you want to see the weather?")"
+    echo "$_location"
+
+    # If $weather_opts is unset, give it an empty value
+    weather_opts+=''
+
+    # Curl wttr.in, a CLI weather app.
+    # curl -s "https://wttr.in/${_location// /%20}?T&${weather_opts}" | yad --text-info --maximized
+    kitty -e sh -c "curl -s 'https://wttr.in/${_location// /%20}?T&${weather_opts}'; read -n 1 -s"
+
+}
+
+MENU="$(get_menu_program "$@")"
+[[ "${BASH_SOURCE[0]}" == "${0}" ]] && main
diff --git a/nixos/scripts/dm-websearch b/nixos/scripts/dm-websearch
new file mode 100755
index 0000000..3dcfd34
--- /dev/null
+++ b/nixos/scripts/dm-websearch
@@ -0,0 +1,54 @@
+#!/usr/bin/env bash
+#
+# Script name: dm-websearch
+# Description: Search various search engines (inspired by surfraw).
+# Dependencies: dmenu, fzf, rofi, brave (change DMMBROWSER in dmscripts config if using another browser)
+# GitLab: https://www.gitlab.com/dwt1/dmscripts
+# License: https://www.gitlab.com/dwt1/dmscripts/LICENSE
+# Contributors: Derek Taylor
+#               Ali Furkan Yıldız
+#               HostGrady
+#               Simon Ingelsson
+
+# Set with the flags "-e", "-u","-o pipefail" cause the script to fail
+# if certain things happen, which is a good thing.  Otherwise, we can
+# get hidden bugs that are hard to discover.
+set -euo pipefail
+
+# shellcheck disable=SC1091
+source ./_dm-helper.sh 2>/dev/null || source _dm-helper.sh 2>/dev/null
+
+source_dmscripts_configs
+
+if configs_are_different; then
+    echo "$(date): configs are different" >>"$DM_CONFIG_DIFF_LOGFILE"
+    sleep 1
+fi
+
+main() {
+    if [ -z "${!websearch[*]}" ]; then
+        notify-send "dm-websearch: BREAKING CHANGES" "Due to breaking changes you must edit all declare statements in your config to include the g option. declare -A -> declare -Ag, declare -a -> declare -ag"
+        echo "$(date): dm-websearch: BREAKING CHANGES: Due to breaking changes you must edit all declare statements in your config to include the g option.
+are -A -> declare -Ag
+are -a -> declare -ag" >>"$DM_CONFIG_DIFF_LOGFILE"
+        sleep 2
+        exit 1
+    fi
+    # As this is loaded from other file it is technically not defined
+    # shellcheck disable=SC2154 # Choosing  a search engine by name from array above.
+    engine=$(printf '%s\n' "${!websearch[@]}" | sort | ${MENU} 'Choose search engine:') || exit 1
+
+    # Getting the URL of the search engine we chose.
+    url="${websearch["${engine}"]}"
+
+    # Searching the chosen engine.
+    query=$(printf '%s' "$engine" | ${MENU} 'Enter search query:')
+
+    query="$(echo -n "${query}" | jq -s -R -r @uri)"
+    # Display search results in web browser
+    # shellcheck disable=SC2154
+    ${DMBROWSER} "${url}${query}"
+}
+
+MENU="$(get_menu_program "$@")"
+[[ "${BASH_SOURCE[0]}" == "${0}" ]] && main
diff --git a/nixos/scripts/dm-wifi b/nixos/scripts/dm-wifi
new file mode 100755
index 0000000..3f94ee5
--- /dev/null
+++ b/nixos/scripts/dm-wifi
@@ -0,0 +1,42 @@
+#!/usr/bin/env bash
+#
+# script name: dm-wifi
+# Description: Connect to wifi using dmenu
+# Dependencies: dmenu, fzf, rofi, nmcli, Any Nerd Font
+# GitLab: https://www.gitlab.com/dwt1/dmscripts
+# License: https://www.gitlab.com/dwt1/dmscripts/LICENSE
+# Contributor: WitherCubes
+#              Derek Taylor
+
+# Set with the flags "-e", "-u","-o pipefail" cause the script to fail
+# if certain things happen, which is a good thing.  Otherwise, we can
+# get hidden bugs that are hard to discover.
+set -euo pipefail
+
+# shellcheck disable=SC1091
+source ./_dm-helper.sh 2>/dev/null || source _dm-helper.sh 2>/dev/null
+
+source_dmscripts_configs
+
+if configs_are_different; then
+    echo "$(date): configs are different" >>"$DM_CONFIG_DIFF_LOGFILE"
+    sleep 1
+fi
+
+main() {
+    # TODO: Fix cut line at some point
+    bssid=$(nmcli device wifi list | sed -n '1!p' | cut -b 9- | ${MENU} "Select Wifi  :" | cut -d' ' -f1)
+    pass=$(echo "" | ${MENU} "Enter Password  :")
+    # We are disabling a shellcheck warning about using && and || as it doesn't apply here.
+    # shellcheck disable=SC2015
+    [ -n "$pass" ] && nmcli device wifi connect "$bssid" password "$pass" || nmcli device wifi connect "$bssid"
+    sleep 10
+    if ping -q -c 2 -W 2 google.com >/dev/null; then
+        notify-send "Your internet is working :)"
+    else
+        notify-send "Your internet is not working :("
+    fi
+}
+
+MENU="$(get_menu_program "$@")"
+[[ "${BASH_SOURCE[0]}" == "${0}" ]] && main
diff --git a/nixos/scripts/dm-youtube b/nixos/scripts/dm-youtube
new file mode 100755
index 0000000..32888d6
--- /dev/null
+++ b/nixos/scripts/dm-youtube
@@ -0,0 +1,87 @@
+#!/usr/bin/env bash
+#
+# Script name: dm-youtube
+# Description: Youtube subscription manager without API access
+# Dependencies: dmenu, curl, a browser (brave by default)
+# Gitlab: https://www.gitlab.com/dwt1/dmscripts
+# License: https://www.gitlab.com/dwt1/dmscripts/LICENSE
+# Contributors: HostGrady
+#               Derek Taylor
+
+# Set with the flags "-e", "-u","-o pipefail" cause the script to fail
+# if certain things happen, which is a good thing.  Otherwise, we can
+# get hidden bugs that are hard to discover.
+set -euo pipefail
+
+# shellcheck disable=SC1091
+source ./_dm-helper.sh 2>/dev/null || source _dm-helper.sh 2>/dev/null
+
+source_dmscripts_configs
+
+if configs_are_different; then
+    echo "$(date): configs are different" >>"$DM_CONFIG_DIFF_LOGFILE"
+    sleep 1
+fi
+
+# this is a function for parsing youtube rss, see _dm-helper.sh for information on xmlgetnext
+parse_youtube_feed() {
+    echo "$1" | while xmlgetnext; do
+        case $DM_XML_TAG in
+        'entry')
+            title=''
+            link=''
+            published=''
+            ;;
+        'media:title')
+            title="$DM_XML_VALUE"
+            ;;
+        'yt:videoId')
+            link="$DM_XML_VALUE"
+            ;;
+        'published')
+            published="$(date --date="${DM_XML_VALUE}" "+%Y-%m-%d %H:%M")"
+            ;;
+        '/entry')
+            echo " ${published} | ${link} | ${title}"
+            ;;
+        esac
+    done
+}
+
+main() {
+    local _feed_url _channel _video
+    local _channel_id _video_id _video_list
+
+    if [ -z "${!youtube_channels[*]}" ]; then
+        notify-send "dm-youtube: BREAKING CHANGES" "Due to breaking changes you must edit all declare statements in your config to include the g option. declare -A -> declare -Ag, declare -a -> declare -ag"
+        echo "$(date): dm-youtube: BREAKING CHANGES: Due to breaking changes you must edit all declare statements in your config to include the g option.
+are -A -> declare -Ag
+are -a -> declare -ag" >>"$DM_CONFIG_DIFF_LOGFILE"
+        sleep 2
+        exit 1
+    fi
+    # Sorts the array and lets you select a channel with dmenu
+    # As this is loaded from other file it is technically not defined
+    # shellcheck disable=SC2154
+    _channel=$(printf '%s\n' "${!youtube_channels[@]}" | sort | ${MENU} 'Select Channel:')
+
+    # The way it's done here is most effective, it searchs for "=" then it takes
+    # everything before the = sign and leaves us with our variable used in the
+    # _feed_url variable
+    _channel_id=$(curl -s -f -L "${youtube_channels[${_channel}]}" | grep -o "channel_id=.*" | sed 's/".*//g')
+    _feed_url="https://www.youtube.com/feeds/videos.xml?channel_id=${_channel_id##*=}"
+    # parse rss
+    _video_list=$(parse_youtube_feed "$(curl -s "${_feed_url}")")
+
+    _video=$(printf '%s\n' "${_video_list}" | sort -r | ${MENU} 'Select Video')
+    _video_id=$(echo "${_video}" | cut -d'|' -f2 | sed -e 's/^[ \t]*//')
+
+    if [[ -n ${_video_id} ]]; then
+        # After the video is chosen, run it in your web browser
+        # shellcheck disable=SC2154
+        ${DMBROWSER} "https://www.youtube.com/watch?v=${_video_id}"
+    fi
+}
+
+MENU="$(get_menu_program "$@")"
+[[ "${BASH_SOURCE[0]}" == "${0}" ]] && main
diff --git a/nixos/scripts/get-battery b/nixos/scripts/get-battery
new file mode 100755
index 0000000..fff6d19
--- /dev/null
+++ b/nixos/scripts/get-battery
@@ -0,0 +1,39 @@
+#!/bin/sh
+
+BATTERY_PATH="/sys/class/power_supply/BAT0"
+
+# Check if the battery is present
+if [ -d "$BATTERY_PATH" ]; then
+    # Get battery status (Charging, Discharging, Full, etc.)
+    status=$(cat "$BATTERY_PATH/status")
+
+    # Get battery percentage
+    capacity=$(cat "$BATTERY_PATH/capacity")
+
+    # Set default icon and color
+    icon=""
+    color=""
+
+    # Determine icon based on battery status
+    if [ "$status" == "Charging" ]; then
+        icon="󱟦"  # Charging icon
+    else
+        icon="󱟤"  # Discharging icon
+    fi
+
+    # Determine color based on battery percentage
+    if [ "$capacity" -le 20 ]; then
+        color="<fc=#f38ba8>"  # Red
+    elif [ "$capacity" -le 50 ]; then
+        color="<fc=#fab387>"  # Orange
+    elif [ "$capacity" -le 79 ]; then
+        color="<fc=#f9e2af>"  # Yellow
+    else
+        color="<fc=#a6e3a1>"  # Green
+    fi
+
+    # Display battery information with icon and color
+    echo "$color$icon $capacity%</fc>"
+else
+    echo "Battery not found."
+fi
diff --git a/nixos/scripts/get-brightness b/nixos/scripts/get-brightness
new file mode 100755
index 0000000..4531c16
--- /dev/null
+++ b/nixos/scripts/get-brightness
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+# Get the current brightness level as a percentage
+brightness=$(brightnessctl g)
+max_brightness=$(brightnessctl m)
+
+# Perform float division and store the result with 2 decimal points
+result=$(awk "BEGIN { printf \"%.2f\", $brightness / $max_brightness }")
+
+# Convert the result to a percentage (multiply by 100) and round to the nearest whole number
+percentage=$(awk "BEGIN { printf \"%.0f\", $result * 100 }")
+
+# Set the icon based on the brightness level
+if [ $percentage -le 33 ]; then
+    icon="󰃞"
+elif [ $percentage -le 66 ]; then
+    icon="󰃟"
+else
+    icon="󰃠"
+fi
+
+echo "$icon $percentage%"
diff --git a/nixos/scripts/get-volume b/nixos/scripts/get-volume
new file mode 100755
index 0000000..4a9d510
--- /dev/null
+++ b/nixos/scripts/get-volume
@@ -0,0 +1,22 @@
+#!/bin/sh
+# Dependencies: pactl, awk
+
+volume=$(pactl list sinks | awk '/^\s+Volume:/ {print $5}' | head -n 1 | tr -d '%')
+muted=$(pactl list sinks | awk '/^\s+Mute:/ {print $2}' | head -n 1)
+
+if [ "$muted" = "yes" ]; then
+    icon="󰝟"
+else
+    if [ "$volume" -le 20 ]; then
+        icon="󰕿"
+    elif [ "$volume" -le 50 ]; then
+        icon="󰖀"
+    elif [ "$volume" -le 100 ]; then
+        icon="󰕾"
+    else
+        icon="󰝝"
+    fi
+fi
+
+echo "$icon $volume%"
+
diff --git a/nixos/wallpapers/PastelPinkLightning.jpg b/nixos/wallpapers/PastelPinkLightning.jpg
new file mode 100644
index 0000000..9440d79
--- /dev/null
+++ b/nixos/wallpapers/PastelPinkLightning.jpg
Binary files differ