summary refs log tree commit diff
path: root/.config
diff options
context:
space:
mode:
Diffstat (limited to '.config')
-rw-r--r--.config/aerc/aerc.conf148
-rw-r--r--.config/aerc/binds.conf101
-rw-r--r--.config/alacritty/alacritty.yml539
-rw-r--r--.config/alacritty/launcher.yml55
-rw-r--r--.config/evdoublebind/config3
-rw-r--r--.config/git/config219
-rw-r--r--.config/git/ignore49
-rw-r--r--.config/imv/config10
-rw-r--r--.config/kanshi/config13
-rw-r--r--.config/mako/config24
-rw-r--r--.config/mpv/config97
-rw-r--r--.config/mpv/input.conf101
-rw-r--r--.config/mpv/script-opts/console.conf2
-rw-r--r--.config/mpv/script-opts/osc.conf23
-rw-r--r--.config/mpv/script-opts/stats.conf4
-rw-r--r--.config/mpv/scripts/mouse_coords.lua31
-rw-r--r--.config/sway/auto.conf60
-rw-r--r--.config/sway/binds.conf215
-rw-r--r--.config/sway/config71
-rw-r--r--.config/sway/contrib/swayidle.confd8
-rwxr-xr-x.config/sway/contrib/swayidle.initd6
-rw-r--r--.config/sway/env22
-rw-r--r--.config/sway/hibiki39
-rw-r--r--.config/sway/input.conf35
-rw-r--r--.config/sway/simple.conf26
-rw-r--r--.config/tridactyl/themes/r.css59
-rw-r--r--.config/tridactyl/tridactylrc105
-rw-r--r--.config/vifm/colors/papercolor_dark.vifm52
-rw-r--r--.config/vifm/vifmrc216
-rw-r--r--.config/waybar/config168
-rwxr-xr-x.config/waybar/mediaplayer.py168
-rw-r--r--.config/waybar/style.css194
-rwxr-xr-x.config/waybar/toggl.lua28
-rw-r--r--.config/wofi/config2
-rw-r--r--.config/wofi/style.css16
-rw-r--r--.config/yamlfs/balena.yml18
-rw-r--r--.config/yamlfs/go.yml21
-rw-r--r--.config/zathura/zathurarc33
38 files changed, 2981 insertions, 0 deletions
diff --git a/.config/aerc/aerc.conf b/.config/aerc/aerc.conf
new file mode 100644
index 0000000..855ce3d
--- /dev/null
+++ b/.config/aerc/aerc.conf
@@ -0,0 +1,148 @@
+#
+# aerc main configuration
+
+[ui]
+#
+# Describes the format for each row in a mailbox view. This field is compatible
+# with mutt's printf-like syntax.
+#
+# Default:
+index-format=%D %-40.40n %s
+
+#
+# See time.Time#Format at https://godoc.org/time#Time.Format
+#
+# Default: 2006-01-02 03:04 PM (ISO 8601 + 12 hour time)
+timestamp-format=2006-01-02 03:04 PM
+
+#
+# Width of the sidebar, including the border.
+#
+# Default: 20
+sidebar-width=25
+
+#
+# Message to display when viewing an empty folder.
+#
+# Default: (no messages)
+empty-message=(no messages)
+
+# Message to display when no folders exists or are all filtered
+#
+# Default: (no folders)
+empty-dirlist=(no folders)
+
+# Enable mouse events in the ui, e.g. clicking and scrolling with the mousewheel
+#
+# Default: false
+mouse-enabled=false
+
+#
+# Ring the bell when new messages are received
+#
+# Default: yes
+new-message-bell=true
+
+# Describes the format string to use for the directory list
+#
+# Default: %n %>r
+dirlist-format=%n %>r
+
+[viewer]
+#
+# Specifies the pager to use when displaying emails. Note that some filters
+# may add ANSI codes to add color to rendered emails, so you may want to use a
+# pager which supports ANSI codes.
+#
+# Default: less -R
+pager=less -g -i -M -R -w -X -s
+
+#
+# If an email offers several versions (multipart), you can configure which
+# mimetype to prefer. For example, this can be used to prefer plaintext over
+# html emails.
+#
+# Default: text/plain,text/html
+alternatives=text/plain,text/html
+
+#
+# Default setting to determine whether to show full headers or only parsed
+# ones in message viewer.
+#
+# Default: false
+show-headers=false
+
+#
+# Layout of headers when viewing a message. To display multiple headers in the
+# same row, separate them with a pipe, e.g. "From|To". Rows will be hidden if
+# none of their specified headers are present in the message.
+#
+# Default: From|To,Cc|Bcc,Date,Subject
+header-layout=From|To,Cc|Bcc,Date,Subject
+
+# Whether to always show the mimetype of an email, even when it is just a single part
+#
+# Default: false
+always-show-mime=true
+
+[compose]
+#
+# Specifies the command to run the editor with. It will be shown in an embedded
+# terminal, though it may also launch a graphical window if the environment
+# supports it. Defaults to $EDITOR, or vi.
+editor=
+
+#
+# Default header fields to display when composing a message. To display
+# multiple headers in the same row, separate them with a pipe, e.g. "To|From". 
+#
+# Default: To|From,Subject
+header-layout=To|From,Subject
+
+[filters]
+#
+# Filters allow you to pipe an email body through a shell command to render
+# certain emails differently, e.g. highlighting them with ANSI escape codes.
+#
+# The first filter which matches the email's mimetype will be used, so order
+# them from most to least specific.
+#
+# You can also match on non-mimetypes, by prefixing with the header to match
+# against (non-case-sensitive) and a comma, e.g. subject,text will match a
+# subject which contains "text". Use header,~regex to match against a regex.
+subject,~^\[PATCH=awk -f /usr/share/aerc/filters/hldiff
+text/html=/usr/share/aerc/filters/html
+text/*=awk -f /usr/share/aerc/filters/plaintext
+#image/*=catimg -w $(tput cols) -
+application/pdf=/usr/share/aerc/filters/pdf
+
+[triggers]
+#
+# Triggers specify commands to execute when certain events occur.
+#
+# Example:
+# new-email=exec notify-send "New email from %n" "%s"<Enter>
+
+#
+# Executed when a new email arrives in the selected folder
+new-email=exec notify-send -a aerc -i mail-client "New mail from %n" "%s"<Enter>
+
+[templates]
+# Templates are used to populate email bodies automatically.
+#
+
+# The directories where the templates are stored. It takes a colon-separated
+# list of directories.
+#
+# default: /usr/share/aerc/templates/
+template-dirs=/usr/share/aerc/templates/:/home/robert/.config/aerc/templates
+
+# The template to be used for quoted replies.
+#
+# default: quoted_reply
+quoted-reply=quoted_reply
+
+# The template to be used for forward as body.
+#
+# default: forward_as_body
+forwards=forward_as_body
diff --git a/.config/aerc/binds.conf b/.config/aerc/binds.conf
new file mode 100644
index 0000000..6037267
--- /dev/null
+++ b/.config/aerc/binds.conf
@@ -0,0 +1,101 @@
+# Binds are of the form <key sequence> = <command to run>
+# To use '=' in a key sequence, substitute it with "Eq": "<Ctrl+Eq>"
+# If you wish to bind #, you can wrap the key sequence in quotes: "#" = quit
+<C-p> = :prev-tab<Enter>
+<C-n> = :next-tab<Enter>
+<C-t> = :term<Enter>
+
+[messages]
+q = :quit<Enter>
+
+j = :next<Enter>
+<Down> = :next<Enter>
+<C-d> = :next 50%<Enter>
+<C-f> = :next 100%<Enter>
+<PgDn> = :next -s 100%<Enter>
+
+k = :prev<Enter>
+<Up> = :prev<Enter>
+<C-u> = :prev 50%<Enter>
+<C-b> = :prev 100%<Enter>
+<PgUp> = :prev -s 100%<Enter>
+g = :select 0<Enter>
+G = :select -1<Enter>
+
+J = :next-folder<Enter>
+K = :prev-folder<Enter>
+
+<Enter> = :view<Enter>
+# d = :confirm 'Really delete this message?' ':delete-message<Enter>'<Enter>
+d = :mv Trash<Enter>
+D = :delete<Enter>
+a = :archive year<Enter>
+
+C = :compose<Enter>
+
+rr = :reply -a<Enter>
+rq = :reply -aq<Enter>
+Rr = :reply<Enter>
+Rq = :reply -q<Enter>
+
+c = :cf<space>
+$ = :term<space>
+! = :term<space>
+| = :pipe<space>
+
+/ = :search<space>
+\ = :filter<space>
+n = :next-result<Enter>
+N = :prev-result<Enter>
+
+[view]
+q = :close<Enter>
+| = :pipe<space>
+D = :delete<Enter>
+S = :save<space>
+A = :archive year<Enter>
+
+f = :forward<Enter>
+rr = :reply -a<Enter>
+rq = :reply -aq<Enter>
+Rr = :reply<Enter>
+Rq = :reply -q<Enter>
+
+H = :toggle-headers<Enter>
+<C-k> = :prev-part<Enter>
+<C-j> = :next-part<Enter>
+J = :next<Enter>
+K = :prev<Enter>
+
+[compose]
+# Keybindings used when the embedded terminal is not selected in the compose
+# view
+$ex = <C-x>
+<C-k> = :prev-field<Enter>
+<C-j> = :next-field<Enter>
+<tab> = :next-field<Enter>
+
+[compose::editor]
+# Keybindings used when the embedded terminal is selected in the compose view
+$noinherit = true
+$ex = <C-x>
+<C-k> = :prev-field<Enter>
+<C-j> = :next-field<Enter>
+<C-p> = :prev-tab<Enter>
+<C-n> = :next-tab<Enter>
+
+[compose::review]
+# Keybindings used when reviewing a message to be sent
+y = :send<Enter>
+n = :abort<Enter>
+q = :abort<Enter>
+e = :edit<Enter>
+a = :attach<Enter>
+d = :save-draft<Enter>
+
+[terminal]
+$noinherit = true
+$ex = <C-x>
+
+<C-p> = :prev-tab<Enter>
+<C-n> = :next-tab<Enter>
diff --git a/.config/alacritty/alacritty.yml b/.config/alacritty/alacritty.yml
new file mode 100644
index 0000000..4d826d2
--- /dev/null
+++ b/.config/alacritty/alacritty.yml
@@ -0,0 +1,539 @@
+# Configuration for Alacritty, the GPU enhanced terminal emulator.
+
+# Any items in the `env` entry below will be added as
+# environment variables. Some entries may override variables
+# set by alacritty itself.
+env:
+  # TERM variable
+  #
+  # This value is used to set the `$TERM` environment variable for
+  # each instance of Alacritty. If it is not present, alacritty will
+  # check the local terminfo database and use 'alacritty' if it is
+  # available, otherwise 'xterm-256color' is used.
+  #
+  # TERM: xterm-256color
+  TERM: alacritty
+  # COLORTERM: truecolor
+
+window:
+  # Window dimensions (changes require restart)
+  #
+  # Specified in number of columns/lines, not pixels.
+  # If both are `0`, this setting is ignored.
+  dimensions:
+    columns: 80
+    lines: 24
+
+  # Window position (changes require restart)
+  #
+  # Specified in number of pixels.
+  # If the position is not set, the window manager will handle the placement.
+  #position:
+  #  x: 0
+  #  y: 0
+
+  # Window padding (changes require restart)
+  #
+  # Blank space added around the window in pixels. This padding is scaled
+  # by DPI and the specified value is always added at both opposing sides.
+  padding:
+    x: 0
+    y: 0
+
+  # Spread additional padding evenly around the terminal content.
+  dynamic_padding: false
+
+  # Window decorations
+  #
+  # Values for `decorations`:
+  #     - full: Borders and title bar
+  #     - none: Neither borders nor title bar
+  decorations: full
+
+  # Startup Mode (changes require restart)
+  #
+  # Values for `startup_mode`:
+  #   - Windowed
+  #   - Maximized
+  #   - Fullscreen
+  #
+  # Values for `startup_mode` (macOS only):
+  #   - SimpleFullscreen
+  #startup_mode: Windowed
+  #
+  # Window title
+  # title: Alacritty
+
+  # Window class (Linux only):
+  class:
+    # Application instance name
+    instance: Alacritty
+    # General application class
+    general: Alacritty
+
+  # GTK theme variant (Linux only)
+  #
+  # Override the variant of the GTK theme. Commonly supported values are `dark` and `light`.
+  # Set this to `None` to use the default theme variant.
+  gtk_theme_variant: None
+
+#scrolling:
+  # Maximum number of lines in the scrollback buffer.
+  # Specifying '0' will disable scrolling.
+  #history: 10000
+
+  # Number of lines the viewport will move for every line scrolled when
+  # scrollback is enabled (history > 0).
+  #multiplier: 3
+
+  # Scroll to the bottom when new text is written to the terminal.
+  auto_scroll: true
+
+# Spaces per Tab (changes require restart)
+#
+# This setting defines the width of a tab in cells.
+#
+# Some applications, like Emacs, rely on knowing about the width of a tab.
+# To prevent unexpected behavior in these applications, it's also required to
+# change the `it` value in terminfo when altering this setting.
+tabspaces: 8
+
+# Font configuration (changes require restart)
+#
+# Important font attributes like antialiasing, subpixel aa, and hinting can be
+# controlled through fontconfig. Specifically, the following attributes should
+# have an effect:
+#   - hintstyle
+#   - antialias
+#   - lcdfilter
+#   - rgba
+#
+# For instance, if you wish to disable subpixel antialiasing, you might set the
+# rgba property to `none`. If you wish to completely disable antialiasing, you
+# can set antialias to `false`.
+#
+# Please see these resources for more information on how to use fontconfig:
+#   - https://wiki.archlinux.org/index.php/font_configuration#Fontconfig_configuration
+#   - file:///usr/share/doc/fontconfig/fontconfig-user.html
+font:
+  # Normal (roman) font face
+  normal:
+    family: Iosevka
+
+    # The `style` can be specified to pick a specific face.
+    style: Slim
+
+  # Bold font face
+  bold:
+    style: Bold
+
+  # Italic font face
+  italic:
+    style: Italic
+
+  bold_italic:
+    style: Bold Italic
+
+  # Point size
+  size: 13.0
+
+  # Offset is the extra space around each character. `offset.y` can be thought of
+  # as modifying the line spacing, and `offset.x` as modifying the letter spacing.
+  #offset:
+  #   x: 0
+  #   y: 0
+
+  # Glyph offset determines the locations of the glyphs within their cells with
+  # the default being at the bottom. Increasing `x` moves the glyph to the right,
+  # increasing `y` moves the glyph upwards.
+  #glyph_offset:
+  #   x: 0
+  #   y: 0
+
+  # Thin stroke font rendering (macOS only)
+  #
+  # Thin strokes are suitable for retina displays, but for non-retina screens
+  # it is recommended to set `use_thin_strokes` to `false`
+  #
+  # macOS >= 10.14.x:
+  #
+  # If the font quality on non-retina display looks bad then set
+  # `use_thin_strokes` to `true` and enable font smoothing by running the
+  # following command:
+  #   `defaults write -g CGFontRenderingFontSmoothingDisabled -bool NO`
+  #
+  # This is a global setting and will require a log out or restart to take
+  # effect.
+  #use_thin_strokes: true
+
+# If `true`, bold text is drawn using the bright color variants.
+draw_bold_text_with_bright_colors: false
+
+# Colors (Papercolor)
+colors:
+  # Default colors
+  primary:
+    background: &bg '#1c1c1c'
+    foreground: &fg '#d0d0d0'
+
+    # Bright and dim foreground colors
+    #
+    # The dimmed foreground color is calculated automatically if it is not present.
+    # If the bright foreground color is not set, or `draw_bold_text_with_bright_colors`
+    # is `false`, the normal foreground color will be used.
+    # dim_foreground: '#BDC0BA'
+    # bright_foreground: '#ffffff' # just white ;)
+
+  # Cursor colors
+  #
+  # Colors which should be used to draw the terminal cursor. If these are unset,
+  # the cursor color will be the inverse of the cell color.
+  cursor:
+    text: *bg
+    cursor: *fg
+
+  # Selection colors
+  #
+  # Colors which should be used to draw the selection area. If selection 
+  # background is unset, selection color will be the inverse of the cell colors. 
+  # If only text is unset the cell text color will remain the same.
+  selection:
+   text: '#251c16'
+   background: '#fffffc'
+
+  # Normal colors
+  normal:
+    black:   '#1c1c1c'
+    red:     '#af005f'
+    green:   '#5faf00'
+    yellow:  '#d7af5f'
+    blue:    '#5fafd7'
+    magenta: '#808080'
+    cyan:    '#d7875f'
+    white:   '#d0d0d0'
+
+  # Bright colors
+  bright:
+    black:   '#585858'
+    red:     '#5faf5f'
+    green:   '#afd700'
+    yellow:  '#af87d7'
+    blue:    '#ffaf00'
+    magenta: '#00afaf'
+    cyan:    '#5f8787'
+    white:   '#fffffc'
+
+  # Dim colors
+  #
+  # If the dim colors are not set, they will be calculated automatically based
+  # on the `normal` colors.
+  #dim:
+  #  black:   '0x000000'
+  #  red:     '0x8c3336'
+  #  green:   '0x7a8530'
+  #  yellow:  '0x97822e'
+  #  blue:    '0x506d8f'
+  #  magenta: '0x80638e'
+  #  cyan:    '0x497e7a'
+  #  white:   '0x9a9a9a'
+
+  # Indexed Colors
+  #
+  # The indexed colors include all colors from 16 to 256.
+  # When these are not set, they're filled with sensible defaults.
+  #
+  # Example:
+  #  - { index: 16, color: '0x000000' }
+  indexed_colors: []
+
+# Visual Bell
+#
+# Any time the BEL code is received, Alacritty "rings" the visual bell. Once
+# rung, the terminal background will be set to white and transition back to the
+# default background color. You can control the rate of this transition by
+# setting the `duration` property (represented in milliseconds). You can also
+# configure the transition function by setting the `animation` property.
+#
+# Values for `animation`:
+#   - Ease
+#   - EaseOut
+#   - EaseOutSine
+#   - EaseOutQuad
+#   - EaseOutCubic
+#   - EaseOutQuart
+#   - EaseOutQuint
+#   - EaseOutExpo
+#   - EaseOutCirc
+#   - Linear
+#
+# Specifying a `duration` of `0` will disable the visual bell.
+visual_bell:
+  duration: 0
+  color: '#af005f'
+  # bell_command: { program: "mpv", args: ["--no-config", "--no-idle", "/usr/share/sounds/gnome/default/alerts/glass.ogg"] }
+
+# Background opacity
+#
+# Window opacity as a floating point number from `0.0` to `1.0`.
+# The value `0.0` is completely transparent and `1.0` is opaque.
+background_opacity: 0.99
+
+selection:
+  semantic_escape_chars: ",│`|:\"' ()[]{}<>"
+
+  # When set to `true`, selected text will be copied to both the primary and
+  # the selection clipboard. Otherwise, it will only be copied to the selection
+  # clipboard.
+  save_to_clipboard: false
+
+dynamic_title: true
+
+cursor:
+  # Cursor style
+  #
+  # Values for `style`:
+  #   - ▇ Block
+  #   - _ Underline
+  #   - | Beam
+  style: Block
+
+  # If this is `true`, the cursor will be rendered as a hollow box when the
+  # window is not focused.
+  unfocused_hollow: true
+
+# Live config reload (changes require restart)
+#live_config_reload: true
+
+# Shell
+#
+# You can set `shell.program` to the path of your favorite shell, e.g. `/bin/fish`.
+# Entries in `shell.args` are passed unmodified as arguments to the shell.
+#
+# Default:
+#   - (macOS) /bin/bash --login
+#   - (Linux) user login shell
+#   - (Windows) powershell
+#shell:
+#  program: /bin/bash
+#  args:
+#    - --login
+
+# Startup directory
+#
+# Directory the shell is started in. If this is unset, or `None`, the working
+# directory of the parent process will be used.
+#working_directory: None
+
+# Windows 10 ConPTY backend (Windows only)
+#
+# This will enable better color support and may resolve other issues,
+# however this API and its implementation is still young and so is
+# disabled by default, as stability may not be as good as the winpty
+# backend.
+#
+# Alacritty will fall back to the WinPTY automatically if the ConPTY
+# backend cannot be initialized.
+#enable_experimental_conpty_backend: false
+
+# Send ESC (\x1b) before characters when alt is pressed.
+#alt_send_esc: true
+
+#debug:
+  # Display the time it takes to redraw each frame.
+  #render_timer: false
+
+  # Keep the log file after quitting Alacritty.
+  #persistent_logging: false
+
+  # Log level
+  #
+  # Values for `log_level`:
+  #   - None
+  #   - Error
+  #   - Warn
+  #   - Info
+  #   - Debug
+  #   - Trace
+  #log_level: Warn
+
+  # Print all received window events.
+  #print_events: false
+
+  # Record all characters and escape sequences as test data.
+  #ref_test: false
+
+mouse:
+  # Click settings
+  #
+  # The `double_click` and `triple_click` settings control the time
+  # alacritty should wait for accepting multiple clicks as one double
+  # or triple click.
+  #double_click: { threshold: 300 }
+  #triple_click: { threshold: 300 }
+
+  # If this is `true`, the cursor is temporarily hidden when typing.
+  #hide_when_typing: true
+
+  url:
+    # URL launcher
+    #
+    # This program is executed when clicking on a text which is recognized as a URL.
+    # The URL is always added to the command as the last parameter.
+    #
+    # When set to `None`, URL launching will be disabled completely.
+    #
+    # Default:
+    #   - (macOS) open
+    #   - (Linux) xdg-open
+    #   - (Windows) explorer
+    launcher:
+      program: url-launcher
+      args: []
+
+    # URL modifiers
+    #
+    # These are the modifiers that need to be held down for opening URLs when clicking
+    # on them. The available modifiers are documented in the key binding section.
+    modifiers: Control
+
+# Mouse bindings
+#
+# Mouse bindings are specified as a list of objects, much like the key
+# bindings further below.
+#
+# Each mouse binding will specify a:
+#
+# - `mouse`:
+#
+#   - Middle
+#   - Left
+#   - Right
+#   - Numeric identifier such as `5`
+#
+# - `action` (see key bindings)
+#
+# And optionally:
+#
+# - `mods` (see key bindings)
+#mouse_bindings:
+#  - { mouse: Middle, action: PasteSelection }
+
+# Key bindings
+#
+# Key bindings are specified as a list of objects. For example, this is the
+# default paste binding:
+#
+# `- { key: V, mods: Control|Shift, action: Paste }`
+#
+# Each key binding will specify a:
+#
+# - `key`: Identifier of the key pressed
+#
+#    - A-Z
+#    - F1-F24
+#    - Key0-Key9
+#
+#    A full list with available key codes can be found here:
+#    https://docs.rs/glutin/*/glutin/event/enum.VirtualKeyCode.html#variants
+#
+#    Instead of using the name of the keys, the `key` field also supports using
+#    the scancode of the desired key. Scancodes have to be specified as a
+#    decimal number. This command will allow you to display the hex scancodes
+#    for certain keys:
+#
+#       `showkey --scancodes`.
+#
+# Then exactly one of:
+#
+# - `chars`: Send a byte sequence to the running application
+#
+#    The `chars` field writes the specified string to the terminal. This makes
+#    it possible to pass escape sequences. To find escape codes for bindings
+#    like `PageUp` (`"\x1b[5~"`), you can run the command `showkey -a` outside
+#    of tmux. Note that applications use terminfo to map escape sequences back
+#    to keys. It is therefore required to update the terminfo when changing an
+#    escape sequence.
+#
+# - `action`: Execute a predefined action
+#
+#   - Copy
+#   - Paste
+#   - PasteSelection
+#   - IncreaseFontSize
+#   - DecreaseFontSize
+#   - ResetFontSize
+#   - ScrollPageUp
+#   - ScrollPageDown
+#   - ScrollLineUp
+#   - ScrollLineDown
+#   - ScrollToTop
+#   - ScrollToBottom
+#   - ClearHistory
+#   - Hide
+#   - Quit
+#   - ToggleFullscreen
+#   - SpawnNewInstance
+#   - ClearLogNotice
+#   - ReceiveChar
+#   - None
+#
+#   (macOS only):
+#   - ToggleSimpleFullscreen: Enters fullscreen without occupying another space
+#
+# - `command`: Fork and execute a specified command plus arguments
+#
+#    The `command` field must be a map containing a `program` string and an
+#    `args` array of command line parameter strings. For example:
+#       `{ program: "alacritty", args: ["-e", "vttest"] }`
+#
+# And optionally:
+#
+# - `mods`: Key modifiers to filter binding actions
+#
+#    - Command
+#    - Control
+#    - Option
+#    - Super
+#    - Shift
+#    - Alt
+#
+#    Multiple `mods` can be combined using `|` like this:
+#       `mods: Control|Shift`.
+#    Whitespace and capitalization are relevant and must match the example.
+#
+# - `mode`: Indicate a binding for only specific terminal reported modes
+#
+#    This is mainly used to send applications the correct escape sequences
+#    when in different modes.
+#
+#    - AppCursor
+#    - AppKeypad
+#    - Alt
+#
+#    A `~` operator can be used before a mode to apply the binding whenever
+#    the mode is *not* active, e.g. `~Alt`.
+#
+# Bindings are always filled by default, but will be replaced when a new
+# binding with the same triggers is defined. To unset a default binding, it can
+# be mapped to the `ReceiveChar` action. Alternatively, you can use `None` for
+# a no-op if you do not wish to receive input characters for that binding.
+key_bindings:
+  - { key: V,        mods: Super,         action: Paste            }
+  - { key: C,        mods: Super,         action: Copy             }
+  - { key: Insert,   mods: Shift,         action: PasteSelection   }
+  - { key: Key0,     mods: Control,       action: ResetFontSize    }
+  - { key: Equals,   mods: Control,       action: IncreaseFontSize }
+  - { key: Add,      mods: Control,       action: IncreaseFontSize }
+  - { key: Subtract, mods: Control,       action: DecreaseFontSize }
+  - { key: Minus,    mods: Control,       action: DecreaseFontSize }
+  - { key: Return,   mods: Alt,           action: ToggleFullscreen }
+
+  - { key: W,        mods: Super|Shift,   action: Quit             }
+  - { key: N,        mods: Super|Shift,   action: SpawnNewInstance }
+
+  - { key: Paste,                         action: Paste            }
+  - { key: Copy,                          action: Copy             }
+  - { key: L,        mods: Control,       action: ClearLogNotice   }
+  - { key: L,        mods: Control,       chars: "\x0c"            }
+  - { key: PageUp,   mods: Alt,           action: ScrollPageUp     }
+  - { key: PageDown, mods: Alt,           action: ScrollPageDown   }
diff --git a/.config/alacritty/launcher.yml b/.config/alacritty/launcher.yml
new file mode 100644
index 0000000..70f3c45
--- /dev/null
+++ b/.config/alacritty/launcher.yml
@@ -0,0 +1,55 @@
+env:
+  TERM: alacritty
+  GUICALL: '1'
+
+window:
+  padding:
+    x: 8
+    y: 8
+  dynamic_padding: true
+  decorations: none
+
+font:
+  normal:
+    family: Iosevka
+    style: Medium
+  bold:
+    style: Bold
+  italic:
+    style: Italic
+  size: 13.0
+
+colors:
+  primary:
+    background: '#221e1d'
+    foreground: '#fffefe'
+    dim_foreground: '#BDC0BA'
+    bright_foreground: '#ffffff' # just white ;)
+  cursor:
+    text: '#221e1d'
+    cursor: '#fffefe'
+  normal:
+    black:   '#221e1d'
+    red:     '#b76868'
+    green:   '#bfbd90'
+    yellow:  '#ae9892'
+    blue:    '#b5c1c0'
+    magenta: '#76a3b0'
+    cyan:    '#4777aa'
+    white:   '#c7c6c6'
+  bright:
+    black:   '#3d3533'
+    red:     '#ff7474'
+    green:   '#ffffa5'
+    yellow:  '#f6b9a9'
+    blue:    '#d3ffff'
+    magenta: '#86def7'
+    cyan:    '#4c9aec'
+    white:   '#fffefe'
+
+background_opacity: 0.95
+# shell:
+#   program: /usr/bin/env
+#   args:
+#     - LD_LIBRARY_PATH=/usr/local/lib64
+#     - mrsh
diff --git a/.config/evdoublebind/config b/.config/evdoublebind/config
new file mode 100644
index 0000000..b5feede
--- /dev/null
+++ b/.config/evdoublebind/config
@@ -0,0 +1,3 @@
+unused : <ESC>
+kbd: /dev/input/by-path/platform-i8042-serio-0-event-kbd
+<CAPS> : void | void
diff --git a/.config/git/config b/.config/git/config
new file mode 100644
index 0000000..a689381
--- /dev/null
+++ b/.config/git/config
@@ -0,0 +1,219 @@
+[user]
+    name = Robert Günzler
+    email = r@gnzler.io
+
+[sendemail]
+    smtpserver = /usr/bin/msmtp
+    smtpserveroption=-a
+    smtpserveroption=gnzler
+    annotate = true
+    confirm = always
+
+[core]
+    excludesfile = ~/.git/ignore
+    # Treat spaces before tabs and all kinds of trailing whitespace as an error
+    # [default] trailing-space: looks for spaces at the end of a line
+    # [default] space-before-tab: looks for spaces before tabs at the beginning of a line
+    whitespace = space-before-tab,-indent-with-non-tab,trailing-space
+
+    # Make `git rebase` safer on OS X
+    # More info: <http://www.git-tower.com/blog/make-git-rebase-safe-on-osx/>
+    trustctime = false
+
+    # Prevent showing files whose names contain non-ASCII symbols as unversioned.
+    # http://michael-kuehnel.de/git/2014/11/21/git-mac-osx-and-german-umlaute.html
+    precomposeunicode = false
+    filemode = false
+
+[init]
+    # templateDir = ~/.dotfiles/git/templates
+
+[commit]
+    # template = ~/.gitmessage
+
+[alias]
+    stp = status --porcelain --branch
+    sti = status --porcelain --branch --ignored
+    st = status -sb
+    stl = ls-files -m -o --exclude-standard
+    ci = commit
+    br = branch
+    co = checkout
+    cp = cherry-pick
+    cr = clone --recursive
+    df = diff --word-diff
+    d = "!f() { local a=${1:-HEAD}; local b=${2:-master}; if [[ $a == '-' ]]; then a=HEAD; fi; printf  ' %s is %s commits ahead and %s commits behind %s\n' `git rev-parse --short=7 $a` `git rev-list --count $b..$a` `git rev-list --count $a..$b` $b; printf ' last common commit (merge-base): %s\n' `git merge-base $a $b`; git diff --shortstat $a..$b; }; f"
+    unstage = reset --hard HEAD
+    l = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
+    ll = log --pretty=oneline --graph --abbrev-commit
+    lm = log --pretty=format:'* %s (%h)'
+    lg = log -p
+    g = grep --break --heading --line-number
+    amend = commit --amend --reuse-message=HEAD --edit
+    contrib = shortlog --summary --numbered
+    show-ignored = "! git clean -ndX | perl -pe 's/Would remove/Ignored:/'"
+    # usage: change-date [rev] [date] [...additional filter-branch flags]
+    # rewrites the commit/author date of <rev> to be <date>
+    # if <rev> is empty HEAD is used
+    # if <date> is empty the current time is used
+    change-date = "!f() { now=\"$(date +'%a %b %d %H:%M:%S %Y %z')\"; head=\"$(git rev-parse HEAD)\"; git filter-branch $3 --env-filter 'if [[ $GIT_COMMIT = ${1-$head} ]]; then export GIT_AUTHOR_DATE=${2:-$now}; export GIT_COMMITTER_DATE=${2:-$now}; fi'; }; f"
+    # usage: ld <n>
+    # prints out the `git log` for the n last days
+    log-since = "!sh -c \"git log --since '${1:-1} days ago' --oneline --author $(git config user.email)\" -"
+    # usage: pr <num> [<remote>]
+    # creates local branch pr/<num> from origin or <remote> and checks it out
+    pr = "!f() { git fetch -fu ${2:-origin} refs/pull/$1/head:pr/$1 && git checkout pr/$1; }; f"
+    total-lines = "! git ls-tree -r master --name-only | xargs -I {} git blame --line-porcelain {} | sed -n 's/^author //p' | sort | uniq -c | sort -rn"
+    fixup = "!f() { git commit --fixup=${1}; }; f"
+    rbi = rebase --autosquash -i
+    rbi-pr = !bash -c 'git rebase --autosquash -i `git merge-base HEAD ${1:-origin/master}`'
+    pushf = push --force-with-lease
+    root = "rev-parse --show-toplevel"
+    trailer = "!f() { msg=$(git rev-parse --show-toplevel)/LAST_COMMIT_MSG; git log -1 --format=%B > $msg; git interpret-trailers --in-place --trailer $@ $msg; git commit --allow-empty --no-verify --amend --only --edit --file $msg; rm $msg; }; f"
+    a = add --patch
+    edit = !bash -c 'set -x && git rbi "${1:-HEAD}"^' -
+    oldest-ancestor = !bash -c 'diff -u <(git rev-list --first-parent ${1:-master}) <(git rev-list --first-parent ${2:-HEAD}) | sed -ne \"s/^ //p\" | head -1'
+    rebase-onto = !bash -c 'git rebase --onto ${1} `git oldest-ancestor ${2} ${3}` ${3}' -
+    find-by-subject = "!f() { set -ex; s=`git log -1 --format=%s ${1}`; git --no-pager log -1 --grep=\"^${s}$\" --no-merges ${2}; }; f"
+    tig = !tig
+
+
+[pager]
+    diff = less
+
+[apply]
+    # Detect whitespace errors when applying a patch
+    whitespace = fix
+
+[color]
+    # Use colors in Git commands that are capable of colored output when
+    # outputting to the terminal. (This is the default setting in Git ≥ 1.8.4.)
+    ui = auto
+
+[color "branch"]
+    current = yellow reverse
+    local = yellow
+    remote = green
+
+[color "diff"]
+    meta = yellow bold
+    frag = magenta bold # line info
+    old = red # deletions
+    new = green # additions
+
+[color "status"]
+    added = yellow
+    changed = green
+    untracked = cyan
+
+[credential]
+    # helper = osxkeychain
+
+[diff]
+    # Detect copies as well as renames
+    renames = copies
+    renameLimit = 3210
+
+[diff "bin"]
+    # Use `hexdump` to diff binary files
+    textconv = hexdump -v -C
+    renames = copies
+    tool = vimdiff
+[difftool]
+    prompt = false
+
+[fetch]
+    prune = true
+
+[grep]
+    lineNumber = true
+
+[help]
+    # Automatically correct and execute mistyped commands
+    autocorrect = 10
+
+[merge]
+    # Include summaries of merged commits in newly created merge commit messages
+    log = true
+    defaultToUpstream = true
+    tool = vimdiff
+[mergetool "vimdiff"]
+    path = /usr/bin/nvim
+    conflictstyle = diff3
+    prompt = false
+
+[rebase]
+    ; instructionFormat = "%aI %an <%ae> |  %s"
+
+[rerere]
+    enabled = false
+
+[push]
+    # Use the Git 1.x.x default to avoid errors on machines with old Git
+    # installations. To use `simple` instead, add this to your `~/.extra` file:
+    # `git config --global push.default simple`. See http://git.io/mMah-w.
+    default = simple
+    # Make `git push` push relevant annotated tags when pushing branches out.
+    followTags = true
+
+# URL shorthands
+[url "git@github.com:"]
+    insteadOf = "gh:"
+    insteadOf = "https://github.com/"
+    pushInsteadOf = "github:"
+    pushInsteadOf = "git://github.com/"
+
+[url "git@bitbucket.org:"]
+    insteadOf = "bb:"
+    insteadOf = "https://bitbucket.org/"
+    pushInsteadOf = "bitbucket:"
+    pushInsteadOf = "git://bitbucket.org/"
+
+[url "git@gitlab.com:"]
+    insteadOf = "gl:"
+    insteadOf = "https://gitlab.com/"
+    pushInsteadOf = "gitlab:"
+    pushInsteadOf = "git://gitlab.com/"
+
+[url "git@git.sr.ht:"]
+    insteadOf = "srht:"
+    insteadOf = "https://git.sr.ht/"
+    pushInsteadOf = "srht:"
+    pushInsteadOf = "git://git.sr.ht/"
+
+[url "git://github.com/"]
+    insteadOf = "github:"
+
+[url "git@gist.github.com:"]
+    insteadOf = "gst:"
+    insteadOf = "gist:"
+    pushInsteadOf = "gist:"
+    pushInsteadOf = "git://gist.github.com/"
+
+[http]
+    sslverify = true
+	cookiefile = /home/robert/.gitcookies
+
+[trailer "sign"]
+	key = "Signed-off-by"
+	ifmissing = add
+	; command = bash -c 'echo \"$(git config user.name) <${$(git config user.signemail):-$(git config user.email)}>\"'
+	command = echo \"`git config user.name` <`git config user.signemail || git config user.email`>\"
+	where = end
+[trailer "changetype"]
+	key = "Change-type"
+	ifmissing = add
+	ifexists = doNothing
+	where = start
+[trailer "connects"]
+	key = "Connects-to"
+	ifmissing = add
+	where = start
+[trailer "depends"]
+	key = "Depends-on"
+	ifmissing = add
+	where = start
+[trailer "changelog"]
+	key = "Changelog-entry"
+	ifmissing = add
+	where = start
diff --git a/.config/git/ignore b/.config/git/ignore
new file mode 100644
index 0000000..9a4c0d2
--- /dev/null
+++ b/.config/git/ignore
@@ -0,0 +1,49 @@
+# Random
+*~
+._*
+Thumbs.db
+.DS_Store*
+Desktop.ini
+.idea
+ehthumbs.db
+Icon*
+Session.vim
+
+# external
+.Spotlight-V100
+.Trashes
+
+# compiled
+*.o
+*.out
+*.pyc
+*.so
+*.exe
+*.class
+*.dll
+bin/
+tags
+
+# logs and db
+*.log
+*.sql
+*.sqlite
+*.db
+
+# packages
+*.7z
+*.dmg
+*.gz
+*.iso
+*.jar
+*.rar
+*.tar
+*.zip
+
+# web stuff
+node_modules
+bower_components
+
+# personal stuff
+.todo.md
+.org.md
diff --git a/.config/imv/config b/.config/imv/config
new file mode 100644
index 0000000..64b2d1f
--- /dev/null
+++ b/.config/imv/config
@@ -0,0 +1,10 @@
+[options]
+overlay = true
+overlay_font = Iosevka Sparkle:14
+
+[binds]
+n = next 
+p = prev
+e = exec echo $imv_current_file
+u = scaling none
+y = scaling full
diff --git a/.config/kanshi/config b/.config/kanshi/config
new file mode 100644
index 0000000..2688b66
--- /dev/null
+++ b/.config/kanshi/config
@@ -0,0 +1,13 @@
+laptop{
+    output eDP-1 mode 2560x1440 scale 1 position 0,0 enable
+}
+
+desk{
+    output "Dell Inc. DELL U2518D 3C4YP87AAK3L" mode 2560x1440 position 0,0 enable
+    output eDP-1 mode 2560x1440 scale 1 position 2560,0 enable
+}
+
+tv{
+   output HDMI-A-1 position 2560,0 enable
+   output eDP-1 mode 2560x1440 scale 1 position 0,0 enable
+}
diff --git a/.config/mako/config b/.config/mako/config
new file mode 100644
index 0000000..567c2ba
--- /dev/null
+++ b/.config/mako/config
@@ -0,0 +1,24 @@
+# vim: ft=config
+
+layer=top
+anchor=top-right
+
+# font=Fira Sans
+font=Iosevka Sparkle
+padding=10
+width=500
+height=300
+background-color=#1C1C1Cee
+text-color=#FCFAF2ff
+border-color=#0B346Edd
+border-radius=3
+progress-color=source #0B346Edd
+
+group-by=app-name
+default-timeout=3000
+
+[urgency=high]
+border-color=#db4d6ddd
+
+[app-name="kp-cli"]
+border-color=#26a65bdd
diff --git a/.config/mpv/config b/.config/mpv/config
new file mode 100644
index 0000000..23e9637
--- /dev/null
+++ b/.config/mpv/config
@@ -0,0 +1,97 @@
+# MPV Configuration
+# clean up input config (helps with iina, gnome-mpv etc.)
+# no-input-default-bindings
+autoload-files=no
+input-ipc-server=/var/run/user/1000/mpv 
+
+#
+# Video
+#
+framedrop=vo
+video-sync=display-resample
+gpu-context=wayland
+
+#
+# Audio
+#
+alang=jpn,ja,eng,en,ger,de
+volume-max=200
+audio-channels=auto-safe
+# bs2b filter
+# af-add=lavfi=[bs2b=profile=jmeier] #default,cmoy
+
+#
+# Subtitles
+#
+slang=eng,en,ger,de
+sub-font="Rosario"
+sub-bold=yes
+sub-ass-force-style=Kerning=yes
+
+#
+# OSD
+#
+#osc=no
+keep-open=yes
+stop-screensaver=yes
+cursor-autohide-fs-only
+osd-font="Iosevka Sparkle"
+# osd-font=monospace
+osd-font-size=14
+osd-scale-by-window=yes
+osd-fractions=yes
+geometry=50%:50%
+hidpi-window-scale
+load-stats-overlay=yes
+load-osd-console=yes
+
+#
+# Misc.
+#
+screenshot-directory=~/Pictures/screenshots/mpv
+screenshot-template='%tY%tm%td-%tH%tM%tS-%F-%p'
+# screenshot-format=png
+# screenshot-jpeg-quality=100
+# user-agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:42.0) Gecko/20100101 Firefox/42.0"
+# ytdl-format=bestvideo+bestaudio,best
+
+#
+# PROFILES
+#
+
+[anime]
+profile-desc="Optimized for watching anime with ASS subtitles"
+sub-auto=fuzzy
+# deband=yes
+# sub-border-size=2
+# sub-font-size=45
+# sub-margin-y=50
+# sub-spacing=1
+
+[cache]
+profile-desc="Optimized for streaming web video"
+cache=yes
+cache-secs=36000
+script=~/.config/mpv/scripts/mpv-plugin-streamcache/streamcache.lua
+ytdl-format='bestvideo[ext=mp4]+bestaudio'
+
+[3d]
+profile-desc="Convert 3d to 2d"
+hwdec=no
+vf-add=stereo3d=sbs2l:mono
+
+[webcam]
+profile-desc="Optimized for showing internal webcam feed"
+osc=no
+profile=low-latency
+video-sync=display-desync # needed or external audio will fail
+pulse-latency-hacks=yes
+demuxer-lavf-o=input_format=mjpeg,video_size=848x480
+framedrop=no
+# no-demuxer-thread
+opengl-glfinish=yes
+opengl-swapinterval=0
+vf=hflip
+
+[sharp]
+glsl-shaders="~/.config/mpv/shaders/finesharp/FineSharp.glsl"
diff --git a/.config/mpv/input.conf b/.config/mpv/input.conf
new file mode 100644
index 0000000..3323ca0
--- /dev/null
+++ b/.config/mpv/input.conf
@@ -0,0 +1,101 @@
+# MPV INPUT CONFIG
+
+# taken from the default config
+ESC set fullscreen no
+f cycle fullscreen
+SPACE cycle pause
+m cycle mute
+
+# ARROW KEY BINDINGS
+RIGHT seek  10  # skip ahead
+LEFT  seek -10  # skip back
+UP    seek  60
+DOWN  seek -60
+
+HOME    seek 0 absolute-percent
+END     seek 100 absolute-percent
+
+Shift+RIGHT     playlist-next
+Shift+LEFT      playlist-prev
+Alt+RIGHT       frame-step
+Alt+LEFT        frame-back-step
+
+Shift+UP        add volume 10
+Shift+DOWN      add volume -10
+Alt+UP          add volume 5
+Alt+DOWN        add volume -5
+
+PGUP            add chapter 1    # Fn-UP; skip to next chapter
+PGDWN           add chapter -1   # Fn-DOWN; skip to previous chapter
+# Meta+UP         add chapter 1
+# Meta+DOWN       add chapter -1
+Shift+PGUP      seek 600
+Shift+PGDWN     seek -600
+Alt+PGUP        add sub-pos -1
+Alt+PGDWN      add sub-pos +1
+
+C script_binding autocrop   # crop black bars from movies (should be activated on scenes with max. contrast to the black bars)
+Ctrl+c script_binding slicing/slicing_mark
+Ctrl+a script_binding slicing/slicing_audio
+W ignore
+Ctrl+W script_binding webm/display-webm-encoder
+
+# A/V/S BINDINGS
+a cycle audio
+v cycle video
+Y cycle-values vf stereo3d=sbs2l:mono stereo3d=ab2l:mono "" # cycle methods to display 3d movie as 2d
+D cycle deinterlace
+
+s cycle sub
+S cycle sub down
+e add sub-scale +0.1                  # increase subtitle font size
+w add sub-scale -0.1                  # decrease subtitle font size
+t add sub-pos -1
+r add sub-pos +1
+
+z add sub-delay -0.1
+Z add audio-delay -0.100
+x add sub-delay +0.1
+X add audio-delay 0.100
+
+u cycle-values sub-ass-override "force" "strip" "no"
+U cycle sub-visibility
+Meta+s cycle sub-ass-force-margins
+
+# PLAYER BINDINGS
+O cycle osc
+i script-binding stats/display-stats-toggle
+g screenshot                    # take a screenshot
+G screenshot video        # ...without subtitles
+
+T cycle ontop
+H cycle-values hwdec auto no
+A cycle-values video-aspect "16:9" "4:3" "21:9" "2.35:1" "-1"
+c cycle-values audio-channels "auto-safe" "auto" "stereo"
+
+q quit
+Q quit-watch-later  # saves playback position to resume later
+
+= add volume 10
+Shift+= add volume 5
+- add volume -10
+Shift+- add volume -5
+
+> frame-step
+< frame-back-step
+
+# VAPOURSYNTH/FILTER BINDINGS
+# banding
+b cycle deband
+B vf toggle gradfun
+# interpolation
+P vf toggle format=yuv420p,vapoursynth=~/.dotfiles/scripts/motioninterpolation.vpy:4:4
+# binaural correction
+h cycle-values af lavfi=[bs2b=profile=default] lavfi=[bs2b=profile=jmeier] lavfi=[bs2b=profile=cmoy] lavfi=[earwax] ""
+
+WHEEL_UP seek -5
+WHEEL_DOWN seek 5
+
+0 script_binding mouse_coords
+# 8 script_binding mouse_coords/set
+# 9 script_binding mouse_coords/measure
diff --git a/.config/mpv/script-opts/console.conf b/.config/mpv/script-opts/console.conf
new file mode 100644
index 0000000..26581d1
--- /dev/null
+++ b/.config/mpv/script-opts/console.conf
@@ -0,0 +1,2 @@
+font="Iosevka Sparkle"
+font_size=18
diff --git a/.config/mpv/script-opts/osc.conf b/.config/mpv/script-opts/osc.conf
new file mode 100644
index 0000000..c99b867
--- /dev/null
+++ b/.config/mpv/script-opts/osc.conf
@@ -0,0 +1,23 @@
+#
+#   MPV LUA SETTINGS
+#
+
+layout=bottombar
+# layout=topbar
+# layout=slimbox
+# layout=box
+
+boxalpha=90
+# valign=-1
+# hidetimeout=1000
+# fadeduration=100
+seekbarstyle=bar
+# seekbarstyle=slider
+# seekbarstyle=knob
+
+# use native mpv values and disable OSC internal track list management (and some functions that depend on it)
+iamaprogrammer=yes
+# display total time instead of remaining time?
+# timetotal=no                 
+# display timecodes with milliseconds
+# timems=yes
diff --git a/.config/mpv/script-opts/stats.conf b/.config/mpv/script-opts/stats.conf
new file mode 100644
index 0000000..d9f699f
--- /dev/null
+++ b/.config/mpv/script-opts/stats.conf
@@ -0,0 +1,4 @@
+font="Iosevka Sparkle"
+font_mono="Iosevka Sparkle"
+font_size=8
+border_size=0.6
diff --git a/.config/mpv/scripts/mouse_coords.lua b/.config/mpv/scripts/mouse_coords.lua
new file mode 100644
index 0000000..dae6239
--- /dev/null
+++ b/.config/mpv/scripts/mouse_coords.lua
@@ -0,0 +1,31 @@
+local msg = require('mp.msg')
+
+-- local x, y = 0, 0
+
+-- function set_marker()
+--     x, y = mp.get_mouse_pos()
+-- end
+
+-- function measure()
+--     x2, y2 = mp.get_mouse_pos()
+--     w = x2-x
+--     h = y2-y
+
+--     pos = "x: " .. x .. ", y:" .. y
+--     dimensions = "w: " .. h .. ", h:" .. h
+--     output = pos .. " | " .. dimensions
+
+--     mp.msg.warn(output)
+--     mp.osd_message(output)
+-- end
+
+function print_pos()
+    x, y = mp.get_mouse_pos()
+    pos = "x: " .. x .. ", y: " .. y
+    mp.msg.warn(pos)
+    mp.osd_message(pos)
+end
+
+mp.add_key_binding("0", mp.get_script_name(), print_pos)
+-- mp.add_key_binding("8", mp.get_script_name().."/set", set_marker)
+-- mp.add_key_binding("9", mp.get_script_name().."/measure", measure)
diff --git a/.config/sway/auto.conf b/.config/sway/auto.conf
new file mode 100644
index 0000000..725900c
--- /dev/null
+++ b/.config/sway/auto.conf
@@ -0,0 +1,60 @@
+# vim: ft=i3
+# NOTE: never use assign, it crashes sway for some reason...
+
+
+for_window [class="nnn"] border pixel
+for_window [app_id="mpv"] floating enable; border pixel; inhibit_idle open
+for_window [app_id="Alacritty"] border pixel
+for_window [app_id="^__floating-.*"] floating enable
+for_window [class="pinentry"] floating enable; border normal
+for_window [class="zoom" title="Zoom - Free Account"] floating enable
+for_window [class="zoom" title="Settings"] floating enable
+for_window [class="zoom"] move workspace 9; move workspace to output eDP-1
+for_window [title="tridactyledit"] floating enable
+for_window [class="feh"] floating enable; urgent enable
+for_window [class="Sxiv"] floating enable; urgent enable
+for_window [title="Volume Control"] floating enable
+for_window [title="Calculator"] floating enable
+for_window [title="wpgtk 6.0.1"] floating enable; border normal
+for_window [app_id="launcher"] floating enable; border pixel
+for_window [app_id="nm-connection-editor"] floating enable; border normal
+for_window [class="balena-etcher-electron"] floating enable; border normal
+for_window [app_id="imv"] border pixel
+for_window [app_id="firefox" title="Picture-in-Picture"] \
+    floating enable, sticky enable, border none
+
+# Tag windows
+for_window [class="zoom"] mark work
+
+for_window [app_id="firefox"] mark browser
+for_window [class="Nightly"] mark browser
+for_window [class="Chromium-browser"] mark work; mark browser
+for_window [class="Mail"] mark mail
+for_window [class="Thunderbird"] mark mail
+for_window [class="discord"] mark mail
+for_window [class="TelegramDesktop"] mark mail
+for_window [app_id="firefox" title="^web.whatsapp.com"] mark mail
+
+for_window [con_mark="browser"] \
+    border pixel, inhibit_idle fullscreen
+
+# Move around
+
+set $outputSide eDP-1
+set $wsWork 3
+set $wsMail 2
+for_window [con_mark="work"] move workspace $wsWork
+for_window [con_mark="mail"] move workspace $wsMail, move workspace to output $outputSide, layout tabbed
+
+for_window [class="Spotify"] \
+    move workspace $wsMusic, move workspace to output $outputSide, layout tabbed, inhibit_idle open
+
+for_window [app_id="spotify-tui"] \
+    move workspace $wsMusic, move workspace to output $outputSide, layout tabbed, inhibit_idle open
+
+# for_window [class="osu!"] \
+#   move workspace $wsGame, layout tabbed
+# for_window [class="^.inecraft.*"] \
+#   move workspace $wsGame, layout tabbed
+
+for_window [class="KeePassXC"] move scratchpad; scratchpad show
diff --git a/.config/sway/binds.conf b/.config/sway/binds.conf
new file mode 100644
index 0000000..4ee9ce0
--- /dev/null
+++ b/.config/sway/binds.conf
@@ -0,0 +1,215 @@
+# vim: ft=i3
+
+# Basics {{{
+# start a terminal
+bindsym $mod+Return exec $term
+bindsym $mod+Shift+Return exec $floating_term
+
+# kill focused window
+bindsym $mod+Shift+q kill
+
+# start your launcher
+bindsym $mod+d exec $menu
+bindsym $mod+o exec $run_menu
+
+# Drag floating windows by holding down $mod and left mouse button.
+# Resize them with right mouse button + $mod.
+# Despite the name, also works for non-floating windows.
+# Change normal to inverse to use left mouse button for resizing and right
+# mouse button for dragging.
+floating_modifier $mod normal
+
+# reload the configuration file
+bindsym $mod+Shift+c reload
+
+# exit sway (logs you out of your wayland session)
+bindsym $mod+Shift+e exit
+bindsym $mod+Shift+p exec $HOME/.dotfiles/bin/lock
+
+bindsym $mod+Shift+s mode "screengrab"
+mode "screengrab" {
+bindsym f exec grimshot save screen; mode "default"
+bindsym s exec grimshot save area; mode "default"
+bindsym c exec grimshot copy area; mode "default"
+bindsym r exec grimshot rec screen; mode "default"
+bindsym p exec colorpick; mode "default"
+bindsym Shift+r exec grimshot rec area; mode "default"
+bindsym Escape mode "default"
+}
+
+bindsym $mod+Shift+b border toggle
+
+bindsym $mod+a exec soundswitch_dmenu
+bindsym $mod+Shift+a exec soundswitch_dmenu global
+bindsym $mod+n exec networkmanager_dmenu
+# }}}
+
+# Moving around {{{
+# Move your focus around
+bindsym $mod+$left focus left
+bindsym $mod+$down focus down
+bindsym $mod+$up focus up
+bindsym $mod+$right focus right
+# or use $mod+[up|down|left|right]
+
+# _move_ the focused window with the same, but add Shift
+bindsym $mod+Shift+$left move left
+bindsym $mod+Shift+$down move down
+bindsym $mod+Shift+$up move up
+bindsym $mod+Shift+$right move right
+
+bindsym $mod+Next focus child
+bindsym $mod+Prior focus parent
+
+bindsym $mod+Escape [urgent="latest"] focus
+# }}}
+
+# Workspaces {{{
+# Note: workspaces can have any name you want, not just numbers.
+# We just use 1-10 as the default.
+bindsym $mod+Shift+comma workspace prev
+bindsym $mod+Shift+period workspace next
+# switch to workspace
+bindsym $mod+1 workspace $ws1
+bindsym $mod+2 workspace $ws2
+bindsym $mod+3 workspace $ws3
+bindsym $mod+4 workspace $ws4
+bindsym $mod+5 workspace $ws5
+bindsym $mod+6 workspace $ws6
+bindsym $mod+7 workspace $ws7
+bindsym $mod+8 workspace $ws8
+bindsym $mod+9 workspace $ws9
+
+bindsym $mod+Ctrl+m workspace $wsMusic
+bindsym $mod+Ctrl+v workspace $wsVideo
+bindsym $mod+Ctrl+g workspace $wsGame
+bindsym $mod+Tab workspace back_and_forth
+
+# move focused container to workspace
+bindsym $mod+Shift+1 move container to workspace $ws1
+bindsym $mod+Shift+2 move container to workspace $ws2
+bindsym $mod+Shift+3 move container to workspace $ws3
+bindsym $mod+Shift+4 move container to workspace $ws4
+bindsym $mod+Shift+5 move container to workspace $ws5
+bindsym $mod+Shift+6 move container to workspace $ws6
+bindsym $mod+Shift+7 move container to workspace $ws7
+bindsym $mod+Shift+8 move container to workspace $ws8
+bindsym $mod+Shift+9 move container to workspace $ws9
+
+# move focused workspce to output
+bindsym $mod+Ctrl+$left move workspace to output left
+bindsym $mod+Ctrl+$down move workspace to output down
+bindsym $mod+Ctrl+$up move workspace to output up
+bindsym $mod+Ctrl+$right move workspace to output right
+# }}}
+
+# Layout stuff {{{
+bindsym $mod+Alt+v splith
+bindsym $mod+Alt+h splitv
+
+# Make the current focus fullscreen
+bindsym $mod+f fullscreen
+# Hide the topbar (also gets you more space)
+bindsym $mod+Shift+t bar mode toggle topbar; default_border pixel
+
+# Swap focus between the tiling area and the floating area
+bindsym $mod+space focus mode_toggle
+# Toggle the current focus between tiling and floating mode
+bindsym $mod+Ctrl+space floating toggle
+
+mode "layout" {
+    # Switch the current container between different layout styles
+    bindsym s layout stacking; mode "default"
+    bindsym w layout tabbed; mode "default"
+    bindsym e layout toggle split; mode "default"
+
+    # move focus to the parent container
+    bindsym p focus parent
+    bindsym Shift+p focus child
+    
+    # make a sticky container
+    bindsym t sticky toggle; mode "default"; exec notify-send "container sticky'd"
+
+    # return to default mode
+    bindsym Return mode "default"
+    bindsym Escape mode "default"
+}
+bindsym $mod+y mode "layout"
+# }}}
+
+# Scratchpad {{{
+# Sway has a "scratchpad", which is a bag of holding for windows.
+# You can send windows there and get them back later.
+
+# Move the currently focused window to the scratchpad
+bindsym $mod+Ctrl+backspace move scratchpad
+
+# Show the next scratchpad window or hide the focused scratchpad window.
+# If there are multiple scratchpad windows, this command cycles through them.
+bindsym $mod+backspace scratchpad show
+# }}}
+
+# Resizing containers {{{
+mode "resize" {
+    # 1x
+    set $resizeRate1x 50
+    bindsym $left resize shrink width $resizeRate1x px
+    bindsym $down resize grow height $resizeRate1x px
+    bindsym $up resize shrink height $resizeRate1x px
+    bindsym $right resize grow width $resizeRate1x px
+    bindsym Shift+$down resize shrink width $resizeRate1x px ; resize shrink height $resizeRate1x px
+    bindsym Shift+$up resize grow width $resizeRate1x px ; resize grow height $resizeRate1x px
+
+    # 2x
+    set $resizeRate2x 100
+    bindsym Left resize shrink width $resizeRate1x px
+    bindsym Down resize grow height $resizeRate1x px
+    bindsym Up resize shrink height $resizeRate1x px
+    bindsym Right resize grow width $resizeRate1x px
+    bindsym Shift+Down resize shrink width $resizeRate2x px ; resize shrink height $resizeRate2x px
+    bindsym Shift+Up resize grow width $resizeRate2x px ; resize grow height $resizeRate2x px
+
+    # return to default mode
+    bindsym Return mode "default"
+    bindsym Escape mode "default"
+}
+bindsym $mod+r mode "resize"
+# }}}
+
+# Gaps {{{
+mode "gaps" {
+    bindsym r gaps outer all set 0; gaps inner all set 0
+
+    set $gapRate 5
+    bindsym $up gaps inner all plus $gapRate
+    bindsym $down gaps inner all minus $gapRate
+
+    # return to default mode
+    bindsym Return mode "default"
+    bindsym Escape mode "default"
+}
+bindsym $mod+Alt+g mode "gaps"
+# }}}
+
+# Misc {{{
+bindsym $mod+Shift+x mark --toggle "x"
+bindsym $mod+x [con_mark="x"] focus
+bindsym $mod+Ctrl+x swap container with mark "x"
+
+# Media volume controls
+bindsym XF86AudioMute exec pactl set-sink-mute '@DEFAULT_SINK@' toggle
+bindsym XF86AudioMicMute exec pactl set-input-mute '@DEFAULT_INPUT@' toggle
+bindsym XF86AudioLowerVolume exec pactl set-sink-volume '@DEFAULT_SINK@' -5%
+bindsym XF86AudioRaiseVolume exec pactl set-sink-volume '@DEFAULT_SINK@' +5%
+
+# Sreen brightness controls
+bindsym XF86MonBrightnessUp exec light -A 5
+bindsym XF86MonBrightnessDown exec light -U 5
+
+# Media player controls
+bindsym XF86AudioPlay exec playerctl play-pause
+# bindsym XF86AudioForward exec playerctl next
+# bindsym XF86AudioRewind exec playerctl previous
+bindsym XF86AudioNext exec playerctl next
+bindsym XF86AudioPrev exec playerctl previous
+# }}}
diff --git a/.config/sway/config b/.config/sway/config
new file mode 100644
index 0000000..97424b1
--- /dev/null
+++ b/.config/sway/config
@@ -0,0 +1,71 @@
+# vim: ft=i3 fdm=marker
+
+set $mod Mod4
+set $alt Mod1
+
+set $left h
+set $down j
+set $up k
+set $right l
+
+set $term alacritty
+set $floating_term $term --config-file $HOME/.config/alacritty/launcher.yml --class '__floating-Alacritty'
+set $menu wofi -k /dev/null --terminal $term --show drun
+set $run_menu menu -run
+
+# workspaces {{{
+set $ws1 1
+set $ws2 2
+set $ws3 3
+set $ws4 4
+set $ws5 5
+set $ws6 6
+set $ws7 7
+set $ws8 8
+set $ws9 9
+set $wsMusic m
+set $wsVideo v
+set $wsGame g
+# }}}
+
+# gaps inner 5
+show_marks yes
+
+# default keyboard
+input * {
+    xkb_layout us
+    xkb_variant mac
+    xkb_options 'caps:hyper,lvl3:ralt_switch_multikey'
+    repeat_rate 70
+}
+
+# default pointer
+input * {
+    accel_profile adaptive
+}
+
+# TODO
+include input.conf
+include binds.conf
+include auto.conf
+
+# style {{{
+set $text #FCFAF2
+set $text2 #BDC0BA
+set $bg #1C1C1C
+set $bg2 #434343
+set $main  #0B346F
+set $main2 #005CAF
+set $urgent #DB4D6D
+set $urgent2 #CB1B45
+set $indicator #FAD689
+set $indicator2 #C18A26
+
+client.focused $main2 $main $text $indicator $main
+client.focused_inactive $bg2 $bg $text2 $indicator2 $bg
+client.unfocused $bg2 $bg $text2 $indicator2 $bg
+client.urgent $urgent2 $urgent $text $indicator $urgent
+# }}}
+
+include config.d/*
+include "`uname -n`"
diff --git a/.config/sway/contrib/swayidle.confd b/.config/sway/contrib/swayidle.confd
new file mode 100644
index 0000000..405cdbe
--- /dev/null
+++ b/.config/sway/contrib/swayidle.confd
@@ -0,0 +1,8 @@
+
+SWAYIDLE_COMMAND=<<EOF
+timeout 540 'notify-send swayidle "screen off in 60s"'
+timeout 600 'sway output * dpms off'
+	resume 'sway output * dpms on'
+timeout 800 suspend
+before-sleep lock
+EOF
diff --git a/.config/sway/contrib/swayidle.initd b/.config/sway/contrib/swayidle.initd
new file mode 100755
index 0000000..169e5cf
--- /dev/null
+++ b/.config/sway/contrib/swayidle.initd
@@ -0,0 +1,6 @@
+#!/sbin/openrc-run
+
+command=swayidle
+command_args="${SWAYIDLE_COMMAND}"
+
+pidfile=/var/run/swayidle.pid
diff --git a/.config/sway/env b/.config/sway/env
new file mode 100644
index 0000000..c7eb252
--- /dev/null
+++ b/.config/sway/env
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+# export XDG_RUNTIME_DIR=/run/user/1000
+
+export DESKTOP_SESSION=gnome
+export GDK_BACKEND=wayland
+export CLUTTER_BACKEND=wayland
+
+# export QT_QPA_PLATFORM=wayland-egl
+export QT_QPA_PLATFORM=
+# export QT_AUTO_SCREEN_SCALE_FACTOR=0
+# export QT_SCREEN_SCALE_FACTORS='1.5;1'
+export QT_QPA_PLATFORMTHEME=qgnomeplatform
+export QT_STYLE_OVERRIDE=adwaita
+
+export _JAVA_AWT_WM_NONREPARENTING=1
+
+export XMODIFIERS=@im=ibus
+export QT_IM_MODULE=ibus
+export GTK_IM_MODULE=xim
+
+export TERM=alacritty
diff --git a/.config/sway/hibiki b/.config/sway/hibiki
new file mode 100644
index 0000000..033ba39
--- /dev/null
+++ b/.config/sway/hibiki
@@ -0,0 +1,39 @@
+# vim: ft=i3
+
+output * scale 1
+output * bg $HOME/.background fill
+
+font pango:Iosevka Sparkle 12
+
+output * max_render_time 1
+# for_window [app_id=Alacritty] max_render_time 2
+for_window [app_id=firefox] max_render_time 3
+
+input "1:1:AT_Translated_Set_2_keyboard" {
+    xkb_options 'caps:hyper,lvl3:ralt_switch_multikey,grp:alt_space_toggle,eurosign:5'
+}
+input "2:7:SynPS/2_Synaptics_TouchPad" {
+    natural_scroll enabled
+    dwt enabled
+    tap enabled
+    click_method clickfinger
+    scroll_method two_finger
+    # pointer_accel 1
+}
+input "2:10:TPPS/2_Elan_TrackPoint" {
+    dwt enabled
+    natural_scroll enabled
+}
+
+bar {
+	swaybar_command waybar
+}
+
+exec mako
+exec kanshi
+exec swayidle \
+	timeout 540 'notify-send swayidle "screen off in 60s"' \
+	timeout 600 'sway output * dpms off' \
+		resume 'sway output * dpms on' \
+	timeout 800 suspend \
+	before-sleep lock
diff --git a/.config/sway/input.conf b/.config/sway/input.conf
new file mode 100644
index 0000000..42b959b
--- /dev/null
+++ b/.config/sway/input.conf
@@ -0,0 +1,35 @@
+# vim: ft=i3
+
+# input club kbd
+input "65261:25700:Input_Club_Infinity_keyboard/QMK" {
+    # intentionally left blank
+}
+
+# planck ez
+input "65261:24672:OLKB_Planck" {
+    xkb_options 'eurosign:5,lvl3:ralt_switch_multikey'
+}
+
+# trackball
+input "1149:8264:Primax_Kensington_Eagle_Trackball" {
+    # intentionally left blank
+}
+
+# pen + tablet
+input "10429:148:XP-PEN_STAR_G640_Pen" {
+    click_method clickfinger
+    middle_emulation disabled
+    accel_profile flat
+    drag enabled
+    tap enabled
+
+    # 331 lower pen button
+    # 332 upper pen button
+    scroll_method on_button_down
+    scroll_button 274
+
+    map_to_output HDMI-A-1
+    map_from_region 0.0x0.0 0.3x0.3
+}
+input "10429:148:XP-PEN_STAR_G640_Mouse" events disabled
+input "10429:148:XP-PEN_STAR_G640_Keyboard" events disabled
diff --git a/.config/sway/simple.conf b/.config/sway/simple.conf
new file mode 100644
index 0000000..435f235
--- /dev/null
+++ b/.config/sway/simple.conf
@@ -0,0 +1,26 @@
+set $mod Mod4
+set $left h
+set $right l
+set $up k
+set $down j
+set $term alacritty
+set $menu wofi -terminal $term -show drun
+
+bindsym $mod+Return exec $term
+bindsym $mod+Shift+q kill
+bindsym $mod+d exec $menu
+bindsym $mod+Shift+c reload
+bindsym $mod+Shift+e exit
+bindsym $mod+$left focus left
+bindsym $mod+$down focus down
+bindsym $mod+$up focus up
+bindsym $mod+$right focus right
+bindsym $mod+Shift+$left move left
+bindsym $mod+Shift+$down move down
+bindsym $mod+Shift+$up move up
+bindsym $mod+Shift+$right move right
+bindsym $mod+f fullscreen
+bindsym $mod+Backspace seat - pointer_constraint disable
+bindsym $mod+0 seat - pointer_constraint escape
+
+exec swaynag -m $(sway --get-socketpath)
diff --git a/.config/tridactyl/themes/r.css b/.config/tridactyl/themes/r.css
new file mode 100644
index 0000000..9017468
--- /dev/null
+++ b/.config/tridactyl/themes/r.css
@@ -0,0 +1,59 @@
+:root.TridactylThemeR {
+    --tridactyl-bg: #1c1c1c;
+    --tridactyl-bg-second: #38383d;
+    --tridactyl-fg: #f9f9fa;
+    --tridactyl-of-bg: #005CAF;
+    /* --tridactyl-of-fg: ; */
+    /* --tridactyl-hightlight-box-bg: ; */
+    /* --tridactyl-hightlight-box-fg: ; */
+    --tridactyl-font-family: "Iosevka Sparkle", monospace;
+    --tridactyl-font-family-sans: sans-serif;
+    --tridactyl-font-size: 12pt !important;
+    --tridactyl-small-font-size: 12pt;
+    --tridactyl-cmdl-bg: #1c1c1c;
+    --tridactyl-cmdl-small-font-size: 12pt;
+    --tridactyl-cmplt-bg: #1c1c1c;
+    --tridactyl-cmplt-small-font-size: 12pt;
+}
+
+/* :root.TridactylThemeR body { */
+/* } */
+
+:root.TridactylThemeR #command-line-holder {
+    order: 1;
+}
+
+:root.TridactylThemeR #completions {
+    order: 2;
+    border-top: 1px solid var(--tridactyl-complt-bg);
+}
+
+:root.TridactylThemeR #completions .sectionHeader {
+    display: none;
+}
+
+/* :root.TridactylThemeR #tridactyl-colon { */
+/*     margin-left: 2px; */
+/* } */
+:root.TridactylThemeR #tridactyl-colon::before {
+    content: " > ";
+}
+
+/* :root.TridactylThemeR #completions .focused, */
+/* :root.TridactylThemeR #completions .focused .url { */
+/*     background: var(--tridactyl-bg-second); */
+/*     text-decoration: italic; */
+/* } */
+
+:root.TridactylThemeR #cmdline_iframe {
+    position: fixed !important;
+    bottom: unset;
+    top: -1px !important;
+    left: 0% !important;
+    box-shadow: rgba(0, 0, 0, 0.5) 0px 0px 15px !important;
+    /* opacity: 0.9; */
+}
+
+/* :root.TridactylThemeR #changelog { */
+/*     background: var(--tridactyl-bg-second); */
+/* } */
diff --git a/.config/tridactyl/tridactylrc b/.config/tridactyl/tridactylrc
new file mode 100644
index 0000000..5ea41a0
--- /dev/null
+++ b/.config/tridactyl/tridactylrc
@@ -0,0 +1,105 @@
+" vim: ft=vim
+" sanitise tridactyllocal tridactylsync
+
+set browser firefox-nightly
+set allowautofocus false
+set searchengine duckduckgo
+set tabopencontaineraware true
+set editorcmd alacritty -t tridactyledit -e nvim
+set historyresults 50
+set newtabfocus page
+set allowautofocus false
+
+colors r
+
+" remove annoying binds
+unbind s
+unbind <C-f>
+unbind <C-a>
+unbind <F1>
+
+bind <Space>tw fillcmdline tabopen -c wee
+bind <Space>tp fillcmdline tabopen -c pers
+bind <Space>tb fillcmdline tabopen -c bank
+bind <Space>ts fillcmdline tabopen -c shop
+
+bind <space>s fillcmdline tabopen search
+bind <space>n fillcmdline nativeopen
+
+bind / fillcmdline find
+bind n findnext 1
+bind N findnext -1
+bind <Space>, nohlsearch
+
+bind <Space>l fillcmdline urlmodify -g 
+
+" select all in cmdline
+unbind --mode=ex <C-a>
+
+bindurl news.ycombinator.com ;c hint -fr \d+\scomments
+bindurl news.ycombinator.com f hint -c [class*="storylink"]
+
+" better result hinting on ddg
+bindurl duckduckgo.com f hint -c [class*="result__url"]
+bindurl duckduckgo.com F hint -b -c [class*="result__url"]
+
+" hint: mpv/video
+bind gv composite get_current_url | !s mpv --profile=cache
+bind yv composite js navigator.clipboard.readText() | !s mpv --profile=cache
+bind ;v hint -W !s mpv --profile=cache
+
+" hint: other
+bind ;i hint -W !s imv
+bind ;e hint -W !s alacritty --class '__floating-tridactyledit' -e nvim
+
+bind gp fillcmdline winopen -popup
+bind g1 tab 2
+bind g2 tab 3
+bind g3 tab 4
+bind g4 tab 5
+
+" some autocommands that rewrite URLs
+" autocmd DocStart www.amazon.co.uk js tri.excmds.urlmodify("-t", "www", "smile")
+" autocmd DocStart *.solus-project.com js tri.excmds.urlmodify("-t", "solus-project.com", "getsol.us")
+" autocmd DocStart golang.org/pkg js tri.excmds.urlmodify("-t", "golang.org/pkg", "godoc.org")
+" autocmd DocStart typeform.com mode ignore
+
+" autocontainers
+" aucon meetup.com personal
+" aucon trello.com personal
+" aucon reddit.com weeb
+" aucon kitsu.io weeb
+" aucon youtube.com weeb
+" aucon shanaproject.com weeb
+" aucon kum4.cf weeb
+" aucon nyaa.si weeb
+" aucon amazon.(com|de|co.jp|co.uk) shopping
+" aucon flowdock.com work
+" aucon calamari.io work
+
+seturl overleaf.com mode ignore
+
+" fix youtube
+seturl youtube.com noiframe true
+unbindurl youtube.com f
+bindurl youtube.com h hint
+bindurl youtube.com T tabopen ddg.gg
+
+" fix reddit
+seturl reddit.com allowautofocus true
+unbindurl reddit.com <Escape>
+unbindurl reddit.com j
+unbindurl reddit.com k
+unbindurl reddit.com n
+unbindurl reddit.com p
+unbindurl reddit.com a
+unbindurl reddit.com z
+unbindurl reddit.com c
+" unbindurl reddit.com r
+unbindurl reddit.com s
+unbindurl reddit.com h
+unbindurl reddit.com x
+unbindurl reddit.com l
+
+set leavegithubalone false
+set blacklistkeys ["/","<Space>",";"]
diff --git a/.config/vifm/colors/papercolor_dark.vifm b/.config/vifm/colors/papercolor_dark.vifm
new file mode 100644
index 0000000..9f79ae4
--- /dev/null
+++ b/.config/vifm/colors/papercolor_dark.vifm
@@ -0,0 +1,52 @@
+" Available attributes (some of them can be combined):
+" bold
+" underline
+" reverse or inverse
+" standout
+" none
+
+" let s:palette = {
+" \       'color00' : ['#1c1c1c', '234'],
+" \       'color01' : ['#af005f', '125'],
+" \       'color02' : ['#5faf00', '70'],
+" \       'color03' : ['#d7af5f', '179'],
+" \       'color04' : ['#5fafd7', '74'],
+" \       'color05' : ['#808080', '244'],
+" \       'color06' : ['#d7875f', '173'],
+" \       'color07' : ['#d0d0d0', '252'],
+" \       'color08' : ['#585858', '240'],
+" \       'color09' : ['#5faf5f', '71'],
+" \       'color10' : ['#afd700', '148'],
+" \       'color11' : ['#af87d7', '140'],
+" \       'color12' : ['#ffaf00', '214'],
+" \       'color13' : ['#ff5faf', '205'],
+" \       'color14' : ['#00afaf', '37'],
+" \       'color15' : ['#5f8787', '66'],
+" \       'color16' : ['#5fafd7', '74'],
+" \       'color17' : ['#d7af00', '178'],
+" \ }
+
+highlight clear
+
+highlight Win cterm=none ctermfg=252 ctermbg=234
+highlight Directory cterm=bold ctermfg=74 ctermbg=default
+highlight Link cterm=bold ctermfg=173 ctermbg=default
+highlight BrokenLink cterm=bold ctermfg=240 ctermbg=default
+highlight Socket cterm=bold ctermfg=205 ctermbg=default
+highlight Device cterm=bold ctermfg=125 ctermbg=default
+highlight Fifo cterm=bold ctermfg=148 ctermbg=default
+highlight Executable cterm=bold ctermfg=70 ctermbg=default
+highlight Selected cterm=standout ctermfg=140 ctermbg=default
+highlight CurrLine cterm=bold,reverse ctermfg=default ctermbg=default
+
+highlight TopLine cterm=none ctermfg=default ctermbg=default
+highlight TopLineSel cterm=bold ctermfg=default ctermbg=default
+highlight StatusLine cterm=bold ctermfg=234 ctermbg=74
+highlight WildMenu cterm=underline,reverse ctermfg=white ctermbg=black
+highlight CmdLine cterm=none ctermfg=default ctermbg=default
+highlight ErrorMsg cterm=none ctermfg=125 ctermbg=default
+highlight Border cterm=none ctermfg=default ctermbg=default
+highlight JobLine cterm=bold,reverse ctermfg=default ctermbg=default
+highlight SuggestBox cterm=bold ctermfg=default ctermbg=default
+highlight CmpMismatch cterm=bold ctermfg=252 ctermbg=125
+highlight AuxWin cterm=bold,underline,reverse,standout ctermfg=default ctermbg=default
diff --git a/.config/vifm/vifmrc b/.config/vifm/vifmrc
new file mode 100644
index 0000000..6af0b3f
--- /dev/null
+++ b/.config/vifm/vifmrc
@@ -0,0 +1,216 @@
+" vim: filetype=vifm :
+
+colorscheme papercolor_dark
+
+set vicmd=nvim
+set trash
+set history=100
+set nofollowlinks
+set sortnumbers
+set undolevels=100
+set vimhelp
+set norunexec
+set timefmt=%m/%d\ %H:%M
+set wildmenu
+set wildstyle=popup
+set suggestoptions=normal,visual,view,otherpane,keys,marks,registers
+set ignorecase
+set smartcase
+set nohlsearch
+set incsearch
+set scrolloff=4
+
+" Don't do too many requests to slow file systems
+if !has('win')
+    set slowfs=curlftpfs
+endif
+
+set statusline="  Hint: %z%= %A %10u:%-7g %15s %20d  "
+
+" ------------------------------------------------------------------------------
+
+mark b ~/bin/
+mark h ~/
+
+" ------------------------------------------------------------------------------
+
+" :com[mand][!] command_name action
+" The following macros can be used in a command
+" %a is replaced with the user arguments.
+" %c the current file under the cursor.
+" %C the current file under the cursor in the other directory.
+" %f the current selected file, or files.
+" %F the current selected file, or files in the other directory.
+" %b same as %f %F.
+" %d the current directory name.
+" %D the other window directory name.
+" %m run the command in a menu window
+
+command! df df -h %m 2> /dev/null
+command! diff vi -d %f %F
+command! zip zip -r %f.zip %f
+command! run !! ./%f
+command! make !!make %a
+command! mkcd :mkdir %a | cd %a
+command! vgrep vi "+grep %a"
+command! reload :write | restart
+
+command ssh
+\ : let $SSH_FILE = system('mktemp /tmp/vifm-XXXX.ssh')
+\ | execute '!echo ''%a'' > $SSH_FILE; ls $SSH_FILE %%U'
+\ | execute 'normal l'
+\ | execute '!rm $SSH_FILE'
+
+" ------------------------------------------------------------------------------
+
+" Pdf
+filextype *.pdf 
+        \ {View in mupdf}
+        \ mupdf %c &,
+        \ {View in zathura}
+        \ zathura %c %i &,
+fileviewer *.pdf pdftotext -nopgbrk %c -
+" PostScript
+filextype *.ps,*.eps,*.ps.gz
+        \ {View in zathura}
+        \ zathura %f,
+" Djvu
+filextype *.djvu
+        \ {View in zathura}
+        \ zathura %f,
+
+" Audio
+filetype *.wav,*.mp3,*.flac,*.m4a,*.wma,*.ape,*.ac3,*.og[agx],*.spx,*.opus
+       \ {Play using mpv}
+       \ mpv --no-video %c,
+       \ {Play using ffplay}
+       \ ffplay -nodisp %c,
+       \ {Enqueue using xap}
+       \ xap add %c:p,
+fileviewer *.mp3 mp3info
+
+" Video
+filextype *.avi,*.mp4,*.wmv,*.dat,*.3gp,*.ogv,*.mkv,*.mpg,*.mpeg,*.vob,
+         \*.fl[icv],*.m2v,*.mov,*.webm,*.ts,*.mts,*.m4v,*.r[am],*.qt,*.divx,
+         \*.as[fx]
+        \ {View using mpv}
+        \ mpv %f,
+        \ {View using ffplay}
+        \ ffplay -fs %f,
+fileviewer *.avi,*.mp4,*.wmv,*.dat,*.3gp,*.ogv,*.mkv,*.mpg,*.mpeg,*.vob,
+          \*.fl[icv],*.m2v,*.mov,*.webm,*.ts,*.mts,*.m4v,*.r[am],*.qt,*.divx,
+          \*.as[fx]
+         \ ffprobe -pretty %c 2>&1
+
+" Web
+filextype *.html,*.htm
+        \ {Open with w3m}
+        \ w3m %f %i &,
+        \ {Open with firefox}
+        \ firefox %f &,
+
+" Object
+filetype *.o nm %f | less
+
+" Man page
+filetype *.[1-8] man ./%c
+fileviewer *.[1-8] man ./%c | col -b
+
+" Images
+filextype *.bmp,*.jpg,*.jpeg,*.png,*.gif,*.xpm
+        \ {View in imv}
+        \ imv -n %c %d 2>/dev/null &,
+fileviewer *.bmp,*.jpg,*.jpeg,*.png,*.gif,*.xpm
+         \ convert -identify %f -verbose /dev/null
+
+" MD5
+filetype *.md5
+       \ {Check MD5 hash sum}
+       \ md5sum -c %f %S,
+" SHA1
+filetype *.sha1
+       \ {Check SHA1 hash sum}
+       \ sha1sum -c %f %S,
+" SHA256
+filetype *.sha256
+       \ {Check SHA256 hash sum}
+       \ sha256sum -c %f %S,
+" SHA512
+filetype *.sha512
+       \ {Check SHA512 hash sum}
+       \ sha512sum -c %f %S,
+" GPG signature
+filetype *.asc
+       \ {Check signature}
+       \ !!gpg --verify %c,
+
+filetype *.zip,*.jar,*.war,*.ear,*.oxt,*.apkg
+       \ {View contents}
+       \ zip -sf %c | less,
+       \ {Extract here}
+       \ tar -xf %c,
+filetype *.zip
+       \ {Extract ZIP}
+       \ unzip %c
+fileviewer *.zip,*.jar,*.war,*.ear,*.oxt zip -sf %c
+
+" ArchiveMount
+fileviewer *.tgz,*.tar.gz tar -tzf %c
+fileviewer *.tar.bz2,*.tbz2 tar -tjf %c
+fileviewer *.tar.txz,*.txz xz --list %c
+fileviewer *.tar tar -tf %c
+
+" ------------------------------------------------------------------------------
+
+" What should be saved automatically between vifm runs
+" Like in previous versions of vifm
+" set vifminfo=options,filetypes,commands,bookmarks,dhistory,state,cs
+" Like in vi
+set vifminfo=dhistory,savedirs,chistory,state,tui,shistory,
+    \phistory,fhistory,dirstack,registers,bookmarks,bmarks
+
+" ------------------------------------------------------------------------------
+
+" Examples of configuring both panels
+
+" Customize view columns a bit (enable ellipsis for truncated file names)
+"
+" set viewcolumns=-{name}..,6{}.
+
+" Filter-out build and temporary files
+"
+" filter! /^.*\.(lo|o|d|class|py[co])$|.*~$/
+
+" ------------------------------------------------------------------------------
+
+" Start shell in current directory
+nnoremap s :shell<cr>
+" Display sorting dialog
+nnoremap S :sort<cr>
+
+" Toggle visibility of preview window
+nnoremap w :view<cr>
+vnoremap w :view<cr>gv
+
+" Open file in the background using its default program
+nnoremap gb :file &<cr>l
+
+" Yanking...
+nnoremap yf :!echo -n %c:p | wl-copy %i<cr>
+nnoremap yn :!echo -n %c | wl-copy %i<cr>
+nnoremap yd :!echo -n %d | wl-copy %i<cr>
+nnoremap yff :!cat -n %c:p | wl-copy %i<cr>
+
+" Mappings for faster renaming
+nnoremap I cw<c-a>
+nnoremap cc cw<c-u>
+nnoremap A cw
+
+" Open console in current directory
+nnoremap ,t :!alacritty &<cr>
+" Open editor to edit vifmrc and apply settings after returning to vifm
+nnoremap ,c :write | edit $MYVIFMRC | restart<cr>
+" Toggle wrap setting on ,w key
+nnoremap ,w :set wrap!<cr>
+
+nnoremap q :quit<cr>
diff --git a/.config/waybar/config b/.config/waybar/config
new file mode 100644
index 0000000..6f29e7e
--- /dev/null
+++ b/.config/waybar/config
@@ -0,0 +1,168 @@
+// vim: commentstring=//\ %s
+{
+    "layer": "top",
+    "position": "top",
+    "height": 30,
+
+    "modules-left": ["sway/mode", "sway/workspaces", "sway/window", "custom/media", "custom/toggl"],
+    // "modules-center": ["sway/window"],
+    "modules-right": ["cpu", "memory", "temperature", "idle_inhibitor", "backlight", "pulseaudio", "network", "battery", "clock#local", "clock#utc", "tray"],
+    "sway/workspaces": {
+        "disable-scroll": true,
+        "all-outputs": false,
+        "format": "{icon}",
+        "format-icons": {
+            // "urgent": "",
+            // "focused": "",
+            // "default": "",
+            // "1": "",
+            // "2": "",
+            // "3": "",
+            // "4": "",
+            // "5": "",
+            // "6": "",
+            // "7": "",
+            // "8": "",
+            // "9": "",
+            "m": "",
+            "v": "",
+            "g": ""
+        }
+    },
+    "sway/window": {
+        "format": "{}",
+        "max-length": 50,
+        "tooltip": false
+    },
+    "sway/mode": {
+        "format": "{}",
+        "tooltip": false
+    },
+    "idle_inhibitor": {
+        "format": "{icon}",
+        "format-icons": {
+            "activated": "",
+            "deactivated": ""
+        }
+    },
+    "tray": {
+        "spacing": 10
+    },
+    "clock#local": {
+        "tooltip": false,
+        "format": "{:<i>%a</i> %d %b %H:%M}",
+        "timezone": "Europe/Berlin"
+    },
+    "clock#utc": {
+        "tooltip": false,
+        "format": "(UTC {:%H:%M})",
+        "timezone": "UTC"
+    },
+    "cpu": {
+        "format": "{usage}% ",
+        "tooltip": true
+    },
+    "memory": {
+        "format": "{}% "
+    },
+    "temperature": {
+        "critical-threshold": 90,
+        "format": "{temperatureC}℃ {icon}",
+        "format-icons": ["", "", ""]
+    },
+    "backlight": {
+        "format": "{percent}% {icon}",
+        "format-icons": [""]
+    },
+    "battery": {
+        "states": {
+            // "good": 95,
+            "warning": 30,
+            "critical": 15
+        },
+        "format": "{capacity}% {icon}",
+        "format-charging": "{capacity}% ",
+        "format-plugged": "{capacity}% ",
+        "format-alt": "{time} {icon}",
+        "format-full": "{icon}",
+        "format-icons": ["", "", "", "", ""],
+        "tooltip": false
+    },
+    "network": {
+        "format-wifi": "{essid} ({signalStrength}%) ",
+        "format-ethernet": "{ifname}: {ipaddr}/{cidr} ",
+        "format-linked": "{ifname} (No IP) ",
+        "format-disconnected": "Disconnected ",
+        "format-alt": "{ifname}: {ipaddr}/{cidr}",
+        "tooltip": false
+    },
+    "network#vpn": {
+        "interface": "tun0",
+        "format-wifi": " {ifname}",
+        "format-ethernet": " {ifname}",
+        "format-disconnected": "",
+        "tooltip": false
+    },
+    "pulseaudio": {
+        "format": "{volume}% {icon}",
+        "format-bluetooth": "{volume}% {icon}",
+        "format-muted": "{volume}%  ",
+        "format-source": "{volume}% ",
+        "format-source-muted": "{volume}% ",
+        "format-icons": {
+            "headphones": "",
+            "handsfree": "",
+            "headset": "",
+            "phone": "",
+            "portable": "",
+            "car": "",
+            "default": ["", "", ""]
+        },
+        "tooltip": false,
+        "on-click-right": "pactl set-sink-mute @DEFAULT_SINK@ toggle",
+        "on-click": "pavucontrol"
+    },
+    "custom/media": {
+        "format": "{icon} {}",
+        "return-type": "json",
+        "max-length": 80,
+        "format-icons": {
+            "spotify": "",
+            "mpv": "",
+            "default": ""
+        },
+        "on-click": "sway [workspace=$wsMusic] focus",
+        "escape": false,
+        "exec": "$HOME/.config/waybar/mediaplayer.py -I chromium 2> /dev/null"
+    },
+    "custom/toggl": {
+        "exec": "$HOME/.config/waybar/toggl.lua 2>/dev/null",
+        "interval": 30
+    },
+    "mpd": {
+        "format": "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}{artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) ",
+        "format-disconnected": "Disconnected",
+        "format-stopped": "{consumeIcon}{randomIcon}{repeatIcon}{singleIcon}Stopped",
+        "unknown-tag": "N/A",
+        "interval": 2,
+        "consume-icons": {
+            "on": " "
+        },
+        "random-icons": {
+            "off": "",
+            "on": " "
+        },
+        "repeat-icons": {
+            "on": " "
+        },
+        "single-icons": {
+            "on": "1 "
+        },
+        "state-icons": {
+            "paused": "",
+            "playing": ""
+        },
+        "tooltip-format": "MPD (connected)",
+        "tooltip-format-disconnected": "MPD (disconnected)"
+    }
+}
diff --git a/.config/waybar/mediaplayer.py b/.config/waybar/mediaplayer.py
new file mode 100755
index 0000000..ce2314d
--- /dev/null
+++ b/.config/waybar/mediaplayer.py
@@ -0,0 +1,168 @@
+#!/usr/bin/env python3
+
+import argparse
+import json
+import logging
+import signal
+import sys
+from datetime import timedelta
+from math import floor
+
+# yapf: disable
+import gi
+gi.require_version('Playerctl', '2.0')
+from gi.repository import GLib, Playerctl
+# yapf: enable
+
+logger = logging.getLogger(__name__)
+
+
+def write_output(text, player):
+    logger.info('Writing output')
+
+    output = {
+        'text': text,
+        'class': 'custom-' + player.props.player_name,
+        'alt': player.props.player_name
+    }
+
+    sys.stdout.write(json.dumps(output) + '\n')
+    sys.stdout.flush()
+
+
+def on_play(player, status, manager):
+    logger.info('Received new playback status')
+    on_metadata(player, player.props.metadata, manager)
+
+
+def on_metadata(player, metadata, manager):
+    logger.info('Received new metadata')
+    track_info = ''
+
+    if player.props.player_name == 'spotify' and \
+            'mpris:trackid' in metadata.keys() and \
+            ':ad:' in player.props.metadata['mpris:trackid']:
+        track_info = 'AD PLAYING'
+
+    if player.get_title() and player.get_title() != '':
+        track_info = f"{player.get_title()}"
+    if player.get_artist() and player.get_artist() != '':
+        track_info = f"{player.get_artist()} - {track_info}"
+
+    if 'mpris:length' in player.props.metadata.keys():
+        dur_td = timedelta(microseconds=player.props.metadata['mpris:length'])
+        dur_h, remainder = divmod(dur_td.total_seconds(), 3600)
+        dur_m, dur_s = divmod(remainder, 60)
+        dur = f"{floor(dur_m)}:{floor(dur_s):02}"
+        if dur_h > 0:
+            dur = f"{floor(dur_h)}:{dur}"
+        track_info = '{} ({})'.format(track_info, str(dur))
+
+    if player.props.status == 'Paused' and track_info:
+        track_info = ' ' + track_info
+
+    if player.props.status == 'Stopped':
+        return
+
+    if track_info == '':
+        logger.warning('TrackInfo was empty after parsing')
+        return
+
+    write_output(track_info, player)
+
+
+def on_player_appeared(manager, player, selected_player=None):
+    if player is not None and (selected_player is None
+                               or player.name == selected_player):
+        init_player(manager, player)
+    else:
+        logger.debug(
+            "New player appeared, but it's not the selected player, skipping")
+
+
+def on_player_vanished(manager, player):
+    logger.info('Player has vanished')
+    sys.stdout.write('\n')
+    sys.stdout.flush()
+
+
+def init_player(manager, name):
+    logger.debug('Initialize player: {player}'.format(player=name.name))
+    player = Playerctl.Player.new_from_name(name)
+    player.connect('playback-status', on_play, manager)
+    player.connect('metadata', on_metadata, manager)
+    manager.manage_player(player)
+    on_metadata(player, player.props.metadata, manager)
+
+
+def signal_handler(sig, frame):
+    logger.debug('Received signal to stop, exiting')
+    sys.stdout.write('\n')
+    sys.stdout.flush()
+    # loop.quit()
+    sys.exit(0)
+
+
+def parse_arguments():
+    parser = argparse.ArgumentParser()
+
+    # Increase verbosity with every occurance of -v
+    parser.add_argument('-v', '--verbose', action='count', default=0)
+
+    # Define for which player we're listening
+    parser.add_argument('--player',
+                        help='player to listen for')
+
+    # Define which players to ignore entirely
+    parser.add_argument('-I', '--ignore',
+                        action='append',
+                        help='players to ignore')
+
+    return parser.parse_args()
+
+
+def main():
+    arguments = parse_arguments()
+
+    # Initialize logging
+    logging.basicConfig(stream=sys.stderr,
+                        level=logging.DEBUG,
+                        format='%(name)s %(levelname)s %(message)s')
+
+    # Logging is set by default to WARN and higher.
+    # With every occurrence of -v it's lowered by one
+    logger.setLevel(max((3 - arguments.verbose) * 10, 0))
+
+    # Log the sent command line arguments
+    logger.debug('Arguments received {}'.format(vars(arguments)))
+
+    manager = Playerctl.PlayerManager()
+    loop = GLib.MainLoop()
+
+    manager.connect('name-appeared',
+                    lambda *args: on_player_appeared(*args, arguments.player))
+    manager.connect('player-vanished', on_player_vanished)
+
+    signal.signal(signal.SIGINT, signal_handler)
+    signal.signal(signal.SIGTERM, signal_handler)
+
+    for player in manager.props.player_names:
+        if arguments.player is not None and arguments.player != player.name:
+            logger.debug(
+                '{player} is not the filtered player, skipping it'.format(
+                    player=player.name))
+            continue
+
+        if arguments.ignore is not None and player.name in arguments.ignore:
+            logger.debug(
+                '{player} is ignored, skipping it'.format(
+                    player=player.name))
+            continue
+
+        init_player(manager, player)
+
+    loop.run()
+
+
+if __name__ == '__main__':
+    main()
diff --git a/.config/waybar/style.css b/.config/waybar/style.css
new file mode 100644
index 0000000..f832fd6
--- /dev/null
+++ b/.config/waybar/style.css
@@ -0,0 +1,194 @@
+@define-color foreground #fffefe;
+@define-color background #221e1d;
+@define-color accent #005CAF;
+@define-color accentdarker #0B346F;
+@define-color dimmed #777777;
+@define-color dimmeddarker #302a29;
+@define-color urgent #db4d6d;
+
+* {
+  border: none;
+  border-radius: 0;
+  font-family: Iosevka Medium, Noto Sans, Font Awesome, monospace;
+  font-size: 12pt;
+  min-height: 0;
+}
+
+window#waybar {
+  background: @background;
+  /* opacity: 0.98; */
+  /* border-bottom: 3px solid rgba(100, 114, 125, 0.5); */
+  color: @foreground;
+  transition-property: background-color;
+  transition-duration: 0.1s;
+}
+
+window#waybar.hidden {
+  opacity: 0.2;
+}
+/* window#waybar.empty {} */
+/* window#waybar.solo {} */
+/* window#waybar.<appid> {} */
+
+#workspaces button {
+  padding: 0 5px;
+  /* background-color: transparent; */
+  background: transparent;
+  color: @dimmed;
+  /* border-bottom: 3px solid transparent; */
+}
+
+/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */
+#workspaces button:hover {
+  background: @dimmeddarker;
+  box-shadow: inherit;
+  text-shadow: inherit;
+}
+
+#workspaces button.focused {
+  color: @foreground;
+  background: @accentdarker;
+}
+#workspaces button.focused:hover {
+  background: @accent;
+}
+
+#workspaces button.urgent {
+  color: @background;
+  background-color: @urgent;
+}
+
+#window {
+  color: @foreground;
+  border-top: 2px solid @accent;
+}
+
+#mode {
+  font-style: italic;
+  background-color: #64727d;
+  border-top: 2px solid @foreground;
+}
+
+#clock,
+#battery,
+#cpu,
+#memory,
+#temperature,
+#backlight,
+#network,
+#pulseaudio,
+#custom-media,
+#custom-toggl,
+#tray,
+#mode,
+#window,
+#idle_inhibitor {
+  padding: 0 0.3rem;
+  margin: 0 0.25rem;
+  color: @foreground;
+  border-top: 2px solid @dimmeddarker;
+}
+
+#clock {
+  /* background-color: #64727d; */
+}
+#clock.local {
+  margin-right: 0;
+  padding-right: 0;
+}
+#clock.utc {
+  margin: 0;
+  padding: 0;
+  padding-left: 0.3rem;
+  color: @dimmed;
+}
+
+#battery {
+}
+#battery.charging {
+  color: @foreground;
+  background-color: #26a65b;
+}
+
+@keyframes blink {
+  to {
+    background-color: @foreground;
+    color: @background;
+  }
+}
+
+#battery.critical:not(.charging) {
+  background-color: #f53c3c;
+  color: @foreground;
+  animation-name: blink;
+  animation-duration: 0.5s;
+  animation-timing-function: linear;
+  animation-iteration-count: infinite;
+  animation-direction: alternate;
+}
+
+label:focus {
+  background-color: @background;
+}
+
+#cpu {
+}
+#memory {
+}
+#backlight {
+}
+#network {
+}
+#network.disconnected {
+  color: @dimmed;
+}
+#pulseaudio {
+}
+#pulseaudio.muted {
+  color: @dimmed;
+}
+
+#custom-media {
+  min-width: 100px;
+  color: @foreground;
+  border-top: 2px solid #628aaa;
+}
+#custom-media.custom-spotify,
+#custom-media.custom-spotifyd {
+  border-top: 2px solid #1DB954;
+}
+#custom-media.custom-mpv {
+  border-top: 2px solid #520053;
+}
+
+#custom-toggl {
+  color: @foreground;
+  /* background-color: #DB4D6D; */
+  border-top: 2px solid #DB4D60;
+}
+
+#temperature {
+}
+
+#temperature.critical {
+  background-color: #eb4d4b;
+}
+
+#tray {
+}
+
+#idle_inhibitor {
+  color: @dimmed;
+}
+#idle_inhibitor.activated {
+  color: unset;
+}
+
+#mpd {
+}
+#mpd.disconnected {
+}
+#mpd.stopped {
+}
+#mpd.paused {
+}
diff --git a/.config/waybar/toggl.lua b/.config/waybar/toggl.lua
new file mode 100755
index 0000000..e44fce2
--- /dev/null
+++ b/.config/waybar/toggl.lua
@@ -0,0 +1,28 @@
+#!/usr/bin/env luajit
+
+TOKEN = os.getenv("TOGGL_TOKEN")
+if not TOKEN then
+    io.stderr:write("need TOGGL_TOKEN\n")
+    os.exit(1)
+end
+
+function timer_duration()
+    cmd = string.format('toggl -t %s -j timer ls | jq -r ".[0].duration"', TOKEN)
+    local f = assert(io.popen(cmd, 'r'))
+    local s = assert(f:read('*a'))
+    f:close()
+    if not (s == '') then
+        return tonumber(s)
+    end
+end
+
+unix_time = os.time()
+
+diff = timer_duration()
+if not diff then
+    os.exit(0)
+end
+
+d = unix_time + diff
+
+print(string.format(' %dh %.2dm', d/(60*60), d/60%60))
diff --git a/.config/wofi/config b/.config/wofi/config
new file mode 100644
index 0000000..35e18a7
--- /dev/null
+++ b/.config/wofi/config
@@ -0,0 +1,2 @@
+allow_images=true
+# allow_markup=true
diff --git a/.config/wofi/style.css b/.config/wofi/style.css
new file mode 100644
index 0000000..38f811b
--- /dev/null
+++ b/.config/wofi/style.css
@@ -0,0 +1,16 @@
+window {
+    font-family: Iosevka;
+    font-size: large;
+}
+
+#input {
+    margin: .5em;
+}
+
+#text {
+    margin: .2em .5em;
+}
+
+#img {
+    -gtk-icon-transform: scale(.6);
+}
diff --git a/.config/yamlfs/balena.yml b/.config/yamlfs/balena.yml
new file mode 100644
index 0000000..5fccdd2
--- /dev/null
+++ b/.config/yamlfs/balena.yml
@@ -0,0 +1,18 @@
+docker-compose.yml: |-
+  version: '2.1'
+
+  services:
+    build: ./container
+  
+  volumes:
+    ctr-data:
+
+container:
+  Dockerfile.template: |-
+    # vim: ft=dockerfile
+    FROM balenalib/%%BALENA_MACHINE_NAME%%-alpine:run
+
+    # RUN apk add --no-cache
+
+    # COPY ./start.sh /usr/local/bin/
+    # CMD [ "start.sh" ]
diff --git a/.config/yamlfs/go.yml b/.config/yamlfs/go.yml
new file mode 100644
index 0000000..f7797be
--- /dev/null
+++ b/.config/yamlfs/go.yml
@@ -0,0 +1,21 @@
+cmd:
+  app:
+    main.go: |-
+      package main
+
+      func main() {
+        println("hello world")
+      }
+
+go.mod: |-
+  module example.com/app
+
+  go 1.13
+
+contrib:
+  data: {}
+
+README.md: |-
+  # app
+  
+  this is an app
diff --git a/.config/zathura/zathurarc b/.config/zathura/zathurarc
new file mode 100644
index 0000000..80811d4
--- /dev/null
+++ b/.config/zathura/zathurarc
@@ -0,0 +1,33 @@
+set window-title-home-tilde true
+set statusbar-basename true
+set selection-clipboard clipboard
+set recolor "true"
+
+set completion-bg "#1c1c1c"
+set completion-fg "#d0d0d0"
+
+set completion-highlight-bg "#5faf00"
+set completion-highlight-fg "#1c1c1c"
+
+set inputbar-bg "#1c1c1c"
+set inputbar-fg "#d0d0d0"
+
+set statusbar-bg "#1c1c1c"
+set statusbar-fg "#d0d0d0"
+
+set recolor-lightcolor "#1c1c1c"
+set recolor-darkcolor "#d0d0d0"
+set default-bg "#1c1c1c"
+
+set index-bg "#585858"
+set index-fg "#d0d0d0"
+set index-active-bg "#1c1c1c"
+set index-active-fg "#d0d0d0"
+
+map P print
+map c recolor
+map R rotate rotate-ccw
+map n zoom in
+map p zoom out
+map M mark_add
+map m mark_evaluate