diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..1b218a7
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+dotfiles/** linguist-vendored
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..bfd0425
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+.direnv
+result
+result/
diff --git a/Justfile b/Justfile
new file mode 100644
index 0000000..fb304ff
--- /dev/null
+++ b/Justfile
@@ -0,0 +1,97 @@
+# Set current hostname
+hostname := `hostname`
+
+# Set current username
+username := `whoami`
+
+
+anywhere input:
+ # Perform nixos-anywhere install
+ nix run github:nix-community/nixos-anywhere -- --generate-hardware-config nixos-generate-config ./hosts/{{input}}/hardware.nix --flake .#{{input}} --target-host root@{{input}}
+
+
+anywhere-lb input:
+ # Perform nixos-anywhere install (local builder)
+ nix run github:nix-community/nixos-anywhere -- --generate-hardware-config nixos-generate-config ./hosts/{{input}}/hardware.nix --flake .#{{input}} --target-host root@{{input}} --build-on local
+
+
+anywhere-vm input:
+ # Test nixos-anywhere install in vm
+ nix run github:nix-community/nixos-anywhere -- --flake .#{{input}} --vm-test
+
+
+build input:
+ # Build
+ sudo nixos-rebuild build --flake .#{{input}} --show-trace -L -v
+
+
+build-vm input:
+ # Build a vm
+ sudo nixos-rebuild build-vm --flake .#{{input}} --show-trace -L -v
+
+
+clean:
+ # Remove useless nix-channel files
+ sudo rm -rf /nix/var/nix/profiles/per-user/root/channels /root/.nix-defexpr/channels
+
+
+format:
+ # Use alejandra and deadnix to format code
+ deadnix -e
+ alejandra .
+
+
+gc:
+ # Do garbage-clean (remove unused packages, etc)
+ sudo nix profile wipe-history --older-than 7d --profile /nix/var/nix/profiles/system
+ sudo nix-collect-garbage --delete-old
+
+
+ghc:
+ # Generate hardware.nix
+ nixos-generate-config --show-hardware-config > ./hosts/{{hostname}}/hardware.nix
+
+
+install:
+ # Install this flake
+ bash install.sh
+
+
+list:
+ # List system packages
+ nix-store -qR /run/current-system | cat
+
+
+profile:
+ # Show system profile
+ sudo nix profile history --profile /nix/var/nix/profiles/system
+
+
+switch input:
+ # Let system rebuild and switch
+ sudo nixos-rebuild switch --flake .#{{input}} --show-trace -L -v
+
+
+update:
+ # Update flake.lock
+ nix flake update --extra-experimental-features flakes --extra-experimental-features nix-command --show-trace
+
+
+upgrade:
+ # Let system totally upgrade
+ ## Set hostname and username in flake.nix
+ sed -i "/^\s*hostname[[:space:]]*=[[:space:]]*\"/s/\"\(.*\)\"/\"{{hostname}}\"/" ./flake.nix
+ sed -i "/^\s*username[[:space:]]*=[[:space:]]*\"/s/\"\(.*\)\"/\"{{username}}\"/" ./flake.nix
+ git add .
+ ## Rebuild the system
+ sudo nixos-rebuild switch --flake .#{{hostname}} --show-trace
+
+
+upgrade-debug:
+ # Let system totally upgrade (deBug Mode)
+ ## Set hostname and username in flake.nix
+ sed -i "/^\s*hostname[[:space:]]*=[[:space:]]*\"/s/\"\(.*\)\"/\"{{hostname}}\"/" ./flake.nix
+ sed -i "/^\s*username[[:space:]]*=[[:space:]]*\"/s/\"\(.*\)\"/\"{{username}}\"/" ./flake.nix
+ git add .
+ ## Rebuild the system
+ sudo unbuffer nixos-rebuild switch --flake .#{{hostname}} --sudo --log-format internal-json --show-trace -L -v |& nom --json
diff --git a/README.md b/README.md
index 81e0acc..67fb767 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,22 @@
-# DCGOS
\ No newline at end of file
+
+
+
+# DCGOS
+
+
+
+## Install
+
+```
+nix-shell -p git
+
+git clone https://github.com/Dichgrem/DCGOS.git && cd DCGOS && bash install.sh
+```
+## Acknowledgements
+-
+-
+-
+-
+-
+-
+-
diff --git a/dotfiles/.config/Kvantum/catppuccin-mocha-lavender/catppuccin-mocha-lavender.kvconfig b/dotfiles/.config/Kvantum/catppuccin-mocha-lavender/catppuccin-mocha-lavender.kvconfig
new file mode 100644
index 0000000..ee9cc6e
--- /dev/null
+++ b/dotfiles/.config/Kvantum/catppuccin-mocha-lavender/catppuccin-mocha-lavender.kvconfig
@@ -0,0 +1,467 @@
+[%General]
+author=elkrien based on Arc Dark style
+comment=Catppuccin-Mocha-Lavender
+combo_focus_rect=true
+spread_menuitems=true
+left_tabs=true
+mirror_doc_tabs=true
+scroll_width=8
+attach_active_tab=true
+composite=false
+menu_shadow_depth=7
+tooltip_shadow_depth=0
+splitter_width=7
+check_size=16
+slider_width=4
+slider_handle_width=18
+slider_handle_length=18
+textless_progressbar=false
+menubar_mouse_tracking=true
+slim_toolbars=false
+toolbutton_style=1
+x11drag=menubar_and_primary_toolbar
+double_click=false
+translucent_windows=false
+blurring=false
+popup_blurring=false
+opaque=kaffeine,kmplayer,subtitlecomposer,kdenlive,vlc,smplayer,smplayer2,avidemux,avidemux2_qt4,avidemux3_qt4,avidemux3_qt5,kamoso,QtCreator,VirtualBox,trojita,dragon,digikam,qmplay2
+group_toolbar_buttons=false
+vertical_spin_indicators=false
+fill_rubberband=false
+spread_progressbar=true
+merge_menubar_with_toolbar=true
+small_icon_size=16
+large_icon_size=32
+button_icon_size=16
+scroll_arrows=false
+iconless_pushbutton=true
+toolbar_icon_size=16
+combo_as_lineedit=true
+button_contents_shift=false
+groupbox_top_label=true
+inline_spin_indicators=true
+joined_inactive_tabs=false
+layout_spacing=2
+submenu_overlap=0
+tooltip_delay=-1
+animate_states=false
+transient_scrollbar=false
+alt_mnemonic=true
+combo_menu=true
+layout_margin=4
+no_window_pattern=false
+respect_DE=true
+scroll_min_extent=36
+scrollable_menu=false
+scrollbar_in_view=false
+spin_button_width=16
+submenu_delay=250
+tree_branch_line=true
+progressbar_thickness=8
+click_behavior=0
+contrast=1.00
+dialog_button_layout=0
+drag_from_buttons=false
+hide_combo_checkboxes=false
+intensity=1.00
+no_inactiveness=false
+reduce_menu_opacity=0
+reduce_window_opacity=10
+saturation=1.00
+shadowless_popup=false
+transient_groove=false
+menu_blur_radius=0
+tooltip_blur_radius=0
+
+[GeneralColors]
+window.color=#1E1E2E
+base.color=#181825
+alt.base.color=#181825
+button.color=#313244
+light.color=#45475A
+mid.light.color=#45475A
+dark.color=#181825
+mid.color=#181825
+highlight.color=#B4BEFE
+inactive.highlight.color=#B4BEFE
+text.color=#CDD6F4
+window.text.color=#CDD6F4
+button.text.color=#CDD6F4
+disabled.text.color=#585B70
+tooltip.text.color=#CDD6F4
+highlight.text.color=#181825
+link.color=#F5E0DC
+link.visited.color=#89B4FA
+
+[ItemView]
+inherits=PanelButtonCommand
+frame.element=itemview
+interior.element=itemview
+frame=true
+interior=true
+text.iconspacing=3
+text.toggle.color=#181825
+
+[RadioButton]
+inherits=PanelButtonCommand
+frame=false
+interior.element=radio
+
+[CheckBox]
+inherits=PanelButtonCommand
+frame=false
+interior.element=checkbox
+
+[TreeExpander]
+indicator.element=tree
+indicator.size=8
+
+[ToolTip]
+frame.top=4
+frame.right=4
+frame.bottom=4
+frame.left=4
+frame=true
+
+[PanelButtonCommand]
+inherits=PanelButtonCommand
+interior.element=button
+frame.element=button
+text.normal.color=#CDD6F4
+text.focus.color=#CDD6F4
+text.press.color=#181825
+text.toggle.color=#181825
+
+[PanelButtonTool]
+inherits=PanelButtonCommand
+
+[DockTitle]
+inherits=PanelButtonCommand
+interior=false
+frame=false
+text.margin.top=5
+text.margin.bottom=5
+text.margin.left=5
+text.margin.right=5
+indicator.size=0
+
+[Dock]
+interior.element=toolbar
+frame.element=toolbar
+frame=true
+interior=true
+
+[GroupBox]
+inherits=PanelButtonCommand
+interior.element=tabframe
+interior=true
+frame=false
+
+[Focus]
+inherits=PanelButtonCommand
+frame=true
+frame.element=focus
+frame.top=1
+frame.bottom=1
+frame.left=1
+frame.right=1
+frame.patternsize=20
+
+[GenericFrame]
+inherits=PanelButtonCommand
+frame.element=common
+frame.top=1
+frame.bottom=1
+frame.left=1
+frame.right=1
+
+[Slider]
+inherits=PanelButtonCommand
+interior=true
+frame.element=slider
+interior.element=slider
+frame.top=3
+frame.bottom=3
+frame.left=3
+frame.right=3
+focusFrame=true
+
+[SliderCursor]
+inherits=PanelButtonCommand
+interior=true
+interior.element=slidercursor
+frame=false
+
+[LineEdit]
+inherits=PanelButtonCommand
+frame.element=lineedit
+interior.element=lineedit
+
+[IndicatorSpinBox]
+inherits=LineEdit
+frame.element=lineedit
+interior.element=lineedit
+frame.top=0
+frame.bottom=2
+frame.left=2
+frame.right=2
+indicator.size=8
+
+[DropDownButton]
+inherits=PanelButtonCommand
+frame.top=2
+frame.bottom=2
+frame.left=0
+frame.right=1
+indicator.size=8
+
+[ToolboxTab]
+inherits=PanelButtonCommand
+frame.element=tabframe
+frame.top=1
+frame.bottom=1
+frame.left=1
+frame.right=1
+
+[Tab]
+inherits=PanelButtonCommand
+interior.element=tab
+frame.element=tab
+frame.top=2
+frame.bottom=3
+frame.left=3
+frame.right=3
+indicator.size=10
+text.normal.color=#585B70
+text.focus.color=#CDD6F4
+text.press.color=#CDD6F4
+text.toggle.color=#CDD6F4
+focusFrame=true
+
+[TabBarFrame]
+inherits=GenericFrame
+frame=true
+frame.element=tabBarFrame
+interior=false
+frame.top=4
+frame.bottom=4
+frame.left=4
+frame.right=4
+
+[TabFrame]
+inherits=PanelButtonCommand
+frame.element=tabframe
+interior.element=tabframe
+
+[Dialog]
+inherits=TabBarFrame
+frame.element=tabframe
+interior=false
+frame=false
+frame.top=1
+frame.bottom=1
+frame.left=1
+frame.right=1
+
+[HeaderSection]
+inherits=PanelButtonCommand
+interior.element=header
+frame.element=header
+frame.top=0
+frame.bottom=1
+frame.left=1
+frame.right=1
+frame.expansion=0
+text.normal.color=#CDD6F4
+text.focus.color=#B4BEFE
+text.press.color=#CDD6F4
+text.toggle.color=#CDD6F4
+indicator.element=harrow
+
+[SizeGrip]
+inherits=PanelButtonCommand
+frame=false
+interior=false
+indicator.element=resize-grip
+indicator.size=0
+
+[Toolbar]
+inherits=PanelButtonCommand
+interior.element=menubar
+frame.element=menubar
+frame=true
+frame.bottom=4
+frame.left=4
+frame.right=4
+text.normal.color=#CDD6F4
+text.focus.color=#CDD6F4
+text.press.color=#B4BEFE
+text.toggle.color=#B4BEFE
+text.bold=false
+
+[MenuBar]
+inherits=PanelButtonCommand
+frame.element=menubar
+interior.element=menubar
+frame.bottom=0
+text.normal.color=#CDD6F4
+frame.expansion=0
+text.bold=false
+
+[ToolbarButton]
+frame.element=tbutton
+interior.element=tbutton
+indicator.element=arrow
+text.normal.color=#CDD6F4
+text.focus.color=#CDD6F4
+text.press.color=#181825
+text.toggle.color=#181825
+text.bold=false
+
+[Scrollbar]
+inherits=PanelButtonCommand
+indicator.size=0
+interior=false
+frame=false
+
+[ScrollbarGroove]
+inherits=PanelButtonCommand
+interior=false
+frame=false
+
+[ScrollbarSlider]
+inherits=PanelButtonCommand
+interior=false
+frame.element=scrollbarslider
+frame.top=4
+frame.bottom=4
+frame.left=4
+frame.right=4
+
+[ProgressbarContents]
+inherits=PanelButtonCommand
+frame=true
+frame.element=progress-pattern
+interior.element=progress-pattern
+frame.top=2
+frame.bottom=2
+frame.left=2
+frame.right=2
+
+[Progressbar]
+inherits=PanelButtonCommand
+frame.element=progress
+interior.element=progress
+frame.top=2
+frame.bottom=2
+frame.left=2
+frame.right=2
+text.margin=0
+text.normal.color=#CDD6F4
+text.focus.color=#CDD6F4
+text.press.color=#181825
+text.toggle.color=#181825
+text.bold=false
+frame.expansion=18
+
+[RadioButton]
+inherits=PanelButtonCommand
+
+[Menu]
+frame.element=menu
+interior.element=menu
+inherits=PanelButtonCommand
+text.press.color=#181825
+text.toggle.color=#181825
+text.bold=false
+frame.top=3
+frame.bottom=3
+frame.left=3
+frame.right=3
+
+[MenuItem]
+inherits=PanelButtonCommand
+interior.element=menuitem
+indicator.size=8
+text.focus.color=#CDD6F4
+text.press.color=#CDD6F4
+
+[MenuBarItem]
+inherits=PanelButtonCommand
+interior.element=menubaritem
+frame=false
+text.margin.top=3
+text.margin.bottom=3
+text.margin.left=5
+text.margin.right=5
+
+[StatusBar]
+inherits=Toolbar
+frame.element=toolbar
+font.bold=true
+text.normal.color=#CDD6F4
+frame=true
+frame.top=0
+frame.bottom=0
+
+[TitleBar]
+inherits=PanelButtonCommand
+frame=false
+interior=false
+text.margin.top=2
+text.margin.bottom=2
+text.margin.left=3
+text.margin.right=3
+
+[ComboBox]
+inherits=PanelButtonCommand
+indicator.size=8
+frame.top=3
+frame.bottom=3
+frame.left=3
+frame.right=3
+text.margin.top=1
+text.margin.bottom=1
+text.margin.left=3
+text.margin.right=3
+text.toggle.color=#CDD6F4
+
+[ToolboxTab]
+inherits=PanelButtonCommand
+text.normal.color=#CDD6F4
+text.press.color=#CDD6F4
+text.focus.color=#CDD6F4
+
+[Hacks]
+transparent_dolphin_view=false
+blur_konsole=true
+transparent_ktitle_label=false
+transparent_menutitle=false
+respect_darkness=true
+kcapacitybar_as_progressbar=true
+force_size_grip=false
+iconless_pushbutton=true
+iconless_menu=false
+disabled_icon_opacity=100
+lxqtmainmenu_iconsize=0
+normal_default_pushbutton=true
+single_top_toolbar=false
+tint_on_mouseover=0
+transparent_pcmanfm_sidepane=false
+transparent_pcmanfm_view=false
+blur_translucent=false
+centered_forms=false
+kinetic_scrolling=false
+middle_click_scroll=false
+no_selection_tint=false
+noninteger_translucency=false
+style_vertical_toolbars=false
+blur_only_active_window=false
+
+[Window]
+interior=true
+interior.element=window
+frame.top=0
+frame.bottom=0
+frame.left=0
+frame.right=0
diff --git a/dotfiles/.config/Kvantum/catppuccin-mocha-lavender/catppuccin-mocha-lavender.svg b/dotfiles/.config/Kvantum/catppuccin-mocha-lavender/catppuccin-mocha-lavender.svg
new file mode 100644
index 0000000..311513c
--- /dev/null
+++ b/dotfiles/.config/Kvantum/catppuccin-mocha-lavender/catppuccin-mocha-lavender.svg
@@ -0,0 +1,1958 @@
+
diff --git a/dotfiles/.config/Kvantum/kvantum.kvconfig b/dotfiles/.config/Kvantum/kvantum.kvconfig
new file mode 100644
index 0000000..bfb2462
--- /dev/null
+++ b/dotfiles/.config/Kvantum/kvantum.kvconfig
@@ -0,0 +1,2 @@
+[General]
+theme=catppuccin-mocha-lavender
diff --git a/dotfiles/.config/alacritty/alacritty.toml b/dotfiles/.config/alacritty/alacritty.toml
new file mode 100644
index 0000000..844e8d6
--- /dev/null
+++ b/dotfiles/.config/alacritty/alacritty.toml
@@ -0,0 +1,133 @@
+[general]
+live_config_reload = false
+import = ["~/.config/alacritty/catppuccin-mocha.toml"]
+
+[env]
+TERM = "xterm-256color"
+
+[window]
+dynamic_padding = true
+decorations = "None"
+
+[window.dimensions]
+columns = 100
+lines = 30
+
+[window.class]
+instance = "Alacritty"
+general = "Alacritty"
+
+[scrolling]
+history = 10000
+multiplier = 3
+
+[font]
+size = 12
+
+[font.normal]
+family = "JetBrainsMono Nerd Font"
+style = "Regular"
+
+[font.bold]
+family = "JetBrainsMono Nerd Font"
+style = "Bold"
+
+[font.italic]
+family = "JetBrainsMono Nerd Font"
+style = "Italic"
+
+[font.bold_italic]
+family = "JetBrainsMono Nerd Font"
+style = "Bold Italic"
+
+[selection]
+semantic_escape_chars = ",│`|:\"' ()[]{}<>\t"
+save_to_clipboard = true
+
+[cursor]
+style = "Underline"
+vi_mode_style = "None"
+unfocused_hollow = true
+thickness = 0.15
+
+[mouse]
+hide_when_typing = true
+
+[[mouse.bindings]]
+mouse = "Middle"
+action = "PasteSelection"
+
+[keyboard]
+[[keyboard.bindings]]
+key = "Paste"
+action = "Paste"
+
+[[keyboard.bindings]]
+key = "Copy"
+action = "Copy"
+
+[[keyboard.bindings]]
+key = "L"
+mods = "Control"
+action = "ClearLogNotice"
+
+[[keyboard.bindings]]
+key = "L"
+mods = "Control"
+mode = "~Vi"
+chars = "\f"
+
+[[keyboard.bindings]]
+key = "PageUp"
+mods = "Shift"
+mode = "~Alt"
+action = "ScrollPageUp"
+
+[[keyboard.bindings]]
+key = "PageDown"
+mods = "Shift"
+mode = "~Alt"
+action = "ScrollPageDown"
+
+[[keyboard.bindings]]
+key = "Home"
+mods = "Shift"
+mode = "~Alt"
+action = "ScrollToTop"
+
+[[keyboard.bindings]]
+key = "End"
+mods = "Shift"
+mode = "~Alt"
+action = "ScrollToBottom"
+
+[[keyboard.bindings]]
+key = "V"
+mods = "Control|Shift"
+action = "Paste"
+
+[[keyboard.bindings]]
+key = "C"
+mods = "Control|Shift"
+action = "Copy"
+
+[[keyboard.bindings]]
+key = "F"
+mods = "Control|Shift"
+action = "SearchForward"
+
+[[keyboard.bindings]]
+key = "B"
+mods = "Control|Shift"
+action = "SearchBackward"
+
+[[keyboard.bindings]]
+key = "C"
+mods = "Control|Shift"
+mode = "Vi"
+action = "ClearSelection"
+
+[[keyboard.bindings]]
+key = "Key0"
+mods = "Control"
+action = "ResetFontSize"
diff --git a/dotfiles/.config/alacritty/catppuccin-mocha.toml b/dotfiles/.config/alacritty/catppuccin-mocha.toml
new file mode 100644
index 0000000..7762dcd
--- /dev/null
+++ b/dotfiles/.config/alacritty/catppuccin-mocha.toml
@@ -0,0 +1,65 @@
+[colors.primary]
+background = "#1e1e2e"
+foreground = "#cdd6f4"
+dim_foreground = "#7f849c"
+bright_foreground = "#cdd6f4"
+
+[colors.cursor]
+text = "#1e1e2e"
+cursor = "#f5e0dc"
+
+[colors.vi_mode_cursor]
+text = "#1e1e2e"
+cursor = "#b4befe"
+
+[colors.search.matches]
+foreground = "#1e1e2e"
+background = "#a6adc8"
+
+[colors.search.focused_match]
+foreground = "#1e1e2e"
+background = "#a6e3a1"
+
+[colors.footer_bar]
+foreground = "#1e1e2e"
+background = "#a6adc8"
+
+[colors.hints.start]
+foreground = "#1e1e2e"
+background = "#f9e2af"
+
+[colors.hints.end]
+foreground = "#1e1e2e"
+background = "#a6adc8"
+
+[colors.selection]
+text = "#1e1e2e"
+background = "#f5e0dc"
+
+[colors.normal]
+black = "#45475a"
+red = "#f38ba8"
+green = "#a6e3a1"
+yellow = "#f9e2af"
+blue = "#89b4fa"
+magenta = "#f5c2e7"
+cyan = "#94e2d5"
+white = "#bac2de"
+
+[colors.bright]
+black = "#585b70"
+red = "#f38ba8"
+green = "#a6e3a1"
+yellow = "#f9e2af"
+blue = "#89b4fa"
+magenta = "#f5c2e7"
+cyan = "#94e2d5"
+white = "#a6adc8"
+
+[[colors.indexed_colors]]
+index = 16
+color = "#fab387"
+
+[[colors.indexed_colors]]
+index = 17
+color = "#f5e0dc"
diff --git a/dotfiles/.config/aria2/AriaNg-1.3.10-AllInOne/LICENSE b/dotfiles/.config/aria2/AriaNg-1.3.10-AllInOne/LICENSE
new file mode 100644
index 0000000..732ce99
--- /dev/null
+++ b/dotfiles/.config/aria2/AriaNg-1.3.10-AllInOne/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016-2025 MaysWind (i@mayswind.net)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/dotfiles/.config/aria2/AriaNg-1.3.10-AllInOne/index b/dotfiles/.config/aria2/AriaNg-1.3.10-AllInOne/index
new file mode 100644
index 0000000..56d5ff2
--- /dev/null
+++ b/dotfiles/.config/aria2/AriaNg-1.3.10-AllInOne/index
@@ -0,0 +1,559 @@
+AriaNg
\ No newline at end of file
diff --git a/dotfiles/.config/aria2/aria2.conf b/dotfiles/.config/aria2/aria2.conf
new file mode 100644
index 0000000..10f2df0
--- /dev/null
+++ b/dotfiles/.config/aria2/aria2.conf
@@ -0,0 +1,9 @@
+enable-rpc=true
+rpc-listen-all=true
+rpc-allow-origin-all=true
+rpc-listen-port=6800
+continue=true
+dir=/home/dich/Downloads
+input-file=/home/dich/.config/aria2/aria2.session
+save-session=/home/dich/.config/aria2/aria2.session
+save-session-interval=60
diff --git a/dotfiles/.config/atuin/config.toml b/dotfiles/.config/atuin/config.toml
new file mode 100644
index 0000000..eedc858
--- /dev/null
+++ b/dotfiles/.config/atuin/config.toml
@@ -0,0 +1,10 @@
+enter_accept = true
+
+[sync]
+records = true
+
+[preview]
+strategy = "auto"
+
+[daemon]
+enabled = false
diff --git a/dotfiles/.config/bat/config b/dotfiles/.config/bat/config
new file mode 100644
index 0000000..b7de378
--- /dev/null
+++ b/dotfiles/.config/bat/config
@@ -0,0 +1 @@
+--theme="Catppuccin Mocha"
diff --git a/dotfiles/.config/bat/themes/Catppuccin Mocha.tmTheme b/dotfiles/.config/bat/themes/Catppuccin Mocha.tmTheme
new file mode 100644
index 0000000..cd3a27b
--- /dev/null
+++ b/dotfiles/.config/bat/themes/Catppuccin Mocha.tmTheme
@@ -0,0 +1,2059 @@
+
+
+
+
+ name
+ Catppuccin Mocha
+ semanticClass
+ theme.dark.catppuccin-mocha
+ uuid
+ 627ce890-fabb-4d39-9819-7be71f4bdca7
+ author
+ Catppuccin Org
+ colorSpaceName
+ sRGB
+ settings
+
+
+ settings
+
+ background
+ #1e1e2e
+ foreground
+ #cdd6f4
+ caret
+ #f5e0dc
+ lineHighlight
+ #313244
+ misspelling
+ #f38ba8
+ accent
+ #cba6f7
+ selection
+ #9399b240
+ activeGuide
+ #45475a
+ findHighlight
+ #3e5767
+ gutterForeground
+ #7f849c
+
+
+
+ name
+ Basic text & variable names (incl. leading punctuation)
+ scope
+ text, source, variable.other.readwrite, punctuation.definition.variable
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ Parentheses, Brackets, Braces
+ scope
+ punctuation
+ settings
+
+ foreground
+ #9399b2
+ fontStyle
+
+
+
+
+ name
+ Comments
+ scope
+ comment, punctuation.definition.comment
+ settings
+
+ foreground
+ #6c7086
+ fontStyle
+ italic
+
+
+
+ scope
+ string, punctuation.definition.string
+ settings
+
+ foreground
+ #a6e3a1
+
+
+
+ scope
+ constant.character.escape
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ Booleans, constants, numbers
+ scope
+ constant.numeric, variable.other.constant, entity.name.constant, constant.language.boolean, constant.language.false, constant.language.true, keyword.other.unit.user-defined, keyword.other.unit.suffix.floating-point
+ settings
+
+ foreground
+ #fab387
+
+
+
+ scope
+ keyword, keyword.operator.word, keyword.operator.new, variable.language.super, support.type.primitive, storage.type, storage.modifier, punctuation.definition.keyword
+ settings
+
+ foreground
+ #cba6f7
+ fontStyle
+
+
+
+
+ scope
+ entity.name.tag.documentation
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ Punctuation
+ scope
+ keyword.operator, punctuation.accessor, punctuation.definition.generic, meta.function.closure punctuation.section.parameters, punctuation.definition.tag, punctuation.separator.key-value
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ scope
+ entity.name.function, meta.function-call.method, support.function, support.function.misc, variable.function
+ settings
+
+ foreground
+ #89b4fa
+ fontStyle
+ italic
+
+
+
+ name
+ Classes
+ scope
+ entity.name.class, entity.other.inherited-class, support.class, meta.function-call.constructor, entity.name.struct
+ settings
+
+ foreground
+ #f9e2af
+ fontStyle
+ italic
+
+
+
+ name
+ Enum
+ scope
+ entity.name.enum
+ settings
+
+ foreground
+ #f9e2af
+ fontStyle
+ italic
+
+
+
+ name
+ Enum member
+ scope
+ meta.enum variable.other.readwrite, variable.other.enummember
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ Object properties
+ scope
+ meta.property.object
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ Types
+ scope
+ meta.type, meta.type-alias, support.type, entity.name.type
+ settings
+
+ foreground
+ #f9e2af
+ fontStyle
+ italic
+
+
+
+ name
+ Decorators
+ scope
+ meta.annotation variable.function, meta.annotation variable.annotation.function, meta.annotation punctuation.definition.annotation, meta.decorator, punctuation.decorator
+ settings
+
+ foreground
+ #fab387
+
+
+
+ scope
+ variable.parameter, meta.function.parameters
+ settings
+
+ foreground
+ #eba0ac
+ fontStyle
+ italic
+
+
+
+ name
+ Built-ins
+ scope
+ constant.language, support.function.builtin
+ settings
+
+ foreground
+ #f38ba8
+
+
+
+ scope
+ entity.other.attribute-name.documentation
+ settings
+
+ foreground
+ #f38ba8
+
+
+
+ name
+ Preprocessor directives
+ scope
+ keyword.control.directive, punctuation.definition.directive
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ Type parameters
+ scope
+ punctuation.definition.typeparameters
+ settings
+
+ foreground
+ #89dceb
+
+
+
+ name
+ Namespaces
+ scope
+ entity.name.namespace
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ Property names (left hand assignments in json/yaml/css)
+ scope
+ support.type.property-name.css
+ settings
+
+ foreground
+ #89b4fa
+ fontStyle
+
+
+
+
+ name
+ This/Self keyword
+ scope
+ variable.language.this, variable.language.this punctuation.definition.variable
+ settings
+
+ foreground
+ #f38ba8
+
+
+
+ name
+ Object properties
+ scope
+ variable.object.property
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ String template interpolation
+ scope
+ string.template variable, string variable
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ `new` as bold
+ scope
+ keyword.operator.new
+ settings
+
+ fontStyle
+ bold
+
+
+
+ name
+ C++ extern keyword
+ scope
+ storage.modifier.specifier.extern.cpp
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ C++ scope resolution
+ scope
+ entity.name.scope-resolution.template.call.cpp, entity.name.scope-resolution.parameter.cpp, entity.name.scope-resolution.cpp, entity.name.scope-resolution.function.definition.cpp
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ C++ doc keywords
+ scope
+ storage.type.class.doxygen
+ settings
+
+ fontStyle
+
+
+
+
+ name
+ C++ operators
+ scope
+ storage.modifier.reference.cpp
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ C# Interpolated Strings
+ scope
+ meta.interpolation.cs
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ C# xml-style docs
+ scope
+ comment.block.documentation.cs
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ Classes, reflecting the className color in JSX
+ scope
+ source.css entity.other.attribute-name.class.css, entity.other.attribute-name.parent-selector.css punctuation.definition.entity.css
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ Operators
+ scope
+ punctuation.separator.operator.css
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ Pseudo classes
+ scope
+ source.css entity.other.attribute-name.pseudo-class
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ scope
+ source.css constant.other.unicode-range
+ settings
+
+ foreground
+ #fab387
+
+
+
+ scope
+ source.css variable.parameter.url
+ settings
+
+ foreground
+ #a6e3a1
+ fontStyle
+
+
+
+
+ name
+ CSS vendored property names
+ scope
+ support.type.vendored.property-name
+ settings
+
+ foreground
+ #89dceb
+
+
+
+ name
+ Less/SCSS right-hand variables (@/$-prefixed)
+ scope
+ source.css meta.property-value variable, source.css meta.property-value variable.other.less, source.css meta.property-value variable.other.less punctuation.definition.variable.less, meta.definition.variable.scss
+ settings
+
+ foreground
+ #eba0ac
+
+
+
+ name
+ CSS variables (--prefixed)
+ scope
+ source.css meta.property-list variable, meta.property-list variable.other.less, meta.property-list variable.other.less punctuation.definition.variable.less
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ name
+ CSS Percentage values, styled the same as numbers
+ scope
+ keyword.other.unit.percentage.css
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ CSS Attribute selectors, styled the same as strings
+ scope
+ source.css meta.attribute-selector
+ settings
+
+ foreground
+ #a6e3a1
+
+
+
+ name
+ JSON/YAML keys, other left-hand assignments
+ scope
+ keyword.other.definition.ini, punctuation.support.type.property-name.json, support.type.property-name.json, punctuation.support.type.property-name.toml, support.type.property-name.toml, entity.name.tag.yaml, punctuation.support.type.property-name.yaml, support.type.property-name.yaml
+ settings
+
+ foreground
+ #89b4fa
+ fontStyle
+
+
+
+
+ name
+ JSON/YAML constants
+ scope
+ constant.language.json, constant.language.yaml
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ YAML anchors
+ scope
+ entity.name.type.anchor.yaml, variable.other.alias.yaml
+ settings
+
+ foreground
+ #f9e2af
+ fontStyle
+
+
+
+
+ name
+ TOML tables / ini groups
+ scope
+ support.type.property-name.table, entity.name.section.group-title.ini
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ TOML dates
+ scope
+ constant.other.time.datetime.offset.toml
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ YAML anchor puctuation
+ scope
+ punctuation.definition.anchor.yaml, punctuation.definition.alias.yaml
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ YAML triple dashes
+ scope
+ entity.other.document.begin.yaml
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ Markup Diff
+ scope
+ markup.changed.diff
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ Diff
+ scope
+ meta.diff.header.from-file, meta.diff.header.to-file, punctuation.definition.from-file.diff, punctuation.definition.to-file.diff
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ name
+ Diff Inserted
+ scope
+ markup.inserted.diff
+ settings
+
+ foreground
+ #a6e3a1
+
+
+
+ name
+ Diff Deleted
+ scope
+ markup.deleted.diff
+ settings
+
+ foreground
+ #f38ba8
+
+
+
+ name
+ dotenv left-hand side assignments
+ scope
+ variable.other.env
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ name
+ dotenv reference to existing env variable
+ scope
+ string.quoted variable.other.env
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ GDScript functions
+ scope
+ support.function.builtin.gdscript
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ name
+ GDScript constants
+ scope
+ constant.language.gdscript
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ Comment keywords
+ scope
+ comment meta.annotation.go
+ settings
+
+ foreground
+ #eba0ac
+
+
+
+ name
+ go:embed, go:build, etc.
+ scope
+ comment meta.annotation.parameters.go
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ Go constants (nil, true, false)
+ scope
+ constant.language.go
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ GraphQL variables
+ scope
+ variable.graphql
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ GraphQL aliases
+ scope
+ string.unquoted.alias.graphql
+ settings
+
+ foreground
+ #f2cdcd
+
+
+
+ name
+ GraphQL enum members
+ scope
+ constant.character.enum.graphql
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ GraphQL field in types
+ scope
+ meta.objectvalues.graphql constant.object.key.graphql string.unquoted.graphql
+ settings
+
+ foreground
+ #f2cdcd
+
+
+
+ name
+ HTML/XML DOCTYPE as keyword
+ scope
+ keyword.other.doctype, meta.tag.sgml.doctype punctuation.definition.tag, meta.tag.metadata.doctype entity.name.tag, meta.tag.metadata.doctype punctuation.definition.tag
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ HTML/XML-like <tags/>
+ scope
+ entity.name.tag
+ settings
+
+ foreground
+ #89b4fa
+ fontStyle
+
+
+
+
+ name
+ Special characters like &
+ scope
+ text.html constant.character.entity, text.html constant.character.entity punctuation, constant.character.entity.xml, constant.character.entity.xml punctuation, constant.character.entity.js.jsx, constant.charactger.entity.js.jsx punctuation, constant.character.entity.tsx, constant.character.entity.tsx punctuation
+ settings
+
+ foreground
+ #f38ba8
+
+
+
+ name
+ HTML/XML tag attribute values
+ scope
+ entity.other.attribute-name
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ Components
+ scope
+ support.class.component, support.class.component.jsx, support.class.component.tsx, support.class.component.vue
+ settings
+
+ foreground
+ #f5c2e7
+ fontStyle
+
+
+
+
+ name
+ Annotations
+ scope
+ punctuation.definition.annotation, storage.type.annotation
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ Java enums
+ scope
+ constant.other.enum.java
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ Java imports
+ scope
+ storage.modifier.import.java
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ Javadoc
+ scope
+ comment.block.javadoc.java keyword.other.documentation.javadoc.java
+ settings
+
+ fontStyle
+
+
+
+
+ name
+ Exported Variable
+ scope
+ meta.export variable.other.readwrite.js
+ settings
+
+ foreground
+ #eba0ac
+
+
+
+ name
+ JS/TS constants & properties
+ scope
+ variable.other.constant.js, variable.other.constant.ts, variable.other.property.js, variable.other.property.ts
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ JSDoc; these are mainly params, so styled as such
+ scope
+ variable.other.jsdoc, comment.block.documentation variable.other
+ settings
+
+ foreground
+ #eba0ac
+ fontStyle
+
+
+
+
+ name
+ JSDoc keywords
+ scope
+ storage.type.class.jsdoc
+ settings
+
+ fontStyle
+
+
+
+
+ scope
+ support.type.object.console.js
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ Node constants as keywords (module, etc.)
+ scope
+ support.constant.node, support.type.object.module.js
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ implements as keyword
+ scope
+ storage.modifier.implements
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ Builtin types
+ scope
+ constant.language.null.js, constant.language.null.ts, constant.language.undefined.js, constant.language.undefined.ts, support.type.builtin.ts
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ scope
+ variable.parameter.generic
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ Arrow functions
+ scope
+ keyword.declaration.function.arrow.js, storage.type.function.arrow.ts
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ Decorator punctuations (decorators inherit from blue functions, instead of styleguide peach)
+ scope
+ punctuation.decorator.ts
+ settings
+
+ foreground
+ #89b4fa
+ fontStyle
+ italic
+
+
+
+ name
+ Extra JS/TS keywords
+ scope
+ keyword.operator.expression.in.js, keyword.operator.expression.in.ts, keyword.operator.expression.infer.ts, keyword.operator.expression.instanceof.js, keyword.operator.expression.instanceof.ts, keyword.operator.expression.is, keyword.operator.expression.keyof.ts, keyword.operator.expression.of.js, keyword.operator.expression.of.ts, keyword.operator.expression.typeof.ts
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ Julia macros
+ scope
+ support.function.macro.julia
+ settings
+
+ foreground
+ #94e2d5
+ fontStyle
+ italic
+
+
+
+ name
+ Julia language constants (true, false)
+ scope
+ constant.language.julia
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ Julia other constants (these seem to be arguments inside arrays)
+ scope
+ constant.other.symbol.julia
+ settings
+
+ foreground
+ #eba0ac
+
+
+
+ name
+ LaTeX preamble
+ scope
+ text.tex keyword.control.preamble
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ LaTeX be functions
+ scope
+ text.tex support.function.be
+ settings
+
+ foreground
+ #89dceb
+
+
+
+ name
+ LaTeX math
+ scope
+ constant.other.general.math.tex
+ settings
+
+ foreground
+ #f2cdcd
+
+
+
+ name
+ Lua docstring keywords
+ scope
+ comment.line.double-dash.documentation.lua storage.type.annotation.lua
+ settings
+
+ foreground
+ #cba6f7
+ fontStyle
+
+
+
+
+ name
+ Lua docstring variables
+ scope
+ comment.line.double-dash.documentation.lua entity.name.variable.lua, comment.line.double-dash.documentation.lua variable.lua
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ scope
+ heading.1.markdown punctuation.definition.heading.markdown, heading.1.markdown, markup.heading.atx.1.mdx, markup.heading.atx.1.mdx punctuation.definition.heading.mdx, markup.heading.setext.1.markdown, markup.heading.heading-0.asciidoc
+ settings
+
+ foreground
+ #f38ba8
+
+
+
+ scope
+ heading.2.markdown punctuation.definition.heading.markdown, heading.2.markdown, markup.heading.atx.2.mdx, markup.heading.atx.2.mdx punctuation.definition.heading.mdx, markup.heading.setext.2.markdown, markup.heading.heading-1.asciidoc
+ settings
+
+ foreground
+ #fab387
+
+
+
+ scope
+ heading.3.markdown punctuation.definition.heading.markdown, heading.3.markdown, markup.heading.atx.3.mdx, markup.heading.atx.3.mdx punctuation.definition.heading.mdx, markup.heading.heading-2.asciidoc
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ scope
+ heading.4.markdown punctuation.definition.heading.markdown, heading.4.markdown, markup.heading.atx.4.mdx, markup.heading.atx.4.mdx punctuation.definition.heading.mdx, markup.heading.heading-3.asciidoc
+ settings
+
+ foreground
+ #a6e3a1
+
+
+
+ scope
+ heading.5.markdown punctuation.definition.heading.markdown, heading.5.markdown, markup.heading.atx.5.mdx, markup.heading.atx.5.mdx punctuation.definition.heading.mdx, markup.heading.heading-4.asciidoc
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ scope
+ heading.6.markdown punctuation.definition.heading.markdown, heading.6.markdown, markup.heading.atx.6.mdx, markup.heading.atx.6.mdx punctuation.definition.heading.mdx, markup.heading.heading-5.asciidoc
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ scope
+ markup.bold
+ settings
+
+ foreground
+ #f38ba8
+ fontStyle
+ bold
+
+
+
+ scope
+ markup.italic
+ settings
+
+ foreground
+ #f38ba8
+ fontStyle
+ italic
+
+
+
+ scope
+ markup.strikethrough
+ settings
+
+ foreground
+ #a6adc8
+ fontStyle
+ strikethrough
+
+
+
+ name
+ Markdown auto links
+ scope
+ punctuation.definition.link, markup.underline.link
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ name
+ Markdown links
+ scope
+ text.html.markdown punctuation.definition.link.title, string.other.link.title.markdown, markup.link, punctuation.definition.constant.markdown, constant.other.reference.link.markdown, markup.substitution.attribute-reference
+ settings
+
+ foreground
+ #b4befe
+
+
+
+ name
+ Markdown code spans
+ scope
+ punctuation.definition.raw.markdown, markup.inline.raw.string.markdown, markup.raw.block.markdown
+ settings
+
+ foreground
+ #a6e3a1
+
+
+
+ name
+ Markdown triple backtick language identifier
+ scope
+ fenced_code.block.language
+ settings
+
+ foreground
+ #89dceb
+
+
+
+ name
+ Markdown triple backticks
+ scope
+ markup.fenced_code.block punctuation.definition, markup.raw support.asciidoc
+ settings
+
+ foreground
+ #9399b2
+
+
+
+ name
+ Markdown quotes
+ scope
+ markup.quote, punctuation.definition.quote.begin
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ Markdown separators
+ scope
+ meta.separator.markdown
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ Markdown list bullets
+ scope
+ punctuation.definition.list.begin.markdown, markup.list.bullet
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ Nix attribute names
+ scope
+ entity.other.attribute-name.multipart.nix, entity.other.attribute-name.single.nix
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ name
+ Nix parameter names
+ scope
+ variable.parameter.name.nix
+ settings
+
+ foreground
+ #cdd6f4
+ fontStyle
+
+
+
+
+ name
+ Nix interpolated parameter names
+ scope
+ meta.embedded variable.parameter.name.nix
+ settings
+
+ foreground
+ #b4befe
+ fontStyle
+
+
+
+
+ name
+ Nix paths
+ scope
+ string.unquoted.path.nix
+ settings
+
+ foreground
+ #f5c2e7
+ fontStyle
+
+
+
+
+ name
+ PHP Attributes
+ scope
+ support.attribute.builtin, meta.attribute.php
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ PHP Parameters (needed for the leading dollar sign)
+ scope
+ meta.function.parameters.php punctuation.definition.variable.php
+ settings
+
+ foreground
+ #eba0ac
+
+
+
+ name
+ PHP Constants (null, __FILE__, etc.)
+ scope
+ constant.language.php
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ PHP functions
+ scope
+ text.html.php support.function
+ settings
+
+ foreground
+ #89dceb
+
+
+
+ name
+ PHPdoc keywords
+ scope
+ keyword.other.phpdoc.php
+ settings
+
+ fontStyle
+
+
+
+
+ name
+ Python argument functions reset to text, otherwise they inherit blue from function-call
+ scope
+ support.variable.magic.python, meta.function-call.arguments.python
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ Python double underscore functions
+ scope
+ support.function.magic.python
+ settings
+
+ foreground
+ #89dceb
+ fontStyle
+ italic
+
+
+
+ name
+ Python `self` keyword
+ scope
+ variable.parameter.function.language.special.self.python, variable.language.special.self.python
+ settings
+
+ foreground
+ #f38ba8
+ fontStyle
+ italic
+
+
+
+ name
+ python keyword flow/logical (for ... in)
+ scope
+ keyword.control.flow.python, keyword.operator.logical.python
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ python storage type
+ scope
+ storage.type.function.python
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ python function support
+ scope
+ support.token.decorator.python, meta.function.decorator.identifier.python
+ settings
+
+ foreground
+ #89dceb
+
+
+
+ name
+ python function calls
+ scope
+ meta.function-call.python
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ name
+ python function decorators
+ scope
+ entity.name.function.decorator.python, punctuation.definition.decorator.python
+ settings
+
+ foreground
+ #fab387
+ fontStyle
+ italic
+
+
+
+ name
+ python placeholder reset to normal string
+ scope
+ constant.character.format.placeholder.other.python
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ Python exception & builtins such as exit()
+ scope
+ support.type.exception.python, support.function.builtin.python
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ entity.name.type
+ scope
+ support.type.python
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ python constants (True/False)
+ scope
+ constant.language.python
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ Arguments accessed later in the function body
+ scope
+ meta.indexed-name.python, meta.item-access.python
+ settings
+
+ foreground
+ #eba0ac
+ fontStyle
+ italic
+
+
+
+ name
+ Python f-strings/binary/unicode storage types
+ scope
+ storage.type.string.python
+ settings
+
+ foreground
+ #a6e3a1
+ fontStyle
+ italic
+
+
+
+ name
+ Python type hints
+ scope
+ meta.function.parameters.python
+ settings
+
+ fontStyle
+
+
+
+
+ name
+ Regex string begin/end in JS/TS
+ scope
+ string.regexp punctuation.definition.string.begin, string.regexp punctuation.definition.string.end
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ Regex anchors (^, $)
+ scope
+ keyword.control.anchor.regexp
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ Regex regular string match
+ scope
+ string.regexp.ts
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ Regex group parenthesis & backreference (\1, \2, \3, ...)
+ scope
+ punctuation.definition.group.regexp, keyword.other.back-reference.regexp
+ settings
+
+ foreground
+ #a6e3a1
+
+
+
+ name
+ Regex character class []
+ scope
+ punctuation.definition.character-class.regexp
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ Regex character classes (\d, \w, \s)
+ scope
+ constant.other.character-class.regexp
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ Regex range
+ scope
+ constant.other.character-class.range.regexp
+ settings
+
+ foreground
+ #f5e0dc
+
+
+
+ name
+ Regex quantifier
+ scope
+ keyword.operator.quantifier.regexp
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ Regex constant/numeric
+ scope
+ constant.character.numeric.regexp
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ Regex lookaheads, negative lookaheads, lookbehinds, negative lookbehinds
+ scope
+ punctuation.definition.group.no-capture.regexp, meta.assertion.look-ahead.regexp, meta.assertion.negative-look-ahead.regexp
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ name
+ Rust attribute
+ scope
+ meta.annotation.rust, meta.annotation.rust punctuation, meta.attribute.rust, punctuation.definition.attribute.rust
+ settings
+
+ foreground
+ #f9e2af
+ fontStyle
+ italic
+
+
+
+ name
+ Rust attribute strings
+ scope
+ meta.attribute.rust string.quoted.double.rust, meta.attribute.rust string.quoted.single.char.rust
+ settings
+
+ fontStyle
+
+
+
+
+ name
+ Rust keyword
+ scope
+ entity.name.function.macro.rules.rust, storage.type.module.rust, storage.modifier.rust, storage.type.struct.rust, storage.type.enum.rust, storage.type.trait.rust, storage.type.union.rust, storage.type.impl.rust, storage.type.rust, storage.type.function.rust, storage.type.type.rust
+ settings
+
+ foreground
+ #cba6f7
+ fontStyle
+
+
+
+
+ name
+ Rust u/i32, u/i64, etc.
+ scope
+ entity.name.type.numeric.rust
+ settings
+
+ foreground
+ #cba6f7
+ fontStyle
+
+
+
+
+ name
+ Rust generic
+ scope
+ meta.generic.rust
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ Rust impl
+ scope
+ entity.name.impl.rust
+ settings
+
+ foreground
+ #f9e2af
+ fontStyle
+ italic
+
+
+
+ name
+ Rust module
+ scope
+ entity.name.module.rust
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ Rust trait
+ scope
+ entity.name.trait.rust
+ settings
+
+ foreground
+ #f9e2af
+ fontStyle
+ italic
+
+
+
+ name
+ Rust struct
+ scope
+ storage.type.source.rust
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ Rust union
+ scope
+ entity.name.union.rust
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+ name
+ Rust enum member
+ scope
+ meta.enum.rust storage.type.source.rust
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ Rust macro
+ scope
+ support.macro.rust, meta.macro.rust support.function.rust, entity.name.function.macro.rust
+ settings
+
+ foreground
+ #89b4fa
+ fontStyle
+ italic
+
+
+
+ name
+ Rust lifetime
+ scope
+ storage.modifier.lifetime.rust, entity.name.type.lifetime
+ settings
+
+ foreground
+ #89b4fa
+ fontStyle
+ italic
+
+
+
+ name
+ Rust string formatting
+ scope
+ string.quoted.double.rust constant.other.placeholder.rust
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ Rust return type generic
+ scope
+ meta.function.return-type.rust meta.generic.rust storage.type.rust
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ Rust functions
+ scope
+ meta.function.call.rust
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ name
+ Rust angle brackets
+ scope
+ punctuation.brackets.angle.rust
+ settings
+
+ foreground
+ #89dceb
+
+
+
+ name
+ Rust constants
+ scope
+ constant.other.caps.rust
+ settings
+
+ foreground
+ #fab387
+
+
+
+ name
+ Rust function parameters
+ scope
+ meta.function.definition.rust variable.other.rust
+ settings
+
+ foreground
+ #eba0ac
+
+
+
+ name
+ Rust closure variables
+ scope
+ meta.function.call.rust variable.other.rust
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ name
+ Rust self
+ scope
+ variable.language.self.rust
+ settings
+
+ foreground
+ #f38ba8
+
+
+
+ name
+ Rust metavariable names
+ scope
+ variable.other.metavariable.name.rust, meta.macro.metavariable.rust keyword.operator.macro.dollar.rust
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ Shell shebang
+ scope
+ comment.line.shebang, comment.line.shebang punctuation.definition.comment, comment.line.shebang, punctuation.definition.comment.shebang.shell, meta.shebang.shell
+ settings
+
+ foreground
+ #f5c2e7
+ fontStyle
+ italic
+
+
+
+ name
+ Shell shebang command
+ scope
+ comment.line.shebang constant.language
+ settings
+
+ foreground
+ #94e2d5
+ fontStyle
+ italic
+
+
+
+ name
+ Shell interpolated command
+ scope
+ meta.function-call.arguments.shell punctuation.definition.variable.shell, meta.function-call.arguments.shell punctuation.section.interpolation, meta.function-call.arguments.shell punctuation.definition.variable.shell, meta.function-call.arguments.shell punctuation.section.interpolation
+ settings
+
+ foreground
+ #f38ba8
+
+
+
+ name
+ Shell interpolated command variable
+ scope
+ meta.string meta.interpolation.parameter.shell variable.other.readwrite
+ settings
+
+ foreground
+ #fab387
+ fontStyle
+ italic
+
+
+
+ scope
+ source.shell punctuation.section.interpolation, punctuation.definition.evaluation.backticks.shell
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ name
+ Shell EOF
+ scope
+ entity.name.tag.heredoc.shell
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ name
+ Shell quoted variable
+ scope
+ string.quoted.double.shell variable.other.normal.shell
+ settings
+
+ foreground
+ #cdd6f4
+
+
+
+ scope
+ markup.heading.synopsis.man, markup.heading.title.man, markup.heading.other.man, markup.heading.env.man
+ settings
+
+ foreground
+ #cba6f7
+
+
+
+ scope
+ markup.heading.commands.man
+ settings
+
+ foreground
+ #89b4fa
+
+
+
+ scope
+ markup.heading.env.man
+ settings
+
+ foreground
+ #f5c2e7
+
+
+
+ name
+ Man page options
+ scope
+ entity.name
+ settings
+
+ foreground
+ #94e2d5
+
+
+
+ scope
+ markup.heading.1.markdown
+ settings
+
+ foreground
+ #f38ba8
+
+
+
+ scope
+ markup.heading.2.markdown
+ settings
+
+ foreground
+ #fab387
+
+
+
+ scope
+ markup.heading.markdown
+ settings
+
+ foreground
+ #f9e2af
+
+
+
+
+
\ No newline at end of file
diff --git a/dotfiles/.config/btop/btop.conf b/dotfiles/.config/btop/btop.conf
new file mode 100644
index 0000000..3b4551c
--- /dev/null
+++ b/dotfiles/.config/btop/btop.conf
@@ -0,0 +1,254 @@
+#? Config file for btop v. 1.4.3
+
+#* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes.
+#* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes"
+color_theme = "/home/dich/.config/btop/themes/catppuccin_frappe.theme"
+
+#* If the theme set background should be shown, set to False if you want terminal background transparency.
+theme_background = True
+
+#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false.
+truecolor = True
+
+#* Set to true to force tty mode regardless if a real tty has been detected or not.
+#* Will force 16-color mode and TTY theme, set all graph symbols to "tty" and swap out other non tty friendly symbols.
+force_tty = False
+
+#* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets.
+#* Format: "box_name:P:G,box_name:P:G" P=(0 or 1) for alternate positions, G=graph symbol to use for box.
+#* Use whitespace " " as separator between different presets.
+#* Example: "cpu:0:default,mem:0:tty,proc:1:default cpu:0:braille,proc:0:tty"
+presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:default cpu:0:block,net:0:tty"
+
+#* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists.
+#* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift.
+vim_keys = False
+
+#* Rounded corners on boxes, is ignored if TTY mode is ON.
+rounded_corners = True
+
+#* Default symbols to use for graph creation, "braille", "block" or "tty".
+#* "braille" offers the highest resolution but might not be included in all fonts.
+#* "block" has half the resolution of braille but uses more common characters.
+#* "tty" uses only 3 different symbols but will work with most fonts and should work in a real TTY.
+#* Note that "tty" only has half the horizontal resolution of the other two, so will show a shorter historical view.
+graph_symbol = "braille"
+
+# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
+graph_symbol_cpu = "default"
+
+# Graph symbol to use for graphs in gpu box, "default", "braille", "block" or "tty".
+graph_symbol_gpu = "default"
+
+# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
+graph_symbol_mem = "default"
+
+# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
+graph_symbol_net = "default"
+
+# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
+graph_symbol_proc = "default"
+
+#* Manually set which boxes to show. Available values are "cpu mem net proc" and "gpu0" through "gpu5", separate values with whitespace.
+shown_boxes = "proc mem cpu"
+
+#* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs.
+update_ms = 2000
+
+#* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct",
+#* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly.
+proc_sorting = "cpu lazy"
+
+#* Reverse sorting order, True or False.
+proc_reversed = False
+
+#* Show processes as a tree.
+proc_tree = False
+
+#* Use the cpu graph colors in the process list.
+proc_colors = True
+
+#* Use a darkening gradient in the process list.
+proc_gradient = True
+
+#* If process cpu usage should be of the core it's running on or usage of the total available cpu power.
+proc_per_core = False
+
+#* Show process memory as bytes instead of percent.
+proc_mem_bytes = True
+
+#* Show cpu graph for each process.
+proc_cpu_graphs = True
+
+#* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate)
+proc_info_smaps = False
+
+#* Show proc box on left side of screen instead of right.
+proc_left = False
+
+#* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop).
+proc_filter_kernel = False
+
+#* In tree-view, always accumulate child process resources in the parent process.
+proc_aggregate = False
+
+#* Sets the CPU stat shown in upper half of the CPU graph, "total" is always available.
+#* Select from a list of detected attributes from the options menu.
+cpu_graph_upper = "Auto"
+
+#* Sets the CPU stat shown in lower half of the CPU graph, "total" is always available.
+#* Select from a list of detected attributes from the options menu.
+cpu_graph_lower = "Auto"
+
+#* If gpu info should be shown in the cpu box. Available values = "Auto", "On" and "Off".
+show_gpu_info = "Auto"
+
+#* Toggles if the lower CPU graph should be inverted.
+cpu_invert_lower = True
+
+#* Set to True to completely disable the lower CPU graph.
+cpu_single_graph = False
+
+#* Show cpu box at bottom of screen instead of top.
+cpu_bottom = False
+
+#* Shows the system uptime in the CPU box.
+show_uptime = True
+
+#* Show cpu temperature.
+check_temp = True
+
+#* Which sensor to use for cpu temperature, use options menu to select from list of available sensors.
+cpu_sensor = "Auto"
+
+#* Show temperatures for cpu cores also if check_temp is True and sensors has been found.
+show_coretemp = True
+
+#* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core.
+#* Use lm-sensors or similar to see which cores are reporting temperatures on your machine.
+#* Format "x:y" x=core with wrong temp, y=core with correct temp, use space as separator between multiple entries.
+#* Example: "4:0 5:1 6:3"
+cpu_core_map = ""
+
+#* Which temperature scale to use, available values: "celsius", "fahrenheit", "kelvin" and "rankine".
+temp_scale = "celsius"
+
+#* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024.
+base_10_sizes = False
+
+#* Show CPU frequency.
+show_cpu_freq = True
+
+#* Draw a clock at top of screen, formatting according to strftime, empty string to disable.
+#* Special formatting: /host = hostname | /user = username | /uptime = system uptime
+clock_format = "%X"
+
+#* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort.
+background_update = True
+
+#* Custom cpu model name, empty string to disable.
+custom_cpu_name = ""
+
+#* Optional filter for shown disks, should be full path of a mountpoint, separate multiple values with whitespace " ".
+#* Begin line with "exclude=" to change to exclude filter, otherwise defaults to "most include" filter. Example: disks_filter="exclude=/boot /home/user".
+disks_filter = ""
+
+#* Show graphs instead of meters for memory values.
+mem_graphs = True
+
+#* Show mem box below net box instead of above.
+mem_below_net = False
+
+#* Count ZFS ARC in cached and available memory.
+zfs_arc_cached = True
+
+#* If swap memory should be shown in memory box.
+show_swap = True
+
+#* Show swap as a disk, ignores show_swap value above, inserts itself after first disk.
+swap_disk = True
+
+#* If mem box should be split to also show disks info.
+show_disks = True
+
+#* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar.
+only_physical = True
+
+#* Read disks list from /etc/fstab. This also disables only_physical.
+use_fstab = True
+
+#* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool)
+zfs_hide_datasets = False
+
+#* Set to true to show available disk space for privileged users.
+disk_free_priv = False
+
+#* Toggles if io activity % (disk busy time) should be shown in regular disk usage view.
+show_io_stat = True
+
+#* Toggles io mode for disks, showing big graphs for disk read/write speeds.
+io_mode = False
+
+#* Set to True to show combined read/write io graphs in io mode.
+io_graph_combined = False
+
+#* Set the top speed for the io graphs in MiB/s (100 by default), use format "mountpoint:speed" separate disks with whitespace " ".
+#* Example: "/mnt/media:100 /:20 /boot:1".
+io_graph_speeds = ""
+
+#* Set fixed values for network graphs in Mebibits. Is only used if net_auto is also set to False.
+net_download = 100
+
+net_upload = 100
+
+#* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest.
+net_auto = True
+
+#* Sync the auto scaling for download and upload to whichever currently has the highest scale.
+net_sync = True
+
+#* Starts with the Network Interface specified here.
+net_iface = ""
+
+#* "True" shows bitrates in base 10 (Kbps, Mbps). "False" shows bitrates in binary sizes (Kibps, Mibps, etc.). "Auto" uses base_10_sizes.
+base_10_bitrate = "Auto"
+
+#* Show battery stats in top right if battery is present.
+show_battery = True
+
+#* Which battery to use if multiple are present. "Auto" for auto detection.
+selected_battery = "Auto"
+
+#* Show power stats of battery next to charge indicator.
+show_battery_watts = True
+
+#* Set loglevel for "~/.config/btop/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG".
+#* The level set includes all lower levels, i.e. "DEBUG" will show all logging info.
+log_level = "WARNING"
+
+#* Measure PCIe throughput on NVIDIA cards, may impact performance on certain cards.
+nvml_measure_pcie_speeds = True
+
+#* Measure PCIe throughput on AMD cards, may impact performance on certain cards.
+rsmi_measure_pcie_speeds = True
+
+#* Horizontally mirror the GPU graph.
+gpu_mirror_graph = True
+
+#* Custom gpu0 model name, empty string to disable.
+custom_gpu_name0 = ""
+
+#* Custom gpu1 model name, empty string to disable.
+custom_gpu_name1 = ""
+
+#* Custom gpu2 model name, empty string to disable.
+custom_gpu_name2 = ""
+
+#* Custom gpu3 model name, empty string to disable.
+custom_gpu_name3 = ""
+
+#* Custom gpu4 model name, empty string to disable.
+custom_gpu_name4 = ""
+
+#* Custom gpu5 model name, empty string to disable.
+custom_gpu_name5 = ""
diff --git a/dotfiles/.config/btop/themes/catppuccin_frappe.theme b/dotfiles/.config/btop/themes/catppuccin_frappe.theme
new file mode 100644
index 0000000..20a91ca
--- /dev/null
+++ b/dotfiles/.config/btop/themes/catppuccin_frappe.theme
@@ -0,0 +1,83 @@
+# Main background, empty for terminal default, need to be empty if you want transparent background
+theme[main_bg]="#303446"
+
+# Main text color
+theme[main_fg]="#C6D0F5"
+
+# Title color for boxes
+theme[title]="#C6D0F5"
+
+# Highlight color for keyboard shortcuts
+theme[hi_fg]="#8CAAEE"
+
+# Background color of selected item in processes box
+theme[selected_bg]="#51576D"
+
+# Foreground color of selected item in processes box
+theme[selected_fg]="#8CAAEE"
+
+# Color of inactive/disabled text
+theme[inactive_fg]="#838BA7"
+
+# Color of text appearing on top of graphs, i.e uptime and current network graph scaling
+theme[graph_text]="#F2D5CF"
+
+# Background color of the percentage meters
+theme[meter_bg]="#51576D"
+
+# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
+theme[proc_misc]="#F2D5CF"
+
+# CPU, Memory, Network, Proc box outline colors
+theme[cpu_box]="#ca9ee6" #Mauve
+theme[mem_box]="#a6d189" #Green
+theme[net_box]="#ea999c" #Maroon
+theme[proc_box]="#8caaee" #Blue
+
+# Box divider line and small boxes line color
+theme[div_line]="#737994"
+
+# Temperature graph color (Green -> Yellow -> Red)
+theme[temp_start]="#a6d189"
+theme[temp_mid]="#e5c890"
+theme[temp_end]="#e78284"
+
+# CPU graph colors (Teal -> Lavender)
+theme[cpu_start]="#81c8be"
+theme[cpu_mid]="#85c1dc"
+theme[cpu_end]="#babbf1"
+
+# Mem/Disk free meter (Mauve -> Lavender -> Blue)
+theme[free_start]="#ca9ee6"
+theme[free_mid]="#babbf1"
+theme[free_end]="#8caaee"
+
+# Mem/Disk cached meter (Sapphire -> Lavender)
+theme[cached_start]="#85c1dc"
+theme[cached_mid]="#8caaee"
+theme[cached_end]="#babbf1"
+
+# Mem/Disk available meter (Peach -> Red)
+theme[available_start]="#ef9f76"
+theme[available_mid]="#ea999c"
+theme[available_end]="#e78284"
+
+# Mem/Disk used meter (Green -> Sky)
+theme[used_start]="#a6d189"
+theme[used_mid]="#81c8be"
+theme[used_end]="#99d1db"
+
+# Download graph colors (Peach -> Red)
+theme[download_start]="#ef9f76"
+theme[download_mid]="#ea999c"
+theme[download_end]="#e78284"
+
+# Upload graph colors (Green -> Sky)
+theme[upload_start]="#a6d189"
+theme[upload_mid]="#81c8be"
+theme[upload_end]="#99d1db"
+
+# Process box color gradient for threads, mem and cpu usage (Sapphire -> Mauve)
+theme[process_start]="#85c1dc"
+theme[process_mid]="#babbf1"
+theme[process_end]="#ca9ee6"
diff --git a/dotfiles/.config/btop/themes/catppuccin_latte.theme b/dotfiles/.config/btop/themes/catppuccin_latte.theme
new file mode 100644
index 0000000..792679c
--- /dev/null
+++ b/dotfiles/.config/btop/themes/catppuccin_latte.theme
@@ -0,0 +1,84 @@
+# Main background, empty for terminal default, need to be empty if you want transparent background
+theme[main_bg]="#EFF1F5"
+
+# Main text color
+theme[main_fg]="#4C4F69"
+
+# Title color for boxes
+theme[title]="#4C4F69"
+
+# Highlight color for keyboard shortcuts
+theme[hi_fg]="#1E66F5"
+
+# Background color of selected item in processes box
+theme[selected_bg]="#BCC0CC"
+
+# Foreground color of selected item in processes box
+theme[selected_fg]="#1E66F5"
+
+# Color of inactive/disabled text
+theme[inactive_fg]="#8C8FA1"
+
+# Color of text appearing on top of graphs, i.e uptime and current network graph scaling
+theme[graph_text]="#DC8A78"
+
+# Background color of the percentage meters
+theme[meter_bg]="#BCC0CC"
+
+# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
+theme[proc_misc]="#DC8A78"
+
+# CPU, Memory, Network, Proc box outline colors
+theme[cpu_box]="#8839ef" #Mauve
+theme[mem_box]="#40a02b" #Green
+theme[net_box]="#e64553" #Maroon
+theme[proc_box]="#1e66f5" #Blue
+
+# Box divider line and small boxes line color
+theme[div_line]="#9CA0B0"
+
+# Temperature graph color (Green -> Yellow -> Red)
+theme[temp_start]="#40a02b"
+theme[temp_mid]="#df8e1d"
+theme[temp_end]="#d20f39"
+
+# CPU graph colors (Teal -> Lavender)
+theme[cpu_start]="#179299"
+theme[cpu_mid]="#209fb5"
+theme[cpu_end]="#7287fd"
+
+# Mem/Disk free meter (Mauve -> Lavender -> Blue)
+theme[free_start]="#8839ef"
+theme[free_mid]="#7287fd"
+theme[free_end]="#1e66f5"
+
+# Mem/Disk cached meter (Sapphire -> Lavender)
+theme[cached_start]="#209fb5"
+theme[cached_mid]="#1e66f5"
+theme[cached_end]="#7287fd"
+
+# Mem/Disk available meter (Peach -> Red)
+theme[available_start]="#fe640b"
+theme[available_mid]="#e64553"
+theme[available_end]="#d20f39"
+
+
+# Mem/Disk used meter (Green -> Sky)
+theme[used_start]="#40a02b"
+theme[used_mid]="#179299"
+theme[used_end]="#04a5e5"
+
+# Download graph colors (Peach -> Red)
+theme[download_start]="#fe640b"
+theme[download_mid]="#e64553"
+theme[download_end]="#d20f39"
+
+# Upload graph colors (Green -> Sky)
+theme[upload_start]="#40a02b"
+theme[upload_mid]="#179299"
+theme[upload_end]="#04a5e5"
+
+# Process box color gradient for threads, mem and cpu usage (Sapphire -> Lavender-> Mauve)
+theme[process_start]="#209fb5"
+theme[process_mid]="#7287fd"
+theme[process_end]="#8839ef"
diff --git a/dotfiles/.config/btop/themes/catppuccin_macchiato.theme b/dotfiles/.config/btop/themes/catppuccin_macchiato.theme
new file mode 100644
index 0000000..86819d2
--- /dev/null
+++ b/dotfiles/.config/btop/themes/catppuccin_macchiato.theme
@@ -0,0 +1,83 @@
+# Main background, empty for terminal default, need to be empty if you want transparent background
+theme[main_bg]="#24273A"
+
+# Main text color
+theme[main_fg]="#CAD3F5"
+
+# Title color for boxes
+theme[title]="#CAD3F5"
+
+# Highlight color for keyboard shortcuts
+theme[hi_fg]="#8AADF4"
+
+# Background color of selected item in processes box
+theme[selected_bg]="#494D64"
+
+# Foreground color of selected item in processes box
+theme[selected_fg]="#8AADF4"
+
+# Color of inactive/disabled text
+theme[inactive_fg]="#8087A2"
+
+# Color of text appearing on top of graphs, i.e uptime and current network graph scaling
+theme[graph_text]="#F4DBD6"
+
+# Background color of the percentage meters
+theme[meter_bg]="#494D64"
+
+# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
+theme[proc_misc]="#F4DBD6"
+
+# CPU, Memory, Network, Proc box outline colors
+theme[cpu_box]="#c6a0f6" #Mauve
+theme[mem_box]="#a6da95" #Green
+theme[net_box]="#ee99a0" #Maroon
+theme[proc_box]="#8aadf4" #Blue
+
+# Box divider line and small boxes line color
+theme[div_line]="#6E738D"
+
+# Temperature graph color (Green -> Yellow -> Red)
+theme[temp_start]="#a6da95"
+theme[temp_mid]="#eed49f"
+theme[temp_end]="#ed8796"
+
+# CPU graph colors (Teal -> Lavender)
+theme[cpu_start]="#8bd5ca"
+theme[cpu_mid]="#7dc4e4"
+theme[cpu_end]="#b7bdf8"
+
+# Mem/Disk free meter (Mauve -> Lavender -> Blue)
+theme[free_start]="#c6a0f6"
+theme[free_mid]="#b7bdf8"
+theme[free_end]="#8aadf4"
+
+# Mem/Disk cached meter (Sapphire -> Lavender)
+theme[cached_start]="#7dc4e4"
+theme[cached_mid]="#8aadf4"
+theme[cached_end]="#b7bdf8"
+
+# Mem/Disk available meter (Peach -> Red)
+theme[available_start]="#f5a97f"
+theme[available_mid]="#ee99a0"
+theme[available_end]="#ed8796"
+
+# Mem/Disk used meter (Green -> Sky)
+theme[used_start]="#a6da95"
+theme[used_mid]="#8bd5ca"
+theme[used_end]="#91d7e3"
+
+# Download graph colors (Peach -> Red)
+theme[download_start]="#f5a97f"
+theme[download_mid]="#ee99a0"
+theme[download_end]="#ed8796"
+
+# Upload graph colors (Green -> Sky)
+theme[upload_start]="#a6da95"
+theme[upload_mid]="#8bd5ca"
+theme[upload_end]="#91d7e3"
+
+# Process box color gradient for threads, mem and cpu usage (Sapphire -> Mauve)
+theme[process_start]="#7dc4e4"
+theme[process_mid]="#b7bdf8"
+theme[process_end]="#c6a0f6"
diff --git a/dotfiles/.config/btop/themes/catppuccin_mocha.theme b/dotfiles/.config/btop/themes/catppuccin_mocha.theme
new file mode 100644
index 0000000..6915504
--- /dev/null
+++ b/dotfiles/.config/btop/themes/catppuccin_mocha.theme
@@ -0,0 +1,83 @@
+# Main background, empty for terminal default, need to be empty if you want transparent background
+theme[main_bg]="#1E1E2E"
+
+# Main text color
+theme[main_fg]="#CDD6F4"
+
+# Title color for boxes
+theme[title]="#CDD6F4"
+
+# Highlight color for keyboard shortcuts
+theme[hi_fg]="#89B4FA"
+
+# Background color of selected item in processes box
+theme[selected_bg]="#45475A"
+
+# Foreground color of selected item in processes box
+theme[selected_fg]="#89B4FA"
+
+# Color of inactive/disabled text
+theme[inactive_fg]="#7F849C"
+
+# Color of text appearing on top of graphs, i.e uptime and current network graph scaling
+theme[graph_text]="#F5E0DC"
+
+# Background color of the percentage meters
+theme[meter_bg]="#45475A"
+
+# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
+theme[proc_misc]="#F5E0DC"
+
+# CPU, Memory, Network, Proc box outline colors
+theme[cpu_box]="#cba6f7" #Mauve
+theme[mem_box]="#a6e3a1" #Green
+theme[net_box]="#eba0ac" #Maroon
+theme[proc_box]="#89b4fa" #Blue
+
+# Box divider line and small boxes line color
+theme[div_line]="#6C7086"
+
+# Temperature graph color (Green -> Yellow -> Red)
+theme[temp_start]="#a6e3a1"
+theme[temp_mid]="#f9e2af"
+theme[temp_end]="#f38ba8"
+
+# CPU graph colors (Teal -> Lavender)
+theme[cpu_start]="#94e2d5"
+theme[cpu_mid]="#74c7ec"
+theme[cpu_end]="#b4befe"
+
+# Mem/Disk free meter (Mauve -> Lavender -> Blue)
+theme[free_start]="#cba6f7"
+theme[free_mid]="#b4befe"
+theme[free_end]="#89b4fa"
+
+# Mem/Disk cached meter (Sapphire -> Lavender)
+theme[cached_start]="#74c7ec"
+theme[cached_mid]="#89b4fa"
+theme[cached_end]="#b4befe"
+
+# Mem/Disk available meter (Peach -> Red)
+theme[available_start]="#fab387"
+theme[available_mid]="#eba0ac"
+theme[available_end]="#f38ba8"
+
+# Mem/Disk used meter (Green -> Sky)
+theme[used_start]="#a6e3a1"
+theme[used_mid]="#94e2d5"
+theme[used_end]="#89dceb"
+
+# Download graph colors (Peach -> Red)
+theme[download_start]="#fab387"
+theme[download_mid]="#eba0ac"
+theme[download_end]="#f38ba8"
+
+# Upload graph colors (Green -> Sky)
+theme[upload_start]="#a6e3a1"
+theme[upload_mid]="#94e2d5"
+theme[upload_end]="#89dceb"
+
+# Process box color gradient for threads, mem and cpu usage (Sapphire -> Mauve)
+theme[process_start]="#74C7EC"
+theme[process_mid]="#89DCEB"
+theme[process_end]="#cba6f7"
diff --git a/dotfiles/.config/easyeffects/output/Prime.json b/dotfiles/.config/easyeffects/output/Prime.json
new file mode 100644
index 0000000..e7b30b1
--- /dev/null
+++ b/dotfiles/.config/easyeffects/output/Prime.json
@@ -0,0 +1,172 @@
+{
+ "output": {
+ "bass_loudness#0": {
+ "bypass": false,
+ "input-gain": 0.0,
+ "link": -9.0,
+ "loudness": -3.0,
+ "output": -5.0000000000000036,
+ "output-gain": 0.0
+ },
+ "blocklist": [],
+ "compressor#0": {
+ "attack": 20.0,
+ "boost-amount": 6.0,
+ "boost-threshold": -72.0,
+ "bypass": false,
+ "dry": -100.0,
+ "hpf-frequency": 10.0,
+ "hpf-mode": "off",
+ "input-gain": 0.0,
+ "knee": -6.0,
+ "lpf-frequency": 20000.0,
+ "lpf-mode": "off",
+ "makeup": 0.0,
+ "mode": "Downward",
+ "output-gain": 0.0,
+ "ratio": 4.0,
+ "release": 100.0,
+ "release-threshold": -100.0,
+ "sidechain": {
+ "lookahead": 0.0,
+ "mode": "RMS",
+ "preamp": 0.0,
+ "reactivity": 10.0,
+ "source": "Middle",
+ "stereo-split-source": "Left/Right",
+ "type": "Feed-forward"
+ },
+ "stereo-split": false,
+ "threshold": -12.0,
+ "wet": 2.7755575615628914e-17
+ },
+ "crossfeed#0": {
+ "bypass": false,
+ "fcut": 700,
+ "feed": 6.0,
+ "input-gain": 0.0,
+ "output-gain": 0.0
+ },
+ "crystalizer#0": {
+ "band0": {
+ "bypass": false,
+ "intensity": 0.0,
+ "mute": false
+ },
+ "band1": {
+ "bypass": false,
+ "intensity": -1.0,
+ "mute": false
+ },
+ "band10": {
+ "bypass": false,
+ "intensity": -10.0,
+ "mute": false
+ },
+ "band11": {
+ "bypass": false,
+ "intensity": -11.0,
+ "mute": false
+ },
+ "band12": {
+ "bypass": false,
+ "intensity": -12.0,
+ "mute": false
+ },
+ "band2": {
+ "bypass": false,
+ "intensity": -2.0,
+ "mute": false
+ },
+ "band3": {
+ "bypass": false,
+ "intensity": -3.0,
+ "mute": false
+ },
+ "band4": {
+ "bypass": false,
+ "intensity": -4.0,
+ "mute": false
+ },
+ "band5": {
+ "bypass": false,
+ "intensity": -5.0,
+ "mute": false
+ },
+ "band6": {
+ "bypass": false,
+ "intensity": -6.0,
+ "mute": false
+ },
+ "band7": {
+ "bypass": false,
+ "intensity": -7.0,
+ "mute": false
+ },
+ "band8": {
+ "bypass": false,
+ "intensity": -8.0,
+ "mute": false
+ },
+ "band9": {
+ "bypass": false,
+ "intensity": -9.0,
+ "mute": false
+ },
+ "bypass": false,
+ "input-gain": 0.0,
+ "output-gain": 0.0
+ },
+ "deesser#0": {
+ "bypass": false,
+ "detection": "RMS",
+ "f1-freq": 6000.0,
+ "f1-level": 0.0,
+ "f2-freq": 4500.0,
+ "f2-level": 12.0,
+ "f2-q": 1.0,
+ "input-gain": 0.0,
+ "laxity": 15,
+ "makeup": 0.0,
+ "mode": "Wide",
+ "output-gain": 0.0,
+ "ratio": 3.0,
+ "sc-listen": false,
+ "threshold": -18.0
+ },
+ "exciter#0": {
+ "amount": 0.9999999999999992,
+ "blend": 0.0,
+ "bypass": false,
+ "ceil": 16000.0,
+ "ceil-active": false,
+ "harmonics": 0.5000000000000001,
+ "input-gain": 0.0,
+ "output-gain": 0.0,
+ "scope": 2000.0
+ },
+ "plugins_order": [
+ "deesser#0",
+ "crystalizer#0",
+ "crossfeed#0",
+ "compressor#0",
+ "exciter#0",
+ "reverb#0",
+ "bass_loudness#0"
+ ],
+ "reverb#0": {
+ "amount": 0.499999999999974,
+ "bass-cut": 300.0,
+ "bypass": false,
+ "decay-time": 0.4999999999999991,
+ "diffusion": 0.49999999999999956,
+ "dry": 0.49999999999999933,
+ "hf-damp": 5000.0,
+ "input-gain": 0.0,
+ "output-gain": 0.0,
+ "predelay": 0.0,
+ "room-size": "Large",
+ "treble-cut": 5000.0
+ }
+ }
+}
diff --git a/dotfiles/.config/easyeffects/output/Speaker.json b/dotfiles/.config/easyeffects/output/Speaker.json
new file mode 100644
index 0000000..8d9a0ee
--- /dev/null
+++ b/dotfiles/.config/easyeffects/output/Speaker.json
@@ -0,0 +1,18 @@
+{
+ "output": {
+ "blocklist": [],
+ "loudness#1": {
+ "bypass": false,
+ "clipping": false,
+ "clipping-range": 6.0,
+ "fft": "4096",
+ "input-gain": 0.0,
+ "output-gain": 10.0,
+ "std": "ISO226-2003",
+ "volume": 6.999999999999991
+ },
+ "plugins_order": [
+ "loudness#1"
+ ]
+ }
+}
diff --git a/dotfiles/.config/fastfetch/config.jsonc b/dotfiles/.config/fastfetch/config.jsonc
new file mode 100644
index 0000000..d150bcc
--- /dev/null
+++ b/dotfiles/.config/fastfetch/config.jsonc
@@ -0,0 +1,181 @@
+{
+ "display": {
+ "separator": " ",
+ },
+ "logo": {
+ "padding": {
+ "top": 0,
+ },
+ },
+ "modules": [
+ {
+ "type": "custom",
+ "format": "\u001b[36m╭────────────┬──────────────────Hardware───────────────────────╮",
+ },
+ {
+ "type": "host",
+ "key": " PC │",
+ "keyColor": "cyan",
+ "format": "{2}",
+ "outputColor": "cyan",
+ },
+ {
+ "type": "board",
+ "key": "│ ╠ Board │",
+ "keyColor": "cyan",
+ "format": "{1}",
+ "outputColor": "cyan",
+ },
+ {
+ "type": "cpu",
+ "key": "│ ╠ CPU │",
+ "keyColor": "cyan",
+ "format": "{1}",
+ "outputColor": "cyan",
+ },
+ {
+ "type": "gpu",
+ "key": "│ ╠ GPU │",
+ "keyColor": "cyan",
+ "format": "{1} {2}",
+ "outputColor": "cyan",
+ },
+ {
+ "type": "memory",
+ "key": "│ ╠ RAM │",
+ "keyColor": "cyan",
+ "outputColor": "cyan",
+ },
+ {
+ "type": "disk",
+ "key": "│ ╠ Disk │",
+ "keyColor": "cyan",
+ "outputColor": "cyan",
+ "format": "{1} / {2} ({3}) {9}",
+ },
+ {
+ "type": "display",
+ "key": "│ ╠ Display │",
+ "keyColor": "cyan",
+ "outputColor": "cyan",
+ "format": "{1}x{2}@{3}Hz in {12}-inch",
+ },
+ {
+ "type": "battery",
+ "key": "│ ╠ Battery │",
+ "keyColor": "cyan",
+ "outputColor": "cyan",
+ },
+ {
+ "type": "uptime",
+ "key": "│ ╚ Uptime │",
+ "keyColor": "cyan",
+ "format": "{1} days {2} hours {3} minutes",
+ "outputColor": "cyan",
+ },
+ {
+ "type": "custom",
+ "format": "\u001b[36m╰────────────┴─────────────────────────────────────────────────╯",
+ },
+ {
+ "type": "custom",
+ "format": "\u001b[34m╭────────────┬──────────────────Software───────────────────────╮",
+ },
+ {
+ "type": "os",
+ "key": " OS │",
+ "keyColor": "blue",
+ "format": "{2} {8} {12}",
+ "outputColor": "blue",
+ },
+ {
+ "type": "kernel",
+ "key": "│ ╠ Kernel │",
+ "keyColor": "blue",
+ "format": "{1} {2}",
+ "outputColor": "blue",
+ },
+ {
+ "type": "packages",
+ "key": "│ ╠ Packages│",
+ "keyColor": "blue",
+ "outputColor": "blue",
+ },
+ {
+ "type": "shell",
+ "key": "│ ╠ Shell │",
+ "keyColor": "blue",
+ "outputColor": "blue",
+ "format": "{6} {4}",
+ },
+ {
+ "type": "terminal",
+ "key": "│ ╠ Terminal│",
+ "keyColor": "blue",
+ "outputColor": "blue",
+ "format": "{5} {6}",
+ },
+ {
+ "type": "lm",
+ "key": "│ ╠ LM │",
+ "keyColor": "blue",
+ "outputColor": "blue",
+ },
+ {
+ "type": "de",
+ "key": "│ ╠ DE │",
+ "keyColor": "blue",
+ "outputColor": "blue",
+ "format": "{2}",
+ },
+ {
+ "type": "wm",
+ "key": "│ ╠ WM │",
+ "keyColor": "blue",
+ "outputColor": "blue",
+ "format": "{2} {5}",
+ },
+ {
+ "type": "cursor",
+ "key": "│ ╠ Cursor │",
+ "keyColor": "blue",
+ "outputColor": "blue",
+ },
+ {
+ "type": "font",
+ "key": "│ ╠ Font │",
+ "keyColor": "blue",
+ "outputColor": "blue",
+ "format": "{1}",
+ },
+ {
+ "type": "terminalfont",
+ "key": "│ ╠ TermFont│",
+ "keyColor": "blue",
+ "outputColor": "blue",
+ },
+ {
+ "type": "icons",
+ "key": "│ ╠ Icons │",
+ "keyColor": "blue",
+ "outputColor": "blue",
+ "format": "{1} {2}",
+ },
+ {
+ "type": "title",
+ "key": "│ ╚ Hostname│",
+ "keyColor": "blue",
+ "outputColor": "blue",
+ "format": "{8}",
+ },
+ {
+ "type": "custom",
+ "format": "\u001b[34m╰────────────┴─────────────────────────────────────────────────╯",
+ },
+ {
+ "type": "custom",
+ "format": "\u001b[90m \u001b[91m \u001b[92m \u001b[93m \u001b[94m \u001b[95m \u001b[96m \u001b[97m \u001b[97m \u001b[96m \u001b[95m \u001b[94m \u001b[93m \u001b[92m \u001b[91m \u001b[90m",
+ },
+ ],
+}
+
diff --git a/dotfiles/.config/fcitx5/conf/cached_layouts b/dotfiles/.config/fcitx5/conf/cached_layouts
new file mode 100644
index 0000000..72334da
--- /dev/null
+++ b/dotfiles/.config/fcitx5/conf/cached_layouts
@@ -0,0 +1,3705 @@
+[keyboard-bqn]
+Description="Keyboard - BQN"
+Language=en
+Label=bqn
+
+[keyboard-apl]
+Description="Keyboard - APL"
+Language=en
+Label=apl
+
+[keyboard-apl-dyalog]
+Description="Keyboard - APL - APL symbols (Dyalog APL)"
+Language=en
+Label="dlg (dyalog)"
+
+[keyboard-apl-sax]
+Description="Keyboard - APL - APL symbols (SAX, Sharp APL for Unix)"
+Language=en
+Label=sax
+
+[keyboard-apl-unified]
+Description="Keyboard - APL - APL symbols (unified)"
+Language=en
+Label="ufd (unified)"
+
+[keyboard-apl-apl2]
+Description="Keyboard - APL - APL symbols (IBM APL2)"
+Language=en
+Label=apl2
+
+[keyboard-apl-aplplusII]
+Description="Keyboard - APL - APL symbols (Manugistics APL*PLUS II)"
+Language=en
+Label="aplII (aplplusII)"
+
+[keyboard-apl-aplx]
+Description="Keyboard - APL - APL symbols (APLX unified)"
+Language=en
+Label=aplx
+
+[keyboard-ua]
+Description="Keyboard - Ukrainian"
+Language=uk
+Label=uk
+
+[keyboard-ua-phonetic]
+Description="Keyboard - Ukrainian - Ukrainian (phonetic)"
+Language=uk
+Label="ua (phonetic)"
+
+[keyboard-ua-typewriter]
+Description="Keyboard - Ukrainian - Ukrainian (typewriter)"
+Language=uk
+Label="ua (typewriter)"
+
+[keyboard-ua-winkeys]
+Description="Keyboard - Ukrainian - Ukrainian (Windows)"
+Language=uk
+Label="ua (winkeys)"
+
+[keyboard-ua-macOS]
+Description="Keyboard - Ukrainian - Ukrainian (macOS)"
+Language=uk
+Label="ua (macOS)"
+
+[keyboard-ua-legacy]
+Description="Keyboard - Ukrainian - Ukrainian (legacy)"
+Language=uk
+Label="ua (legacy)"
+
+[keyboard-ua-homophonic]
+Description="Keyboard - Ukrainian - Ukrainian (homophonic)"
+Language=uk
+Label="ua (homophonic)"
+
+[keyboard-ua-crh]
+Description="Keyboard - Ukrainian - Crimean Tatar (Turkish Q)"
+Language=crh
+Label=crh
+
+[keyboard-ua-crh_f]
+Description="Keyboard - Ukrainian - Crimean Tatar (Turkish F)"
+Language=crh
+Label="crh (crh_f)"
+
+[keyboard-ua-crh_alt]
+Description="Keyboard - Ukrainian - Crimean Tatar (Turkish Alt-Q)"
+Language=crh
+Label="crh (crh_alt)"
+
+[keyboard-ua-sun_type6]
+Description="Keyboard - Ukrainian - Ukrainian (Sun Type 6/7)"
+Language=uk
+Label="ua (sun_type6)"
+
+[keyboard-th]
+Description="Keyboard - Thai"
+Language=th
+Label=th
+
+[keyboard-th-tis]
+Description="Keyboard - Thai - Thai (TIS-820.2538)"
+Language=th
+Label="th (tis)"
+
+[keyboard-th-pat]
+Description="Keyboard - Thai - Thai (Pattachote)"
+Language=th
+Label="th (pat)"
+
+[keyboard-tz]
+Description="Keyboard - Swahili (Tanzania)"
+Language=sw
+Label=sw
+
+[keyboard-latam]
+Description="Keyboard - Spanish (Latin American)"
+Language=es
+Label=es
+
+[keyboard-latam-nodeadkeys]
+Description="Keyboard - Spanish (Latin American) - Spanish (Latin American, no dead keys)"
+Language=es
+Label="latam (nodeadkeys)"
+
+[keyboard-latam-deadtilde]
+Description="Keyboard - Spanish (Latin American) - Spanish (Latin American, dead tilde)"
+Language=es
+Label="latam (deadtilde)"
+
+[keyboard-latam-dvorak]
+Description="Keyboard - Spanish (Latin American) - Spanish (Latin American, Dvorak)"
+Language=es
+Label="latam (dvorak)"
+
+[keyboard-latam-colemak]
+Description="Keyboard - Spanish (Latin American) - Spanish (Latin American, Colemak)"
+Language=es
+Label="latam (colemak)"
+
+[keyboard-sk]
+Description="Keyboard - Slovak"
+Language=sk
+Label=sk
+
+[keyboard-sk-bksl]
+Description="Keyboard - Slovak - Slovak (extra backslash)"
+Language=sk
+Label="sk (bksl)"
+
+[keyboard-sk-qwerty]
+Description="Keyboard - Slovak - Slovak (QWERTY)"
+Language=sk
+Label="sk (qwerty)"
+
+[keyboard-sk-qwerty_bksl]
+Description="Keyboard - Slovak - Slovak (QWERTY, extra backslash)"
+Language=sk
+Label="sk (qwerty_bksl)"
+
+[keyboard-sk-acc]
+Description="Keyboard - Slovak - Slovak (ACC layout, only accented letters)"
+Language=sk
+Label="sk (acc)"
+
+[keyboard-sk-sun_type6]
+Description="Keyboard - Slovak - Slovak (Sun Type 6/7)"
+Language=sk
+Label="sk (sun_type6)"
+
+[keyboard-ru]
+Description="Keyboard - Russian"
+Language=ru
+Label=ru
+
+[keyboard-ru-phonetic]
+Description="Keyboard - Russian - Russian (phonetic)"
+Language=ru
+Label="ru (phonetic)"
+
+[keyboard-ru-phonetic_winkeys]
+Description="Keyboard - Russian - Russian (phonetic, Windows)"
+Language=ru
+Label="ru (phonetic_winkeys)"
+
+[keyboard-ru-phonetic_YAZHERTY]
+Description="Keyboard - Russian - Russian (phonetic, YAZHERTY)"
+Language=ru
+Label="ru (phonetic_YAZHERTY)"
+
+[keyboard-ru-phonetic_azerty]
+Description="Keyboard - Russian - Russian (phonetic, AZERTY)"
+Language=ru
+Label="ru (phonetic_azerty)"
+
+[keyboard-ru-phonetic_dvorak]
+Description="Keyboard - Russian - Russian (phonetic, Dvorak)"
+Language=ru
+Label="ru (phonetic_dvorak)"
+
+[keyboard-ru-typewriter]
+Description="Keyboard - Russian - Russian (typewriter)"
+Language=ru
+Label="ru (typewriter)"
+
+[keyboard-ru-ruchey_ru]
+Description="Keyboard - Russian - Russian (engineering, RU)"
+Language=ru
+Label="ru (ruchey_ru)"
+
+[keyboard-ru-ruchey_en]
+Description="Keyboard - Russian - Russian (engineering, EN)"
+Language=ru
+Label="en (ruchey_en)"
+
+[keyboard-ru-legacy]
+Description="Keyboard - Russian - Russian (legacy)"
+Language=ru
+Label="ru (legacy)"
+
+[keyboard-ru-typewriter-legacy]
+Description="Keyboard - Russian - Russian (typewriter, legacy)"
+Language=ru
+Label="ru (typewriter-legacy)"
+
+[keyboard-ru-dos]
+Description="Keyboard - Russian - Russian (DOS)"
+Language=ru
+Label="ru (dos)"
+
+[keyboard-ru-mac]
+Description="Keyboard - Russian - Russian (Macintosh)"
+Language=ru
+Label="ru (mac)"
+
+[keyboard-ru-ab]
+Description="Keyboard - Russian - Abkhazian (Russia)"
+Language=ab
+Label="ru (ab)"
+
+[keyboard-ru-bak]
+Description="Keyboard - Russian - Bashkirian"
+Language=ba
+Label="ru (bak)"
+
+[keyboard-ru-cv]
+Description="Keyboard - Russian - Chuvash"
+Language=cv
+Label="ru (cv)"
+
+[keyboard-ru-cv_latin]
+Description="Keyboard - Russian - Chuvash (Latin)"
+Language=cv
+Label="ru (cv_latin)"
+
+[keyboard-ru-xal]
+Description="Keyboard - Russian - Kalmyk"
+Language=xal
+Label="ru (xal)"
+
+[keyboard-ru-kom]
+Description="Keyboard - Russian - Komi"
+Language=kv
+Label="ru (kom)"
+
+[keyboard-ru-chm]
+Description="Keyboard - Russian - Mari"
+Language=chm
+Label="ru (chm)"
+
+[keyboard-ru-os_legacy]
+Description="Keyboard - Russian - Ossetian (legacy)"
+Language=os
+Label="ru (os_legacy)"
+
+[keyboard-ru-os_winkeys]
+Description="Keyboard - Russian - Ossetian (Windows)"
+Language=os
+Label="ru (os_winkeys)"
+
+[keyboard-ru-srp]
+Description="Keyboard - Russian - Serbian (Russia)"
+Language=ru
+Label="ru (srp)"
+
+[keyboard-ru-tt]
+Description="Keyboard - Russian - Tatar"
+Language=tt
+Label="ru (tt)"
+
+[keyboard-ru-udm]
+Description="Keyboard - Russian - Udmurt"
+Language=udm
+Label="ru (udm)"
+
+[keyboard-ru-sah]
+Description="Keyboard - Russian - Yakut"
+Language=sah
+Label="ru (sah)"
+
+[keyboard-ru-chu]
+Description="Keyboard - Russian - Church Slavonic"
+Language=cu
+Label="ru (chu)"
+
+[keyboard-ru-ruu]
+Description="Keyboard - Russian - Russian (plus Ukrainian and Belarusian letters)"
+Language=ru
+Label="ru (ruu)"
+
+[keyboard-ru-rulemak]
+Description="Keyboard - Russian - Russian (Rulemak, phonetic Colemak)"
+Language=ru
+Label="ru (rulemak)"
+
+[keyboard-ru-phonetic_mac]
+Description="Keyboard - Russian - Russian (phonetic, Macintosh)"
+Language=ru
+Label="ru (phonetic_mac)"
+
+[keyboard-ru-sun_type6]
+Description="Keyboard - Russian - Russian (Sun Type 6/7)"
+Language=ru
+Label="ru (sun_type6)"
+
+[keyboard-ru-unipunct]
+Description="Keyboard - Russian - Russian (with US punctuation)"
+Language=ru
+Label="ru (unipunct)"
+
+[keyboard-ru-gost-6431-75-48]
+Description="Keyboard - Russian - Russian (GOST 6431-75)"
+Language=ru
+Label="ru (gost-6431-75-48)"
+
+[keyboard-ru-gost-14289-88]
+Description="Keyboard - Russian - Russian (GOST 14289-88)"
+Language=ru
+Label="ru (gost-14289-88)"
+
+[keyboard-ru-prxn]
+Description="Keyboard - Russian - Russian (Polyglot and Reactionary)"
+Language=ru
+Label="ru (prxn)"
+
+[keyboard-ru-winkeys-p]
+Description="Keyboard - Russian - Russian (Programmer)"
+Language=ru
+Label=winkeys-p
+
+[keyboard-ru-typo]
+Description="Keyboard - Russian - Russian (plus typographic symbols)"
+Language=ru
+Label="ru (typo)"
+
+[keyboard-ru-rtu]
+Description="Keyboard - Russian - Russian (plus Tatar letters)"
+Language=ru
+Label="ru (rtu)"
+
+[keyboard-ru-diktor]
+Description="Keyboard - Russian - Russian (Diktor)"
+Language=ru
+Label=diktor
+
+[keyboard-ru-ruintl_ru]
+Description="Keyboard - Russian - Russian (international, RU)"
+Language=ru
+Label="ru (ruintl_ru)"
+
+[keyboard-ru-ruintl_en]
+Description="Keyboard - Russian - Russian (international, EN)"
+Language=en
+Label="en (ruintl_en)"
+
+[keyboard-br]
+Description="Keyboard - Portuguese (Brazil)"
+Language=pt
+Label=pt
+
+[keyboard-br-nodeadkeys]
+Description="Keyboard - Portuguese (Brazil) - Portuguese (Brazil, no dead keys)"
+Language=pt
+Label="br (nodeadkeys)"
+
+[keyboard-br-dvorak]
+Description="Keyboard - Portuguese (Brazil) - Portuguese (Brazil, Dvorak)"
+Language=pt
+Label="br (dvorak)"
+
+[keyboard-br-nativo]
+Description="Keyboard - Portuguese (Brazil) - Portuguese (Brazil, Nativo)"
+Language=pt
+Label="br (nativo)"
+
+[keyboard-br-nativo-us]
+Description="Keyboard - Portuguese (Brazil) - Portuguese (Brazil, Nativo for US keyboards)"
+Language=pt
+Label="br (nativo-us)"
+
+[keyboard-br-thinkpad]
+Description="Keyboard - Portuguese (Brazil) - Portuguese (Brazil, IBM/Lenovo ThinkPad)"
+Language=pt
+Label="br (thinkpad)"
+
+[keyboard-br-nativo-epo]
+Description="Keyboard - Portuguese (Brazil) - Esperanto (Brazil, Nativo)"
+Language=eo
+Label="br (nativo-epo)"
+
+[keyboard-br-rus]
+Description="Keyboard - Portuguese (Brazil) - Russian (Brazil, phonetic)"
+Language=ru
+Label="ru (rus)"
+
+[keyboard-br-sun_type6]
+Description="Keyboard - Portuguese (Brazil) - Portuguese (Brazil, Sun Type 6/7)"
+Language=pt
+Label="br (sun_type6)"
+
+[keyboard-ro]
+Description="Keyboard - Romanian"
+Language=ro
+Label=ro
+
+[keyboard-ro-std]
+Description="Keyboard - Romanian - Romanian (standard)"
+Language=ro
+Label="ro (std)"
+
+[keyboard-ro-winkeys]
+Description="Keyboard - Romanian - Romanian (Windows)"
+Language=ro
+Label="ro (winkeys)"
+
+[keyboard-ro-crh_dobruja]
+Description="Keyboard - Romanian - Crimean Tatar (Dobruja Q)"
+Language=crh
+Label="crh (crh_dobruja)"
+
+[keyboard-ro-ergonomic]
+Description="Keyboard - Romanian - Romanian (ergonomic Touchtype)"
+Language=ro
+Label="ro (ergonomic)"
+
+[keyboard-ro-sun_type6]
+Description="Keyboard - Romanian - Romanian (Sun Type 6/7)"
+Language=ro
+Label="ro (sun_type6)"
+
+[keyboard-pl]
+Description="Keyboard - Polish"
+Language=pl
+Label=pl
+
+[keyboard-pl-legacy]
+Description="Keyboard - Polish - Polish (legacy)"
+Language=pl
+Label="pl (legacy)"
+
+[keyboard-pl-qwertz]
+Description="Keyboard - Polish - Polish (QWERTZ)"
+Language=pl
+Label="pl (qwertz)"
+
+[keyboard-pl-dvorak]
+Description="Keyboard - Polish - Polish (Dvorak)"
+Language=pl
+Label="pl (dvorak)"
+
+[keyboard-pl-dvorak_quotes]
+Description="Keyboard - Polish - Polish (Dvorak, with Polish quotes on quotemark key)"
+Language=pl
+Label="pl (dvorak_quotes)"
+
+[keyboard-pl-dvorak_altquotes]
+Description="Keyboard - Polish - Polish (Dvorak, with Polish quotes on key 1)"
+Language=pl
+Label="pl (dvorak_altquotes)"
+
+[keyboard-pl-dvp]
+Description="Keyboard - Polish - Polish (programmer Dvorak)"
+Language=pl
+Label="pl (dvp)"
+
+[keyboard-pl-csb]
+Description="Keyboard - Polish - Kashubian"
+Language=csb
+Label="pl (csb)"
+
+[keyboard-pl-szl]
+Description="Keyboard - Polish - Silesian"
+Language=szl
+Label="pl (szl)"
+
+[keyboard-pl-ru_phonetic_dvorak]
+Description="Keyboard - Polish - Russian (Poland, phonetic Dvorak)"
+Language=ru
+Label="ru (ru_phonetic_dvorak)"
+
+[keyboard-pl-intl]
+Description="Keyboard - Polish - Polish (intl., with dead keys)"
+Language=pl
+Label="pl (intl)"
+
+[keyboard-pl-colemak]
+Description="Keyboard - Polish - Polish (Colemak)"
+Language=pl
+Label="pl (colemak)"
+
+[keyboard-pl-colemak_dh_ansi]
+Description="Keyboard - Polish - Polish (Colemak-DH)"
+Language=pl
+Label="pl (colemak_dh_ansi)"
+
+[keyboard-pl-colemak_dh]
+Description="Keyboard - Polish - Polish (Colemak-DH ISO)"
+Language=pl
+Label="pl (colemak_dh)"
+
+[keyboard-pl-sun_type6]
+Description="Keyboard - Polish - Polish (Sun Type 6/7)"
+Language=pl
+Label="pl (sun_type6)"
+
+[keyboard-pl-glagolica]
+Description="Keyboard - Polish - Polish (Glagolica)"
+Language=pl
+Label="pl (glagolica)"
+
+[keyboard-pl-lefty]
+Description="Keyboard - Polish - Polish (lefty)"
+Language=pl
+Label="pl (lefty)"
+
+[keyboard-trans]
+Description="Keyboard - International Phonetic Alphabet"
+Language=
+Label=ipa
+
+[keyboard-trans-qwerty]
+Description="Keyboard - International Phonetic Alphabet - International Phonetic Alphabet (QWERTY)"
+Language=
+Label="trans (qwerty)"
+
+[keyboard-ir]
+Description="Keyboard - Persian"
+Language=fa
+Label=fa
+
+[keyboard-ir-pes_keypad]
+Description="Keyboard - Persian - Persian (with Persian keypad)"
+Language=fa
+Label="ir (pes_keypad)"
+
+[keyboard-ir-winkeys]
+Description="Keyboard - Persian - Persian (Windows)"
+Language=fa
+Label="ir (winkeys)"
+
+[keyboard-ir-azb]
+Description="Keyboard - Persian - Azerbaijani (Iran)"
+Language=azb
+Label=azb
+
+[keyboard-ir-ku]
+Description="Keyboard - Persian - Kurdish (Iran, Latin Q)"
+Language=ku
+Label=ku
+
+[keyboard-ir-ku_alt]
+Description="Keyboard - Persian - Kurdish (Iran, Latin Alt-Q)"
+Language=ku
+Label="ku (ku_alt)"
+
+[keyboard-ir-ku_f]
+Description="Keyboard - Persian - Kurdish (Iran, F)"
+Language=ku
+Label="ku (ku_f)"
+
+[keyboard-ir-ku_ara]
+Description="Keyboard - Persian - Kurdish (Iran, Arabic-Latin)"
+Language=ku
+Label="ku (ku_ara)"
+
+[keyboard-custom]
+Description="Keyboard - A user-defined custom Layout"
+Language=und
+Label=custom
+
+[keyboard-no]
+Description="Keyboard - Norwegian"
+Language=no
+Label=no
+
+[keyboard-no-nodeadkeys]
+Description="Keyboard - Norwegian - Norwegian (no dead keys)"
+Language=no
+Label="no (nodeadkeys)"
+
+[keyboard-no-winkeys]
+Description="Keyboard - Norwegian - Norwegian (Windows)"
+Language=no
+Label="no (winkeys)"
+
+[keyboard-no-mac]
+Description="Keyboard - Norwegian - Norwegian (Macintosh)"
+Language=no
+Label="no (mac)"
+
+[keyboard-no-mac_nodeadkeys]
+Description="Keyboard - Norwegian - Norwegian (Macintosh, no dead keys)"
+Language=no
+Label="no (mac_nodeadkeys)"
+
+[keyboard-no-colemak]
+Description="Keyboard - Norwegian - Norwegian (Colemak)"
+Language=no
+Label="no (colemak)"
+
+[keyboard-no-colemak_dh]
+Description="Keyboard - Norwegian - Norwegian (Colemak-DH)"
+Language=no
+Label="no (colemak_dh)"
+
+[keyboard-no-colemak_dh_wide]
+Description="Keyboard - Norwegian - Norwegian (Colemak-DH Wide)"
+Language=no
+Label="no (colemak_dh_wide)"
+
+[keyboard-no-dvorak]
+Description="Keyboard - Norwegian - Norwegian (Dvorak)"
+Language=no
+Label="no (dvorak)"
+
+[keyboard-no-smi]
+Description="Keyboard - Norwegian - Northern Saami (Norway)"
+Language=se
+Label="no (smi)"
+
+[keyboard-no-smi_nodeadkeys]
+Description="Keyboard - Norwegian - Northern Saami (Norway, no dead keys)"
+Language=se
+Label="no (smi_nodeadkeys)"
+
+[keyboard-no-sun_type6]
+Description="Keyboard - Norwegian - Norwegian (Sun Type 6/7)"
+Language=no
+Label="no (sun_type6)"
+
+[keyboard-gn]
+Description="Keyboard - N'Ko (AZERTY)"
+Language=nqo
+Label=nqo
+
+[keyboard-tm]
+Description="Keyboard - Turkmen"
+Language=tk
+Label=tk
+
+[keyboard-tm-alt]
+Description="Keyboard - Turkmen - Turkmen (Alt-Q)"
+Language=tk
+Label="tm (alt)"
+
+[keyboard-np]
+Description="Keyboard - Nepali"
+Language=ne
+Label=ne
+
+[keyboard-ancient]
+Description="Keyboard - Ancient"
+Language=got
+Label=xx
+
+[keyboard-ancient-got]
+Description="Keyboard - Ancient - Gothic"
+Language=got
+Label="ancient (got)"
+
+[keyboard-ancient-uga]
+Description="Keyboard - Ancient - Ugaritic"
+Language=uga
+Label="ancient (uga)"
+
+[keyboard-ancient-ave]
+Description="Keyboard - Ancient - Avestan"
+Language=ae
+Label="ancient (ave)"
+
+[keyboard-mt]
+Description="Keyboard - Maltese"
+Language=mt
+Label=mt
+
+[keyboard-mt-us]
+Description="Keyboard - Maltese - Maltese (US)"
+Language=mt
+Label="mt (us)"
+
+[keyboard-mt-alt-us]
+Description="Keyboard - Maltese - Maltese (US, with AltGr overrides)"
+Language=mt
+Label="mt (alt-us)"
+
+[keyboard-mt-alt-gb]
+Description="Keyboard - Maltese - Maltese (UK, with AltGr overrides)"
+Language=mt
+Label="mt (alt-gb)"
+
+[keyboard-pt]
+Description="Keyboard - Portuguese"
+Language=pt
+Label=pt
+
+[keyboard-pt-nodeadkeys]
+Description="Keyboard - Portuguese - Portuguese (no dead keys)"
+Language=pt
+Label="pt (nodeadkeys)"
+
+[keyboard-pt-mac]
+Description="Keyboard - Portuguese - Portuguese (Macintosh)"
+Language=pt
+Label="pt (mac)"
+
+[keyboard-pt-mac_nodeadkeys]
+Description="Keyboard - Portuguese - Portuguese (Macintosh, no dead keys)"
+Language=pt
+Label="pt (mac_nodeadkeys)"
+
+[keyboard-pt-nativo]
+Description="Keyboard - Portuguese - Portuguese (Nativo)"
+Language=pt
+Label="pt (nativo)"
+
+[keyboard-pt-nativo-us]
+Description="Keyboard - Portuguese - Portuguese (Nativo for US keyboards)"
+Language=pt
+Label="pt (nativo-us)"
+
+[keyboard-pt-nativo-epo]
+Description="Keyboard - Portuguese - Esperanto (Portugal, Nativo)"
+Language=eo
+Label="pt (nativo-epo)"
+
+[keyboard-pt-sun_type6]
+Description="Keyboard - Portuguese - Portuguese (Sun Type 6/7)"
+Language=pt
+Label="pt (sun_type6)"
+
+[keyboard-pt-colemak]
+Description="Keyboard - Portuguese - Portuguese (Colemak)"
+Language=pt
+Label="pt (colemak)"
+
+[keyboard-my]
+Description="Keyboard - Malay (Jawi, Arabic Keyboard)"
+Language=id
+Label=ms
+
+[keyboard-my-phonetic]
+Description="Keyboard - Malay (Jawi, Arabic Keyboard) - Malay (Jawi, phonetic)"
+Language=id
+Label="my (phonetic)"
+
+[keyboard-mk]
+Description="Keyboard - Macedonian"
+Language=mk
+Label=mk
+
+[keyboard-mk-nodeadkeys]
+Description="Keyboard - Macedonian - Macedonian (no dead keys)"
+Language=mk
+Label="mk (nodeadkeys)"
+
+[keyboard-kg]
+Description="Keyboard - Kyrgyz"
+Language=ky
+Label=ki
+
+[keyboard-kg-phonetic]
+Description="Keyboard - Kyrgyz - Kyrgyz (phonetic)"
+Language=ky
+Label="kg (phonetic)"
+
+[keyboard-tj]
+Description="Keyboard - Tajik"
+Language=tg
+Label=tg
+
+[keyboard-tj-legacy]
+Description="Keyboard - Tajik - Tajik (legacy)"
+Language=tg
+Label="tj (legacy)"
+
+[keyboard-mv]
+Description="Keyboard - Dhivehi"
+Language=dv
+Label=dv
+
+[keyboard-lk]
+Description="Keyboard - Sinhala (phonetic)"
+Language=si
+Label=si
+
+[keyboard-lk-us]
+Description="Keyboard - Sinhala (phonetic) - Sinhala (US)"
+Language=si
+Label="si (us)"
+
+[keyboard-lk-tam_unicode]
+Description="Keyboard - Sinhala (phonetic) - Tamil (Sri Lanka, TamilNet '99)"
+Language=ta
+Label="ta (tam_unicode)"
+
+[keyboard-lk-tam_TAB]
+Description="Keyboard - Sinhala (phonetic) - Tamil (Sri Lanka, TamilNet '99, TAB encoding)"
+Language=ta
+Label="lk (tam_TAB)"
+
+[keyboard-al]
+Description="Keyboard - Albanian"
+Language=sq
+Label=sq
+
+[keyboard-al-plisi]
+Description="Keyboard - Albanian - Albanian (Plisi)"
+Language=sq
+Label="al (plisi)"
+
+[keyboard-al-veqilharxhi]
+Description="Keyboard - Albanian - Albanian (Veqilharxhi)"
+Language=sq
+Label="al (veqilharxhi)"
+
+[keyboard-cz]
+Description="Keyboard - Czech"
+Language=cs
+Label=cs
+
+[keyboard-cz-bksl]
+Description="Keyboard - Czech - Czech (extra backslash)"
+Language=cs
+Label="cz (bksl)"
+
+[keyboard-cz-qwerty]
+Description="Keyboard - Czech - Czech (QWERTY)"
+Language=cs
+Label="cz (qwerty)"
+
+[keyboard-cz-qwerty_bksl]
+Description="Keyboard - Czech - Czech (QWERTY, extra backslash)"
+Language=cs
+Label="cz (qwerty_bksl)"
+
+[keyboard-cz-winkeys]
+Description="Keyboard - Czech - Czech (QWERTZ, Windows)"
+Language=cs
+Label="cz (winkeys)"
+
+[keyboard-cz-winkeys-qwerty]
+Description="Keyboard - Czech - Czech (QWERTY, Windows)"
+Language=cs
+Label="cz (winkeys-qwerty)"
+
+[keyboard-cz-qwerty-mac]
+Description="Keyboard - Czech - Czech (QWERTY, Macintosh)"
+Language=cs
+Label="cz (qwerty-mac)"
+
+[keyboard-cz-ucw]
+Description="Keyboard - Czech - Czech (UCW, only accented letters)"
+Language=cs
+Label="cz (ucw)"
+
+[keyboard-cz-dvorak-ucw]
+Description="Keyboard - Czech - Czech (US, Dvorak, UCW support)"
+Language=cs
+Label="cz (dvorak-ucw)"
+
+[keyboard-cz-rus]
+Description="Keyboard - Czech - Russian (Czechia, phonetic)"
+Language=ru
+Label="ru (rus)"
+
+[keyboard-cz-sun_type6]
+Description="Keyboard - Czech - Czech (Sun Type 6/7)"
+Language=cs
+Label="cz (sun_type6)"
+
+[keyboard-cz-prog]
+Description="Keyboard - Czech - Czech (programming)"
+Language=cs
+Label="cz (prog)"
+
+[keyboard-cz-prog_typo]
+Description="Keyboard - Czech - Czech (programming, typographic)"
+Language=cs
+Label="cz (prog_typo)"
+
+[keyboard-cz-coder]
+Description="Keyboard - Czech - Czech (coder)"
+Language=cs
+Label="cz (coder)"
+
+[keyboard-cz-colemak-ucw]
+Description="Keyboard - Czech - Czech (US, Colemak, UCW support)"
+Language=cs
+Label="cz (colemak-ucw)"
+
+[keyboard-brai]
+Description="Keyboard - Braille"
+Language=
+Label=brl
+
+[keyboard-brai-left_hand]
+Description="Keyboard - Braille - Braille (left-handed)"
+Language=
+Label="brai (left_hand)"
+
+[keyboard-brai-left_hand_invert]
+Description="Keyboard - Braille - Braille (left-handed inverted thumb)"
+Language=
+Label="brai (left_hand_invert)"
+
+[keyboard-brai-right_hand]
+Description="Keyboard - Braille - Braille (right-handed)"
+Language=
+Label="brai (right_hand)"
+
+[keyboard-brai-right_hand_invert]
+Description="Keyboard - Braille - Braille (right-handed inverted thumb)"
+Language=
+Label="brai (right_hand_invert)"
+
+[keyboard-se]
+Description="Keyboard - Swedish"
+Language=sv
+Label=sv
+
+[keyboard-se-nodeadkeys]
+Description="Keyboard - Swedish - Swedish (no dead keys)"
+Language=sv
+Label="se (nodeadkeys)"
+
+[keyboard-se-dvorak]
+Description="Keyboard - Swedish - Swedish (Dvorak)"
+Language=sv
+Label="se (dvorak)"
+
+[keyboard-se-us_dvorak]
+Description="Keyboard - Swedish - Swedish (Dvorak, intl.)"
+Language=sv
+Label="se (us_dvorak)"
+
+[keyboard-se-svdvorak]
+Description="Keyboard - Swedish - Swedish (Svdvorak)"
+Language=sv
+Label="se (svdvorak)"
+
+[keyboard-se-mac]
+Description="Keyboard - Swedish - Swedish (Macintosh)"
+Language=sv
+Label="se (mac)"
+
+[keyboard-se-us]
+Description="Keyboard - Swedish - Swedish (US)"
+Language=sv
+Label="se (us)"
+
+[keyboard-se-swl]
+Description="Keyboard - Swedish - Swedish Sign Language"
+Language=swl
+Label="se (swl)"
+
+[keyboard-se-smi]
+Description="Keyboard - Swedish - Northern Saami (Sweden)"
+Language=se
+Label="se (smi)"
+
+[keyboard-se-rus]
+Description="Keyboard - Swedish - Russian (Sweden, phonetic)"
+Language=ru
+Label="ru (rus)"
+
+[keyboard-se-dvorak_a5]
+Description="Keyboard - Swedish - Swedish (Dvorak A5)"
+Language=sv
+Label="se (dvorak_a5)"
+
+[keyboard-se-sun_type6]
+Description="Keyboard - Swedish - Swedish (Sun Type 6/7)"
+Language=sv
+Label="se (sun_type6)"
+
+[keyboard-se-ovd]
+Description="Keyboard - Swedish - Elfdalian (Sweden, with combining ogonek)"
+Language=ovd
+Label="se (ovd)"
+
+[keyboard-bg]
+Description="Keyboard - Bulgarian"
+Language=bg
+Label=bg
+
+[keyboard-bg-phonetic]
+Description="Keyboard - Bulgarian - Bulgarian (traditional phonetic)"
+Language=bg
+Label="bg (phonetic)"
+
+[keyboard-bg-bas_phonetic]
+Description="Keyboard - Bulgarian - Bulgarian (new phonetic)"
+Language=bg
+Label="bg (bas_phonetic)"
+
+[keyboard-bg-bekl]
+Description="Keyboard - Bulgarian - Bulgarian (enhanced)"
+Language=bg
+Label="bg (bekl)"
+
+[keyboard-pk]
+Description="Keyboard - Urdu (Pakistan)"
+Language=ur
+Label=ur
+
+[keyboard-pk-urd-crulp]
+Description="Keyboard - Urdu (Pakistan) - Urdu (Pakistan, CRULP)"
+Language=ur
+Label="pk (urd-crulp)"
+
+[keyboard-pk-urd-nla]
+Description="Keyboard - Urdu (Pakistan) - Urdu (Pakistan, NLA)"
+Language=ur
+Label="pk (urd-nla)"
+
+[keyboard-pk-ara]
+Description="Keyboard - Urdu (Pakistan) - Arabic (Pakistan)"
+Language=ar
+Label="ar (ara)"
+
+[keyboard-pk-snd]
+Description="Keyboard - Urdu (Pakistan) - Sindhi"
+Language=sd
+Label="sd (snd)"
+
+[keyboard-pk-urd-navees]
+Description="Keyboard - Urdu (Pakistan) - Urdu (Pakistan, Navees)"
+Language=ur
+Label="pk (urd-navees)"
+
+[keyboard-au]
+Description="Keyboard - English (Australia)"
+Language=en
+Label=en
+
+[keyboard-mn]
+Description="Keyboard - Mongolian"
+Language=mn
+Label=mn
+
+[keyboard-dz]
+Description="Keyboard - Berber (Algeria, Latin)"
+Language=tzm
+Label=kab
+
+[keyboard-dz-ber]
+Description="Keyboard - Berber (Algeria, Latin) - Berber (Algeria, Tifinagh)"
+Language=kab
+Label="kab (ber)"
+
+[keyboard-dz-azerty-deadkeys]
+Description="Keyboard - Berber (Algeria, Latin) - Kabyle (AZERTY, with dead keys)"
+Language=kab
+Label="kab (azerty-deadkeys)"
+
+[keyboard-dz-qwerty-gb-deadkeys]
+Description="Keyboard - Berber (Algeria, Latin) - Kabyle (QWERTY, UK, with dead keys)"
+Language=kab
+Label="kab (qwerty-gb-deadkeys)"
+
+[keyboard-dz-qwerty-us-deadkeys]
+Description="Keyboard - Berber (Algeria, Latin) - Kabyle (QWERTY, US, with dead keys)"
+Language=kab
+Label="kab (qwerty-us-deadkeys)"
+
+[keyboard-dz-ar]
+Description="Keyboard - Berber (Algeria, Latin) - Arabic (Algeria)"
+Language=ar
+Label=ar
+
+[keyboard-me]
+Description="Keyboard - Montenegrin"
+Language=sr
+Label=sr
+
+[keyboard-me-cyrillic]
+Description="Keyboard - Montenegrin - Montenegrin (Cyrillic)"
+Language=sr
+Label="me (cyrillic)"
+
+[keyboard-me-cyrillicyz]
+Description="Keyboard - Montenegrin - Montenegrin (Cyrillic, ZE and ZHE swapped)"
+Language=sr
+Label="me (cyrillicyz)"
+
+[keyboard-me-cyrillicalternatequotes]
+Description="Keyboard - Montenegrin - Montenegrin (Cyrillic, with guillemets)"
+Language=sr
+Label="me (cyrillicalternatequotes)"
+
+[keyboard-me-latinunicode]
+Description="Keyboard - Montenegrin - Montenegrin (Latin, Unicode)"
+Language=sr
+Label="me (latinunicode)"
+
+[keyboard-me-latinyz]
+Description="Keyboard - Montenegrin - Montenegrin (Latin, QWERTY)"
+Language=sr
+Label="me (latinyz)"
+
+[keyboard-me-latinunicodeyz]
+Description="Keyboard - Montenegrin - Montenegrin (Latin, Unicode, QWERTY)"
+Language=sr
+Label="me (latinunicodeyz)"
+
+[keyboard-me-latinalternatequotes]
+Description="Keyboard - Montenegrin - Montenegrin (Latin, with guillemets)"
+Language=sr
+Label="me (latinalternatequotes)"
+
+[keyboard-lv]
+Description="Keyboard - Latvian"
+Language=lv
+Label=lv
+
+[keyboard-lv-apostrophe]
+Description="Keyboard - Latvian - Latvian (apostrophe)"
+Language=lv
+Label="lv (apostrophe)"
+
+[keyboard-lv-tilde]
+Description="Keyboard - Latvian - Latvian (tilde)"
+Language=lv
+Label="lv (tilde)"
+
+[keyboard-lv-fkey]
+Description="Keyboard - Latvian - Latvian (F)"
+Language=lv
+Label="lv (fkey)"
+
+[keyboard-lv-modern]
+Description="Keyboard - Latvian - Latvian (Modern Latin)"
+Language=lv
+Label="lv (modern)"
+
+[keyboard-lv-modern-cyr]
+Description="Keyboard - Latvian - Latvian (Modern Cyrillic)"
+Language=lv
+Label="lv (modern-cyr)"
+
+[keyboard-lv-ergonomic]
+Description="Keyboard - Latvian - Latvian (ergonomic, ŪGJRMV)"
+Language=lv
+Label="lv (ergonomic)"
+
+[keyboard-lv-adapted]
+Description="Keyboard - Latvian - Latvian (adapted)"
+Language=lv
+Label="lv (adapted)"
+
+[keyboard-lv-dvorak]
+Description="Keyboard - Latvian - Latvian (Dvorak)"
+Language=lv
+Label="lv (dvorak)"
+
+[keyboard-lv-ykeydvorak]
+Description="Keyboard - Latvian - Latvian (Dvorak, with Y)"
+Language=lv
+Label="lv (ykeydvorak)"
+
+[keyboard-lv-minuskeydvorak]
+Description="Keyboard - Latvian - Latvian (Dvorak, with minus)"
+Language=lv
+Label="lv (minuskeydvorak)"
+
+[keyboard-lv-dvorakprogr]
+Description="Keyboard - Latvian - Latvian (programmer Dvorak)"
+Language=lv
+Label="lv (dvorakprogr)"
+
+[keyboard-lv-ykeydvorakprogr]
+Description="Keyboard - Latvian - Latvian (programmer Dvorak, with Y)"
+Language=lv
+Label="lv (ykeydvorakprogr)"
+
+[keyboard-lv-minuskeydvorakprogr]
+Description="Keyboard - Latvian - Latvian (programmer Dvorak, with minus)"
+Language=lv
+Label="lv (minuskeydvorakprogr)"
+
+[keyboard-lv-colemak]
+Description="Keyboard - Latvian - Latvian (Colemak)"
+Language=lv
+Label="lv (colemak)"
+
+[keyboard-lv-apostrophecolemak]
+Description="Keyboard - Latvian - Latvian (Colemak, with apostrophe)"
+Language=lv
+Label="lv (apostrophecolemak)"
+
+[keyboard-lv-sun_type6]
+Description="Keyboard - Latvian - Latvian (Sun Type 6/7)"
+Language=lv
+Label="lv (sun_type6)"
+
+[keyboard-lv-apostrophe-deadquotes]
+Description="Keyboard - Latvian - Latvian (apostrophe, dead quotes)"
+Language=lv
+Label="lv (apostrophe-deadquotes)"
+
+[keyboard-ba]
+Description="Keyboard - Bosnian"
+Language=bs
+Label=bs
+
+[keyboard-ba-alternatequotes]
+Description="Keyboard - Bosnian - Bosnian (with guillemets)"
+Language=bs
+Label="ba (alternatequotes)"
+
+[keyboard-ba-unicode]
+Description="Keyboard - Bosnian - Bosnian (with Bosnian digraphs)"
+Language=bs
+Label="ba (unicode)"
+
+[keyboard-ba-unicodeus]
+Description="Keyboard - Bosnian - Bosnian (US, with Bosnian digraphs)"
+Language=bs
+Label="ba (unicodeus)"
+
+[keyboard-ba-us]
+Description="Keyboard - Bosnian - Bosnian (US)"
+Language=bs
+Label="ba (us)"
+
+[keyboard-tw]
+Description="Keyboard - Taiwanese"
+Language=
+Label=zh
+
+[keyboard-tw-indigenous]
+Description="Keyboard - Taiwanese - Taiwanese (indigenous)"
+Language=tay
+Label="tw (indigenous)"
+
+[keyboard-tw-saisiyat]
+Description="Keyboard - Taiwanese - Saisiyat (Taiwan)"
+Language=xsy
+Label="xsy (saisiyat)"
+
+[keyboard-rs]
+Description="Keyboard - Serbian"
+Language=sr
+Label=sr
+
+[keyboard-rs-alternatequotes]
+Description="Keyboard - Serbian - Serbian (Cyrillic, with guillemets)"
+Language=sr
+Label="rs (alternatequotes)"
+
+[keyboard-rs-yz]
+Description="Keyboard - Serbian - Serbian (Cyrillic, ZE and ZHE swapped)"
+Language=sr
+Label="rs (yz)"
+
+[keyboard-rs-latin]
+Description="Keyboard - Serbian - Serbian (Latin)"
+Language=sr
+Label="rs (latin)"
+
+[keyboard-rs-latinalternatequotes]
+Description="Keyboard - Serbian - Serbian (Latin, with guillemets)"
+Language=sr
+Label="rs (latinalternatequotes)"
+
+[keyboard-rs-latinunicode]
+Description="Keyboard - Serbian - Serbian (Latin, Unicode)"
+Language=sr
+Label="rs (latinunicode)"
+
+[keyboard-rs-latinyz]
+Description="Keyboard - Serbian - Serbian (Latin, QWERTY)"
+Language=sr
+Label="rs (latinyz)"
+
+[keyboard-rs-latinunicodeyz]
+Description="Keyboard - Serbian - Serbian (Latin, Unicode, QWERTY)"
+Language=sr
+Label="rs (latinunicodeyz)"
+
+[keyboard-rs-rue]
+Description="Keyboard - Serbian - Pannonian Rusyn"
+Language=rue
+Label="rs (rue)"
+
+[keyboard-rs-combiningkeys]
+Description="Keyboard - Serbian - Serbian (combining accents instead of dead keys)"
+Language=sr
+Label="rs (combiningkeys)"
+
+[keyboard-dk]
+Description="Keyboard - Danish"
+Language=da
+Label=da
+
+[keyboard-dk-nodeadkeys]
+Description="Keyboard - Danish - Danish (no dead keys)"
+Language=da
+Label="dk (nodeadkeys)"
+
+[keyboard-dk-winkeys]
+Description="Keyboard - Danish - Danish (Windows)"
+Language=da
+Label="dk (winkeys)"
+
+[keyboard-dk-mac]
+Description="Keyboard - Danish - Danish (Macintosh)"
+Language=da
+Label="dk (mac)"
+
+[keyboard-dk-mac_nodeadkeys]
+Description="Keyboard - Danish - Danish (Macintosh, no dead keys)"
+Language=da
+Label="dk (mac_nodeadkeys)"
+
+[keyboard-dk-dvorak]
+Description="Keyboard - Danish - Danish (Dvorak)"
+Language=da
+Label="dk (dvorak)"
+
+[keyboard-dk-sun_type6]
+Description="Keyboard - Danish - Danish (Sun Type 6/7)"
+Language=da
+Label="dk (sun_type6)"
+
+[keyboard-bw]
+Description="Keyboard - Tswana"
+Language=tn
+Label=tn
+
+[keyboard-kr]
+Description="Keyboard - Korean"
+Language=ko
+Label=ko
+
+[keyboard-kr-kr104]
+Description="Keyboard - Korean - Korean (101/104-key compatible)"
+Language=ko
+Label="kr (kr104)"
+
+[keyboard-kr-sun_type6]
+Description="Keyboard - Korean - Korean (Sun Type 6/7)"
+Language=ko
+Label="kr (sun_type6)"
+
+[keyboard-nl]
+Description="Keyboard - Dutch"
+Language=nl
+Label=nl
+
+[keyboard-nl-us]
+Description="Keyboard - Dutch - Dutch (US)"
+Language=nl
+Label="nl (us)"
+
+[keyboard-nl-mac]
+Description="Keyboard - Dutch - Dutch (Macintosh)"
+Language=nl
+Label="nl (mac)"
+
+[keyboard-nl-std]
+Description="Keyboard - Dutch - Dutch (standard)"
+Language=nl
+Label="nl (std)"
+
+[keyboard-nl-sun_type6]
+Description="Keyboard - Dutch - Dutch (Sun Type 6/7)"
+Language=nl
+Label="nl (sun_type6)"
+
+[keyboard-et]
+Description="Keyboard - Amharic"
+Language=am
+Label=am
+
+[keyboard-be]
+Description="Keyboard - Belgian"
+Language=de
+Label=be
+
+[keyboard-be-oss]
+Description="Keyboard - Belgian - Belgian (alt.)"
+Language=de
+Label="be (oss)"
+
+[keyboard-be-oss_latin9]
+Description="Keyboard - Belgian - Belgian (Latin-9 only, alt.)"
+Language=de
+Label="be (oss_latin9)"
+
+[keyboard-be-iso-alternate]
+Description="Keyboard - Belgian - Belgian (ISO, alt.)"
+Language=de
+Label="be (iso-alternate)"
+
+[keyboard-be-nodeadkeys]
+Description="Keyboard - Belgian - Belgian (no dead keys)"
+Language=de
+Label="be (nodeadkeys)"
+
+[keyboard-be-wang]
+Description="Keyboard - Belgian - Belgian (Wang 724 AZERTY)"
+Language=de
+Label="be (wang)"
+
+[keyboard-be-sun_type6]
+Description="Keyboard - Belgian - Belgian (Sun Type 6/7)"
+Language=de
+Label="be (sun_type6)"
+
+[keyboard-la]
+Description="Keyboard - Lao"
+Language=lo
+Label=lo
+
+[keyboard-la-stea]
+Description="Keyboard - Lao - Lao (STEA)"
+Language=lo
+Label="la (stea)"
+
+[keyboard-bt]
+Description="Keyboard - Dzongkha"
+Language=dz
+Label=dz
+
+[keyboard-mm]
+Description="Keyboard - Burmese"
+Language=my
+Label=my
+
+[keyboard-mm-zawgyi]
+Description="Keyboard - Burmese - Burmese (Zawgyi)"
+Language=my
+Label="my-zwg (zawgyi)"
+
+[keyboard-mm-mnw]
+Description="Keyboard - Burmese - Mon"
+Language=mnw
+Label=mnw
+
+[keyboard-mm-mnw-a1]
+Description="Keyboard - Burmese - Mon (A1)"
+Language=mnw
+Label="mnw (mnw-a1)"
+
+[keyboard-mm-shn]
+Description="Keyboard - Burmese - Shan"
+Language=shn
+Label=shn
+
+[keyboard-mm-zgt]
+Description="Keyboard - Burmese - Shan (Zawgyi)"
+Language=shn
+Label="shn-zwg (zgt)"
+
+[keyboard-si]
+Description="Keyboard - Slovenian"
+Language=sl
+Label=sl
+
+[keyboard-si-alternatequotes]
+Description="Keyboard - Slovenian - Slovenian (with guillemets)"
+Language=sl
+Label="si (alternatequotes)"
+
+[keyboard-si-us]
+Description="Keyboard - Slovenian - Slovenian (US)"
+Language=sl
+Label="si (us)"
+
+[keyboard-am]
+Description="Keyboard - Armenian"
+Language=hy
+Label=hy
+
+[keyboard-am-phonetic]
+Description="Keyboard - Armenian - Armenian (phonetic)"
+Language=hy
+Label="am (phonetic)"
+
+[keyboard-am-phonetic-alt]
+Description="Keyboard - Armenian - Armenian (alt. phonetic)"
+Language=hy
+Label="am (phonetic-alt)"
+
+[keyboard-am-eastern]
+Description="Keyboard - Armenian - Armenian (eastern)"
+Language=hy
+Label="am (eastern)"
+
+[keyboard-am-eastern-alt]
+Description="Keyboard - Armenian - Armenian (alt. eastern)"
+Language=hy
+Label="am (eastern-alt)"
+
+[keyboard-am-western]
+Description="Keyboard - Armenian - Armenian (western)"
+Language=hy
+Label="am (western)"
+
+[keyboard-am-olpc-phonetic]
+Description="Keyboard - Armenian - Armenian (OLPC, phonetic)"
+Language=hy
+Label="am (olpc-phonetic)"
+
+[keyboard-by]
+Description="Keyboard - Belarusian"
+Language=be
+Label=by
+
+[keyboard-by-legacy]
+Description="Keyboard - Belarusian - Belarusian (legacy)"
+Language=be
+Label="by (legacy)"
+
+[keyboard-by-latin]
+Description="Keyboard - Belarusian - Belarusian (Latin)"
+Language=be
+Label="by (latin)"
+
+[keyboard-by-intl]
+Description="Keyboard - Belarusian - Belarusian (intl.)"
+Language=be
+Label="by (intl)"
+
+[keyboard-by-phonetic]
+Description="Keyboard - Belarusian - Belarusian (phonetic)"
+Language=be
+Label="by (phonetic)"
+
+[keyboard-by-ru]
+Description="Keyboard - Belarusian - Russian (Belarus)"
+Language=ru
+Label="by (ru)"
+
+[keyboard-vn]
+Description="Keyboard - Vietnamese"
+Language=vi
+Label=vi
+
+[keyboard-vn-us]
+Description="Keyboard - Vietnamese - Vietnamese (US)"
+Language=vi
+Label="vn (us)"
+
+[keyboard-vn-fr]
+Description="Keyboard - Vietnamese - Vietnamese (France)"
+Language=vi
+Label="vn (fr)"
+
+[keyboard-vn-aderty]
+Description="Keyboard - Vietnamese - Vietnamese (AÐERTY)"
+Language=vi
+Label="vn (aderty)"
+
+[keyboard-vn-qderty]
+Description="Keyboard - Vietnamese - Vietnamese (QĐERTY)"
+Language=vi
+Label="vn (qderty)"
+
+[keyboard-ml]
+Description="Keyboard - Bambara"
+Language=bm
+Label=bm
+
+[keyboard-ml-fr-oss]
+Description="Keyboard - Bambara - French (Mali, alt.)"
+Language=fr
+Label="fr (fr-oss)"
+
+[keyboard-ml-us-mac]
+Description="Keyboard - Bambara - English (Mali, US, Macintosh)"
+Language=en
+Label="en (us-mac)"
+
+[keyboard-ml-us-intl]
+Description="Keyboard - Bambara - English (Mali, US, intl.)"
+Language=en
+Label="en (us-intl)"
+
+[keyboard-ara]
+Description="Keyboard - Arabic"
+Language=ar
+Label=ar
+
+[keyboard-ara-digits]
+Description="Keyboard - Arabic - Arabic (Eastern Arabic numerals)"
+Language=ar
+Label="ara (digits)"
+
+[keyboard-ara-azerty]
+Description="Keyboard - Arabic - Arabic (AZERTY)"
+Language=ar
+Label="ara (azerty)"
+
+[keyboard-ara-azerty_digits]
+Description="Keyboard - Arabic - Arabic (AZERTY, Eastern Arabic numerals)"
+Language=ar
+Label="ara (azerty_digits)"
+
+[keyboard-ara-buckwalter]
+Description="Keyboard - Arabic - Arabic (Buckwalter)"
+Language=ar
+Label="ara (buckwalter)"
+
+[keyboard-ara-mac]
+Description="Keyboard - Arabic - Arabic (Macintosh)"
+Language=ar
+Label="ara (mac)"
+
+[keyboard-ara-mac-phonetic]
+Description="Keyboard - Arabic - Arabic (Macintosh, phonetic)"
+Language=ar
+Label="ara (mac-phonetic)"
+
+[keyboard-ara-olpc]
+Description="Keyboard - Arabic - Arabic (OLPC)"
+Language=ar
+Label="ara (olpc)"
+
+[keyboard-ara-sun_type6]
+Description="Keyboard - Arabic - Arabic (Sun Type 6/7)"
+Language=ar
+Label="ara (sun_type6)"
+
+[keyboard-ara-basic_ext]
+Description="Keyboard - Arabic - Arabic (Arabic numerals, extensions in the 4th level)"
+Language=ar
+Label="ara (basic_ext)"
+
+[keyboard-ara-basic_ext_digits]
+Description="Keyboard - Arabic - Arabic (Eastern Arabic numerals, extensions in the 4th level)"
+Language=ar
+Label="ara (basic_ext_digits)"
+
+[keyboard-ara-ergoarabic]
+Description="Keyboard - Arabic - Arabic (ErgoArabic)"
+Language=ar
+Label="ara (ergoarabic)"
+
+[keyboard-ie]
+Description="Keyboard - Irish"
+Language=en
+Label=ie
+
+[keyboard-ie-UnicodeExpert]
+Description="Keyboard - Irish - Irish (UnicodeExpert)"
+Language=en
+Label="ie (UnicodeExpert)"
+
+[keyboard-ie-CloGaelach]
+Description="Keyboard - Irish - CloGaelach"
+Language=ga
+Label="ie (CloGaelach)"
+
+[keyboard-ie-ogam]
+Description="Keyboard - Irish - Ogham"
+Language=sga
+Label="ie (ogam)"
+
+[keyboard-ie-ogam_is434]
+Description="Keyboard - Irish - Ogham (IS434)"
+Language=sga
+Label="ie (ogam_is434)"
+
+[keyboard-cm]
+Description="Keyboard - English (Cameroon)"
+Language=en
+Label=cm
+
+[keyboard-cm-french]
+Description="Keyboard - English (Cameroon) - French (Cameroon)"
+Language=fr
+Label="fr (french)"
+
+[keyboard-cm-qwerty]
+Description="Keyboard - English (Cameroon) - Cameroon Multilingual (QWERTY, intl.)"
+Language=en
+Label="cm (qwerty)"
+
+[keyboard-cm-azerty]
+Description="Keyboard - English (Cameroon) - Cameroon (AZERTY, intl.)"
+Language=fr
+Label="cm (azerty)"
+
+[keyboard-cm-dvorak]
+Description="Keyboard - English (Cameroon) - Cameroon (Dvorak, intl.)"
+Language=en
+Label="cm (dvorak)"
+
+[keyboard-cm-mmuock]
+Description="Keyboard - English (Cameroon) - Mmuock"
+Language=en
+Label="cm (mmuock)"
+
+[keyboard-iq]
+Description="Keyboard - Arabic (Iraq)"
+Language=ar
+Label=ar
+
+[keyboard-iq-ku]
+Description="Keyboard - Arabic (Iraq) - Kurdish (Iraq, Latin Q)"
+Language=ku
+Label=ku
+
+[keyboard-iq-ku_alt]
+Description="Keyboard - Arabic (Iraq) - Kurdish (Iraq, Latin Alt-Q)"
+Language=ku
+Label="ku (ku_alt)"
+
+[keyboard-iq-ku_f]
+Description="Keyboard - Arabic (Iraq) - Kurdish (Iraq, F)"
+Language=ku
+Label="ku (ku_f)"
+
+[keyboard-iq-ku_ara]
+Description="Keyboard - Arabic (Iraq) - Kurdish (Iraq, Arabic-Latin)"
+Language=ku
+Label="ku (ku_ara)"
+
+[keyboard-af]
+Description="Keyboard - Dari"
+Language=prs
+Label=fa
+
+[keyboard-af-ps]
+Description="Keyboard - Dari - Pashto"
+Language=ps
+Label=ps
+
+[keyboard-af-uz]
+Description="Keyboard - Dari - Uzbek (Afghanistan)"
+Language=uz
+Label=uz
+
+[keyboard-af-fa-olpc]
+Description="Keyboard - Dari - Dari (Afghanistan, OLPC)"
+Language=prs
+Label="fa (fa-olpc)"
+
+[keyboard-af-ps-olpc]
+Description="Keyboard - Dari - Pashto (Afghanistan, OLPC)"
+Language=ps
+Label="ps (ps-olpc)"
+
+[keyboard-af-uz-olpc]
+Description="Keyboard - Dari - Uzbek (Afghanistan, OLPC)"
+Language=uz
+Label="uz (uz-olpc)"
+
+[keyboard-hr]
+Description="Keyboard - Croatian"
+Language=hr
+Label=hr
+
+[keyboard-hr-alternatequotes]
+Description="Keyboard - Croatian - Croatian (with guillemets)"
+Language=hr
+Label="hr (alternatequotes)"
+
+[keyboard-hr-unicode]
+Description="Keyboard - Croatian - Croatian (with Croatian digraphs)"
+Language=hr
+Label="hr (unicode)"
+
+[keyboard-hr-unicodeus]
+Description="Keyboard - Croatian - Croatian (US, with Croatian digraphs)"
+Language=hr
+Label="hr (unicodeus)"
+
+[keyboard-hr-us]
+Description="Keyboard - Croatian - Croatian (US)"
+Language=hr
+Label="hr (us)"
+
+[keyboard-ma]
+Description="Keyboard - Arabic (Morocco)"
+Language=ary
+Label=ar
+
+[keyboard-ma-tifinagh]
+Description="Keyboard - Arabic (Morocco) - Berber (Morocco, Tifinagh)"
+Language=
+Label="ber (tifinagh)"
+
+[keyboard-ma-tifinagh-alt]
+Description="Keyboard - Arabic (Morocco) - Berber (Morocco, Tifinagh alt.)"
+Language=
+Label="ber (tifinagh-alt)"
+
+[keyboard-ma-tifinagh-alt-phonetic]
+Description="Keyboard - Arabic (Morocco) - Berber (Morocco, Tifinagh phonetic, alt.)"
+Language=
+Label="ber (tifinagh-alt-phonetic)"
+
+[keyboard-ma-tifinagh-extended]
+Description="Keyboard - Arabic (Morocco) - Berber (Morocco, Tifinagh extended)"
+Language=
+Label="ber (tifinagh-extended)"
+
+[keyboard-ma-tifinagh-phonetic]
+Description="Keyboard - Arabic (Morocco) - Berber (Morocco, Tifinagh phonetic)"
+Language=
+Label="ber (tifinagh-phonetic)"
+
+[keyboard-ma-tifinagh-extended-phonetic]
+Description="Keyboard - Arabic (Morocco) - Berber (Morocco, Tifinagh extended phonetic)"
+Language=
+Label="ber (tifinagh-extended-phonetic)"
+
+[keyboard-ma-french]
+Description="Keyboard - Arabic (Morocco) - French (Morocco)"
+Language=fr
+Label="fr (french)"
+
+[keyboard-ma-rif]
+Description="Keyboard - Arabic (Morocco) - Tarifit"
+Language=rif
+Label=rif
+
+[keyboard-sy]
+Description="Keyboard - Arabic (Syria)"
+Language=syr
+Label=ar
+
+[keyboard-sy-syc]
+Description="Keyboard - Arabic (Syria) - Syriac"
+Language=syr
+Label=syc
+
+[keyboard-sy-syc_phonetic]
+Description="Keyboard - Arabic (Syria) - Syriac (phonetic)"
+Language=syr
+Label="syc (syc_phonetic)"
+
+[keyboard-sy-ku]
+Description="Keyboard - Arabic (Syria) - Kurdish (Syria, Latin Q)"
+Language=ku
+Label=ku
+
+[keyboard-sy-ku_alt]
+Description="Keyboard - Arabic (Syria) - Kurdish (Syria, Latin Alt-Q)"
+Language=ku
+Label="ku (ku_alt)"
+
+[keyboard-sy-ku_f]
+Description="Keyboard - Arabic (Syria) - Kurdish (Syria, F)"
+Language=ku
+Label="ku (ku_f)"
+
+[keyboard-at]
+Description="Keyboard - German (Austria)"
+Language=de
+Label=de
+
+[keyboard-at-nodeadkeys]
+Description="Keyboard - German (Austria) - German (Austria, no dead keys)"
+Language=de
+Label="at (nodeadkeys)"
+
+[keyboard-at-mac]
+Description="Keyboard - German (Austria) - German (Austria, Macintosh)"
+Language=de
+Label="at (mac)"
+
+[keyboard-nz]
+Description="Keyboard - English (New Zealand)"
+Language=en
+Label=en
+
+[keyboard-nz-mao]
+Description="Keyboard - English (New Zealand) - Maori"
+Language=mi
+Label="mi (mao)"
+
+[keyboard-epo]
+Description="Keyboard - Esperanto"
+Language=eo
+Label=eo
+
+[keyboard-epo-legacy]
+Description="Keyboard - Esperanto - Esperanto (legacy)"
+Language=eo
+Label="epo (legacy)"
+
+[keyboard-eu]
+Description="Keyboard - EurKEY (US)"
+Language=ca
+Label=eu
+
+[keyboard-za]
+Description="Keyboard - English (South Africa)"
+Language=en
+Label=en
+
+[keyboard-fo]
+Description="Keyboard - Faroese"
+Language=fo
+Label=fo
+
+[keyboard-fo-nodeadkeys]
+Description="Keyboard - Faroese - Faroese (no dead keys)"
+Language=fo
+Label="fo (nodeadkeys)"
+
+[keyboard-gb]
+Description="Keyboard - English (UK)"
+Language=en
+Label=en
+
+[keyboard-gb-extd]
+Description="Keyboard - English (UK) - English (UK, extended, Windows)"
+Language=en
+Label="gb (extd)"
+
+[keyboard-gb-intl]
+Description="Keyboard - English (UK) - English (UK, intl., with dead keys)"
+Language=en
+Label="gb (intl)"
+
+[keyboard-gb-dvorak]
+Description="Keyboard - English (UK) - English (UK, Dvorak)"
+Language=en
+Label="gb (dvorak)"
+
+[keyboard-gb-dvorakukp]
+Description="Keyboard - English (UK) - English (UK, Dvorak, with UK punctuation)"
+Language=en
+Label="gb (dvorakukp)"
+
+[keyboard-gb-mac]
+Description="Keyboard - English (UK) - English (UK, Macintosh)"
+Language=en
+Label="gb (mac)"
+
+[keyboard-gb-mac_intl]
+Description="Keyboard - English (UK) - English (UK, Macintosh, intl.)"
+Language=en
+Label="gb (mac_intl)"
+
+[keyboard-gb-colemak]
+Description="Keyboard - English (UK) - English (UK, Colemak)"
+Language=en
+Label="gb (colemak)"
+
+[keyboard-gb-colemak_dh]
+Description="Keyboard - English (UK) - English (UK, Colemak-DH)"
+Language=en
+Label="gb (colemak_dh)"
+
+[keyboard-gb-gla]
+Description="Keyboard - English (UK) - Scottish Gaelic"
+Language=en
+Label="gd (gla)"
+
+[keyboard-gb-pl]
+Description="Keyboard - English (UK) - Polish (British keyboard)"
+Language=pl
+Label=pl
+
+[keyboard-gb-sun_type6]
+Description="Keyboard - English (UK) - English (UK, Sun Type 6/7)"
+Language=en
+Label="gb (sun_type6)"
+
+[keyboard-ke]
+Description="Keyboard - Swahili (Kenya)"
+Language=sw
+Label=sw
+
+[keyboard-ke-kik]
+Description="Keyboard - Swahili (Kenya) - Kikuyu"
+Language=ki
+Label="ki (kik)"
+
+[keyboard-md]
+Description="Keyboard - Moldavian"
+Language=ro
+Label=ro
+
+[keyboard-md-gag]
+Description="Keyboard - Moldavian - Gagauz (Moldova)"
+Language=gag
+Label=gag
+
+[keyboard-us]
+Description="Keyboard - English (US)"
+Language=en
+Label=en
+
+[keyboard-us-euro]
+Description="Keyboard - English (US) - English (US, euro on 5)"
+Language=en
+Label="us (euro)"
+
+[keyboard-us-intl]
+Description="Keyboard - English (US) - English (US, intl., with dead keys)"
+Language=en
+Label="us (intl)"
+
+[keyboard-us-alt-intl]
+Description="Keyboard - English (US) - English (US, alt. intl.)"
+Language=en
+Label="us (alt-intl)"
+
+[keyboard-us-altgr-intl]
+Description="Keyboard - English (US) - English (intl., with AltGr dead keys)"
+Language=en
+Label="us (altgr-intl)"
+
+[keyboard-us-mac]
+Description="Keyboard - English (US) - English (Macintosh)"
+Language=en
+Label="us (mac)"
+
+[keyboard-us-colemak]
+Description="Keyboard - English (US) - English (Colemak)"
+Language=en
+Label="us (colemak)"
+
+[keyboard-us-colemak_dh]
+Description="Keyboard - English (US) - English (Colemak-DH)"
+Language=en
+Label="us (colemak_dh)"
+
+[keyboard-us-colemak_dh_wide]
+Description="Keyboard - English (US) - English (Colemak-DH Wide)"
+Language=en
+Label="us (colemak_dh_wide)"
+
+[keyboard-us-colemak_dh_ortho]
+Description="Keyboard - English (US) - English (Colemak-DH Ortholinear)"
+Language=en
+Label="us (colemak_dh_ortho)"
+
+[keyboard-us-colemak_dh_iso]
+Description="Keyboard - English (US) - English (Colemak-DH ISO)"
+Language=en
+Label="us (colemak_dh_iso)"
+
+[keyboard-us-colemak_dh_wide_iso]
+Description="Keyboard - English (US) - English (Colemak-DH Wide ISO)"
+Language=en
+Label="us (colemak_dh_wide_iso)"
+
+[keyboard-us-dvorak]
+Description="Keyboard - English (US) - English (Dvorak)"
+Language=en
+Label="us (dvorak)"
+
+[keyboard-us-dvorak-intl]
+Description="Keyboard - English (US) - English (Dvorak, intl., with dead keys)"
+Language=en
+Label="us (dvorak-intl)"
+
+[keyboard-us-dvorak-alt-intl]
+Description="Keyboard - English (US) - English (Dvorak, alt. intl.)"
+Language=en
+Label="us (dvorak-alt-intl)"
+
+[keyboard-us-dvorak-l]
+Description="Keyboard - English (US) - English (Dvorak, left-handed)"
+Language=en
+Label="us (dvorak-l)"
+
+[keyboard-us-dvorak-r]
+Description="Keyboard - English (US) - English (Dvorak, right-handed)"
+Language=en
+Label="us (dvorak-r)"
+
+[keyboard-us-dvorak-classic]
+Description="Keyboard - English (US) - English (classic Dvorak)"
+Language=en
+Label="us (dvorak-classic)"
+
+[keyboard-us-dvp]
+Description="Keyboard - English (US) - English (programmer Dvorak)"
+Language=en
+Label="us (dvp)"
+
+[keyboard-us-dvorak-mac]
+Description="Keyboard - English (US) - English (Dvorak, Macintosh)"
+Language=en
+Label="us (dvorak-mac)"
+
+[keyboard-us-norman]
+Description="Keyboard - English (US) - English (Norman)"
+Language=en
+Label="us (norman)"
+
+[keyboard-us-symbolic]
+Description="Keyboard - English (US) - English (US, Symbolic)"
+Language=en
+Label="us (symbolic)"
+
+[keyboard-us-workman]
+Description="Keyboard - English (US) - English (Workman)"
+Language=en
+Label="us (workman)"
+
+[keyboard-us-workman-intl]
+Description="Keyboard - English (US) - English (Workman, intl., with dead keys)"
+Language=en
+Label="us (workman-intl)"
+
+[keyboard-us-olpc2]
+Description="Keyboard - English (US) - English (the divide/multiply toggle the layout)"
+Language=en
+Label="us (olpc2)"
+
+[keyboard-us-chr]
+Description="Keyboard - English (US) - Cherokee"
+Language=chr
+Label=chr
+
+[keyboard-us-haw]
+Description="Keyboard - English (US) - Hawaiian"
+Language=haw
+Label=haw
+
+[keyboard-us-rus]
+Description="Keyboard - English (US) - Russian (US, phonetic)"
+Language=ru
+Label="ru (rus)"
+
+[keyboard-us-hbs]
+Description="Keyboard - English (US) - Serbo-Croatian (US)"
+Language=en
+Label="us (hbs)"
+
+[keyboard-us-intl-unicode]
+Description="Keyboard - English (US) - English (US, intl., AltGr Unicode combining)"
+Language=en
+Label="us (intl-unicode)"
+
+[keyboard-us-alt-intl-unicode]
+Description="Keyboard - English (US) - English (US, intl., AltGr Unicode combining, alt.)"
+Language=en
+Label="us (alt-intl-unicode)"
+
+[keyboard-us-ats]
+Description="Keyboard - English (US) - Atsina"
+Language=en
+Label="us (ats)"
+
+[keyboard-us-crd]
+Description="Keyboard - English (US) - Coeur d'Alene Salish"
+Language=crd
+Label="us (crd)"
+
+[keyboard-us-cz_sk_de]
+Description="Keyboard - English (US) - Czech, Slovak and German (US)"
+Language=en
+Label="us (cz_sk_de)"
+
+[keyboard-us-cz_sk_pl_de_es_fi_sv]
+Description="Keyboard - English (US) - Czech, Slovak, Polish, Spanish, Finnish, Swedish and German (US)"
+Language=en
+Label="us (cz_sk_pl_de_es_fi_sv)"
+
+[keyboard-us-drix]
+Description="Keyboard - English (US) - English (Drix)"
+Language=en
+Label="us (drix)"
+
+[keyboard-us-de_se_fi]
+Description="Keyboard - English (US) - German, Swedish and Finnish (US)"
+Language=en
+Label="us (de_se_fi)"
+
+[keyboard-us-ibm238l]
+Description="Keyboard - English (US) - English (US, IBM Arabic 238_L)"
+Language=en
+Label="us (ibm238l)"
+
+[keyboard-us-sun_type6]
+Description="Keyboard - English (US) - English (US, Sun Type 6/7)"
+Language=en
+Label="us (sun_type6)"
+
+[keyboard-us-carpalx]
+Description="Keyboard - English (US) - English (Carpalx)"
+Language=en
+Label="us (carpalx)"
+
+[keyboard-us-carpalx-intl]
+Description="Keyboard - English (US) - English (Carpalx, intl., with dead keys)"
+Language=en
+Label="us (carpalx-intl)"
+
+[keyboard-us-carpalx-altgr-intl]
+Description="Keyboard - English (US) - English (Carpalx, intl., with AltGr dead keys)"
+Language=en
+Label="us (carpalx-altgr-intl)"
+
+[keyboard-us-carpalx-full]
+Description="Keyboard - English (US) - English (Carpalx, full optimization)"
+Language=en
+Label="us (carpalx-full)"
+
+[keyboard-us-carpalx-full-intl]
+Description="Keyboard - English (US) - English (Carpalx, full optimization, intl., with dead keys)"
+Language=en
+Label="us (carpalx-full-intl)"
+
+[keyboard-us-carpalx-full-altgr-intl]
+Description="Keyboard - English (US) - English (Carpalx, full optimization, intl., with AltGr dead keys)"
+Language=en
+Label="us (carpalx-full-altgr-intl)"
+
+[keyboard-us-3l]
+Description="Keyboard - English (US) - English (3l)"
+Language=en
+Label="us (3l)"
+
+[keyboard-us-3l-cros]
+Description="Keyboard - English (US) - English (3l, Chromebook)"
+Language=en
+Label="us (3l-cros)"
+
+[keyboard-us-3l-emacs]
+Description="Keyboard - English (US) - English (3l, emacs)"
+Language=en
+Label="us (3l-emacs)"
+
+[keyboard-us-workman-p]
+Description="Keyboard - English (US) - English (Workman-P)"
+Language=en
+Label=workman-p
+
+[keyboard-us-scn]
+Description="Keyboard - English (US) - Sicilian (US keyboard)"
+Language=en
+Label="us (scn)"
+
+[keyboard-us-altgr-weur]
+Description="Keyboard - English (US) - English (Western European AltGr dead keys)"
+Language=en
+Label="us (altgr-weur)"
+
+[keyboard-ge]
+Description="Keyboard - Georgian"
+Language=ka
+Label=ka
+
+[keyboard-ge-ergonomic]
+Description="Keyboard - Georgian - Georgian (ergonomic)"
+Language=ka
+Label="ge (ergonomic)"
+
+[keyboard-ge-mess]
+Description="Keyboard - Georgian - Georgian (MESS)"
+Language=ka
+Label="ge (mess)"
+
+[keyboard-ge-os]
+Description="Keyboard - Georgian - Ossetian (Georgia)"
+Language=os
+Label="ge (os)"
+
+[keyboard-ge-ru]
+Description="Keyboard - Georgian - Russian (Georgia)"
+Language=ru
+Label=ru
+
+[keyboard-es]
+Description="Keyboard - Spanish"
+Language=es
+Label=es
+
+[keyboard-es-nodeadkeys]
+Description="Keyboard - Spanish - Spanish (no dead keys)"
+Language=es
+Label="es (nodeadkeys)"
+
+[keyboard-es-deadtilde]
+Description="Keyboard - Spanish - Spanish (dead tilde)"
+Language=es
+Label="es (deadtilde)"
+
+[keyboard-es-winkeys]
+Description="Keyboard - Spanish - Spanish (Windows)"
+Language=es
+Label="es (winkeys)"
+
+[keyboard-es-dvorak]
+Description="Keyboard - Spanish - Spanish (Dvorak)"
+Language=es
+Label="es (dvorak)"
+
+[keyboard-es-ast]
+Description="Keyboard - Spanish - Asturian (Spain, with bottom-dot H and L)"
+Language=ast
+Label=ast
+
+[keyboard-es-cat]
+Description="Keyboard - Spanish - Catalan (Spain, with middle-dot L)"
+Language=ca
+Label="ca (cat)"
+
+[keyboard-es-sun_type6]
+Description="Keyboard - Spanish - Spanish (Sun Type 6/7)"
+Language=es
+Label="es (sun_type6)"
+
+[keyboard-ee]
+Description="Keyboard - Estonian"
+Language=et
+Label=et
+
+[keyboard-ee-nodeadkeys]
+Description="Keyboard - Estonian - Estonian (no dead keys)"
+Language=et
+Label="ee (nodeadkeys)"
+
+[keyboard-ee-dvorak]
+Description="Keyboard - Estonian - Estonian (Dvorak)"
+Language=et
+Label="ee (dvorak)"
+
+[keyboard-ee-us]
+Description="Keyboard - Estonian - Estonian (US)"
+Language=et
+Label="ee (us)"
+
+[keyboard-ee-sun_type6]
+Description="Keyboard - Estonian - Estonian (Sun Type 6/7)"
+Language=et
+Label="ee (sun_type6)"
+
+[keyboard-bd]
+Description="Keyboard - Bangla"
+Language=bn
+Label=bn
+
+[keyboard-bd-probhat]
+Description="Keyboard - Bangla - Bangla (Probhat)"
+Language=bn
+Label="bd (probhat)"
+
+[keyboard-ph]
+Description="Keyboard - Filipino"
+Language=fil
+Label=ph
+
+[keyboard-ph-qwerty-bay]
+Description="Keyboard - Filipino - Filipino (QWERTY, Baybayin)"
+Language=fil
+Label="ph (qwerty-bay)"
+
+[keyboard-ph-capewell-dvorak]
+Description="Keyboard - Filipino - Filipino (Capewell-Dvorak, Latin)"
+Language=fil
+Label="ph (capewell-dvorak)"
+
+[keyboard-ph-capewell-dvorak-bay]
+Description="Keyboard - Filipino - Filipino (Capewell-Dvorak, Baybayin)"
+Language=fil
+Label="ph (capewell-dvorak-bay)"
+
+[keyboard-ph-capewell-qwerf2k6]
+Description="Keyboard - Filipino - Filipino (Capewell-QWERF 2006, Latin)"
+Language=fil
+Label="ph (capewell-qwerf2k6)"
+
+[keyboard-ph-capewell-qwerf2k6-bay]
+Description="Keyboard - Filipino - Filipino (Capewell-QWERF 2006, Baybayin)"
+Language=fil
+Label="ph (capewell-qwerf2k6-bay)"
+
+[keyboard-ph-colemak]
+Description="Keyboard - Filipino - Filipino (Colemak, Latin)"
+Language=fil
+Label="ph (colemak)"
+
+[keyboard-ph-colemak-bay]
+Description="Keyboard - Filipino - Filipino (Colemak, Baybayin)"
+Language=fil
+Label="ph (colemak-bay)"
+
+[keyboard-ph-dvorak]
+Description="Keyboard - Filipino - Filipino (Dvorak, Latin)"
+Language=fil
+Label="ph (dvorak)"
+
+[keyboard-ph-dvorak-bay]
+Description="Keyboard - Filipino - Filipino (Dvorak, Baybayin)"
+Language=fil
+Label="ph (dvorak-bay)"
+
+[keyboard-uz]
+Description="Keyboard - Uzbek"
+Language=uz
+Label=uz
+
+[keyboard-uz-latin]
+Description="Keyboard - Uzbek - Uzbek (Latin)"
+Language=uz
+Label="uz (latin)"
+
+[keyboard-lt]
+Description="Keyboard - Lithuanian"
+Language=lt
+Label=lt
+
+[keyboard-lt-std]
+Description="Keyboard - Lithuanian - Lithuanian (standard)"
+Language=lt
+Label="lt (std)"
+
+[keyboard-lt-us]
+Description="Keyboard - Lithuanian - Lithuanian (US)"
+Language=lt
+Label="lt (us)"
+
+[keyboard-lt-ibm]
+Description="Keyboard - Lithuanian - Lithuanian (IBM)"
+Language=lt
+Label="lt (ibm)"
+
+[keyboard-lt-lekp]
+Description="Keyboard - Lithuanian - Lithuanian (LEKP)"
+Language=lt
+Label="lt (lekp)"
+
+[keyboard-lt-lekpa]
+Description="Keyboard - Lithuanian - Lithuanian (LEKPa)"
+Language=lt
+Label="lt (lekpa)"
+
+[keyboard-lt-ratise]
+Description="Keyboard - Lithuanian - Lithuanian (Ratise)"
+Language=lt
+Label="lt (ratise)"
+
+[keyboard-lt-sgs]
+Description="Keyboard - Lithuanian - Samogitian"
+Language=sgs
+Label="lt (sgs)"
+
+[keyboard-lt-us_dvorak]
+Description="Keyboard - Lithuanian - Lithuanian (Dvorak)"
+Language=lt
+Label="lt (us_dvorak)"
+
+[keyboard-lt-sun_type6]
+Description="Keyboard - Lithuanian - Lithuanian (Sun Type 6/7)"
+Language=lt
+Label="lt (sun_type6)"
+
+[keyboard-fi]
+Description="Keyboard - Finnish"
+Language=fi
+Label=fi
+
+[keyboard-fi-winkeys]
+Description="Keyboard - Finnish - Finnish (Windows)"
+Language=fi
+Label="fi (winkeys)"
+
+[keyboard-fi-classic]
+Description="Keyboard - Finnish - Finnish (classic)"
+Language=fi
+Label="fi (classic)"
+
+[keyboard-fi-nodeadkeys]
+Description="Keyboard - Finnish - Finnish (classic, no dead keys)"
+Language=fi
+Label="fi (nodeadkeys)"
+
+[keyboard-fi-mac]
+Description="Keyboard - Finnish - Finnish (Macintosh)"
+Language=fi
+Label="fi (mac)"
+
+[keyboard-fi-smi]
+Description="Keyboard - Finnish - Northern Saami (Finland)"
+Language=se
+Label="fi (smi)"
+
+[keyboard-fi-sun_type6]
+Description="Keyboard - Finnish - Finnish (Sun Type 6/7)"
+Language=fi
+Label="fi (sun_type6)"
+
+[keyboard-fi-das]
+Description="Keyboard - Finnish - Finnish (DAS)"
+Language=fi
+Label="fi (das)"
+
+[keyboard-fi-fidvorak]
+Description="Keyboard - Finnish - Finnish (Dvorak)"
+Language=fi
+Label="fi (fidvorak)"
+
+[keyboard-cn]
+Description="Keyboard - Chinese"
+Language=zh
+Label=zh
+
+[keyboard-cn-altgr-pinyin]
+Description="Keyboard - Chinese - Hanyu Pinyin Letters (with AltGr dead keys)"
+Language=zh
+Label="cn (altgr-pinyin)"
+
+[keyboard-cn-mon_trad]
+Description="Keyboard - Chinese - Mongolian (Bichig)"
+Language=mvf
+Label="cn (mon_trad)"
+
+[keyboard-cn-mon_trad_todo]
+Description="Keyboard - Chinese - Mongolian (Todo)"
+Language=mvf
+Label="cn (mon_trad_todo)"
+
+[keyboard-cn-mon_trad_xibe]
+Description="Keyboard - Chinese - Mongolian (Xibe)"
+Language=sjo
+Label="cn (mon_trad_xibe)"
+
+[keyboard-cn-mon_trad_manchu]
+Description="Keyboard - Chinese - Mongolian (Manchu)"
+Language=mnc
+Label="cn (mon_trad_manchu)"
+
+[keyboard-cn-mon_trad_galik]
+Description="Keyboard - Chinese - Mongolian (Galik)"
+Language=mvf
+Label="cn (mon_trad_galik)"
+
+[keyboard-cn-mon_todo_galik]
+Description="Keyboard - Chinese - Mongolian (Todo Galik)"
+Language=mvf
+Label="cn (mon_todo_galik)"
+
+[keyboard-cn-mon_manchu_galik]
+Description="Keyboard - Chinese - Mongolian (Manchu Galik)"
+Language=mnc
+Label="cn (mon_manchu_galik)"
+
+[keyboard-cn-tib]
+Description="Keyboard - Chinese - Tibetan"
+Language=bo
+Label="cn (tib)"
+
+[keyboard-cn-tib_asciinum]
+Description="Keyboard - Chinese - Tibetan (with ASCII numerals)"
+Language=bo
+Label="cn (tib_asciinum)"
+
+[keyboard-cn-ug]
+Description="Keyboard - Chinese - Uyghur"
+Language=ug
+Label=ug
+
+[keyboard-ca]
+Description="Keyboard - French (Canada)"
+Language=fr
+Label=fr
+
+[keyboard-ca-fr-dvorak]
+Description="Keyboard - French (Canada) - French (Canada, Dvorak)"
+Language=fr
+Label="fr (fr-dvorak)"
+
+[keyboard-ca-fr-legacy]
+Description="Keyboard - French (Canada) - French (Canada, legacy)"
+Language=fr
+Label="fr (fr-legacy)"
+
+[keyboard-ca-multix]
+Description="Keyboard - French (Canada) - Canadian (CSA)"
+Language=fr
+Label="ca (multix)"
+
+[keyboard-ca-eng]
+Description="Keyboard - French (Canada) - English (Canada)"
+Language=en
+Label="en (eng)"
+
+[keyboard-ca-ike]
+Description="Keyboard - French (Canada) - Inuktitut"
+Language=iu
+Label=ike
+
+[keyboard-ca-kut]
+Description="Keyboard - French (Canada) - Kutenai"
+Language=fr
+Label=kut
+
+[keyboard-ca-shs]
+Description="Keyboard - French (Canada) - Secwepemctsin"
+Language=fr
+Label=shs
+
+[keyboard-ca-sun_type6]
+Description="Keyboard - French (Canada) - Multilingual (Canada, Sun Type 6/7)"
+Language=fr
+Label="ca (sun_type6)"
+
+[keyboard-gh]
+Description="Keyboard - English (Ghana)"
+Language=en
+Label=en
+
+[keyboard-gh-generic]
+Description="Keyboard - English (Ghana) - English (Ghana, multilingual)"
+Language=en
+Label="gh (generic)"
+
+[keyboard-gh-gillbt]
+Description="Keyboard - English (Ghana) - English (Ghana, GILLBT)"
+Language=en
+Label="gh (gillbt)"
+
+[keyboard-gh-akan]
+Description="Keyboard - English (Ghana) - Akan"
+Language=ak
+Label="ak (akan)"
+
+[keyboard-gh-avn]
+Description="Keyboard - English (Ghana) - Avatime"
+Language=avn
+Label=avn
+
+[keyboard-gh-ewe]
+Description="Keyboard - English (Ghana) - Ewe"
+Language=ee
+Label="ee (ewe)"
+
+[keyboard-gh-fula]
+Description="Keyboard - English (Ghana) - Fula"
+Language=ff
+Label="ff (fula)"
+
+[keyboard-gh-ga]
+Description="Keyboard - English (Ghana) - Ga"
+Language=gaa
+Label="gaa (ga)"
+
+[keyboard-gh-hausa]
+Description="Keyboard - English (Ghana) - Hausa (Ghana)"
+Language=ha
+Label="ha (hausa)"
+
+[keyboard-fr]
+Description="Keyboard - French"
+Language=fr
+Label=fr
+
+[keyboard-fr-nodeadkeys]
+Description="Keyboard - French - French (no dead keys)"
+Language=fr
+Label="fr (nodeadkeys)"
+
+[keyboard-fr-oss]
+Description="Keyboard - French - French (alt.)"
+Language=fr
+Label="fr (oss)"
+
+[keyboard-fr-oss_nodeadkeys]
+Description="Keyboard - French - French (alt., no dead keys)"
+Language=fr
+Label="fr (oss_nodeadkeys)"
+
+[keyboard-fr-oss_latin9]
+Description="Keyboard - French - French (alt., Latin-9 only)"
+Language=fr
+Label="fr (oss_latin9)"
+
+[keyboard-fr-latin9]
+Description="Keyboard - French - French (legacy, alt.)"
+Language=fr
+Label="fr (latin9)"
+
+[keyboard-fr-latin9_nodeadkeys]
+Description="Keyboard - French - French (legacy, alt., no dead keys)"
+Language=fr
+Label="fr (latin9_nodeadkeys)"
+
+[keyboard-fr-azerty]
+Description="Keyboard - French - French (AZERTY)"
+Language=fr
+Label="fr (azerty)"
+
+[keyboard-fr-afnor]
+Description="Keyboard - French - French (AZERTY, AFNOR)"
+Language=fr
+Label="fr (afnor)"
+
+[keyboard-fr-bepo]
+Description="Keyboard - French - French (BEPO)"
+Language=fr
+Label="fr (bepo)"
+
+[keyboard-fr-bepo_latin9]
+Description="Keyboard - French - French (BEPO, Latin-9 only)"
+Language=fr
+Label="fr (bepo_latin9)"
+
+[keyboard-fr-bepo_afnor]
+Description="Keyboard - French - French (BEPO, AFNOR)"
+Language=fr
+Label="fr (bepo_afnor)"
+
+[keyboard-fr-dvorak]
+Description="Keyboard - French - French (Dvorak)"
+Language=fr
+Label="fr (dvorak)"
+
+[keyboard-fr-ergol]
+Description="Keyboard - French - French (Ergo‑L)"
+Language=fr
+Label="fr (ergol)"
+
+[keyboard-fr-ergol_iso]
+Description="Keyboard - French - French (Ergo‑L, ISO variant)"
+Language=fr
+Label="fr (ergol_iso)"
+
+[keyboard-fr-mac]
+Description="Keyboard - French - French (Macintosh)"
+Language=fr
+Label="fr (mac)"
+
+[keyboard-fr-us]
+Description="Keyboard - French - French (US)"
+Language=fr
+Label="fr (us)"
+
+[keyboard-fr-bre]
+Description="Keyboard - French - Breton (France)"
+Language=br
+Label="fr (bre)"
+
+[keyboard-fr-oci]
+Description="Keyboard - French - Occitan"
+Language=oc
+Label="fr (oci)"
+
+[keyboard-fr-geo]
+Description="Keyboard - French - Georgian (France, AZERTY Tskapo)"
+Language=ka
+Label="fr (geo)"
+
+[keyboard-fr-sun_type6]
+Description="Keyboard - French - French (Sun Type 6/7)"
+Language=fr
+Label="fr (sun_type6)"
+
+[keyboard-fr-us-alt]
+Description="Keyboard - French - French (US with dead keys, alt.)"
+Language=fr
+Label="fr (us-alt)"
+
+[keyboard-fr-us-azerty]
+Description="Keyboard - French - French (US, AZERTY)"
+Language=fr
+Label="fr (us-azerty)"
+
+[keyboard-eg]
+Description="Keyboard - Arabic (Egypt)"
+Language=ar
+Label=ar
+
+[keyboard-eg-cop]
+Description="Keyboard - Arabic (Egypt) - Coptic"
+Language=cop
+Label=cop
+
+[keyboard-cd]
+Description="Keyboard - French (Democratic Republic of the Congo)"
+Language=fr
+Label=fr
+
+[keyboard-tg]
+Description="Keyboard - French (Togo)"
+Language=fr
+Label=fr
+
+[keyboard-kz]
+Description="Keyboard - Kazakh"
+Language=kk
+Label=kk
+
+[keyboard-kz-kazrus]
+Description="Keyboard - Kazakh - Kazakh (with Russian)"
+Language=kk
+Label="kz (kazrus)"
+
+[keyboard-kz-ext]
+Description="Keyboard - Kazakh - Kazakh (extended)"
+Language=kk
+Label="kz (ext)"
+
+[keyboard-kz-latin]
+Description="Keyboard - Kazakh - Kazakh (Latin)"
+Language=kk
+Label="kz (latin)"
+
+[keyboard-kz-ruskaz]
+Description="Keyboard - Kazakh - Russian (Kazakhstan, with Kazakh)"
+Language=ru
+Label="ru (ruskaz)"
+
+[keyboard-ch]
+Description="Keyboard - German (Switzerland)"
+Language=de
+Label=de
+
+[keyboard-ch-de_nodeadkeys]
+Description="Keyboard - German (Switzerland) - German (Switzerland, no dead keys)"
+Language=de
+Label="de (de_nodeadkeys)"
+
+[keyboard-ch-de_mac]
+Description="Keyboard - German (Switzerland) - German (Switzerland, Macintosh)"
+Language=de
+Label="de (de_mac)"
+
+[keyboard-ch-legacy]
+Description="Keyboard - German (Switzerland) - German (Switzerland, legacy)"
+Language=de
+Label="ch (legacy)"
+
+[keyboard-ch-fr]
+Description="Keyboard - German (Switzerland) - French (Switzerland)"
+Language=fr
+Label=fr
+
+[keyboard-ch-fr_nodeadkeys]
+Description="Keyboard - German (Switzerland) - French (Switzerland, no dead keys)"
+Language=fr
+Label="fr (fr_nodeadkeys)"
+
+[keyboard-ch-fr_mac]
+Description="Keyboard - German (Switzerland) - French (Switzerland, Macintosh)"
+Language=fr
+Label="fr (fr_mac)"
+
+[keyboard-ch-sun_type6_de]
+Description="Keyboard - German (Switzerland) - German (Switzerland, Sun Type 6/7)"
+Language=de
+Label="ch (sun_type6_de)"
+
+[keyboard-ch-sun_type6_fr]
+Description="Keyboard - German (Switzerland) - French (Switzerland, Sun Type 6/7)"
+Language=de
+Label="ch (sun_type6_fr)"
+
+[keyboard-gr]
+Description="Keyboard - Greek"
+Language=el
+Label=gr
+
+[keyboard-gr-simple]
+Description="Keyboard - Greek - Greek (simple)"
+Language=el
+Label="gr (simple)"
+
+[keyboard-gr-nodeadkeys]
+Description="Keyboard - Greek - Greek (no dead keys)"
+Language=el
+Label="gr (nodeadkeys)"
+
+[keyboard-gr-polytonic]
+Description="Keyboard - Greek - Greek (polytonic)"
+Language=el
+Label="gr (polytonic)"
+
+[keyboard-gr-sun_type6]
+Description="Keyboard - Greek - Greek (Sun Type 6/7)"
+Language=el
+Label="gr (sun_type6)"
+
+[keyboard-gr-colemak]
+Description="Keyboard - Greek - Greek (Colemak)"
+Language=el
+Label="gr (colemak)"
+
+[keyboard-tr]
+Description="Keyboard - Turkish"
+Language=tr
+Label=tr
+
+[keyboard-tr-f]
+Description="Keyboard - Turkish - Turkish (F)"
+Language=tr
+Label="tr (f)"
+
+[keyboard-tr-e]
+Description="Keyboard - Turkish - Turkish (E)"
+Language=tr
+Label="tr (e)"
+
+[keyboard-tr-alt]
+Description="Keyboard - Turkish - Turkish (Alt-Q)"
+Language=tr
+Label="tr (alt)"
+
+[keyboard-tr-intl]
+Description="Keyboard - Turkish - Turkish (intl., with dead keys)"
+Language=tr
+Label="tr (intl)"
+
+[keyboard-tr-ku]
+Description="Keyboard - Turkish - Kurdish (Turkey, Latin Q)"
+Language=ku
+Label=ku
+
+[keyboard-tr-ku_f]
+Description="Keyboard - Turkish - Kurdish (Turkey, F)"
+Language=ku
+Label="ku (ku_f)"
+
+[keyboard-tr-ku_alt]
+Description="Keyboard - Turkish - Kurdish (Turkey, Latin Alt-Q)"
+Language=ku
+Label="ku (ku_alt)"
+
+[keyboard-tr-sun_type6]
+Description="Keyboard - Turkish - Turkish (Sun Type 6/7)"
+Language=tr
+Label="tr (sun_type6)"
+
+[keyboard-tr-us]
+Description="Keyboard - Turkish - Turkish (i and ı swapped)"
+Language=tr
+Label="tr (us)"
+
+[keyboard-tr-otk]
+Description="Keyboard - Turkish - Old Turkic"
+Language=tr
+Label="tr (otk)"
+
+[keyboard-tr-otkf]
+Description="Keyboard - Turkish - Old Turkic (F)"
+Language=tr
+Label="tr (otkf)"
+
+[keyboard-tr-ot]
+Description="Keyboard - Turkish - Ottoman (Q)"
+Language=tr
+Label="tr (ot)"
+
+[keyboard-tr-otf]
+Description="Keyboard - Turkish - Ottoman (F)"
+Language=tr
+Label="tr (otf)"
+
+[keyboard-il]
+Description="Keyboard - Hebrew"
+Language=he
+Label=he
+
+[keyboard-il-si2]
+Description="Keyboard - Hebrew - Hebrew (SI-1452-2)"
+Language=he
+Label="il (si2)"
+
+[keyboard-il-lyx]
+Description="Keyboard - Hebrew - Hebrew (lyx)"
+Language=he
+Label="il (lyx)"
+
+[keyboard-il-phonetic]
+Description="Keyboard - Hebrew - Hebrew (phonetic)"
+Language=he
+Label="il (phonetic)"
+
+[keyboard-il-biblical]
+Description="Keyboard - Hebrew - Hebrew (Biblical, Tiro)"
+Language=he
+Label="il (biblical)"
+
+[keyboard-il-biblicalSIL]
+Description="Keyboard - Hebrew - Hebrew (Biblical, SIL phonetic)"
+Language=he
+Label="il (biblicalSIL)"
+
+[keyboard-de]
+Description="Keyboard - German"
+Language=de
+Label=de
+
+[keyboard-de-deadacute]
+Description="Keyboard - German - German (dead acute)"
+Language=de
+Label="de (deadacute)"
+
+[keyboard-de-deadgraveacute]
+Description="Keyboard - German - German (dead grave acute)"
+Language=de
+Label="de (deadgraveacute)"
+
+[keyboard-de-deadtilde]
+Description="Keyboard - German - German (dead tilde)"
+Language=de
+Label="de (deadtilde)"
+
+[keyboard-de-nodeadkeys]
+Description="Keyboard - German - German (no dead keys)"
+Language=de
+Label="de (nodeadkeys)"
+
+[keyboard-de-e1]
+Description="Keyboard - German - German (E1)"
+Language=de
+Label="de (e1)"
+
+[keyboard-de-e2]
+Description="Keyboard - German - German (E2)"
+Language=de
+Label="de (e2)"
+
+[keyboard-de-T3]
+Description="Keyboard - German - German (T3)"
+Language=de
+Label="de (T3)"
+
+[keyboard-de-us]
+Description="Keyboard - German - German (US)"
+Language=de
+Label="de (us)"
+
+[keyboard-de-dvorak]
+Description="Keyboard - German - German (Dvorak)"
+Language=de
+Label="de (dvorak)"
+
+[keyboard-de-mac]
+Description="Keyboard - German - German (Macintosh)"
+Language=de
+Label="de (mac)"
+
+[keyboard-de-mac_nodeadkeys]
+Description="Keyboard - German - German (Macintosh, no dead keys)"
+Language=de
+Label="de (mac_nodeadkeys)"
+
+[keyboard-de-neo]
+Description="Keyboard - German - German (Neo 2)"
+Language=de
+Label="de (neo)"
+
+[keyboard-de-qwerty]
+Description="Keyboard - German - German (QWERTY)"
+Language=de
+Label="de (qwerty)"
+
+[keyboard-de-dsb]
+Description="Keyboard - German - Lower Sorbian"
+Language=dsb
+Label="de (dsb)"
+
+[keyboard-de-dsb_qwertz]
+Description="Keyboard - German - Lower Sorbian (QWERTZ)"
+Language=dsb
+Label="de (dsb_qwertz)"
+
+[keyboard-de-ro]
+Description="Keyboard - German - Romanian (Germany)"
+Language=ro
+Label="de (ro)"
+
+[keyboard-de-ro_nodeadkeys]
+Description="Keyboard - German - Romanian (Germany, no dead keys)"
+Language=ro
+Label="de (ro_nodeadkeys)"
+
+[keyboard-de-ru]
+Description="Keyboard - German - Russian (Germany, phonetic)"
+Language=ru
+Label=ru
+
+[keyboard-de-tr]
+Description="Keyboard - German - Turkish (Germany)"
+Language=tr
+Label="de (tr)"
+
+[keyboard-de-hu]
+Description="Keyboard - German - German (with Hungarian letters, no dead keys)"
+Language=de
+Label="de (hu)"
+
+[keyboard-de-pl]
+Description="Keyboard - German - Polish (Germany, no dead keys)"
+Language=de
+Label="de (pl)"
+
+[keyboard-de-sun_type6]
+Description="Keyboard - German - German (Sun Type 6/7)"
+Language=de
+Label="de (sun_type6)"
+
+[keyboard-de-adnw]
+Description="Keyboard - German - German (Aus der Neo-Welt)"
+Language=de
+Label="de (adnw)"
+
+[keyboard-de-koy]
+Description="Keyboard - German - German (KOY)"
+Language=de
+Label="de (koy)"
+
+[keyboard-de-bone]
+Description="Keyboard - German - German (Bone)"
+Language=de
+Label="de (bone)"
+
+[keyboard-de-bone_eszett_home]
+Description="Keyboard - German - German (Bone, eszett in the home row)"
+Language=de
+Label="de (bone_eszett_home)"
+
+[keyboard-de-neo_qwertz]
+Description="Keyboard - German - German (Neo, QWERTZ)"
+Language=de
+Label="de (neo_qwertz)"
+
+[keyboard-de-neo_qwerty]
+Description="Keyboard - German - German (Neo, QWERTY)"
+Language=de
+Label="de (neo_qwerty)"
+
+[keyboard-de-ru-recom]
+Description="Keyboard - German - Russian (Germany, recommended)"
+Language=ru
+Label="ru (ru-recom)"
+
+[keyboard-de-ru-translit]
+Description="Keyboard - German - Russian (Germany, transliteration)"
+Language=ru
+Label="ru (ru-translit)"
+
+[keyboard-id]
+Description="Keyboard - Indonesian (Latin)"
+Language=id
+Label=id
+
+[keyboard-id-melayu-phonetic]
+Description="Keyboard - Indonesian (Latin) - Indonesian (Arab Melayu, phonetic)"
+Language=id
+Label="id (melayu-phonetic)"
+
+[keyboard-id-melayu-phoneticx]
+Description="Keyboard - Indonesian (Latin) - Indonesian (Arab Melayu, extended phonetic)"
+Language=id
+Label="id (melayu-phoneticx)"
+
+[keyboard-id-pegon-phonetic]
+Description="Keyboard - Indonesian (Latin) - Indonesian (Arab Pegon, phonetic)"
+Language=id
+Label="id (pegon-phonetic)"
+
+[keyboard-id-javanese]
+Description="Keyboard - Indonesian (Latin) - Javanese"
+Language=jax
+Label="id (javanese)"
+
+[keyboard-sn]
+Description="Keyboard - Wolof"
+Language=wo
+Label=wo
+
+[keyboard-az]
+Description="Keyboard - Azerbaijani"
+Language=az
+Label=az
+
+[keyboard-az-cyrillic]
+Description="Keyboard - Azerbaijani - Azerbaijani (Cyrillic)"
+Language=az
+Label="az (cyrillic)"
+
+[keyboard-kh]
+Description="Keyboard - Khmer (Cambodia)"
+Language=km
+Label=km
+
+[keyboard-hu]
+Description="Keyboard - Hungarian"
+Language=hu
+Label=hu
+
+[keyboard-hu-standard]
+Description="Keyboard - Hungarian - Hungarian (standard)"
+Language=hu
+Label="hu (standard)"
+
+[keyboard-hu-nodeadkeys]
+Description="Keyboard - Hungarian - Hungarian (no dead keys)"
+Language=hu
+Label="hu (nodeadkeys)"
+
+[keyboard-hu-qwerty]
+Description="Keyboard - Hungarian - Hungarian (QWERTY)"
+Language=hu
+Label="hu (qwerty)"
+
+[keyboard-hu-101_qwertz_comma_dead]
+Description="Keyboard - Hungarian - Hungarian (QWERTZ, 101-key, comma, dead keys)"
+Language=hu
+Label="hu (101_qwertz_comma_dead)"
+
+[keyboard-hu-101_qwertz_comma_nodead]
+Description="Keyboard - Hungarian - Hungarian (QWERTZ, 101-key, comma, no dead keys)"
+Language=hu
+Label="hu (101_qwertz_comma_nodead)"
+
+[keyboard-hu-101_qwertz_dot_dead]
+Description="Keyboard - Hungarian - Hungarian (QWERTZ, 101-key, dot, dead keys)"
+Language=hu
+Label="hu (101_qwertz_dot_dead)"
+
+[keyboard-hu-101_qwertz_dot_nodead]
+Description="Keyboard - Hungarian - Hungarian (QWERTZ, 101-key, dot, no dead keys)"
+Language=hu
+Label="hu (101_qwertz_dot_nodead)"
+
+[keyboard-hu-101_qwerty_comma_dead]
+Description="Keyboard - Hungarian - Hungarian (QWERTY, 101-key, comma, dead keys)"
+Language=hu
+Label="hu (101_qwerty_comma_dead)"
+
+[keyboard-hu-101_qwerty_comma_nodead]
+Description="Keyboard - Hungarian - Hungarian (QWERTY, 101-key, comma, no dead keys)"
+Language=hu
+Label="hu (101_qwerty_comma_nodead)"
+
+[keyboard-hu-101_qwerty_dot_dead]
+Description="Keyboard - Hungarian - Hungarian (QWERTY, 101-key, dot, dead keys)"
+Language=hu
+Label="hu (101_qwerty_dot_dead)"
+
+[keyboard-hu-101_qwerty_dot_nodead]
+Description="Keyboard - Hungarian - Hungarian (QWERTY, 101-key, dot, no dead keys)"
+Language=hu
+Label="hu (101_qwerty_dot_nodead)"
+
+[keyboard-hu-102_qwertz_comma_dead]
+Description="Keyboard - Hungarian - Hungarian (QWERTZ, 102-key, comma, dead keys)"
+Language=hu
+Label="hu (102_qwertz_comma_dead)"
+
+[keyboard-hu-102_qwertz_comma_nodead]
+Description="Keyboard - Hungarian - Hungarian (QWERTZ, 102-key, comma, no dead keys)"
+Language=hu
+Label="hu (102_qwertz_comma_nodead)"
+
+[keyboard-hu-102_qwertz_dot_dead]
+Description="Keyboard - Hungarian - Hungarian (QWERTZ, 102-key, dot, dead keys)"
+Language=hu
+Label="hu (102_qwertz_dot_dead)"
+
+[keyboard-hu-102_qwertz_dot_nodead]
+Description="Keyboard - Hungarian - Hungarian (QWERTZ, 102-key, dot, no dead keys)"
+Language=hu
+Label="hu (102_qwertz_dot_nodead)"
+
+[keyboard-hu-102_qwerty_comma_dead]
+Description="Keyboard - Hungarian - Hungarian (QWERTY, 102-key, comma, dead keys)"
+Language=hu
+Label="hu (102_qwerty_comma_dead)"
+
+[keyboard-hu-102_qwerty_comma_nodead]
+Description="Keyboard - Hungarian - Hungarian (QWERTY, 102-key, comma, no dead keys)"
+Language=hu
+Label="hu (102_qwerty_comma_nodead)"
+
+[keyboard-hu-102_qwerty_dot_dead]
+Description="Keyboard - Hungarian - Hungarian (QWERTY, 102-key, dot, dead keys)"
+Language=hu
+Label="hu (102_qwerty_dot_dead)"
+
+[keyboard-hu-102_qwerty_dot_nodead]
+Description="Keyboard - Hungarian - Hungarian (QWERTY, 102-key, dot, no dead keys)"
+Language=hu
+Label="hu (102_qwerty_dot_nodead)"
+
+[keyboard-hu-oldhunlig]
+Description="Keyboard - Hungarian - Old Hungarian (for ligatures)"
+Language=hu
+Label="oldhun(lig) (oldhunlig)"
+
+[keyboard-hu-oldhun_sk_sh]
+Description="Keyboard - Hungarian - Old Hungarian (Carpathian Highlands, S as Sh)"
+Language=hu
+Label="oldhun(SK,Sh) (oldhun_sk_sh)"
+
+[keyboard-hu-oldhun_sk_sz]
+Description="Keyboard - Hungarian - Old Hungarian (Carpathian Highlands, S as Sz)"
+Language=hu
+Label="oldhun(SK,Sz) (oldhun_sk_sz)"
+
+[keyboard-hu-us]
+Description="Keyboard - Hungarian - Hungarian (US)"
+Language=hu
+Label=us
+
+[keyboard-ng]
+Description="Keyboard - English (Nigeria)"
+Language=en
+Label=en
+
+[keyboard-ng-hausa]
+Description="Keyboard - English (Nigeria) - Hausa (Nigeria)"
+Language=ha
+Label="ha (hausa)"
+
+[keyboard-ng-igbo]
+Description="Keyboard - English (Nigeria) - Igbo"
+Language=ig
+Label="ig (igbo)"
+
+[keyboard-ng-yoruba]
+Description="Keyboard - English (Nigeria) - Yoruba"
+Language=yo
+Label="yo (yoruba)"
+
+[keyboard-is]
+Description="Keyboard - Icelandic"
+Language=is
+Label=is
+
+[keyboard-is-mac_legacy]
+Description="Keyboard - Icelandic - Icelandic (Macintosh, legacy)"
+Language=is
+Label="is (mac_legacy)"
+
+[keyboard-is-mac]
+Description="Keyboard - Icelandic - Icelandic (Macintosh)"
+Language=is
+Label="is (mac)"
+
+[keyboard-is-dvorak]
+Description="Keyboard - Icelandic - Icelandic (Dvorak)"
+Language=is
+Label="is (dvorak)"
+
+[keyboard-in]
+Description="Keyboard - Indian"
+Language=hi
+Label=in
+
+[keyboard-in-asm-kagapa]
+Description="Keyboard - Indian - Assamese (KaGaPa, phonetic)"
+Language=as
+Label="as (asm-kagapa)"
+
+[keyboard-in-ben]
+Description="Keyboard - Indian - Bangla (India)"
+Language=bn
+Label="bn (ben)"
+
+[keyboard-in-ben_probhat]
+Description="Keyboard - Indian - Bangla (India, Probhat)"
+Language=bn
+Label="bn (ben_probhat)"
+
+[keyboard-in-ben_baishakhi]
+Description="Keyboard - Indian - Bangla (India, Baishakhi)"
+Language=bn
+Label="in (ben_baishakhi)"
+
+[keyboard-in-ben_bornona]
+Description="Keyboard - Indian - Bangla (India, Bornona)"
+Language=bn
+Label="in (ben_bornona)"
+
+[keyboard-in-ben-kagapa]
+Description="Keyboard - Indian - Bangla (India, KaGaPa, phonetic)"
+Language=bn
+Label="in (ben-kagapa)"
+
+[keyboard-in-ben_gitanjali]
+Description="Keyboard - Indian - Bangla (India, Gitanjali)"
+Language=bn
+Label="in (ben_gitanjali)"
+
+[keyboard-in-ben_inscript]
+Description="Keyboard - Indian - Bangla (India, Baishakhi InScript)"
+Language=bn
+Label="in (ben_inscript)"
+
+[keyboard-in-eng]
+Description="Keyboard - Indian - English (India, with rupee)"
+Language=en
+Label="en (eng)"
+
+[keyboard-in-guj]
+Description="Keyboard - Indian - Gujarati"
+Language=gu
+Label="gu (guj)"
+
+[keyboard-in-guj-kagapa]
+Description="Keyboard - Indian - Gujarati (KaGaPa, phonetic)"
+Language=gu
+Label="gu (guj-kagapa)"
+
+[keyboard-in-bolnagri]
+Description="Keyboard - Indian - Hindi (Bolnagri)"
+Language=hi
+Label="hi (bolnagri)"
+
+[keyboard-in-hin-wx]
+Description="Keyboard - Indian - Hindi (Wx)"
+Language=hi
+Label="hi (hin-wx)"
+
+[keyboard-in-hin-kagapa]
+Description="Keyboard - Indian - Hindi (KaGaPa, phonetic)"
+Language=hi
+Label="hi (hin-kagapa)"
+
+[keyboard-in-kan]
+Description="Keyboard - Indian - Kannada"
+Language=kn
+Label="kn (kan)"
+
+[keyboard-in-kan-kagapa]
+Description="Keyboard - Indian - Kannada (KaGaPa, phonetic)"
+Language=kn
+Label="kn (kan-kagapa)"
+
+[keyboard-in-mal]
+Description="Keyboard - Indian - Malayalam"
+Language=ml
+Label="ml (mal)"
+
+[keyboard-in-mal_lalitha]
+Description="Keyboard - Indian - Malayalam (Lalitha)"
+Language=ml
+Label="ml (mal_lalitha)"
+
+[keyboard-in-mal_enhanced]
+Description="Keyboard - Indian - Malayalam (enhanced InScript, with rupee)"
+Language=ml
+Label="ml (mal_enhanced)"
+
+[keyboard-in-mal_poorna]
+Description="Keyboard - Indian - Malayalam (Poorna, extended InScript)"
+Language=ml
+Label="ml (mal_poorna)"
+
+[keyboard-in-mni]
+Description="Keyboard - Indian - Manipuri (Meitei)"
+Language=mni
+Label="in (mni)"
+
+[keyboard-in-mar-kagapa]
+Description="Keyboard - Indian - Marathi (KaGaPa, phonetic)"
+Language=mr
+Label="mr (mar-kagapa)"
+
+[keyboard-in-marathi]
+Description="Keyboard - Indian - Marathi (enhanced InScript)"
+Language=mr
+Label="in (marathi)"
+
+[keyboard-in-ori]
+Description="Keyboard - Indian - Oriya"
+Language=or
+Label="or (ori)"
+
+[keyboard-in-ori-bolnagri]
+Description="Keyboard - Indian - Oriya (Bolnagri)"
+Language=or
+Label="or (ori-bolnagri)"
+
+[keyboard-in-ori-wx]
+Description="Keyboard - Indian - Oriya (Wx)"
+Language=or
+Label="or (ori-wx)"
+
+[keyboard-in-guru]
+Description="Keyboard - Indian - Punjabi (Gurmukhi)"
+Language=pa
+Label="pa (guru)"
+
+[keyboard-in-jhelum]
+Description="Keyboard - Indian - Punjabi (Gurmukhi Jhelum)"
+Language=pa
+Label="pa (jhelum)"
+
+[keyboard-in-san-kagapa]
+Description="Keyboard - Indian - Sanskrit (KaGaPa, phonetic)"
+Language=sa
+Label="sa (san-kagapa)"
+
+[keyboard-in-sat]
+Description="Keyboard - Indian - Santali (Ol Chiki)"
+Language=sat
+Label=sat
+
+[keyboard-in-tamilnet]
+Description="Keyboard - Indian - Tamil (TamilNet '99)"
+Language=ta
+Label="ta (tamilnet)"
+
+[keyboard-in-tamilnet_tamilnumbers]
+Description="Keyboard - Indian - Tamil (TamilNet '99 with Tamil numerals)"
+Language=ta
+Label="ta (tamilnet_tamilnumbers)"
+
+[keyboard-in-tamilnet_TAB]
+Description="Keyboard - Indian - Tamil (TamilNet '99, TAB encoding)"
+Language=ta
+Label="ta (tamilnet_TAB)"
+
+[keyboard-in-tamilnet_TSCII]
+Description="Keyboard - Indian - Tamil (TamilNet '99, TSCII encoding)"
+Language=ta
+Label="ta (tamilnet_TSCII)"
+
+[keyboard-in-tam]
+Description="Keyboard - Indian - Tamil (InScript, with Arabic numerals)"
+Language=ta
+Label="ta (tam)"
+
+[keyboard-in-tam_tamilnumbers]
+Description="Keyboard - Indian - Tamil (InScript, with Tamil numerals)"
+Language=ta
+Label="ta (tam_tamilnumbers)"
+
+[keyboard-in-tel]
+Description="Keyboard - Indian - Telugu"
+Language=te
+Label="te (tel)"
+
+[keyboard-in-tel-kagapa]
+Description="Keyboard - Indian - Telugu (KaGaPa, phonetic)"
+Language=te
+Label="te (tel-kagapa)"
+
+[keyboard-in-tel-sarala]
+Description="Keyboard - Indian - Telugu (Sarala)"
+Language=te
+Label="te (tel-sarala)"
+
+[keyboard-in-urd-phonetic]
+Description="Keyboard - Indian - Urdu (phonetic)"
+Language=ur
+Label="ur (urd-phonetic)"
+
+[keyboard-in-urd-phonetic3]
+Description="Keyboard - Indian - Urdu (alt. phonetic)"
+Language=ur
+Label="ur (urd-phonetic3)"
+
+[keyboard-in-urd-winkeys]
+Description="Keyboard - Indian - Urdu (Windows)"
+Language=ur
+Label="ur (urd-winkeys)"
+
+[keyboard-in-iipa]
+Description="Keyboard - Indian - Indic IPA"
+Language=en
+Label="in (iipa)"
+
+[keyboard-in-modi-kagapa]
+Description="Keyboard - Indian - Modi (KaGaPa, phonetic)"
+Language=mr
+Label="mr (modi-kagapa)"
+
+[keyboard-in-san-misc]
+Description="Keyboard - Indian - Sanskrit symbols"
+Language=sa
+Label="sas (san-misc)"
+
+[keyboard-in-urd-navees]
+Description="Keyboard - Indian - Urdu (Navees)"
+Language=ur
+Label="ur (urd-navees)"
+
+[keyboard-it]
+Description="Keyboard - Italian"
+Language=it
+Label=it
+
+[keyboard-it-nodeadkeys]
+Description="Keyboard - Italian - Italian (no dead keys)"
+Language=it
+Label="it (nodeadkeys)"
+
+[keyboard-it-winkeys]
+Description="Keyboard - Italian - Italian (Windows)"
+Language=it
+Label="it (winkeys)"
+
+[keyboard-it-mac]
+Description="Keyboard - Italian - Italian (Macintosh)"
+Language=it
+Label="it (mac)"
+
+[keyboard-it-us]
+Description="Keyboard - Italian - Italian (US)"
+Language=it
+Label="it (us)"
+
+[keyboard-it-ibm]
+Description="Keyboard - Italian - Italian (IBM 142)"
+Language=it
+Label="it (ibm)"
+
+[keyboard-it-fur]
+Description="Keyboard - Italian - Friulian (Italy)"
+Language=fur
+Label="it (fur)"
+
+[keyboard-it-scn]
+Description="Keyboard - Italian - Sicilian"
+Language=it
+Label="it (scn)"
+
+[keyboard-it-geo]
+Description="Keyboard - Italian - Georgian (Italy)"
+Language=ka
+Label="it (geo)"
+
+[keyboard-it-sun_type6]
+Description="Keyboard - Italian - Italian (Sun Type 6/7)"
+Language=it
+Label="it (sun_type6)"
+
+[keyboard-it-lld]
+Description="Keyboard - Italian - Ladin (Italian keyboard)"
+Language=it
+Label="it_lld (lld)"
+
+[keyboard-it-lldde]
+Description="Keyboard - Italian - Ladin (German keyboard)"
+Language=de
+Label="de_lld (lldde)"
+
+[keyboard-it-dvorak]
+Description="Keyboard - Italian - Italian (Dvorak)"
+Language=it
+Label="it (dvorak)"
+
+[keyboard-jp]
+Description="Keyboard - Japanese"
+Language=ja
+Label=ja
+
+[keyboard-jp-kana]
+Description="Keyboard - Japanese - Japanese (Kana)"
+Language=ja
+Label="jp (kana)"
+
+[keyboard-jp-kana86]
+Description="Keyboard - Japanese - Japanese (Kana 86)"
+Language=ja
+Label="jp (kana86)"
+
+[keyboard-jp-OADG109A]
+Description="Keyboard - Japanese - Japanese (OADG 109A)"
+Language=ja
+Label="jp (OADG109A)"
+
+[keyboard-jp-mac]
+Description="Keyboard - Japanese - Japanese (Macintosh)"
+Language=ja
+Label="jp (mac)"
+
+[keyboard-jp-dvorak]
+Description="Keyboard - Japanese - Japanese (Dvorak)"
+Language=ja
+Label="jp (dvorak)"
+
+[keyboard-jp-sun_type6]
+Description="Keyboard - Japanese - Japanese (Sun Type 6)"
+Language=ja
+Label="jp (sun_type6)"
+
+[keyboard-jp-sun_type7]
+Description="Keyboard - Japanese - Japanese (Sun Type 7, PC-compatible)"
+Language=ja
+Label="jp (sun_type7)"
+
+[keyboard-jp-sun_type7_suncompat]
+Description="Keyboard - Japanese - Japanese (Sun Type 7, Sun-compatible)"
+Language=ja
+Label="jp (sun_type7_suncompat)"
+
diff --git a/dotfiles/.config/fcitx5/conf/classicui.conf b/dotfiles/.config/fcitx5/conf/classicui.conf
new file mode 100644
index 0000000..8cc16b5
--- /dev/null
+++ b/dotfiles/.config/fcitx5/conf/classicui.conf
@@ -0,0 +1,35 @@
+# Vertical Candidate List
+Vertical Candidate List=False
+# Use mouse wheel to go to prev or next page
+WheelForPaging=True
+# Font
+Font="Sarasa Gothic SC 14"
+# Menu Font
+MenuFont="Sarasa Gothic SC 14"
+# Tray Font
+TrayFont="Sarasa Gothic SC 12"
+# Tray Label Outline Color
+TrayOutlineColor=#000000
+# Tray Label Text Color
+TrayTextColor=#ffffff
+# Prefer Text Icon
+PreferTextIcon=False
+# Show Layout Name In Icon
+ShowLayoutNameInIcon=True
+# Use input method language to display text
+UseInputMethodLanguageToDisplayText=True
+# Theme
+Theme=catppuccin-mocha-flamingo
+# Dark Theme
+DarkTheme=catppuccin-mocha-flamingo
+# Follow system light/dark color scheme
+UseDarkTheme=True
+# Follow system accent color if it is supported by theme and desktop
+UseAccentColor=True
+# Use Per Screen DPI on X11
+PerScreenDPI=False
+# Force font DPI on Wayland
+ForceWaylandDPI=0
+# Enable fractional scale under Wayland
+EnableFractionalScale=True
+
diff --git a/dotfiles/.config/fcitx5/conf/clipboard.conf b/dotfiles/.config/fcitx5/conf/clipboard.conf
new file mode 100644
index 0000000..c2d6def
--- /dev/null
+++ b/dotfiles/.config/fcitx5/conf/clipboard.conf
@@ -0,0 +1,13 @@
+# Paste Primary
+PastePrimaryKey=
+# Number of entries
+Number of entries=10
+# Do not show password from password managers
+IgnorePasswordFromPasswordManager=False
+# Hidden clipboard content that contains a password
+ShowPassword=False
+# Seconds before clearing password
+ClearPasswordAfter=30
+
+[TriggerKey]
+0=Super+V
diff --git a/dotfiles/.config/fcitx5/conf/keyboard.conf b/dotfiles/.config/fcitx5/conf/keyboard.conf
new file mode 100644
index 0000000..4793bba
--- /dev/null
+++ b/dotfiles/.config/fcitx5/conf/keyboard.conf
@@ -0,0 +1,29 @@
+# Page size
+PageSize=5
+# Enable emoji in hint
+EnableEmoji=True
+# Enable emoji in quickphrase
+EnableQuickPhraseEmoji=True
+# Choose key modifier
+Choose Modifier=Alt
+# Enable hint by default
+EnableHintByDefault=False
+# Use new compose behavior
+UseNewComposeBehavior=True
+# Type special characters with long press
+EnableLongPress=False
+# Applications disabled for long press
+LongPressBlocklist=
+
+[PrevCandidate]
+0=Shift+Tab
+
+[NextCandidate]
+0=Tab
+
+[Hint Trigger]
+0=Control+Alt+H
+
+[One Time Hint Trigger]
+0=Control+Alt+J
+
diff --git a/dotfiles/.config/fcitx5/conf/notifications.conf b/dotfiles/.config/fcitx5/conf/notifications.conf
new file mode 100644
index 0000000..6e7d1b9
--- /dev/null
+++ b/dotfiles/.config/fcitx5/conf/notifications.conf
@@ -0,0 +1,3 @@
+# Hidden Notifications
+HiddenNotifications=
+
diff --git a/dotfiles/.config/fcitx5/conf/quickphrase.conf b/dotfiles/.config/fcitx5/conf/quickphrase.conf
new file mode 100644
index 0000000..90b06be
--- /dev/null
+++ b/dotfiles/.config/fcitx5/conf/quickphrase.conf
@@ -0,0 +1,9 @@
+# Trigger Key
+TriggerKey=
+# Choose key modifier
+Choose Modifier=None
+# Enable Spell check
+Spell=False
+# Fallback Spell check language
+FallbackSpellLanguage=en
+
diff --git a/dotfiles/.config/fcitx5/conf/rime.conf b/dotfiles/.config/fcitx5/conf/rime.conf
new file mode 100644
index 0000000..1f68a4a
--- /dev/null
+++ b/dotfiles/.config/fcitx5/conf/rime.conf
@@ -0,0 +1,13 @@
+# Preedit Mode
+PreeditMode="Do not show"
+# Shared Input State
+InputState=All
+# Fix embedded preedit cursor at the beginning of the preedit
+PreeditCursorPositionAtBeginning=True
+# Action when switching input method
+SwitchInputMethodBehavior="Commit commit preview"
+# Deploy
+Deploy=
+# Synchronize
+Synchronize=
+
diff --git a/dotfiles/.config/fcitx5/conf/spell.conf b/dotfiles/.config/fcitx5/conf/spell.conf
new file mode 100644
index 0000000..25197e3
--- /dev/null
+++ b/dotfiles/.config/fcitx5/conf/spell.conf
@@ -0,0 +1,5 @@
+[ProviderOrder]
+0=Presage
+1=Custom
+2=Enchant
+
diff --git a/dotfiles/.config/fcitx5/conf/wayland.conf b/dotfiles/.config/fcitx5/conf/wayland.conf
new file mode 100644
index 0000000..6d970c1
--- /dev/null
+++ b/dotfiles/.config/fcitx5/conf/wayland.conf
@@ -0,0 +1,3 @@
+# Allow Overriding System XKB Settings (Only support KDE 5)
+Allow Overriding System XKB Settings=False
+
diff --git a/dotfiles/.config/fcitx5/config b/dotfiles/.config/fcitx5/config
new file mode 100644
index 0000000..0443fe2
--- /dev/null
+++ b/dotfiles/.config/fcitx5/config
@@ -0,0 +1,73 @@
+[Hotkey]
+# Enumerate when press trigger key repeatedly
+EnumerateWithTriggerKeys=True
+# Temporally switch between first and current Input Method
+AltTriggerKeys=
+# Enumerate Input Method Forward
+EnumerateForwardKeys=
+# Enumerate Input Method Backward
+EnumerateBackwardKeys=
+# Skip first input method while enumerating
+EnumerateSkipFirst=False
+# Enumerate Input Method Group Forward
+EnumerateGroupForwardKeys=
+# Enumerate Input Method Group Backward
+EnumerateGroupBackwardKeys=
+# Activate Input Method
+ActivateKeys=
+# Deactivate Input Method
+DeactivateKeys=
+# Toggle embedded preedit
+TogglePreedit=
+
+[Hotkey/TriggerKeys]
+0=Super+space
+
+[Hotkey/PrevPage]
+0=Up
+
+[Hotkey/NextPage]
+0=Down
+
+[Hotkey/PrevCandidate]
+0=Shift+Tab
+
+[Hotkey/NextCandidate]
+0=Tab
+
+[Behavior]
+# Active By Default
+ActiveByDefault=False
+# Reset state on Focus In
+resetStateWhenFocusIn=No
+# Share Input State
+ShareInputState=No
+# Show preedit in application
+PreeditEnabledByDefault=True
+# Show Input Method Information when switch input method
+ShowInputMethodInformation=True
+# Show Input Method Information when changing focus
+showInputMethodInformationWhenFocusIn=False
+# Show compact input method information
+CompactInputMethodInformation=True
+# Show first input method information
+ShowFirstInputMethodInformation=True
+# Default page size
+DefaultPageSize=5
+# Override Xkb Option
+OverrideXkbOption=False
+# Custom Xkb Option
+CustomXkbOption=
+# Force Enabled Addons
+EnabledAddons=
+# Force Disabled Addons
+DisabledAddons=
+# Preload input method to be used by default
+PreloadInputMethod=True
+# Allow input method in the password field
+AllowInputMethodForPassword=False
+# Show preedit text when typing password
+ShowPreeditForPassword=False
+# Interval of saving user data in minutes
+AutoSavePeriod=30
+
diff --git a/dotfiles/.config/fcitx5/profile b/dotfiles/.config/fcitx5/profile
new file mode 100644
index 0000000..d28185b
--- /dev/null
+++ b/dotfiles/.config/fcitx5/profile
@@ -0,0 +1,23 @@
+[Groups/0]
+# Group Name
+Name=Default
+# Layout
+Default Layout=us
+# Default Input Method
+DefaultIM=rime
+
+[Groups/0/Items/0]
+# Name
+Name=keyboard-us
+# Layout
+Layout=
+
+[Groups/0/Items/1]
+# Name
+Name=rime
+# Layout
+Layout=
+
+[GroupOrder]
+0=Default
+
diff --git a/dotfiles/.config/fuzzel/fuzzel.ini b/dotfiles/.config/fuzzel/fuzzel.ini
new file mode 100644
index 0000000..9da285f
--- /dev/null
+++ b/dotfiles/.config/fuzzel/fuzzel.ini
@@ -0,0 +1,21 @@
+[colors]
+background=1e1e2edd
+text=cdd6f4ff
+prompt=bac2deff
+placeholder=7f849cff
+input=cdd6f4ff
+match=b4befeff
+selection=585b70ff
+selection-text=cdd6f4ff
+selection-match=b4befeff
+counter=7f849cff
+border=b4befeff
+
+[main]
+font=Sarasa Gothic SC:size=18
+icon-theme=Papirus-Dark
+icons-enabled=yes
+delayed-filter-ms=0
+delayed-filter-limit=0
+lines=10
+sort-result=yes
diff --git a/dotfiles/.config/hypr/hyprland/autostart.conf b/dotfiles/.config/hypr/hyprland/autostart.conf
new file mode 100644
index 0000000..907a5b7
--- /dev/null
+++ b/dotfiles/.config/hypr/hyprland/autostart.conf
@@ -0,0 +1,9 @@
+exec-once = fcitx5 -d -r
+exec-once = nm-applet
+exec-once = swayosd-server
+exec-once = swww-daemon
+exec-once = swww restore
+exec-once = xprop -root -f _XWAYLAND_GLOBAL_OUTPUT_SCALE 32c -set _XWAYLAND_GLOBAL_OUTPUT_SCALE $SCALE
+exec-once = waybar
+
+# exec-once = sleep 1 && strawberry
diff --git a/dotfiles/.config/hypr/hyprland/basic.conf b/dotfiles/.config/hypr/hyprland/basic.conf
new file mode 100644
index 0000000..66bedbc
--- /dev/null
+++ b/dotfiles/.config/hypr/hyprland/basic.conf
@@ -0,0 +1,136 @@
+source = ~/.config/hypr/theme.conf
+
+animations {
+ enabled = true
+ bezier = liner, 1, 1, 1, 1
+ bezier = overshot, 0.13, 0.99, 0.29, 1.1
+ bezier = wind, 0.05, 0.9, 0.1, 1.05
+ bezier = winIn, 0.1, 1.1, 0.1, 1.1
+ animation = windows, 1, 6, wind, slide
+ animation = windowsIn, 1, 7, winIn, slide
+ animation = windowsOut, 1, 7, default, popin 80%
+ animation = windowsMove, 1, 5, wind, slide
+ animation = border, 1, 1, liner
+ animation = fade, 1, 10, default
+ animation = workspaces, 1, 8, default, slidefade 20%
+ animation = specialWorkspaceIn, 1, 8, default, fade
+ animation = specialWorkspaceOut, 1, 8, default, fade
+}
+
+
+debug {
+ suppress_errors = true
+ watchdog_timeout = 0
+}
+
+
+decoration {
+ active_opacity = 1.0
+ blur {
+ enabled = false
+ }
+ dim_inactive = false
+ fullscreen_opacity = 1.0
+ inactive_opacity = 1.0
+ rounding = 4
+ shadow {
+ enabled = false
+ }
+}
+
+
+ecosystem {
+ no_donation_nag = true
+ no_update_news = true
+}
+
+
+env = XDG_SESSION_DESKTOP, Hyprland
+
+
+general {
+ gaps_in = 1
+ gaps_out = 1
+ border_size = 1
+ col.active_border = $lavender
+ col.inactive_border = $base
+ layout = hy3
+}
+
+
+gestures {
+ workspace_swipe = true
+ workspace_swipe_fingers = 3
+ workspace_swipe_distance = 250
+ workspace_swipe_invert = true
+ workspace_swipe_min_speed_to_force = 15
+ workspace_swipe_cancel_ratio = 0.5
+ workspace_swipe_create_new = false
+}
+
+
+input {
+ follow_mouse = 1
+ float_switch_override_focus = 2
+ kb_layout = $KEYBOARDLAYOUT
+ numlock_by_default = false
+ sensitivity = 0
+ touchpad {
+ disable_while_typing = true
+ natural_scroll = true
+ scroll_factor = 0.5
+ }
+}
+
+
+misc {
+ always_follow_on_dnd = true
+ disable_autoreload = true
+ disable_hyprland_logo = true
+ disable_hyprland_qtutils_check = true;
+ disable_splash_rendering = true;
+ disable_xdg_env_checks = true;
+ enable_anr_dialog = false;
+ enable_swallow = true
+ focus_on_activate = true
+ initial_workspace_tracking = 0
+ key_press_enables_dpms = false
+ layers_hog_keyboard_focus = true
+ mouse_move_enables_dpms = false
+ vfr = true
+}
+
+
+plugin {
+ hy3 {
+ no_gaps_when_only = 1
+ node_collapse_policy = 1
+ group_inset = 10
+ tab_first_window = true
+ tabs {
+ col.active = rgb(b4befe)
+ col.active.border = rgb(313244)
+ col.active.text = rgb(181825)
+ col.inactive = rgb(181825)
+ col.inactive.border = rgb(313244)
+ col.inactive.text = rgb(b4befe)
+ col.urgent = rgb(f2cdcd)
+ col.urgent.border = rgb(313244)
+ col.urgent.text = rgb(181825)
+ from_top = false
+ height = 14
+ padding = 2
+ render_text = true
+ rounding = 6
+ text_center = true
+ text_font = Sarasa Gothic SC
+ text_height = 10
+ text_padding = 0
+ }
+ }
+}
+
+
+xwayland {
+ force_zero_scaling = true
+}
diff --git a/dotfiles/.config/hypr/hyprland/bind.conf b/dotfiles/.config/hypr/hyprland/bind.conf
new file mode 100644
index 0000000..e450e49
--- /dev/null
+++ b/dotfiles/.config/hypr/hyprland/bind.conf
@@ -0,0 +1,178 @@
+## bind settings
+binds {
+ workspace_back_and_forth = 1
+ allow_workspace_cycles = 1
+}
+
+
+## App Launcher
+bindr = ALT, SPACE, exec, fuzzel
+
+
+## Restart some programs
+### Input Tool
+bind = Ctrl_ALT, I, exec, pkill fcitx5 -9;sleep 1;fcitx5 -d --replace; sleep 1;fcitx5-remote -r
+### Notification Manager
+bind = Ctrl_ALT, N, exec, swaync-client -rs
+### Status Bar
+bind = Ctrl_ALT, B, exec, pkill waybar;sleep 1;waybar # Status Bar
+
+
+## Shortcuts
+### File Explorer
+bind = SUPER, E, exec, nemo
+### Logout Menu
+bind = CTRL_SUPER, Q, exec, wlogout
+### Terminal Emulator
+bind = SUPER, T, exec, alacritty
+### Screenshot (Area Mod)
+bind = SUPER, S, exec, sh ~/.config/waybar/scripts/Screenshot-Area.sh
+### Screenshot (Fullscreen Mod)
+bind = SUPER_ALT, S, exec, sh ~/.config/waybar/scripts/Screenshot-Fullscreen.sh
+### Screenshot (Window Mod)
+bind = SUPER_CTRL, S, exec, sh ~/.config/waybar/scripts/Screenshot-Hyprland-Window.sh
+### Screenshot (OCR Mod)
+bind = SUPER_CTRL_ALT, S, exec, sh ~/.config/waybar/scripts/Screenshot-OCR.sh
+
+
+## Window actions
+bind = SUPER, F, fullscreen
+bind = SUPER, Q, hy3:killactive
+
+## Window actions (bonus)
+bind = SUPER_SHIFT, F, togglefloating
+
+
+## Workspace jumping
+bind = SUPER,1,workspace,1
+bind = SUPER,2,workspace,2
+bind = SUPER,3,workspace,3
+bind = SUPER,4,workspace,4
+bind = SUPER,5,workspace,5
+bind = SUPER,6,workspace,6
+bind = SUPER,7,workspace,7
+bind = SUPER,8,workspace,8
+bind = SUPER,9,workspace,9
+bind = SUPER,0,workspace,10
+
+
+## Window movement between Workspace
+### without switching to the Workspace
+bind = SUPER_CTRL, 1, movetoworkspacesilent, 1
+bind = SUPER_CTRL, 2, movetoworkspacesilent, 2
+bind = SUPER_CTRL, 3, movetoworkspacesilent, 3
+bind = SUPER_CTRL, 4, movetoworkspacesilent, 4
+bind = SUPER_CTRL, 5, movetoworkspacesilent, 5
+bind = SUPER_CTRL, 6, movetoworkspacesilent, 6
+bind = SUPER_CTRL, 7, movetoworkspacesilent, 7
+bind = SUPER_CTRL, 8, movetoworkspacesilent, 8
+bind = SUPER_CTRL, 9, movetoworkspacesilent, 9
+bind = SUPER_CTRL, 0, movetoworkspacesilent, 10
+
+### also switching to the Workspace
+bind = SUPER_SHIFT, 1, movetoworkspace, 1
+bind = SUPER_SHIFT, 2, movetoworkspace, 2
+bind = SUPER_SHIFT, 3, movetoworkspace, 3
+bind = SUPER_SHIFT, 4, movetoworkspace, 4
+bind = SUPER_SHIFT, 5, movetoworkspace, 5
+bind = SUPER_SHIFT, 6, movetoworkspace, 6
+bind = SUPER_SHIFT, 7, movetoworkspace, 7
+bind = SUPER_SHIFT, 8, movetoworkspace, 8
+bind = SUPER_SHIFT, 9, movetoworkspace, 9
+bind = SUPER_SHIFT, 0, movetoworkspace, 10
+
+bind = SUPER_SHIFT, mouse_down, movetoworkspace, -1
+bind = SUPER_SHIFT, mouse_up, movetoworkspace, +1
+
+bind = SUPER_SHIFT, mouse:275, movetoworkspace, e+1
+bind = SUPER_SHIFT, mouse:276, movetoworkspace, e-1
+
+
+### Special Workspace
+bind = SUPER, Grave, togglespecialworkspace
+bind = SUPER_CTRL, Grave, movetoworkspacesilent, special
+bind = SUPER_SHIFT, Grave, movetoworkspace, special
+
+
+## Workspace movement
+bind = SUPER_CTRL, left, workspace, -1
+bind = SUPER_CTRL, right, workspace, +1
+
+### Using Vim-like keys
+bind = SUPER_CTRL, H, workspace, -1
+bind = SUPER_CTRL, L, workspace, +1
+
+## Window focus movement
+### Using Alt+Tab
+bind = ALT, Tab, hy3:movefocus, r
+bind = ALT_SHIFT, Tab, hy3:movefocus, l
+
+### Using Arrow keys
+bind = SUPER, left, hy3:movefocus,l
+bind = SUPER, right, hy3:movefocus,r
+bind = SUPER, up, hy3:movefocus,u
+bind = SUPER, down, hy3:movefocus,d
+
+### Using Vim-like keys
+bind = SUPER_Alt, H, hy3:movefocus, l
+bind = SUPER_Alt, L, hy3:movefocus, r
+bind = SUPER_Alt, K, hy3:movefocus, u
+bind = SUPER_Alt, J, hy3:movefocus, d
+
+
+## Window direction movement
+### Using Arrow keys
+bind = SUPER_SHIFT, left, hy3:movewindow,l
+bind = SUPER_SHIFT, right, hy3:movewindow,r
+bind = SUPER_SHIFT, up, hy3:movewindow,u
+bind = SUPER_SHIFT, down, hy3:movewindow,d
+
+### Using Vim-like keys
+bind = SUPER_SHIFT, H, hy3:movefocus, l
+bind = SUPER_SHIFT, L, hy3:movefocus, r
+bind = SUPER_SHIFT, K, hy3:movefocus, u
+bind = SUPER_SHIFT, J, hy3:movefocus, d
+
+
+## Some smart actions with Mouse
+bindm = SUPER, mouse:272, movewindow
+bindm = SUPER, mouse:273, resizewindow
+
+bind = SUPER, mouse_down, workspace, -1
+bind = SUPER, mouse_up, workspace, +1
+
+bind = SUPER, mouse:275, workspace, e+1
+bind = SUPER, mouse:276, workspace, e-1
+
+### hy3 bonus
+bindn = , mouse:272, hy3:focustab, mouse
+bindn = , mouse_down, hy3:focustab, l, require_hovered
+bindn = , mouse_up, hy3:focustab, r, require_hovered
+
+
+## Brightness control
+bindel = , XF86MonBrightnessUp, exec, swayosd-client --brightness +5
+bindel = , XF86MonBrightnessDown, exec, swayosd-client --brightness -5
+
+
+## Playback control
+bindl = ,XF86AudioPlay,exec, playerctl play-pause
+bindl = ,XF86AudioNext,exec, playerctl next
+bindl = ,XF86AudioPrev,exec, playerctl previous
+
+### Playback control (bonus)
+bindl = CONTROL_ALT, Return, exec, playerctl play-pause
+bindl = CONTROL_ALT, right, exec, playerctl next
+bindl = CONTROL_ALT, left, exec, playerctl previous
+
+
+## Volume control
+bindel = ,XF86AudioRaiseVolume, exec, swayosd-client --output-volume +2
+bindel = ,XF86AudioLowerVolume, exec, swayosd-client --output-volume -2
+bindl = ,XF86AudioMicMute, exec, swayosd-client --input-volume mute-toggle
+bindl = ,XF86AudioMute, exec, swayosd-client --output-volume mute-toggle
+
+
+## Volume control (bonus)
+bindel = CONTROL_ALT, up, exec, swayosd-client --output-volume +2
+bindel = CONTROL_ALT, down, exec, swayosd-client --output-volume -2
diff --git a/dotfiles/.config/hypr/hyprlock.conf b/dotfiles/.config/hypr/hyprlock.conf
new file mode 100644
index 0000000..a8212e1
--- /dev/null
+++ b/dotfiles/.config/hypr/hyprlock.conf
@@ -0,0 +1,77 @@
+source = $HOME/.config/hypr/theme.conf
+
+$accent = $mauve
+$accentAlpha = $mauveAlpha
+$font = JetBrainsMono Nerd Font
+
+# GENERAL
+general {
+ disable_loading_bar = true
+ hide_cursor = true
+}
+
+# BACKGROUND
+background {
+ monitor =
+ blur_passes = 0
+ color = $base
+}
+
+# LAYOUT
+label {
+ monitor =
+ text = Layout: $LAYOUT
+ color = $text
+ font_size = 25
+ font_family = $font
+ position = 30, -30
+ halign = left
+ valign = top
+}
+
+# TIME
+label {
+ monitor =
+ text = $TIME
+ color = $text
+ font_size = 90
+ font_family = $font
+ position = -30, 0
+ halign = right
+ valign = top
+}
+
+# DATE
+label {
+ monitor =
+ text = cmd[update:43200000] date +"%A, %d %B %Y"
+ color = $text
+ font_size = 25
+ font_family = $font
+ position = -30, -150
+ halign = right
+ valign = top
+}
+
+# INPUT FIELD
+input-field {
+ monitor =
+ size = 300, 60
+ outline_thickness = 4
+ dots_size = 0.2
+ dots_spacing = 0.2
+ dots_center = true
+ outer_color = $accent
+ inner_color = $surface0
+ font_color = $text
+ fade_on_empty = false
+ placeholder_text = Logged in as $USER
+ hide_input = false
+ check_color = $accent
+ fail_color = $red
+ fail_text = $FAIL ($ATTEMPTS)
+ capslock_color = $yellow
+ position = 0, -47
+ halign = center
+ valign = center
+}
diff --git a/dotfiles/.config/hypr/theme.conf b/dotfiles/.config/hypr/theme.conf
new file mode 100644
index 0000000..0855b5d
--- /dev/null
+++ b/dotfiles/.config/hypr/theme.conf
@@ -0,0 +1,79 @@
+# Catpucchin Mocha
+
+$rosewater = rgb(f5e0dc)
+$rosewaterAlpha = f5e0dc
+
+$flamingo = rgb(f2cdcd)
+$flamingoAlpha = f2cdcd
+
+$pink = rgb(f5c2e7)
+$pinkAlpha = f5c2e7
+
+$mauve = rgb(cba6f7)
+$mauveAlpha = cba6f7
+
+$red = rgb(f38ba8)
+$redAlpha = f38ba8
+
+$maroon = rgb(eba0ac)
+$maroonAlpha = eba0ac
+
+$peach = rgb(fab387)
+$peachAlpha = fab387
+
+$yellow = rgb(f9e2af)
+$yellowAlpha = f9e2af
+
+$green = rgb(a6e3a1)
+$greenAlpha = a6e3a1
+
+$teal = rgb(94e2d5)
+$tealAlpha = 94e2d5
+
+$sky = rgb(89dceb)
+$skyAlpha = 89dceb
+
+$sapphire = rgb(74c7ec)
+$sapphireAlpha = 74c7ec
+
+$blue = rgb(89b4fa)
+$blueAlpha = 89b4fa
+
+$lavender = rgb(b4befe)
+$lavenderAlpha = b4befe
+
+$text = rgb(cdd6f4)
+$textAlpha = cdd6f4
+
+$subtext1 = rgb(bac2de)
+$subtext1Alpha = bac2de
+
+$subtext0 = rgb(a6adc8)
+$subtext0Alpha = a6adc8
+
+$overlay2 = rgb(9399b2)
+$overlay2Alpha = 9399b2
+
+$overlay1 = rgb(7f849c)
+$overlay1Alpha = 7f849c
+
+$overlay0 = rgb(6c7086)
+$overlay0Alpha = 6c7086
+
+$surface2 = rgb(585b70)
+$surface2Alpha = 585b70
+
+$surface1 = rgb(45475a)
+$surface1Alpha = 45475a
+
+$surface0 = rgb(313244)
+$surface0Alpha = 313244
+
+$base = rgb(1e1e2e)
+$baseAlpha = 1e1e2e
+
+$mantle = rgb(181825)
+$mantleAlpha = 181825
+
+$crust = rgb(11111b)
+$crustAlpha = 11111b
diff --git a/dotfiles/.config/keepassxc/keepassxc.ini b/dotfiles/.config/keepassxc/keepassxc.ini
new file mode 100644
index 0000000..e1d1059
--- /dev/null
+++ b/dotfiles/.config/keepassxc/keepassxc.ini
@@ -0,0 +1,31 @@
+[General]
+ConfigVersion=2
+
+[Browser]
+AlwaysAllowAccess=true
+CustomProxyLocation=
+Enabled=false
+
+[FdoSecrets]
+Enabled=false
+
+[GUI]
+ApplicationTheme=classic
+MinimizeOnClose=true
+MinimizeOnStartup=false
+MinimizeToTray=true
+ShowTrayIcon=true
+ToolButtonStyle=0
+TrayIconAppearance=monochrome-dark
+
+[PasswordGenerator]
+AdditionalChars=
+ExcludedChars=
+SpecialChars=false
+
+[SSHAgent]
+Enabled=true
+
+[Security]
+ClearClipboard=false
+IconDownloadFallback=true
diff --git a/dotfiles/.config/kwalletrc b/dotfiles/.config/kwalletrc
new file mode 100644
index 0000000..95510c3
--- /dev/null
+++ b/dotfiles/.config/kwalletrc
@@ -0,0 +1,14 @@
+[Wallet]
+Close When Idle=true
+Close on Screensaver=true
+Enabled=false
+First Use=false
+Idle Timeout=1
+Launch Manager=false
+Leave Manager Open=false
+Leave Open=false
+Prompt on Open=false
+Use One Wallet=true
+
+[org.freedesktop.secrets]
+apiEnabled=false
diff --git a/dotfiles/.config/nushell/config.nu b/dotfiles/.config/nushell/config.nu
new file mode 100644
index 0000000..04df2f9
--- /dev/null
+++ b/dotfiles/.config/nushell/config.nu
@@ -0,0 +1,821 @@
+
+let dark_theme = {
+ separator: white
+ leading_trailing_space_bg: { attr: n }
+ header: green_bold
+ bool: light_cyan
+ int: white
+ filesize: cyan
+ duration: white
+ date: purple
+ range: white
+ float: white
+ string: white
+ nothing: white
+ binary: white
+ cell-path: white
+ row_index: green_bold
+ record: white
+ list: white
+ block: white
+ hints: dark_gray
+ search_result: { bg: red fg: white }
+ shape_and: purple_bold
+ shape_binary: purple_bold
+ shape_block: blue_bold
+ shape_bool: light_cyan
+ shape_closure: green_bold
+ shape_custom: green
+ shape_datetime: cyan_bold
+ shape_directory: cyan
+ shape_external: cyan
+ shape_externalarg: green_bold
+ shape_external_resolved: light_yellow_bold
+ shape_filepath: cyan
+ shape_flag: blue_bold
+ shape_float: purple_bold
+ shape_garbage: { fg: white bg: red attr: b }
+ shape_glob_interpolation: cyan_bold
+ shape_globpattern: cyan_bold
+ shape_int: purple_bold
+ shape_internalcall: cyan_bold
+ shape_keyword: cyan_bold
+ shape_list: cyan_bold
+ shape_literal: blue
+ shape_match_pattern: green
+ shape_matching_brackets: { attr: u }
+ shape_nothing: light_cyan
+ shape_operator: yellow
+ shape_or: purple_bold
+ shape_pipe: purple_bold
+ shape_range: yellow_bold
+ shape_record: cyan_bold
+ shape_redirection: purple_bold
+ shape_signature: green_bold
+ shape_string: green
+ shape_string_interpolation: cyan_bold
+ shape_table: blue_bold
+ shape_variable: purple
+ shape_vardecl: purple
+ shape_raw_string: light_purple
+}
+
+let light_theme = {
+ separator: dark_gray
+ leading_trailing_space_bg: { attr: n }
+ header: green_bold
+ empty: blue
+ bool: dark_cyan
+ int: dark_gray
+ filesize: cyan_bold
+ duration: dark_gray
+ date: purple
+ range: dark_gray
+ float: dark_gray
+ string: dark_gray
+ nothing: dark_gray
+ binary: dark_gray
+ cell-path: dark_gray
+ row_index: green_bold
+ record: dark_gray
+ list: dark_gray
+ block: dark_gray
+ hints: dark_gray
+ search_result: { fg: white bg: red }
+ shape_and: purple_bold
+ shape_binary: purple_bold
+ shape_block: blue_bold
+ shape_bool: light_cyan
+ shape_closure: green_bold
+ shape_custom: green
+ shape_datetime: cyan_bold
+ shape_directory: cyan
+ shape_external: cyan
+ shape_externalarg: green_bold
+ shape_external_resolved: light_purple_bold
+ shape_filepath: cyan
+ shape_flag: blue_bold
+ shape_float: purple_bold
+ shape_garbage: { fg: white bg: red attr: b }
+ shape_glob_interpolation: cyan_bold
+ shape_globpattern: cyan_bold
+ shape_int: purple_bold
+ shape_internalcall: cyan_bold
+ shape_keyword: cyan_bold
+ shape_list: cyan_bold
+ shape_literal: blue
+ shape_match_pattern: green
+ shape_matching_brackets: { attr: u }
+ shape_nothing: light_cyan
+ shape_operator: yellow
+ shape_or: purple_bold
+ shape_pipe: purple_bold
+ shape_range: yellow_bold
+ shape_record: cyan_bold
+ shape_redirection: purple_bold
+ shape_signature: green_bold
+ shape_string: green
+ shape_string_interpolation: cyan_bold
+ shape_table: blue_bold
+ shape_variable: purple
+ shape_vardecl: purple
+ shape_raw_string: light_purple
+}
+$env.config = {
+ show_banner: false
+
+ ls: {
+ use_ls_colors: true
+ clickable_links: true
+ }
+
+ rm: {
+ always_trash: false
+ }
+
+ table: {
+ mode: rounded
+ index_mode: always
+ show_empty: true
+ padding: { left: 1, right: 1 }
+ trim: {
+ methodology: wrapping
+ wrapping_try_keep_words: true
+ truncating_suffix: "..."
+ }
+ header_on_separator: false
+ }
+
+ error_style: "fancy"
+ display_errors: {
+ exit_code: false
+ termination_signal: true
+ }
+ datetime_format: {
+ }
+
+ explore: {
+ status_bar_background: { fg: "#1D1F21", bg: "#C4C9C6" },
+ command_bar_text: { fg: "#C4C9C6" },
+ highlight: { fg: "black", bg: "yellow" },
+ status: {
+ error: { fg: "white", bg: "red" },
+ warn: {}
+ info: {}
+ },
+ selected_cell: { bg: light_blue },
+ }
+
+ history: {
+ max_size: 100_000
+ sync_on_enter: true
+ file_format: "plaintext"
+ isolation: false
+ }
+
+ completions: {
+ case_sensitive: false
+ quick: true
+ partial: true
+ algorithm: "prefix"
+ sort: "smart"
+ external: {
+ enable: true
+ max_results: 100
+ completer: null
+ }
+ use_ls_colors: true
+ }
+
+ cursor_shape: {
+ emacs: line
+ vi_insert: block
+ vi_normal: underscore
+ }
+
+ color_config: $dark_theme
+ footer_mode: 25
+ float_precision: 2
+ buffer_editor: micro
+ use_ansi_coloring: true
+ bracketed_paste: true
+ edit_mode: emacs
+ shell_integration: {
+ osc2: true
+ osc7: true
+ osc8: true
+ osc9_9: false
+ osc133: true
+ osc633: true
+ reset_application_mode: true
+ }
+ render_right_prompt_on_last_line: false
+ use_kitty_protocol: false
+ highlight_resolved_externals: false
+ recursion_limit: 50
+
+ plugins: {}
+
+ plugin_gc: {
+ default: {
+ enabled: true
+ stop_after: 10sec
+ }
+ plugins: {
+ }
+ }
+
+ hooks: {
+ pre_prompt: [{ null }]
+ pre_execution: [{ null }]
+ env_change: {
+ PWD: [{|before, after|
+ if (which direnv | is-empty) {
+ return
+ }
+
+ direnv export json | from json | default {} | load-env
+ }]
+ }
+ display_output: "if (term size).columns >= 100 { table -e } else { table }"
+ command_not_found: { null }
+ }
+
+ menus: [
+ {
+ name: completion_menu
+ only_buffer_difference: false
+ marker: "| "
+ type: {
+ layout: columnar
+ columns: 4
+ col_width: 20
+ col_padding: 2
+ }
+ style: {
+ text: green
+ selected_text: { attr: r }
+ description_text: yellow
+ match_text: { attr: u }
+ selected_match_text: { attr: ur }
+ }
+ }
+ {
+ name: ide_completion_menu
+ only_buffer_difference: false
+ marker: "| "
+ type: {
+ layout: ide
+ min_completion_width: 0,
+ max_completion_width: 50,
+ max_completion_height: 10,
+ padding: 0,
+ border: true,
+ cursor_offset: 0,
+ description_mode: "prefer_right"
+ min_description_width: 0
+ max_description_width: 50
+ max_description_height: 10
+ description_offset: 1
+ correct_cursor_pos: false
+ }
+ style: {
+ text: green
+ selected_text: { attr: r }
+ description_text: yellow
+ match_text: { attr: u }
+ selected_match_text: { attr: ur }
+ }
+ }
+ {
+ name: history_menu
+ only_buffer_difference: true
+ marker: "? "
+ type: {
+ layout: list
+ page_size: 10
+ }
+ style: {
+ text: green
+ selected_text: green_reverse
+ description_text: yellow
+ }
+ }
+ {
+ name: help_menu
+ only_buffer_difference: true
+ marker: "? "
+ type: {
+ layout: description
+ columns: 4
+ col_width: 20
+ col_padding: 2
+ selection_rows: 4
+ description_rows: 10
+ }
+ style: {
+ text: green
+ selected_text: green_reverse
+ description_text: yellow
+ }
+ }
+ ]
+
+ keybindings: [
+ {
+ name: completion_menu
+ modifier: none
+ keycode: tab
+ mode: [emacs vi_normal vi_insert]
+ event: {
+ until: [
+ { send: menu name: completion_menu }
+ { send: menunext }
+ { edit: complete }
+ ]
+ }
+ }
+ {
+ name: completion_previous_menu
+ modifier: shift
+ keycode: backtab
+ mode: [emacs, vi_normal, vi_insert]
+ event: { send: menuprevious }
+ }
+ {
+ name: ide_completion_menu
+ modifier: control
+ keycode: space
+ mode: [emacs vi_normal vi_insert]
+ event: {
+ until: [
+ { send: menu name: ide_completion_menu }
+ { send: menunext }
+ { edit: complete }
+ ]
+ }
+ }
+ {
+ name: history_menu
+ modifier: control
+ keycode: char_r
+ mode: [emacs, vi_insert, vi_normal]
+ event: { send: menu name: history_menu }
+ }
+ {
+ name: help_menu
+ modifier: none
+ keycode: f1
+ mode: [emacs, vi_insert, vi_normal]
+ event: { send: menu name: help_menu }
+ }
+ {
+ name: next_page_menu
+ modifier: control
+ keycode: char_x
+ mode: emacs
+ event: { send: menupagenext }
+ }
+ {
+ name: undo_or_previous_page_menu
+ modifier: control
+ keycode: char_z
+ mode: emacs
+ event: {
+ until: [
+ { send: menupageprevious }
+ { edit: undo }
+ ]
+ }
+ }
+ {
+ name: escape
+ modifier: none
+ keycode: escape
+ mode: [emacs, vi_normal, vi_insert]
+ event: { send: esc } # NOTE: does not appear to work
+ }
+ {
+ name: cancel_command
+ modifier: control
+ keycode: char_c
+ mode: [emacs, vi_normal, vi_insert]
+ event: { send: ctrlc }
+ }
+ {
+ name: quit_shell
+ modifier: control
+ keycode: char_d
+ mode: [emacs, vi_normal, vi_insert]
+ event: { send: ctrld }
+ }
+ {
+ name: clear_screen
+ modifier: control
+ keycode: char_l
+ mode: [emacs, vi_normal, vi_insert]
+ event: { send: clearscreen }
+ }
+ {
+ name: search_history
+ modifier: control
+ keycode: char_q
+ mode: [emacs, vi_normal, vi_insert]
+ event: { send: searchhistory }
+ }
+ {
+ name: open_command_editor
+ modifier: control
+ keycode: char_o
+ mode: [emacs, vi_normal, vi_insert]
+ event: { send: openeditor }
+ }
+ {
+ name: move_up
+ modifier: none
+ keycode: up
+ mode: [emacs, vi_normal, vi_insert]
+ event: {
+ until: [
+ { send: menuup }
+ { send: up }
+ ]
+ }
+ }
+ {
+ name: move_down
+ modifier: none
+ keycode: down
+ mode: [emacs, vi_normal, vi_insert]
+ event: {
+ until: [
+ { send: menudown }
+ { send: down }
+ ]
+ }
+ }
+ {
+ name: move_left
+ modifier: none
+ keycode: left
+ mode: [emacs, vi_normal, vi_insert]
+ event: {
+ until: [
+ { send: menuleft }
+ { send: left }
+ ]
+ }
+ }
+ {
+ name: move_right_or_take_history_hint
+ modifier: none
+ keycode: right
+ mode: [emacs, vi_normal, vi_insert]
+ event: {
+ until: [
+ { send: historyhintcomplete }
+ { send: menuright }
+ { send: right }
+ ]
+ }
+ }
+ {
+ name: move_one_word_left
+ modifier: control
+ keycode: left
+ mode: [emacs, vi_normal, vi_insert]
+ event: { edit: movewordleft }
+ }
+ {
+ name: move_one_word_right_or_take_history_hint
+ modifier: control
+ keycode: right
+ mode: [emacs, vi_normal, vi_insert]
+ event: {
+ until: [
+ { send: historyhintwordcomplete }
+ { edit: movewordright }
+ ]
+ }
+ }
+ {
+ name: move_to_line_start
+ modifier: none
+ keycode: home
+ mode: [emacs, vi_normal, vi_insert]
+ event: { edit: movetolinestart }
+ }
+ {
+ name: move_to_line_start
+ modifier: control
+ keycode: char_a
+ mode: [emacs, vi_normal, vi_insert]
+ event: { edit: movetolinestart }
+ }
+ {
+ name: move_to_line_end_or_take_history_hint
+ modifier: none
+ keycode: end
+ mode: [emacs, vi_normal, vi_insert]
+ event: {
+ until: [
+ { send: historyhintcomplete }
+ { edit: movetolineend }
+ ]
+ }
+ }
+ {
+ name: move_to_line_end_or_take_history_hint
+ modifier: control
+ keycode: char_e
+ mode: [emacs, vi_normal, vi_insert]
+ event: {
+ until: [
+ { send: historyhintcomplete }
+ { edit: movetolineend }
+ ]
+ }
+ }
+ {
+ name: move_to_line_start
+ modifier: control
+ keycode: home
+ mode: [emacs, vi_normal, vi_insert]
+ event: { edit: movetolinestart }
+ }
+ {
+ name: move_to_line_end
+ modifier: control
+ keycode: end
+ mode: [emacs, vi_normal, vi_insert]
+ event: { edit: movetolineend }
+ }
+ {
+ name: move_down
+ modifier: control
+ keycode: char_n
+ mode: [emacs, vi_normal, vi_insert]
+ event: {
+ until: [
+ { send: menudown }
+ { send: down }
+ ]
+ }
+ }
+ {
+ name: move_up
+ modifier: control
+ keycode: char_p
+ mode: [emacs, vi_normal, vi_insert]
+ event: {
+ until: [
+ { send: menuup }
+ { send: up }
+ ]
+ }
+ }
+ {
+ name: delete_one_character_backward
+ modifier: none
+ keycode: backspace
+ mode: [emacs, vi_insert]
+ event: { edit: backspace }
+ }
+ {
+ name: delete_one_word_backward
+ modifier: control
+ keycode: backspace
+ mode: [emacs, vi_insert]
+ event: { edit: backspaceword }
+ }
+ {
+ name: delete_one_character_forward
+ modifier: none
+ keycode: delete
+ mode: [emacs, vi_insert]
+ event: { edit: delete }
+ }
+ {
+ name: delete_one_character_forward
+ modifier: control
+ keycode: delete
+ mode: [emacs, vi_insert]
+ event: { edit: delete }
+ }
+ {
+ name: delete_one_character_backward
+ modifier: control
+ keycode: char_h
+ mode: [emacs, vi_insert]
+ event: { edit: backspace }
+ }
+ {
+ name: delete_one_word_backward
+ modifier: control
+ keycode: char_w
+ mode: [emacs, vi_insert]
+ event: { edit: backspaceword }
+ }
+ {
+ name: move_left
+ modifier: none
+ keycode: backspace
+ mode: vi_normal
+ event: { edit: moveleft }
+ }
+ {
+ name: newline_or_run_command
+ modifier: none
+ keycode: enter
+ mode: emacs
+ event: { send: enter }
+ }
+ {
+ name: move_left
+ modifier: control
+ keycode: char_b
+ mode: emacs
+ event: {
+ until: [
+ { send: menuleft }
+ { send: left }
+ ]
+ }
+ }
+ {
+ name: move_right_or_take_history_hint
+ modifier: control
+ keycode: char_f
+ mode: emacs
+ event: {
+ until: [
+ { send: historyhintcomplete }
+ { send: menuright }
+ { send: right }
+ ]
+ }
+ }
+ {
+ name: redo_change
+ modifier: control
+ keycode: char_g
+ mode: emacs
+ event: { edit: redo }
+ }
+ {
+ name: undo_change
+ modifier: control
+ keycode: char_z
+ mode: emacs
+ event: { edit: undo }
+ }
+ {
+ name: paste_before
+ modifier: control
+ keycode: char_y
+ mode: emacs
+ event: { edit: pastecutbufferbefore }
+ }
+ {
+ name: cut_word_left
+ modifier: control
+ keycode: char_w
+ mode: emacs
+ event: { edit: cutwordleft }
+ }
+ {
+ name: cut_line_to_end
+ modifier: control
+ keycode: char_k
+ mode: emacs
+ event: { edit: cuttolineend }
+ }
+ {
+ name: cut_line_from_start
+ modifier: control
+ keycode: char_u
+ mode: emacs
+ event: { edit: cutfromstart }
+ }
+ {
+ name: swap_graphemes
+ modifier: control
+ keycode: char_t
+ mode: emacs
+ event: { edit: swapgraphemes }
+ }
+ {
+ name: move_one_word_left
+ modifier: alt
+ keycode: left
+ mode: emacs
+ event: { edit: movewordleft }
+ }
+ {
+ name: move_one_word_right_or_take_history_hint
+ modifier: alt
+ keycode: right
+ mode: emacs
+ event: {
+ until: [
+ { send: historyhintwordcomplete }
+ { edit: movewordright }
+ ]
+ }
+ }
+ {
+ name: move_one_word_left
+ modifier: alt
+ keycode: char_b
+ mode: emacs
+ event: { edit: movewordleft }
+ }
+ {
+ name: move_one_word_right_or_take_history_hint
+ modifier: alt
+ keycode: char_f
+ mode: emacs
+ event: {
+ until: [
+ { send: historyhintwordcomplete }
+ { edit: movewordright }
+ ]
+ }
+ }
+ {
+ name: delete_one_word_forward
+ modifier: alt
+ keycode: delete
+ mode: emacs
+ event: { edit: deleteword }
+ }
+ {
+ name: delete_one_word_backward
+ modifier: alt
+ keycode: backspace
+ mode: emacs
+ event: { edit: backspaceword }
+ }
+ {
+ name: delete_one_word_backward
+ modifier: alt
+ keycode: char_m
+ mode: emacs
+ event: { edit: backspaceword }
+ }
+ {
+ name: cut_word_to_right
+ modifier: alt
+ keycode: char_d
+ mode: emacs
+ event: { edit: cutwordright }
+ }
+ {
+ name: upper_case_word
+ modifier: alt
+ keycode: char_u
+ mode: emacs
+ event: { edit: uppercaseword }
+ }
+ {
+ name: lower_case_word
+ modifier: alt
+ keycode: char_l
+ mode: emacs
+ event: { edit: lowercaseword }
+ }
+ {
+ name: capitalize_char
+ modifier: alt
+ keycode: char_c
+ mode: emacs
+ event: { edit: capitalizechar }
+ }
+ {
+ name: copy_selection
+ modifier: control_shift
+ keycode: char_c
+ mode: emacs
+ event: { edit: copyselection }
+ }
+ {
+ name: cut_selection
+ modifier: control_shift
+ keycode: char_x
+ mode: emacs
+ event: { edit: cutselection }
+ }
+ {
+ name: select_all
+ modifier: control_shift
+ keycode: char_a
+ mode: emacs
+ event: { edit: selectall }
+ }
+ ]
+}
+
+mkdir ($nu.data-dir | path join "vendor/autoload")
+atuin init nu | save -f ($nu.data-dir | path join "vendor/autoload/atuin.nu")
+starship init nu | save -f ($nu.data-dir | path join "vendor/autoload/starship.nu")
+zoxide init nushell | save -f ($nu.data-dir | path join "vendor/autoload/zoxide.nu")
diff --git a/dotfiles/.config/nushell/env.nu b/dotfiles/.config/nushell/env.nu
new file mode 100644
index 0000000..9006520
--- /dev/null
+++ b/dotfiles/.config/nushell/env.nu
@@ -0,0 +1,57 @@
+def create_left_prompt [] {
+ let dir = match (do --ignore-errors { $env.PWD | path relative-to $nu.home-path }) {
+ null => $env.PWD
+ '' => '~'
+ $relative_pwd => ([~ $relative_pwd] | path join)
+ }
+
+ let path_color = (if (is-admin) { ansi red_bold } else { ansi green_bold })
+ let separator_color = (if (is-admin) { ansi light_red_bold } else { ansi light_green_bold })
+ let path_segment = $"($path_color)($dir)(ansi reset)"
+
+ $path_segment | str replace --all (char path_sep) $"($separator_color)(char path_sep)($path_color)"
+}
+
+def create_right_prompt [] {
+ let time_segment = ([
+ (ansi reset)
+ (ansi magenta)
+ (date now | format date '%x %X')
+ ] | str join | str replace --regex --all "([/:])" $"(ansi green)${1}(ansi magenta)" |
+ str replace --regex --all "([AP]M)" $"(ansi magenta_underline)${1}")
+
+ let last_exit_code = if ($env.LAST_EXIT_CODE != 0) {([
+ (ansi rb)
+ ($env.LAST_EXIT_CODE)
+ ] | str join)
+ } else { "" }
+
+ ([$last_exit_code, (char space), $time_segment] | str join)
+}
+
+$env.PROMPT_COMMAND = {|| create_left_prompt }
+$env.PROMPT_COMMAND_RIGHT = {|| create_right_prompt }
+$env.PROMPT_INDICATOR = {|| "> " }
+$env.PROMPT_INDICATOR_VI_INSERT = {|| ": " }
+$env.PROMPT_INDICATOR_VI_NORMAL = {|| "> " }
+$env.PROMPT_MULTILINE_INDICATOR = {|| "::: " }
+
+$env.ENV_CONVERSIONS = {
+ "PATH": {
+ from_string: { |s| $s | split row (char esep) | path expand --no-symlink }
+ to_string: { |v| $v | path expand --no-symlink | str join (char esep) }
+ }
+ "Path": {
+ from_string: { |s| $s | split row (char esep) | path expand --no-symlink }
+ to_string: { |v| $v | path expand --no-symlink | str join (char esep) }
+ }
+}
+
+$env.NU_LIB_DIRS = [
+ ($nu.default-config-dir | path join 'scripts')
+ ($nu.data-dir | path join 'completions')
+]
+
+$env.NU_PLUGIN_DIRS = [
+ ($nu.default-config-dir | path join 'plugins')
+]
diff --git a/dotfiles/.config/obs-studio/basic/profiles/Untitled/basic.ini b/dotfiles/.config/obs-studio/basic/profiles/Untitled/basic.ini
new file mode 100644
index 0000000..63a657c
--- /dev/null
+++ b/dotfiles/.config/obs-studio/basic/profiles/Untitled/basic.ini
@@ -0,0 +1,113 @@
+[General]
+Name=Untitled
+
+[Output]
+Mode=Simple
+FilenameFormatting=%CCYY-%MM-%DD %hh-%mm-%ss
+DelayEnable=false
+DelaySec=20
+DelayPreserve=true
+Reconnect=true
+RetryDelay=2
+MaxRetries=25
+BindIP=default
+IPFamily=IPv4+IPv6
+NewSocketLoopEnable=false
+LowLatencyEnable=false
+
+[Stream1]
+IgnoreRecommended=false
+EnableMultitrackVideo=false
+MultitrackVideoMaximumAggregateBitrateAuto=true
+MultitrackVideoMaximumVideoTracksAuto=true
+
+[SimpleOutput]
+FilePath=/home/dich
+RecFormat2=mp4
+VBitrate=2500
+ABitrate=160
+UseAdvanced=false
+Preset=veryfast
+NVENCPreset2=p5
+RecQuality=Stream
+RecRB=false
+RecRBTime=20
+RecRBSize=512
+RecRBPrefix=Replay
+StreamAudioEncoder=aac
+RecAudioEncoder=aac
+RecTracks=1
+StreamEncoder=x264
+RecEncoder=x264
+
+[AdvOut]
+ApplyServiceSettings=true
+UseRescale=false
+TrackIndex=1
+VodTrackIndex=2
+Encoder=obs_x264
+RecType=Standard
+RecFilePath=/home/dich
+RecFormat2=mkv
+RecUseRescale=false
+RecTracks=1
+RecEncoder=none
+FLVTrack=1
+StreamMultiTrackAudioMixes=1
+FFOutputToFile=true
+FFFilePath=/home/dich
+FFVBitrate=2500
+FFVGOPSize=250
+FFUseRescale=false
+FFIgnoreCompat=false
+FFABitrate=160
+FFAudioMixes=1
+Track1Bitrate=160
+Track2Bitrate=160
+Track3Bitrate=160
+Track4Bitrate=160
+Track5Bitrate=160
+Track6Bitrate=160
+RecSplitFileTime=15
+RecSplitFileSize=2048
+RecRB=false
+RecRBTime=20
+RecRBSize=512
+AudioEncoder=libfdk_aac
+RecAudioEncoder=libfdk_aac
+RecSplitFileType=Time
+FFFormat=
+FFFormatMimeType=
+FFVEncoderId=0
+FFVEncoder=
+FFAEncoderId=0
+FFAEncoder=
+FFExtension=mp4
+
+[Video]
+BaseCX=1920
+BaseCY=1080
+OutputCX=1280
+OutputCY=720
+FPSType=0
+FPSCommon=30
+FPSInt=30
+FPSNum=30
+FPSDen=1
+ScaleType=bicubic
+ColorFormat=NV12
+ColorSpace=709
+ColorRange=Partial
+SdrWhiteLevel=300
+HdrNominalPeakLevel=1000
+
+[Audio]
+MonitoringDeviceId=alsa_output.pci-0000_05_00.6.analog-stereo
+MonitoringDeviceName=Family 17h/19h/1ah HD Audio Controller Analog Stereo
+SampleRate=48000
+ChannelSetup=Stereo
+MeterDecayRate=23.53
+PeakMeterType=0
+
+[Panels]
+CookieId=9FF9985CAAB5C18B
diff --git a/dotfiles/.config/obs-studio/basic/scenes/Untitled.json b/dotfiles/.config/obs-studio/basic/scenes/Untitled.json
new file mode 100644
index 0000000..1cb6079
--- /dev/null
+++ b/dotfiles/.config/obs-studio/basic/scenes/Untitled.json
@@ -0,0 +1,247 @@
+{
+ "DesktopAudioDevice1": {
+ "prev_ver": 520093699,
+ "name": "Desktop Audio",
+ "uuid": "02d5047a-68ce-43a6-a1c2-401dfb117480",
+ "id": "pulse_output_capture",
+ "versioned_id": "pulse_output_capture",
+ "settings": {
+ "device_id": "alsa_output.pci-0000_05_00.6.analog-stereo.monitor"
+ },
+ "mixers": 255,
+ "sync": 0,
+ "flags": 0,
+ "volume": 0.32882726192474365,
+ "balance": 0.5,
+ "enabled": true,
+ "muted": false,
+ "push-to-mute": false,
+ "push-to-mute-delay": 0,
+ "push-to-talk": false,
+ "push-to-talk-delay": 0,
+ "hotkeys": {
+ "libobs.mute": [],
+ "libobs.unmute": [],
+ "libobs.push-to-mute": [],
+ "libobs.push-to-talk": []
+ },
+ "deinterlace_mode": 0,
+ "deinterlace_field_order": 0,
+ "monitoring_type": 0,
+ "private_settings": {}
+ },
+ "AuxAudioDevice1": {
+ "prev_ver": 520093699,
+ "name": "Mic/Aux",
+ "uuid": "72203d14-38fc-419b-aac9-46a4c1385437",
+ "id": "pulse_input_capture",
+ "versioned_id": "pulse_input_capture",
+ "settings": {
+ "device_id": "alsa_input.pci-0000_05_00.6.analog-stereo"
+ },
+ "mixers": 255,
+ "sync": 0,
+ "flags": 0,
+ "volume": 0.31743475794792175,
+ "balance": 0.5,
+ "enabled": true,
+ "muted": false,
+ "push-to-mute": false,
+ "push-to-mute-delay": 0,
+ "push-to-talk": false,
+ "push-to-talk-delay": 0,
+ "hotkeys": {
+ "libobs.mute": [],
+ "libobs.unmute": [],
+ "libobs.push-to-mute": [],
+ "libobs.push-to-talk": []
+ },
+ "deinterlace_mode": 0,
+ "deinterlace_field_order": 0,
+ "monitoring_type": 0,
+ "private_settings": {},
+ "filters": [
+ {
+ "prev_ver": 520093699,
+ "name": "噪声抑制",
+ "uuid": "fd3d521b-86d5-48c6-b720-264c708ea2cb",
+ "id": "noise_suppress_filter",
+ "versioned_id": "noise_suppress_filter_v2",
+ "settings": {},
+ "mixers": 255,
+ "sync": 0,
+ "flags": 0,
+ "volume": 1.0,
+ "balance": 0.5,
+ "enabled": true,
+ "muted": false,
+ "push-to-mute": false,
+ "push-to-mute-delay": 0,
+ "push-to-talk": false,
+ "push-to-talk-delay": 0,
+ "hotkeys": {},
+ "deinterlace_mode": 0,
+ "deinterlace_field_order": 0,
+ "monitoring_type": 0,
+ "private_settings": {}
+ }
+ ]
+ },
+ "current_scene": "Scene",
+ "current_program_scene": "Scene",
+ "scene_order": [
+ {
+ "name": "Scene"
+ }
+ ],
+ "name": "Untitled",
+ "sources": [
+ {
+ "prev_ver": 520093699,
+ "name": "Scene",
+ "uuid": "aa201eee-721f-44aa-8e7a-6383fa5da63a",
+ "id": "scene",
+ "versioned_id": "scene",
+ "settings": {
+ "id_counter": 1,
+ "custom_size": false,
+ "items": [
+ {
+ "name": "Screen Capture (PipeWire)",
+ "source_uuid": "385bea17-7de2-41ea-9fbb-acc8c50c9fb3",
+ "visible": true,
+ "locked": false,
+ "rot": 0.0,
+ "scale_ref": {
+ "x": 1920.0,
+ "y": 1080.0
+ },
+ "align": 5,
+ "bounds_type": 0,
+ "bounds_align": 0,
+ "bounds_crop": false,
+ "crop_left": 0,
+ "crop_top": 0,
+ "crop_right": 0,
+ "crop_bottom": 0,
+ "id": 1,
+ "group_item_backup": false,
+ "pos": {
+ "x": 0.0,
+ "y": 0.0
+ },
+ "pos_rel": {
+ "x": -1.7777777910232544,
+ "y": -1.0
+ },
+ "scale": {
+ "x": 0.75,
+ "y": 0.75
+ },
+ "scale_rel": {
+ "x": 0.75,
+ "y": 0.75
+ },
+ "bounds": {
+ "x": 0.0,
+ "y": 0.0
+ },
+ "bounds_rel": {
+ "x": 0.0,
+ "y": 0.0
+ },
+ "scale_filter": "disable",
+ "blend_method": "default",
+ "blend_type": "normal",
+ "show_transition": {
+ "duration": 0
+ },
+ "hide_transition": {
+ "duration": 0
+ },
+ "private_settings": {}
+ }
+ ]
+ },
+ "mixers": 0,
+ "sync": 0,
+ "flags": 0,
+ "volume": 1.0,
+ "balance": 0.5,
+ "enabled": true,
+ "muted": false,
+ "push-to-mute": false,
+ "push-to-mute-delay": 0,
+ "push-to-talk": false,
+ "push-to-talk-delay": 0,
+ "hotkeys": {
+ "OBSBasic.SelectScene": [],
+ "libobs.show_scene_item.1": [],
+ "libobs.hide_scene_item.1": []
+ },
+ "deinterlace_mode": 0,
+ "deinterlace_field_order": 0,
+ "monitoring_type": 0,
+ "private_settings": {}
+ },
+ {
+ "prev_ver": 520093699,
+ "name": "Screen Capture (PipeWire)",
+ "uuid": "385bea17-7de2-41ea-9fbb-acc8c50c9fb3",
+ "id": "pipewire-screen-capture-source",
+ "versioned_id": "pipewire-screen-capture-source",
+ "settings": {
+ "RestoreToken": "5f9f4fdb-56d1-45a2-aedf-19564983774a"
+ },
+ "mixers": 0,
+ "sync": 0,
+ "flags": 0,
+ "volume": 1.0,
+ "balance": 0.5,
+ "enabled": true,
+ "muted": false,
+ "push-to-mute": false,
+ "push-to-mute-delay": 0,
+ "push-to-talk": false,
+ "push-to-talk-delay": 0,
+ "hotkeys": {},
+ "deinterlace_mode": 0,
+ "deinterlace_field_order": 0,
+ "monitoring_type": 0,
+ "private_settings": {}
+ }
+ ],
+ "groups": [],
+ "quick_transitions": [],
+ "transitions": [],
+ "saved_projectors": [],
+ "current_transition": "淡入淡出",
+ "transition_duration": 300,
+ "preview_locked": false,
+ "scaling_enabled": false,
+ "scaling_level": 0,
+ "scaling_off_x": 0.0,
+ "scaling_off_y": 0.0,
+ "virtual-camera": {
+ "type2": 3
+ },
+ "modules": {
+ "scripts-tool": [],
+ "output-timer": {
+ "streamTimerHours": 0,
+ "streamTimerMinutes": 0,
+ "streamTimerSeconds": 30,
+ "recordTimerHours": 0,
+ "recordTimerMinutes": 0,
+ "recordTimerSeconds": 30,
+ "autoStartStreamTimer": false,
+ "autoStartRecordTimer": false,
+ "pauseRecordTimer": true
+ }
+ },
+ "resolution": {
+ "x": 1920,
+ "y": 1080
+ },
+ "version": 2
+}
\ No newline at end of file
diff --git a/dotfiles/.config/obs-studio/basic/scenes/Untitled.json.bak b/dotfiles/.config/obs-studio/basic/scenes/Untitled.json.bak
new file mode 100644
index 0000000..1cb6079
--- /dev/null
+++ b/dotfiles/.config/obs-studio/basic/scenes/Untitled.json.bak
@@ -0,0 +1,247 @@
+{
+ "DesktopAudioDevice1": {
+ "prev_ver": 520093699,
+ "name": "Desktop Audio",
+ "uuid": "02d5047a-68ce-43a6-a1c2-401dfb117480",
+ "id": "pulse_output_capture",
+ "versioned_id": "pulse_output_capture",
+ "settings": {
+ "device_id": "alsa_output.pci-0000_05_00.6.analog-stereo.monitor"
+ },
+ "mixers": 255,
+ "sync": 0,
+ "flags": 0,
+ "volume": 0.32882726192474365,
+ "balance": 0.5,
+ "enabled": true,
+ "muted": false,
+ "push-to-mute": false,
+ "push-to-mute-delay": 0,
+ "push-to-talk": false,
+ "push-to-talk-delay": 0,
+ "hotkeys": {
+ "libobs.mute": [],
+ "libobs.unmute": [],
+ "libobs.push-to-mute": [],
+ "libobs.push-to-talk": []
+ },
+ "deinterlace_mode": 0,
+ "deinterlace_field_order": 0,
+ "monitoring_type": 0,
+ "private_settings": {}
+ },
+ "AuxAudioDevice1": {
+ "prev_ver": 520093699,
+ "name": "Mic/Aux",
+ "uuid": "72203d14-38fc-419b-aac9-46a4c1385437",
+ "id": "pulse_input_capture",
+ "versioned_id": "pulse_input_capture",
+ "settings": {
+ "device_id": "alsa_input.pci-0000_05_00.6.analog-stereo"
+ },
+ "mixers": 255,
+ "sync": 0,
+ "flags": 0,
+ "volume": 0.31743475794792175,
+ "balance": 0.5,
+ "enabled": true,
+ "muted": false,
+ "push-to-mute": false,
+ "push-to-mute-delay": 0,
+ "push-to-talk": false,
+ "push-to-talk-delay": 0,
+ "hotkeys": {
+ "libobs.mute": [],
+ "libobs.unmute": [],
+ "libobs.push-to-mute": [],
+ "libobs.push-to-talk": []
+ },
+ "deinterlace_mode": 0,
+ "deinterlace_field_order": 0,
+ "monitoring_type": 0,
+ "private_settings": {},
+ "filters": [
+ {
+ "prev_ver": 520093699,
+ "name": "噪声抑制",
+ "uuid": "fd3d521b-86d5-48c6-b720-264c708ea2cb",
+ "id": "noise_suppress_filter",
+ "versioned_id": "noise_suppress_filter_v2",
+ "settings": {},
+ "mixers": 255,
+ "sync": 0,
+ "flags": 0,
+ "volume": 1.0,
+ "balance": 0.5,
+ "enabled": true,
+ "muted": false,
+ "push-to-mute": false,
+ "push-to-mute-delay": 0,
+ "push-to-talk": false,
+ "push-to-talk-delay": 0,
+ "hotkeys": {},
+ "deinterlace_mode": 0,
+ "deinterlace_field_order": 0,
+ "monitoring_type": 0,
+ "private_settings": {}
+ }
+ ]
+ },
+ "current_scene": "Scene",
+ "current_program_scene": "Scene",
+ "scene_order": [
+ {
+ "name": "Scene"
+ }
+ ],
+ "name": "Untitled",
+ "sources": [
+ {
+ "prev_ver": 520093699,
+ "name": "Scene",
+ "uuid": "aa201eee-721f-44aa-8e7a-6383fa5da63a",
+ "id": "scene",
+ "versioned_id": "scene",
+ "settings": {
+ "id_counter": 1,
+ "custom_size": false,
+ "items": [
+ {
+ "name": "Screen Capture (PipeWire)",
+ "source_uuid": "385bea17-7de2-41ea-9fbb-acc8c50c9fb3",
+ "visible": true,
+ "locked": false,
+ "rot": 0.0,
+ "scale_ref": {
+ "x": 1920.0,
+ "y": 1080.0
+ },
+ "align": 5,
+ "bounds_type": 0,
+ "bounds_align": 0,
+ "bounds_crop": false,
+ "crop_left": 0,
+ "crop_top": 0,
+ "crop_right": 0,
+ "crop_bottom": 0,
+ "id": 1,
+ "group_item_backup": false,
+ "pos": {
+ "x": 0.0,
+ "y": 0.0
+ },
+ "pos_rel": {
+ "x": -1.7777777910232544,
+ "y": -1.0
+ },
+ "scale": {
+ "x": 0.75,
+ "y": 0.75
+ },
+ "scale_rel": {
+ "x": 0.75,
+ "y": 0.75
+ },
+ "bounds": {
+ "x": 0.0,
+ "y": 0.0
+ },
+ "bounds_rel": {
+ "x": 0.0,
+ "y": 0.0
+ },
+ "scale_filter": "disable",
+ "blend_method": "default",
+ "blend_type": "normal",
+ "show_transition": {
+ "duration": 0
+ },
+ "hide_transition": {
+ "duration": 0
+ },
+ "private_settings": {}
+ }
+ ]
+ },
+ "mixers": 0,
+ "sync": 0,
+ "flags": 0,
+ "volume": 1.0,
+ "balance": 0.5,
+ "enabled": true,
+ "muted": false,
+ "push-to-mute": false,
+ "push-to-mute-delay": 0,
+ "push-to-talk": false,
+ "push-to-talk-delay": 0,
+ "hotkeys": {
+ "OBSBasic.SelectScene": [],
+ "libobs.show_scene_item.1": [],
+ "libobs.hide_scene_item.1": []
+ },
+ "deinterlace_mode": 0,
+ "deinterlace_field_order": 0,
+ "monitoring_type": 0,
+ "private_settings": {}
+ },
+ {
+ "prev_ver": 520093699,
+ "name": "Screen Capture (PipeWire)",
+ "uuid": "385bea17-7de2-41ea-9fbb-acc8c50c9fb3",
+ "id": "pipewire-screen-capture-source",
+ "versioned_id": "pipewire-screen-capture-source",
+ "settings": {
+ "RestoreToken": "5f9f4fdb-56d1-45a2-aedf-19564983774a"
+ },
+ "mixers": 0,
+ "sync": 0,
+ "flags": 0,
+ "volume": 1.0,
+ "balance": 0.5,
+ "enabled": true,
+ "muted": false,
+ "push-to-mute": false,
+ "push-to-mute-delay": 0,
+ "push-to-talk": false,
+ "push-to-talk-delay": 0,
+ "hotkeys": {},
+ "deinterlace_mode": 0,
+ "deinterlace_field_order": 0,
+ "monitoring_type": 0,
+ "private_settings": {}
+ }
+ ],
+ "groups": [],
+ "quick_transitions": [],
+ "transitions": [],
+ "saved_projectors": [],
+ "current_transition": "淡入淡出",
+ "transition_duration": 300,
+ "preview_locked": false,
+ "scaling_enabled": false,
+ "scaling_level": 0,
+ "scaling_off_x": 0.0,
+ "scaling_off_y": 0.0,
+ "virtual-camera": {
+ "type2": 3
+ },
+ "modules": {
+ "scripts-tool": [],
+ "output-timer": {
+ "streamTimerHours": 0,
+ "streamTimerMinutes": 0,
+ "streamTimerSeconds": 30,
+ "recordTimerHours": 0,
+ "recordTimerMinutes": 0,
+ "recordTimerSeconds": 30,
+ "autoStartStreamTimer": false,
+ "autoStartRecordTimer": false,
+ "pauseRecordTimer": true
+ }
+ },
+ "resolution": {
+ "x": 1920,
+ "y": 1080
+ },
+ "version": 2
+}
\ No newline at end of file
diff --git a/dotfiles/.config/obs-studio/global.ini b/dotfiles/.config/obs-studio/global.ini
new file mode 100644
index 0000000..9102158
--- /dev/null
+++ b/dotfiles/.config/obs-studio/global.ini
@@ -0,0 +1,19 @@
+[General]
+Pre31Migrated=true
+MaxLogs=10
+InfoIncrement=-1
+ProcessPriority=Normal
+EnableAutoUpdates=true
+LastVersion=520093699
+
+[Video]
+Renderer=OpenGL
+
+[Locations]
+Configuration=/home/dich/.config
+SceneCollections=/home/dich/.config
+Profiles=/home/dich/.config
+
+[PropertiesWindow]
+cx=720
+cy=580
diff --git a/dotfiles/.config/obs-studio/plugin_config/rtmp-services/amazon_ivs_ingests.json b/dotfiles/.config/obs-studio/plugin_config/rtmp-services/amazon_ivs_ingests.json
new file mode 100644
index 0000000..2cb31e4
--- /dev/null
+++ b/dotfiles/.config/obs-studio/plugin_config/rtmp-services/amazon_ivs_ingests.json
@@ -0,0 +1,625 @@
+{
+ "ingests": [
+ {
+ "_id": 0,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: Japan, Narita (10)",
+ "url_template": "rtmp://apn10.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://apn10.contribute.live-video.net/app/{stream_key}",
+ "priority": 0
+ },
+ {
+ "_id": 1,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: Japan, Tokyo (3)",
+ "url_template": "rtmp://tyo03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://tyo03.contribute.live-video.net/app/{stream_key}",
+ "priority": 1
+ },
+ {
+ "_id": 2,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: Japan, Tokyo (5)",
+ "url_template": "rtmp://tyo05.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://tyo05.contribute.live-video.net/app/{stream_key}",
+ "priority": 2
+ },
+ {
+ "_id": 3,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: Japan, Osaka (1)",
+ "url_template": "rtmp://osa01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://osa01.contribute.live-video.net/app/{stream_key}",
+ "priority": 3
+ },
+ {
+ "_id": 4,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: South Korea, Seoul (3)",
+ "url_template": "rtmp://sel03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://sel03.contribute.live-video.net/app/{stream_key}",
+ "priority": 4
+ },
+ {
+ "_id": 5,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: South Korea, Seoul (4)",
+ "url_template": "rtmp://sel04.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://sel04.contribute.live-video.net/app/{stream_key}",
+ "priority": 5
+ },
+ {
+ "_id": 6,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: Taiwan, Taipei (3)",
+ "url_template": "rtmp://tpe03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://tpe03.contribute.live-video.net/app/{stream_key}",
+ "priority": 6
+ },
+ {
+ "_id": 7,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: Taiwan, Taipei (1)",
+ "url_template": "rtmp://tpe01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://tpe01.contribute.live-video.net/app/{stream_key}",
+ "priority": 7
+ },
+ {
+ "_id": 8,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: China, Hong Kong (6)",
+ "url_template": "rtmp://hkg06.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://hkg06.contribute.live-video.net/app/{stream_key}",
+ "priority": 8
+ },
+ {
+ "_id": 9,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: Manila, Philippines (1)",
+ "url_template": "rtmp://mnl01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://mnl01.contribute.live-video.net/app/{stream_key}",
+ "priority": 9
+ },
+ {
+ "_id": 10,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: Thailand, Bangkok (2)",
+ "url_template": "rtmp://bkk02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://bkk02.contribute.live-video.net/app/{stream_key}",
+ "priority": 10
+ },
+ {
+ "_id": 11,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: Singapore (1)",
+ "url_template": "rtmp://sin01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://sin01.contribute.live-video.net/app/{stream_key}",
+ "priority": 11
+ },
+ {
+ "_id": 12,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: Indonesia, Jakarta (2)",
+ "url_template": "rtmp://jkt02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://jkt02.contribute.live-video.net/app/{stream_key}",
+ "priority": 12
+ },
+ {
+ "_id": 13,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: India, Hyderabad (1)",
+ "url_template": "rtmp://hyd01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://hyd01.contribute.live-video.net/app/{stream_key}",
+ "priority": 13
+ },
+ {
+ "_id": 14,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: India, Chennai (1)",
+ "url_template": "rtmp://maa01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://maa01.contribute.live-video.net/app/{stream_key}",
+ "priority": 14
+ },
+ {
+ "_id": 15,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: India, New Delhi (1)",
+ "url_template": "rtmp://del01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://del01.contribute.live-video.net/app/{stream_key}",
+ "priority": 15
+ },
+ {
+ "_id": 16,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: India, Bangalore (1)",
+ "url_template": "rtmp://blr01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://blr01.contribute.live-video.net/app/{stream_key}",
+ "priority": 16
+ },
+ {
+ "_id": 17,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: India, Mumbai",
+ "url_template": "rtmp://bom01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://bom01.contribute.live-video.net/app/{stream_key}",
+ "priority": 17
+ },
+ {
+ "_id": 18,
+ "availability": 1.0,
+ "default": false,
+ "name": "US West: Seattle, WA (2)",
+ "url_template": "rtmp://sea02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://sea02.contribute.live-video.net/app/{stream_key}",
+ "priority": 18
+ },
+ {
+ "_id": 19,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Finland, Helsinki (3)",
+ "url_template": "rtmp://hel03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://hel03.contribute.live-video.net/app/{stream_key}",
+ "priority": 19
+ },
+ {
+ "_id": 20,
+ "availability": 1.0,
+ "default": false,
+ "name": "Oceania: Australia, Sydney (2)",
+ "url_template": "rtmp://syd02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://syd02.contribute.live-video.net/app/{stream_key}",
+ "priority": 20
+ },
+ {
+ "_id": 21,
+ "availability": 1.0,
+ "default": false,
+ "name": "Oceania: Australia, Sydney (3)",
+ "url_template": "rtmp://syd03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://syd03.contribute.live-video.net/app/{stream_key}",
+ "priority": 21
+ },
+ {
+ "_id": 22,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Sweden, Stockholm (3)",
+ "url_template": "rtmp://arn03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://arn03.contribute.live-video.net/app/{stream_key}",
+ "priority": 22
+ },
+ {
+ "_id": 23,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Sweden, Stockholm (4)",
+ "url_template": "rtmp://arn04.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://arn04.contribute.live-video.net/app/{stream_key}",
+ "priority": 23
+ },
+ {
+ "_id": 24,
+ "availability": 1.0,
+ "default": false,
+ "name": "US West: San Jose, California (6)",
+ "url_template": "rtmp://sjc06.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://sjc06.contribute.live-video.net/app/{stream_key}",
+ "priority": 24
+ },
+ {
+ "_id": 25,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Norway, Oslo",
+ "url_template": "rtmp://osl.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://osl.contribute.live-video.net/app/{stream_key}",
+ "priority": 25
+ },
+ {
+ "_id": 26,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Poland, Warsaw (2)",
+ "url_template": "rtmp://waw02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://waw02.contribute.live-video.net/app/{stream_key}",
+ "priority": 26
+ },
+ {
+ "_id": 27,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Denmark, Copenhagen",
+ "url_template": "rtmp://cph.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://cph.contribute.live-video.net/app/{stream_key}",
+ "priority": 27
+ },
+ {
+ "_id": 28,
+ "availability": 1.0,
+ "default": false,
+ "name": "US West: Los Angeles, CA",
+ "url_template": "rtmp://lax.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://lax.contribute.live-video.net/app/{stream_key}",
+ "priority": 28
+ },
+ {
+ "_id": 29,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Czech Republic, Prague",
+ "url_template": "rtmp://prg03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://prg03.contribute.live-video.net/app/{stream_key}",
+ "priority": 29
+ },
+ {
+ "_id": 30,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Austria, Vienna (2)",
+ "url_template": "rtmp://vie02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://vie02.contribute.live-video.net/app/{stream_key}",
+ "priority": 30
+ },
+ {
+ "_id": 31,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Netherlands, Amsterdam (3)",
+ "url_template": "rtmp://ams03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://ams03.contribute.live-video.net/app/{stream_key}",
+ "priority": 31
+ },
+ {
+ "_id": 32,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Netherlands, Amsterdam (2)",
+ "url_template": "rtmp://ams02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://ams02.contribute.live-video.net/app/{stream_key}",
+ "priority": 32
+ },
+ {
+ "_id": 33,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Germany, Dusseldorf (1)",
+ "url_template": "rtmp://dus01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://dus01.contribute.live-video.net/app/{stream_key}",
+ "priority": 33
+ },
+ {
+ "_id": 34,
+ "availability": 1.0,
+ "default": false,
+ "name": "US Central: Denver, CO (52)",
+ "url_template": "rtmp://den52.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://den52.contribute.live-video.net/app/{stream_key}",
+ "priority": 34
+ },
+ {
+ "_id": 35,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Germany, Munich (1)",
+ "url_template": "rtmp://muc01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://muc01.contribute.live-video.net/app/{stream_key}",
+ "priority": 35
+ },
+ {
+ "_id": 36,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: UK, London (8)",
+ "url_template": "rtmp://lhr08.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://lhr08.contribute.live-video.net/app/{stream_key}",
+ "priority": 36
+ },
+ {
+ "_id": 37,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: UK, London (3)",
+ "url_template": "rtmp://lhr03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://lhr03.contribute.live-video.net/app/{stream_key}",
+ "priority": 37
+ },
+ {
+ "_id": 38,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: France, Paris (2)",
+ "url_template": "rtmp://cdg02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://cdg02.contribute.live-video.net/app/{stream_key}",
+ "priority": 38
+ },
+ {
+ "_id": 39,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: France, Paris (10)",
+ "url_template": "rtmp://cdg10.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://cdg10.contribute.live-video.net/app/{stream_key}",
+ "priority": 39
+ },
+ {
+ "_id": 40,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Italy, Milan (2)",
+ "url_template": "rtmp://mil02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://mil02.contribute.live-video.net/app/{stream_key}",
+ "priority": 40
+ },
+ {
+ "_id": 41,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Germany, Frankfurt (5)",
+ "url_template": "rtmp://fra05.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://fra05.contribute.live-video.net/app/{stream_key}",
+ "priority": 41
+ },
+ {
+ "_id": 42,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Germany, Frankfurt (2)",
+ "url_template": "rtmp://fra02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://fra02.contribute.live-video.net/app/{stream_key}",
+ "priority": 42
+ },
+ {
+ "_id": 43,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: France, Marseille (2)",
+ "url_template": "rtmp://mrs02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://mrs02.contribute.live-video.net/app/{stream_key}",
+ "priority": 43
+ },
+ {
+ "_id": 44,
+ "availability": 1.0,
+ "default": false,
+ "name": "US East: Chicago, IL (3)",
+ "url_template": "rtmp://ord03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://ord03.contribute.live-video.net/app/{stream_key}",
+ "priority": 44
+ },
+ {
+ "_id": 45,
+ "availability": 1.0,
+ "default": false,
+ "name": "US East: Chicago, IL (56)",
+ "url_template": "rtmp://ord56.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://ord56.contribute.live-video.net/app/{stream_key}",
+ "priority": 45
+ },
+ {
+ "_id": 46,
+ "availability": 1.0,
+ "default": false,
+ "name": "NA: Canada, Toronto",
+ "url_template": "rtmp://yto.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://yto.contribute.live-video.net/app/{stream_key}",
+ "priority": 46
+ },
+ {
+ "_id": 47,
+ "availability": 1.0,
+ "default": false,
+ "name": "NA: Canada, Quebec",
+ "url_template": "rtmp://ymq03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://ymq03.contribute.live-video.net/app/{stream_key}",
+ "priority": 47
+ },
+ {
+ "_id": 48,
+ "availability": 1.0,
+ "default": false,
+ "name": "US Central: Garland, TX (56)",
+ "url_template": "rtmp://dfw56.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://dfw56.contribute.live-video.net/app/{stream_key}",
+ "priority": 48
+ },
+ {
+ "_id": 49,
+ "availability": 1.0,
+ "default": false,
+ "name": "US Central: Dallas, TX (2)",
+ "url_template": "rtmp://dfw02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://dfw02.contribute.live-video.net/app/{stream_key}",
+ "priority": 49
+ },
+ {
+ "_id": 50,
+ "availability": 1.0,
+ "default": false,
+ "name": "US Central: Houston, TX (50)",
+ "url_template": "rtmp://iah50.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://iah50.contribute.live-video.net/app/{stream_key}",
+ "priority": 50
+ },
+ {
+ "_id": 51,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Spain, Madrid (2)",
+ "url_template": "rtmp://mad02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://mad02.contribute.live-video.net/app/{stream_key}",
+ "priority": 51
+ },
+ {
+ "_id": 52,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Spain, Madrid (1)",
+ "url_template": "rtmp://mad01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://mad01.contribute.live-video.net/app/{stream_key}",
+ "priority": 52
+ },
+ {
+ "_id": 53,
+ "availability": 1.0,
+ "default": false,
+ "name": "US East: McAllen, TX (1)",
+ "url_template": "rtmp://mfe01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://mfe01.contribute.live-video.net/app/{stream_key}",
+ "priority": 53
+ },
+ {
+ "_id": 54,
+ "availability": 1.0,
+ "default": false,
+ "name": "US East: New York, NY (50)",
+ "url_template": "rtmp://jfk50.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://jfk50.contribute.live-video.net/app/{stream_key}",
+ "priority": 54
+ },
+ {
+ "_id": 55,
+ "availability": 1.0,
+ "default": false,
+ "name": "US East: New York, NY",
+ "url_template": "rtmp://jfk.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://jfk.contribute.live-video.net/app/{stream_key}",
+ "priority": 55
+ },
+ {
+ "_id": 56,
+ "availability": 1.0,
+ "default": false,
+ "name": "US East: Ashburn, VA (5)",
+ "url_template": "rtmp://iad05.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://iad05.contribute.live-video.net/app/{stream_key}",
+ "priority": 56
+ },
+ {
+ "_id": 57,
+ "availability": 1.0,
+ "default": false,
+ "name": "US East: Atlanta, GA",
+ "url_template": "rtmp://atl.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://atl.contribute.live-video.net/app/{stream_key}",
+ "priority": 57
+ },
+ {
+ "_id": 58,
+ "availability": 1.0,
+ "default": false,
+ "name": "NA: Mexico, Queretaro (4)",
+ "url_template": "rtmp://qro04.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://qro04.contribute.live-video.net/app/{stream_key}",
+ "priority": 58
+ },
+ {
+ "_id": 59,
+ "availability": 1.0,
+ "default": false,
+ "name": "NA: Mexico, Queretaro (3)",
+ "url_template": "rtmp://qro03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://qro03.contribute.live-video.net/app/{stream_key}",
+ "priority": 59
+ },
+ {
+ "_id": 60,
+ "availability": 1.0,
+ "default": false,
+ "name": "US East: Miami, FL (5)",
+ "url_template": "rtmp://mia05.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://mia05.contribute.live-video.net/app/{stream_key}",
+ "priority": 60
+ },
+ {
+ "_id": 61,
+ "availability": 1.0,
+ "default": false,
+ "name": "South America: Colombia, Bogota (1)",
+ "url_template": "rtmp://bog01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://bog01.contribute.live-video.net/app/{stream_key}",
+ "priority": 61
+ },
+ {
+ "_id": 62,
+ "availability": 1.0,
+ "default": false,
+ "name": "South America: Brazil, Fortaleza (1)",
+ "url_template": "rtmp://for01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://for01.contribute.live-video.net/app/{stream_key}",
+ "priority": 62
+ },
+ {
+ "_id": 63,
+ "availability": 1.0,
+ "default": false,
+ "name": "South America : chile, Santiago (1)",
+ "url_template": "rtmp://scl01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://scl01.contribute.live-video.net/app/{stream_key}",
+ "priority": 63
+ },
+ {
+ "_id": 64,
+ "availability": 1.0,
+ "default": false,
+ "name": "South America: Buenos Aires, Argentina (1)",
+ "url_template": "rtmp://bue01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://bue01.contribute.live-video.net/app/{stream_key}",
+ "priority": 64
+ },
+ {
+ "_id": 65,
+ "availability": 1.0,
+ "default": false,
+ "name": "South America: Brazil, Sao Paulo (5)",
+ "url_template": "rtmp://sao05.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://sao05.contribute.live-video.net/app/{stream_key}",
+ "priority": 65
+ },
+ {
+ "_id": 66,
+ "availability": 1.0,
+ "default": false,
+ "name": "South America: Brazil, Sao Paulo",
+ "url_template": "rtmp://sao03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://sao03.contribute.live-video.net/app/{stream_key}",
+ "priority": 66
+ },
+ {
+ "_id": 67,
+ "availability": 1.0,
+ "default": false,
+ "name": "South America: Brazil, Rio de Janeiro (4)",
+ "url_template": "rtmp://rio04.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://rio04.contribute.live-video.net/app/{stream_key}",
+ "priority": 67
+ },
+ {
+ "_id": 68,
+ "availability": 1.0,
+ "default": false,
+ "name": "South America: Brazil, Rio de Janeiro (3)",
+ "url_template": "rtmp://rio03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://rio03.contribute.live-video.net/app/{stream_key}",
+ "priority": 68
+ }
+ ]
+}
diff --git a/dotfiles/.config/obs-studio/plugin_config/rtmp-services/package.json b/dotfiles/.config/obs-studio/plugin_config/rtmp-services/package.json
new file mode 100644
index 0000000..7a60fe0
--- /dev/null
+++ b/dotfiles/.config/obs-studio/plugin_config/rtmp-services/package.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "schema/package-schema.json",
+ "url": "https://obsproject.com/obs2_update/rtmp-services/v5",
+ "version": 268,
+ "files": [
+ {
+ "name": "services.json",
+ "version": 268
+ }
+ ]
+}
diff --git a/dotfiles/.config/obs-studio/plugin_config/rtmp-services/services.json b/dotfiles/.config/obs-studio/plugin_config/rtmp-services/services.json
new file mode 100644
index 0000000..3ddd184
--- /dev/null
+++ b/dotfiles/.config/obs-studio/plugin_config/rtmp-services/services.json
@@ -0,0 +1,3586 @@
+{
+ "$schema": "schema/service-schema-v5.json",
+ "format_version": 5,
+ "services": [
+ {
+ "name": "Twitch",
+ "common": true,
+ "stream_key_link": "https://dashboard.twitch.tv/settings/stream",
+ "multitrack_video_configuration_url": "https://ingest.twitch.tv/api/v3/GetClientConfiguration",
+ "multitrack_video_name": "Enhanced Broadcasting",
+ "multitrack_video_learn_more_link": "https://help.twitch.tv/s/article/multiple-encodes",
+ "servers": [
+ {
+ "name": "Asia: Hong Kong",
+ "url": "rtmp://live-hkg.twitch.tv/app"
+ },
+ {
+ "name": "Asia: Seoul, South Korea",
+ "url": "rtmp://live-sel.twitch.tv/app"
+ },
+ {
+ "name": "Asia: Singapore",
+ "url": "rtmp://live-sin.twitch.tv/app"
+ },
+ {
+ "name": "Asia: Taipei, Taiwan",
+ "url": "rtmp://live-tpe.twitch.tv/app"
+ },
+ {
+ "name": "Asia: Tokyo, Japan",
+ "url": "rtmp://live-tyo.twitch.tv/app"
+ },
+ {
+ "name": "Australia: Sydney",
+ "url": "rtmp://live-syd.twitch.tv/app"
+ },
+ {
+ "name": "EU: Amsterdam, NL",
+ "url": "rtmp://live-ams.twitch.tv/app"
+ },
+ {
+ "name": "EU: Berlin, DE",
+ "url": "rtmp://live-ber.twitch.tv/app"
+ },
+ {
+ "name": "Europe: Copenhagen, DK",
+ "url": "rtmp://live-cph.twitch.tv/app"
+ },
+ {
+ "name": "EU: Frankfurt, DE",
+ "url": "rtmp://live-fra.twitch.tv/app"
+ },
+ {
+ "name": "EU: Helsinki, FI",
+ "url": "rtmp://live-hel.twitch.tv/app"
+ },
+ {
+ "name": "EU: Lisbon, Portugal",
+ "url": "rtmp://live-lis.twitch.tv/app"
+ },
+ {
+ "name": "EU: London, UK",
+ "url": "rtmp://live-lhr.twitch.tv/app"
+ },
+ {
+ "name": "EU: Madrid, Spain",
+ "url": "rtmp://live-mad.twitch.tv/app"
+ },
+ {
+ "name": "EU: Marseille, FR",
+ "url": "rtmp://live-mrs.twitch.tv/app"
+ },
+ {
+ "name": "EU: Milan, Italy",
+ "url": "rtmp://live-mil.twitch.tv/app"
+ },
+ {
+ "name": "EU: Norway, Oslo",
+ "url": "rtmp://live-osl.twitch.tv/app"
+ },
+ {
+ "name": "EU: Paris, FR",
+ "url": "rtmp://live-cdg.twitch.tv/app"
+ },
+ {
+ "name": "EU: Prague, CZ",
+ "url": "rtmp://live-prg.twitch.tv/app"
+ },
+ {
+ "name": "EU: Stockholm, SE",
+ "url": "rtmp://live-arn.twitch.tv/app"
+ },
+ {
+ "name": "EU: Vienna, Austria",
+ "url": "rtmp://live-vie.twitch.tv/app"
+ },
+ {
+ "name": "EU: Warsaw, Poland",
+ "url": "rtmp://live-waw.twitch.tv/app"
+ },
+ {
+ "name": "NA: Mexico City",
+ "url": "rtmp://live-qro.twitch.tv/app"
+ },
+ {
+ "name": "NA: Quebec, Canada",
+ "url": "rtmp://live-ymq.twitch.tv/app"
+ },
+ {
+ "name": "NA: Toronto, Canada",
+ "url": "rtmp://live-yto.twitch.tv/app"
+ },
+ {
+ "name": "South America: Argentina",
+ "url": "rtmp://live-eze.twitch.tv/app"
+ },
+ {
+ "name": "South America: Chile",
+ "url": "rtmp://live-scl.twitch.tv/app"
+ },
+ {
+ "name": "South America: Lima, Peru",
+ "url": "rtmp://live-lim.twitch.tv/app"
+ },
+ {
+ "name": "South America: Medellin, Colombia",
+ "url": "rtmp://live-mde.twitch.tv/app"
+ },
+ {
+ "name": "South America: Rio de Janeiro, Brazil",
+ "url": "rtmp://live-rio.twitch.tv/app"
+ },
+ {
+ "name": "South America: Sao Paulo, Brazil",
+ "url": "rtmp://live-sao.twitch.tv/app"
+ },
+ {
+ "name": "US Central: Dallas, TX",
+ "url": "rtmp://live-dfw.twitch.tv/app"
+ },
+ {
+ "name": "US Central: Denver, CO",
+ "url": "rtmp://live-den.twitch.tv/app"
+ },
+ {
+ "name": "US Central: Houston, TX",
+ "url": "rtmp://live-hou.twitch.tv/app"
+ },
+ {
+ "name": "US Central: Salt Lake City, UT",
+ "url": "rtmp://live-slc.twitch.tv/app"
+ },
+ {
+ "name": "US East: Ashburn, VA",
+ "url": "rtmp://live-iad.twitch.tv/app"
+ },
+ {
+ "name": "US East: Atlanta, GA",
+ "url": "rtmp://live-atl.twitch.tv/app"
+ },
+ {
+ "name": "US East: Chicago",
+ "url": "rtmp://live-ord.twitch.tv/app"
+ },
+ {
+ "name": "US East: Miami, FL",
+ "url": "rtmp://live-mia.twitch.tv/app"
+ },
+ {
+ "name": "US East: New York, NY",
+ "url": "rtmp://live-jfk.twitch.tv/app"
+ },
+ {
+ "name": "US West: Los Angeles, CA",
+ "url": "rtmp://live-lax.twitch.tv/app"
+ },
+ {
+ "name": "US West: Phoenix, AZ",
+ "url": "rtmp://live-phx.twitch.tv/app"
+ },
+ {
+ "name": "US West: Portland, Oregon",
+ "url": "rtmp://live-pdx.twitch.tv/app"
+ },
+ {
+ "name": "US West: San Francisco, CA",
+ "url": "rtmp://live-sfo.twitch.tv/app"
+ },
+ {
+ "name": "US West: San Jose, CA",
+ "url": "rtmp://live-sjc.twitch.tv/app"
+ },
+ {
+ "name": "US West: Seattle, WA",
+ "url": "rtmp://live-sea.twitch.tv/app"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 6000,
+ "max audio bitrate": 320,
+ "x264opts": "scenecut=0"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "YouTube - HLS",
+ "common": false,
+ "more_info_link": "https://developers.google.com/youtube/v3/live/guides/ingestion-protocol-comparison",
+ "stream_key_link": "https://www.youtube.com/live_dashboard",
+ "protocol": "HLS",
+ "supported video codecs": [
+ "h264",
+ "hevc"
+ ],
+ "servers": [
+ {
+ "name": "Primary YouTube ingest server",
+ "url": "https://a.upload.youtube.com/http_upload_hls?cid={stream_key}©=0&file=out.m3u8"
+ },
+ {
+ "name": "Backup YouTube ingest server",
+ "url": "https://b.upload.youtube.com/http_upload_hls?cid={stream_key}©=1&file=out.m3u8"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "output": "ffmpeg_hls_muxer",
+ "max video bitrate": 51000,
+ "max audio bitrate": 160
+ }
+ },
+ {
+ "name": "YouTube - RTMPS",
+ "common": true,
+ "stream_key_link": "https://www.youtube.com/live_dashboard",
+ "alt_names": [
+ "YouTube / YouTube Gaming",
+ "YouTube - RTMP",
+ "YouTube - RTMPS (Beta)"
+ ],
+ "supported video codecs": [
+ "h264",
+ "hevc",
+ "av1"
+ ],
+ "servers": [
+ {
+ "name": "Primary YouTube ingest server",
+ "url": "rtmps://a.rtmps.youtube.com:443/live2"
+ },
+ {
+ "name": "Backup YouTube ingest server",
+ "url": "rtmps://b.rtmps.youtube.com:443/live2?backup=1"
+ },
+ {
+ "name": "Primary YouTube ingest server (legacy RTMP)",
+ "url": "rtmp://a.rtmp.youtube.com/live2"
+ },
+ {
+ "name": "Backup YouTube ingest server (legacy RTMP)",
+ "url": "rtmp://b.rtmp.youtube.com/live2?backup=1"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 51000,
+ "max audio bitrate": 160
+ }
+ },
+ {
+ "name": "Loola.tv",
+ "common": false,
+ "servers": [
+ {
+ "name": "US East: Virginia",
+ "url": "rtmp://rtmp.loola.tv/push"
+ },
+ {
+ "name": "EU Central: Germany",
+ "url": "rtmp://rtmp-eu.loola.tv/push"
+ },
+ {
+ "name": "South America: Brazil",
+ "url": "rtmp://rtmp-sa.loola.tv/push"
+ },
+ {
+ "name": "Asia/Pacific: Singapore",
+ "url": "rtmp://rtmp-sg.loola.tv/push"
+ },
+ {
+ "name": "Middle East: Bahrain",
+ "url": "rtmp://rtmp-me.loola.tv/push"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "profile": "high",
+ "max video bitrate": 2500,
+ "max audio bitrate": 160,
+ "bframes": 2,
+ "x264opts": "scenecut=0"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Lovecast",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://live-a.lovecastapp.com:5222/app"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "profile": "main",
+ "max video bitrate": 8000,
+ "max audio bitrate": 192,
+ "supported resolutions": [
+ "1920x1080",
+ "1280x720"
+ ],
+ "max fps": 30
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Luzento.com - RTMP",
+ "stream_key_link": "https://cms.luzento.com/dashboard/stream-key?from=OBS",
+ "servers": [
+ {
+ "name": "Primary",
+ "url": "rtmp://ingest.luzento.com/live"
+ },
+ {
+ "name": "Primary (Test)",
+ "url": "rtmp://ingest.luzento.com/test"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 6000,
+ "max audio bitrate": 256,
+ "bframes": 2,
+ "x264opts": "scenecut=0"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Web.TV",
+ "servers": [
+ {
+ "name": "Primary",
+ "url": "rtmp://live3.origins.web.tv/liveext"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "profile": "main",
+ "max video bitrate": 3500,
+ "max audio bitrate": 160
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "GoodGame.ru",
+ "servers": [
+ {
+ "name": "Моscow",
+ "url": "rtmp://msk.goodgame.ru:1940/live"
+ }
+ ],
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Vaughn Live / iNSTAGIB",
+ "servers": [
+ {
+ "name": "US: Vint Hill, VA",
+ "url": "rtmp://live-iad.vaughnsoft.net/live"
+ },
+ {
+ "name": "US: Vint Hill, VA #2",
+ "url": "rtmp://live-iad2.vaughnsoft.net/live"
+ },
+ {
+ "name": "US: Dallas, TX",
+ "url": "rtmp://live-dfw.vaughnsoft.net/live"
+ },
+ {
+ "name": "US: Denver, CO",
+ "url": "rtmp://live-den.vaughnsoft.net/live"
+ },
+ {
+ "name": "US: New York, NY",
+ "url": "rtmp://live-nyc.vaughnsoft.net/live"
+ },
+ {
+ "name": "US: Miami, FL",
+ "url": "rtmp://live-mia.vaughnsoft.net/live"
+ },
+ {
+ "name": "US: Seattle, WA",
+ "url": "rtmp://live-sea.vaughnsoft.net/live"
+ },
+ {
+ "name": "CA: Toronto",
+ "url": "rtmp://live-tor.vaughnsoft.net/live"
+ },
+ {
+ "name": "EU: Amsterdam, NL",
+ "url": "rtmp://live-ams.vaughnsoft.net/live"
+ },
+ {
+ "name": "EU: London, UK",
+ "url": "rtmp://live-lhr.vaughnsoft.net/live"
+ },
+ {
+ "name": "EU: Paris, FR",
+ "url": "rtmp://live-lhr.vaughnsoft.net/live"
+ },
+ {
+ "name": "Tokyo, JP",
+ "url": "rtmp://live-lhr.vaughnsoft.net/live"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 15000,
+ "max audio bitrate": 320
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Breakers.TV",
+ "servers": [
+ {
+ "name": "US: Vint Hill, VA",
+ "url": "rtmp://live-iad.vaughnsoft.net/live"
+ },
+ {
+ "name": "US: Vint Hill, VA #2",
+ "url": "rtmp://live-iad2.vaughnsoft.net/live"
+ },
+ {
+ "name": "US: Dallas, TX",
+ "url": "rtmp://live-dfw.vaughnsoft.net/live"
+ },
+ {
+ "name": "US: Denver, CO",
+ "url": "rtmp://live-den.vaughnsoft.net/live"
+ },
+ {
+ "name": "US: New York, NY",
+ "url": "rtmp://live-nyc.vaughnsoft.net/live"
+ },
+ {
+ "name": "US: Miami, FL",
+ "url": "rtmp://live-mia.vaughnsoft.net/live"
+ },
+ {
+ "name": "US: Seattle, WA",
+ "url": "rtmp://live-sea.vaughnsoft.net/live"
+ },
+ {
+ "name": "CA: Toronto",
+ "url": "rtmp://live-tor.vaughnsoft.net/live"
+ },
+ {
+ "name": "EU: Amsterdam, NL",
+ "url": "rtmp://live-ams.vaughnsoft.net/live"
+ },
+ {
+ "name": "EU: London, UK",
+ "url": "rtmp://live-lhr.vaughnsoft.net/live"
+ },
+ {
+ "name": "EU: Paris, FR",
+ "url": "rtmp://live-lhr.vaughnsoft.net/live"
+ },
+ {
+ "name": "Tokyo, JP",
+ "url": "rtmp://live-lhr.vaughnsoft.net/live"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 15000,
+ "max audio bitrate": 320
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Facebook Live",
+ "common": true,
+ "stream_key_link": "https://www.facebook.com/live/producer?ref=OBS",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmps://rtmp-api.facebook.com:443/rtmp/"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "profile": "main",
+ "supported resolutions": [
+ "1920x1080",
+ "1280x720",
+ "852x480",
+ "640x360"
+ ],
+ "bitrate matrix": [
+ {
+ "res": "640x360",
+ "fps": 30,
+ "max bitrate": 1000
+ },
+ {
+ "res": "640x360",
+ "fps": 60,
+ "max bitrate": 1500
+ },
+ {
+ "res": "852x480",
+ "fps": 30,
+ "max bitrate": 2000
+ },
+ {
+ "res": "852x480",
+ "fps": 60,
+ "max bitrate": 3000
+ },
+ {
+ "res": "1280x720",
+ "fps": 30,
+ "max bitrate": 4000
+ },
+ {
+ "res": "1280x720",
+ "fps": 60,
+ "max bitrate": 6000
+ },
+ {
+ "res": "1920x1080",
+ "fps": 30,
+ "max bitrate": 6000
+ },
+ {
+ "res": "1920x1080",
+ "fps": 60,
+ "max bitrate": 9000
+ }
+ ],
+ "max fps": 60,
+ "max video bitrate": 9000,
+ "max audio bitrate": 128
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Restream.io",
+ "alt_names": [
+ "Restream.io - RTMP",
+ "Restream.io - FTL"
+ ],
+ "common": true,
+ "stream_key_link": "https://restream.io/settings/streaming-setup?from=OBS",
+ "servers": [
+ {
+ "name": "Autodetect",
+ "url": "rtmp://live.restream.io/live"
+ },
+ {
+ "name": "EU-West (London, GB)",
+ "url": "rtmp://london.restream.io/live"
+ },
+ {
+ "name": "EU-West (Amsterdam, NL)",
+ "url": "rtmp://amsterdam.restream.io/live"
+ },
+ {
+ "name": "EU-West (Paris, FR)",
+ "url": "rtmp://paris.restream.io/live"
+ },
+ {
+ "name": "EU-Central (Frankfurt, DE)",
+ "url": "rtmp://frankfurt.restream.io/live"
+ },
+ {
+ "name": "EU-South (Madrid, Spain)",
+ "url": "rtmp://madrid.restream.io/live"
+ },
+ {
+ "name": "Turkey (Istanbul)",
+ "url": "rtmp://istanbul.restream.io/live"
+ },
+ {
+ "name": "US-West (Seattle, WA)",
+ "url": "rtmp://seattle.restream.io/live"
+ },
+ {
+ "name": "US-West (San Jose, CA)",
+ "url": "rtmp://sanjose.restream.io/live"
+ },
+ {
+ "name": "US-Central (Dallas, TX)",
+ "url": "rtmp://dallas.restream.io/live"
+ },
+ {
+ "name": "US-East (Chicago, IL)",
+ "url": "rtmp://chicago.restream.io/live"
+ },
+ {
+ "name": "US-East (New York, NY)",
+ "url": "rtmp://newyork.restream.io/live"
+ },
+ {
+ "name": "US-East (Washington, DC)",
+ "url": "rtmp://washington.restream.io/live"
+ },
+ {
+ "name": "NA-East (Toronto, Canada)",
+ "url": "rtmp://toronto.restream.io/live"
+ },
+ {
+ "name": "SA (Saint Paul, Brazil)",
+ "url": "rtmp://saopaulo.restream.io/live"
+ },
+ {
+ "name": "India (Bangalore)",
+ "url": "rtmp://bangalore.restream.io/live"
+ },
+ {
+ "name": "Asia (Hong Kong)",
+ "url": "rtmp://hongkong.restream.io/live"
+ },
+ {
+ "name": "Asia (Singapore)",
+ "url": "rtmp://singapore.restream.io/live"
+ },
+ {
+ "name": "Asia (Seoul, South Korea)",
+ "url": "rtmp://seoul.restream.io/live"
+ },
+ {
+ "name": "Asia (Tokyo, Japan)",
+ "url": "rtmp://tokyo.restream.io/live"
+ },
+ {
+ "name": "Australia (Sydney)",
+ "url": "rtmp://sydney.restream.io/live"
+ }
+ ],
+ "recommended": {
+ "keyint": 2
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Castr.io",
+ "servers": [
+ {
+ "name": "US-East (Chicago, IL)",
+ "url": "rtmp://cg.castr.io/static"
+ },
+ {
+ "name": "US-East (New York, NY)",
+ "url": "rtmp://ny.castr.io/static"
+ },
+ {
+ "name": "US-East (Miami, FL)",
+ "url": "rtmp://mi.castr.io/static"
+ },
+ {
+ "name": "US-West (Seattle, WA)",
+ "url": "rtmp://se.castr.io/static"
+ },
+ {
+ "name": "US-West (Los Angeles, CA)",
+ "url": "rtmp://la.castr.io/static"
+ },
+ {
+ "name": "US-Central (Dallas, TX)",
+ "url": "rtmp://da.castr.io/static"
+ },
+ {
+ "name": "NA-East (Toronto, CA)",
+ "url": "rtmp://qc.castr.io/static"
+ },
+ {
+ "name": "Mexico",
+ "url": "rtmp://mexico.castr.io/static"
+ },
+ {
+ "name": "Sao Paulo, BR",
+ "url": "rtmp://br.castr.io/static"
+ },
+ {
+ "name": "Colombia",
+ "url": "rtmp://bogota.castr.io/static"
+ },
+ {
+ "name": "Santiago, Chile",
+ "url": "rtmp://santiago.castr.io/static"
+ },
+ {
+ "name": "Istanbul, TR",
+ "url": "rtmp://istanbul.castr.io/static"
+ },
+ {
+ "name": "Tel Aviv, IL",
+ "url": "rtmp://telaviv.castr.io/static"
+ },
+ {
+ "name": "EU-West (London, UK)",
+ "url": "rtmp://uk.castr.io/static"
+ },
+ {
+ "name": "EU-West (Paris, FR)",
+ "url": "rtmp://paris.castr.io/static"
+ },
+ {
+ "name": "EU-West (Madrid, ES)",
+ "url": "rtmp://madrid.castr.io/static"
+ },
+ {
+ "name": "EU-Central (Frankfurt, DE)",
+ "url": "rtmp://fr.castr.io/static"
+ },
+ {
+ "name": "EU-Central (Milan, IT)",
+ "url": "rtmp://milan.castr.io/static"
+ },
+ {
+ "name": "EU-North (Stockholm, SE)",
+ "url": "rtmp://stockholm.castr.io/static"
+ },
+ {
+ "name": "EU-North (Copenhagen, DK)",
+ "url": "rtmp://copenhagen.castr.io/static"
+ },
+ {
+ "name": "Russia (Moscow)",
+ "url": "rtmp://ru.castr.io/static"
+ },
+ {
+ "name": "Asia (Singapore)",
+ "url": "rtmp://sg.castr.io/static"
+ },
+ {
+ "name": "Asia (Hong Kong, HK)",
+ "url": "rtmp://hongkong.castr.io/static"
+ },
+ {
+ "name": "Asia (India)",
+ "url": "rtmp://in.castr.io/static"
+ },
+ {
+ "name": "Australia (Sydney)",
+ "url": "rtmp://au.castr.io/static"
+ },
+ {
+ "name": "UAE (Dubai)",
+ "url": "rtmp://dubai.castr.io/static"
+ },
+ {
+ "name": "Africa (Johannesburg, ZA)",
+ "url": "rtmp://southafrica.castr.io/static"
+ },
+ {
+ "name": "Africa (Lagos, NG)",
+ "url": "rtmp://lagos.castr.io/static"
+ },
+ {
+ "name": "US Central",
+ "url": "rtmp://us-central.castr.io/static"
+ },
+ {
+ "name": "US West",
+ "url": "rtmp://us-west.castr.io/static"
+ },
+ {
+ "name": "US East",
+ "url": "rtmp://us-east.castr.io/static"
+ },
+ {
+ "name": "US South",
+ "url": "rtmp://us-south.castr.io/static"
+ },
+ {
+ "name": "South America",
+ "url": "rtmp://south-am.castr.io/static"
+ },
+ {
+ "name": "EU Central",
+ "url": "rtmp://eu-central.castr.io/static"
+ },
+ {
+ "name": "Singapore",
+ "url": "rtmp://sg-central.castr.io/static"
+ }
+ ],
+ "recommended": {
+ "keyint": 2
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Boomstream",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://live.boomstream.com/live"
+ }
+ ],
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Meridix Live Sports Platform",
+ "servers": [
+ {
+ "name": "Primary",
+ "url": "rtmp://publish.meridix.com/live"
+ }
+ ],
+ "recommended": {
+ "max video bitrate": 3500
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "AfreecaTV",
+ "alt_names": [
+ "아프리카TV",
+ "Afreeca.TV"
+ ],
+ "servers": [
+ {
+ "name": "Asia : Korea",
+ "url": "rtmp://rtmpmanager-freecat.afreeca.tv/app"
+ },
+ {
+ "name": "North America : US East",
+ "url": "rtmp://rtmp-esu.afreecatv.com/app"
+ },
+ {
+ "name": "North America : US West",
+ "url": "rtmp://rtmp-wsu.afreecatv.com/app"
+ },
+ {
+ "name": "South America : Brazil",
+ "url": "rtmp://rtmp-brz.afreecatv.com/app"
+ },
+ {
+ "name": "Europe : UK",
+ "url": "rtmp://rtmp-uk.afreecatv.com/app"
+ },
+ {
+ "name": "Asia : Singapore",
+ "url": "rtmp://rtmp-sgp.afreecatv.com/app"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "profile": "main",
+ "max video bitrate": 8000,
+ "max audio bitrate": 192
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "CAM4",
+ "servers": [
+ {
+ "name": "CAM4",
+ "url": "rtmp://origin.cam4.com/cam4-origin-live"
+ }
+ ],
+ "recommended": {
+ "keyint": 1,
+ "profile": "baseline",
+ "max video bitrate": 3000,
+ "max audio bitrate": 128
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "ePlay",
+ "servers": [
+ {
+ "name": "ePlay Primary",
+ "url": "rtmp://live.eplay.link/origin"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "profile": "main",
+ "max video bitrate": 7500,
+ "max audio bitrate": 192
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Picarto",
+ "servers": [
+ {
+ "name": "Autoselect closest server",
+ "url": "rtmp://live.us.picarto.tv/golive"
+ },
+ {
+ "name": "Los Angeles, USA",
+ "url": "rtmp://live.us-losangeles.picarto.tv/golive"
+ },
+ {
+ "name": "Dallas, USA",
+ "url": "rtmp://live.us-dallas.picarto.tv/golive"
+ },
+ {
+ "name": "Miami, USA",
+ "url": "rtmp://live.us-miami.picarto.tv/golive"
+ },
+ {
+ "name": "New York, USA",
+ "url": "rtmp://live.us-newyork.picarto.tv/golive"
+ },
+ {
+ "name": "Europe",
+ "url": "rtmp://live.eu-west1.picarto.tv/golive"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "profile": "main",
+ "max video bitrate": 3500
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Livestream",
+ "servers": [
+ {
+ "name": "Primary",
+ "url": "rtmp://rtmpin.livestreamingest.com/rtmpin"
+ }
+ ],
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Uscreen",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://global-live.uscreen.app:5222/app"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 8000,
+ "max audio bitrate": 192
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Stripchat",
+ "servers": [
+ {
+ "name": "Auto",
+ "url": "rtmp://live.doppiocdn.com/ext"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "profile": "main",
+ "bframes": 0,
+ "max video bitrate": 6000,
+ "max audio bitrate": 128,
+ "x264opts": "tune=zerolatency"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "CamSoda",
+ "servers": [
+ {
+ "name": "North America",
+ "url": "rtmp://obs-ingest-na.livemediahost.com/cam_obs"
+ },
+ {
+ "name": "South America",
+ "url": "rtmp://obs-ingest-sa.livemediahost.com/cam_obs"
+ },
+ {
+ "name": "Asia",
+ "url": "rtmp://obs-ingest-as.livemediahost.com/cam_obs"
+ },
+ {
+ "name": "Europe",
+ "url": "rtmp://obs-ingest-eu.livemediahost.com/cam_obs"
+ },
+ {
+ "name": "Oceania",
+ "url": "rtmp://obs-ingest-oc.livemediahost.com/cam_obs"
+ }
+ ],
+ "recommended": {
+ "supported resolutions": [
+ "1920x1080",
+ "1280x720",
+ "852x480",
+ "480x360"
+ ],
+ "max fps": 30,
+ "max video bitrate": 6000,
+ "max audio bitrate": 160,
+ "x264opts": "tune=zerolatency"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Chaturbate",
+ "stream_key_link": "https://chaturbate.com/b/?useExternalSoftware=true",
+ "more_info_link": "https://support.chaturbate.com/hc/en-us/articles/360037971952-How-do-I-set-up-OBS",
+ "servers": [
+ {
+ "name": "Global Main Fastest - Recommended",
+ "url": "rtmp://global.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "Global Backup",
+ "url": "rtmp://global-backup.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "Asia: Mumbai, India",
+ "url": "rtmp://bom.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "Asia: Singapore",
+ "url": "rtmp://sin.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "Asia: Taiwan",
+ "url": "rtmp://tsa.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "Asia: Tokyo, Japan",
+ "url": "rtmp://nrt.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "Australasia: Sydney, Australia",
+ "url": "rtmp://syd.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "EU East: Sofia, Bulgaria",
+ "url": "rtmp://sof.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "EU East: Warsaw, Poland",
+ "url": "rtmp://waw.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "EU North: Helsinki, Finland",
+ "url": "rtmp://hel.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "EU West: Amsterdam, Netherlands",
+ "url": "rtmp://ams.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "EU West: Frankfurt, Germany",
+ "url": "rtmp://fra.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "EU West: Madrid, Spain",
+ "url": "rtmp://mad.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "EU West: Milan, Italy",
+ "url": "rtmp://mxp.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "EU West: Rotterdam, Netherlands",
+ "url": "rtmp://rtm.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "South America: Bogota, Colombia",
+ "url": "rtmp://bog.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "South America: Sao Paulo, Brazil",
+ "url": "rtmp://gru.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "US Central: Austin, TX",
+ "url": "rtmp://aus.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "US Central: Chicago, IL",
+ "url": "rtmp://chi.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "US East: Ashburn, VA",
+ "url": "rtmp://ash.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "US East: Atlanta, GA",
+ "url": "rtmp://atl.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "US East: Miami, FL",
+ "url": "rtmp://mia.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "US West: Los Angeles, CA",
+ "url": "rtmp://lax.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "US West: Phoenix, AZ",
+ "url": "rtmp://phx.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "US West: Salt Lake City, UT",
+ "url": "rtmp://slc.live.mmcdn.com/live-origin"
+ },
+ {
+ "name": "US West: Seattle, WA",
+ "url": "rtmp://sea.live.mmcdn.com/live-origin"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 50000,
+ "max audio bitrate": 192,
+ "supported resolutions": [
+ "3840x2160",
+ "2560x1440",
+ "1920x1080",
+ "1280x720",
+ "960x540",
+ "852x480",
+ "640x360"
+ ],
+ "max fps": 60
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "WpStream",
+ "more_info_link": "https://wpstream.net/obs-more-info",
+ "stream_key_link": "https://wpstream.net/obs-get-stream-key",
+ "servers": [
+ {
+ "name": "Closest server - Automatic",
+ "url": "rtmp://ingest.wpstream.net/golive"
+ },
+ {
+ "name": "North America",
+ "url": "rtmp://ingest-na.wpstream.net/golive"
+ },
+ {
+ "name": "Europe",
+ "url": "rtmp://ingest-eu.wpstream.net/golive"
+ },
+ {
+ "name": "Asia",
+ "url": "rtmp://ingest-as.wpstream.net/golive"
+ },
+ {
+ "name": "South America",
+ "url": "rtmp://ingest-sa.wpstream.net/golive"
+ },
+ {
+ "name": "Australia & Oceania",
+ "url": "rtmp://ingest-au.wpstream.net/golive"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max audio bitrate": 160
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Twitter",
+ "common": true,
+ "stream_key_link": "https://studio.twitter.com/producer/sources",
+ "alt_names": [
+ "Twitter / Periscope"
+ ],
+ "servers": [
+ {
+ "name": "US West: California",
+ "url": "rtmp://ca.pscp.tv:80/x"
+ },
+ {
+ "name": "US West: Oregon",
+ "url": "rtmp://or.pscp.tv:80/x"
+ },
+ {
+ "name": "US East: Virginia",
+ "url": "rtmp://va.pscp.tv:80/x"
+ },
+ {
+ "name": "South America: Brazil",
+ "url": "rtmp://br.pscp.tv:80/x"
+ },
+ {
+ "name": "EU West: France",
+ "url": "rtmp://fr.pscp.tv:80/x"
+ },
+ {
+ "name": "EU West: Ireland",
+ "url": "rtmp://ie.pscp.tv:80/x"
+ },
+ {
+ "name": "EU Central: Germany",
+ "url": "rtmp://de.pscp.tv:80/x"
+ },
+ {
+ "name": "Asia/Pacific: Australia",
+ "url": "rtmp://au.pscp.tv:80/x"
+ },
+ {
+ "name": "Asia/Pacific: India",
+ "url": "rtmp://in.pscp.tv:80/x"
+ },
+ {
+ "name": "Asia/Pacific: Japan",
+ "url": "rtmp://jp.pscp.tv:80/x"
+ },
+ {
+ "name": "Asia/Pacific: Korea",
+ "url": "rtmp://kr.pscp.tv:80/x"
+ },
+ {
+ "name": "Asia/Pacific: Singapore",
+ "url": "rtmp://sg.pscp.tv:80/x"
+ }
+ ],
+ "recommended": {
+ "keyint": 3,
+ "max video bitrate": 12000,
+ "max audio bitrate": 128,
+ "max fps": 60
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Switchboard Live",
+ "alt_names": [
+ "Switchboard Live (Joicaster)"
+ ],
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmps://live.sb.zone:443/live"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "profile": "high"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Eventials",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://transmission.eventials.com/eventialsLiveOrigin"
+ }
+ ],
+ "recommended": {
+ "keyint": 1,
+ "profile": "baseline",
+ "max video bitrate": 900,
+ "max audio bitrate": 96
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "EventLive.pro",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://go.eventlive.pro/live"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 3000,
+ "max audio bitrate": 192,
+ "supported resolutions": [
+ "1920x1080",
+ "1280x720"
+ ],
+ "max fps": 30
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Lahzenegar - StreamG | لحظهنگار - استریمجی",
+ "servers": [
+ {
+ "name": "Primary",
+ "url": "rtmp://rtmp.lahzecdn.com/pro"
+ },
+ {
+ "name": "Iran",
+ "url": "rtmp://rtmp-iran.lahzecdn.com/pro"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "profile": "main",
+ "max video bitrate": 4000,
+ "max audio bitrate": 192
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "MyLive",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://stream.mylive.in.th/live"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "profile": "main",
+ "max video bitrate": 7000,
+ "max audio bitrate": 192
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Trovo",
+ "alt_names": [
+ "Madcat"
+ ],
+ "stream_key_link": "https://studio.trovo.live/mychannel/stream",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://livepush.trovo.live/live/"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 9000,
+ "max audio bitrate": 160,
+ "x264opts": "scenecut=0"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Mixcloud",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://rtmp.mixcloud.com/broadcast"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 6000,
+ "max audio bitrate": 320,
+ "supported resolutions": [
+ "1280x720",
+ "852x480",
+ "480x360"
+ ],
+ "max fps": 30,
+ "x264opts": "scenecut=0"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "SermonAudio Cloud",
+ "alt_names": [
+ "SermonAudio.com"
+ ],
+ "servers": [
+ {
+ "name": "Primary",
+ "url": "rtmp://webcast.sermonaudio.com/sa"
+ }
+ ],
+ "recommended": {
+ "max video bitrate": 2000,
+ "max audio bitrate": 128
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Vimeo",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://rtmp.cloud.vimeo.com/live"
+ }
+ ],
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Aparat",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://rtmp.cdn.asset.aparat.com:443/event"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 6000,
+ "max audio bitrate": 320,
+ "x264opts": "scenecut=0"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "KakaoTV",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://rtmp.play.kakao.com/kakaotv"
+ }
+ ],
+ "recommended": {
+ "max video bitrate": 8000,
+ "max audio bitrate": 192
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Piczel.tv",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://piczel.tv:1935/live"
+ }
+ ],
+ "recommended": {
+ "keyint": 4,
+ "max video bitrate": 2500,
+ "max audio bitrate": 256,
+ "x264opts": "tune=zerolatency"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "STAGE TEN",
+ "servers": [
+ {
+ "name": "STAGE TEN",
+ "url": "rtmps://app-rtmp.stageten.tv:443/stageten"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "profile": "baseline",
+ "max video bitrate": 4000,
+ "max audio bitrate": 128
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "DLive",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://stream.dlive.tv/live"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 6000,
+ "max audio bitrate": 160
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Lightcast.com",
+ "servers": [
+ {
+ "name": "North America 1",
+ "url": "rtmp://ingest-na1.live.lightcast.com/in"
+ },
+ {
+ "name": "North America 2",
+ "url": "rtmp://ingest-na2.live.lightcast.com/in"
+ },
+ {
+ "name": "Europe",
+ "url": "rtmp://ingest-eu1.live.lightcast.com/in"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 6000,
+ "max audio bitrate": 320,
+ "x264opts": "scenecut=0"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Bongacams",
+ "servers": [
+ {
+ "name": "Automatic / Default",
+ "url": "rtmp://auto.origin.gnsbc.com:1934/live"
+ },
+ {
+ "name": "Automatic / Backup",
+ "url": "rtmp://origin.bcvidorigin.com:1934/live"
+ },
+ {
+ "name": "Europe",
+ "url": "rtmp://z-eu.origin.gnsbc.com:1934/live"
+ },
+ {
+ "name": "North America",
+ "url": "rtmp://z-us.origin.gnsbc.com:1934/live"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 6000,
+ "max audio bitrate": 192,
+ "bframes": 0,
+ "x264opts": "tune=zerolatency"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "OnlyFans.com",
+ "stream_key_link": "https://onlyfans.com/my/settings/other",
+ "servers": [
+ {
+ "name": "CloudBeta",
+ "url": "rtmp://cloudbetastreaming.onlyfans.com/live"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "profile": "main",
+ "max video bitrate": 2500,
+ "max audio bitrate": 192,
+ "bframes": 0,
+ "x264opts": "tune=zerolatency"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Steam",
+ "common": false,
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://ingest-rtmp.broadcast.steamcontent.com/app"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "profile": "high",
+ "max video bitrate": 7000,
+ "max audio bitrate": 128
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Konduit.live",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://rtmp.konduit.live/live"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "x264opts": "scenecut=0"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "LOCO",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://ivory-ingest.getloconow.com:1935/stream"
+ }
+ ],
+ "recommended": {
+ "keyint": 2
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "niconico, premium member (ニコニコ生放送 プレミアム会員)",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://aliveorigin.dmc.nico/named_input"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "profile": "high",
+ "max audio bitrate": 192,
+ "max video bitrate": 5808,
+ "x264opts": "tune=zerolatency"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "niconico, free member (ニコニコ生放送 一般会員)",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://aliveorigin.dmc.nico/named_input"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "profile": "high",
+ "max audio bitrate": 96,
+ "max video bitrate": 904,
+ "x264opts": "tune=zerolatency"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Nimo TV",
+ "servers": [
+ {
+ "name": "Global:2",
+ "url": "rtmp://txpush.rtmp.nimo.tv/live/"
+ },
+ {
+ "name": "Global:3",
+ "url": "rtmp://alpush.rtmp.nimo.tv/live/"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 6000,
+ "max audio bitrate": 160
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "XLoveCam.com",
+ "servers": [
+ {
+ "name": "Europe(main)",
+ "url": "rtmp://nl.eu.stream.xlove.com/performer-origin"
+ },
+ {
+ "name": "Europe(Romania)",
+ "url": "rtmp://ro.eu.stream.xlove.com/performer-origin"
+ },
+ {
+ "name": "Europe(Russia)",
+ "url": "rtmp://ru.eu.stream.xlove.com/performer-origin"
+ },
+ {
+ "name": "North America(US East)",
+ "url": "rtmp://usec.na.stream.xlove.com/performer-origin"
+ },
+ {
+ "name": "North America(US West)",
+ "url": "rtmp://uswc.na.stream.xlove.com/performer-origin"
+ },
+ {
+ "name": "North America(Canada)",
+ "url": "rtmp://ca.na.stream.xlove.com/performer-origin"
+ },
+ {
+ "name": "South America",
+ "url": "rtmp://co.sa.stream.xlove.com/performer-origin"
+ },
+ {
+ "name": "Asia",
+ "url": "rtmp://sg.as.stream.xlove.com/performer-origin"
+ }
+ ],
+ "recommended": {
+ "x264opts": "scenecut=0"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "AngelThump",
+ "servers": [
+ {
+ "name": "Auto",
+ "url": "rtmp://ingest.angelthump.com/live"
+ },
+ {
+ "name": "New York 3",
+ "url": "rtmp://nyc-ingest.angelthump.com:1935/live"
+ },
+ {
+ "name": "San Francisco 2",
+ "url": "rtmp://sfo-ingest.angelthump.com:1935/live"
+ },
+ {
+ "name": "Singapore 1",
+ "url": "rtmp://sgp-ingest.angelthump.com:1935/live"
+ },
+ {
+ "name": "London 1",
+ "url": "rtmp://lon-ingest.angelthump.com:1935/live"
+ },
+ {
+ "name": "Frankfurt 1",
+ "url": "rtmp://fra-ingest.angelthump.com:1935/live"
+ },
+ {
+ "name": "Toronto 1",
+ "url": "rtmp://tor-ingest.angelthump.com:1935/live"
+ },
+ {
+ "name": "Amsterdam 3",
+ "url": "rtmp://ams-ingest.angelthump.com:1935/live"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "profile": "high",
+ "max video bitrate": 3500,
+ "max audio bitrate": 160
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "api.video",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://broadcast.api.video/s"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 20000,
+ "max audio bitrate": 192
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "SHOWROOM",
+ "protocol": "RTMP",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "https://www.showroom-live.com/api/obs/streaming_info?obs_key="
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "profile": "main",
+ "max video bitrate": 1500,
+ "max audio bitrate": 160,
+ "x264opts": "tune=zerolatency"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Mux",
+ "servers": [
+ {
+ "name": "Global (RTMPS)",
+ "url": "rtmps://global-live.mux.com:443/app"
+ },
+ {
+ "name": "Global (RTMP)",
+ "url": "rtmp://global-live.mux.com:5222/app"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 5000,
+ "max audio bitrate": 160
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Viloud",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://live.viloud.tv:5222/app"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 5000,
+ "max audio bitrate": 160
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "MyFreeCams",
+ "servers": [
+ {
+ "name": "Automatic",
+ "url": "rtmp://publish.myfreecams.com/NxServer"
+ },
+ {
+ "name": "Australia",
+ "url": "rtmp://publish-syd.myfreecams.com/NxServer"
+ },
+ {
+ "name": "East Asia",
+ "url": "rtmp://publish-tyo.myfreecams.com/NxServer"
+ },
+ {
+ "name": "Europe (East)",
+ "url": "rtmp://publish-buh.myfreecams.com/NxServer"
+ },
+ {
+ "name": "Europe (West)",
+ "url": "rtmp://publish-ams.myfreecams.com/NxServer"
+ },
+ {
+ "name": "North America (East Coast)",
+ "url": "rtmp://publish-ord.myfreecams.com/NxServer"
+ },
+ {
+ "name": "North America (West Coast)",
+ "url": "rtmp://publish-tuk.myfreecams.com/NxServer"
+ },
+ {
+ "name": "South America",
+ "url": "rtmp://publish-sao.myfreecams.com/NxServer"
+ }
+ ],
+ "recommended": {
+ "keyint": 1,
+ "profile": "high",
+ "max fps": 60,
+ "max video bitrate": 10000,
+ "max audio bitrate": 192,
+ "x264opts": "tune=zerolatency scenecut=0"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "PolyStreamer.com",
+ "servers": [
+ {
+ "name": "Auto-select closest server",
+ "url": "rtmp://live.polystreamer.com/live"
+ },
+ {
+ "name": "United States - West",
+ "url": "rtmp://us-west.live.polystreamer.com/live"
+ },
+ {
+ "name": "United States - East",
+ "url": "rtmp://us-east.live.polystreamer.com/live"
+ },
+ {
+ "name": "Australia",
+ "url": "rtmp://aus.live.polystreamer.com/live"
+ },
+ {
+ "name": "India",
+ "url": "rtmp://ind.live.polystreamer.com/live"
+ },
+ {
+ "name": "Germany",
+ "url": "rtmp://deu.live.polystreamer.com/live"
+ },
+ {
+ "name": "Japan",
+ "url": "rtmp://jpn.live.polystreamer.com/live"
+ },
+ {
+ "name": "Singapore",
+ "url": "rtmp://sgp.live.polystreamer.com/live"
+ }
+ ],
+ "recommended": {
+ "keyint": 2
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "OPENREC.tv - Premium member (プレミアム会員)",
+ "stream_key_link": "https://www.openrec.tv/login?keep_login=true&url=https://www.openrec.tv/dashboard/live?from=obs",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://a.station.openrec.tv:1935/live1"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 5000,
+ "max audio bitrate": 160
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "nanoStream Cloud / bintu",
+ "more_info_link": "https://www.nanocosmos.de/obs",
+ "stream_key_link": "https://bintu-cloud-frontend.nanocosmos.de/organisation",
+ "servers": [
+ {
+ "name": "bintu-stream global ingest (rtmp)",
+ "url": "rtmp://bintu-stream.nanocosmos.de/live"
+ },
+ {
+ "name": "bintu-stream global ingest (rtmps)",
+ "url": "rtmps://bintu-stream.nanocosmos.de:1937/live"
+ },
+ {
+ "name": "bintu-vtrans global ingest with transcoding/ABR (rtmp)",
+ "url": "rtmp://bintu-vtrans.nanocosmos.de/live"
+ },
+ {
+ "name": "bintu-vtrans global ingest with transcoding/ABR (rtmps)",
+ "url": "rtmps://bintu-vtrans.nanocosmos.de:1937/live"
+ },
+ {
+ "name": "bintu-stream Europe (EU)",
+ "url": "rtmp://bintu-stream-eu.nanocosmos.de/live"
+ },
+ {
+ "name": "bintu-stream USA West (USW)",
+ "url": "rtmp://bintu-stream-usw.nanocosmos.de/live"
+ },
+ {
+ "name": "bintu-stream US East (USE)",
+ "url": "rtmp://bintu-stream-use.nanocosmos.de/live"
+ },
+ {
+ "name": "bintu-stream Asia South (ASS)",
+ "url": "rtmp://bintu-stream-ass.nanocosmos.de/live"
+ },
+ {
+ "name": "bintu-stream Australia (AU)",
+ "url": "rtmp://bintu-stream-au.nanocosmos.de/live"
+ },
+ {
+ "name": "bintu-vtrans Europe (EU)",
+ "url": "rtmp://bintu-vtrans-eu.nanocosmos.de/live"
+ },
+ {
+ "name": "bintu-vtrans USA West (USW)",
+ "url": "rtmp://bintu-vtrans-usw.nanocosmos.de/live"
+ },
+ {
+ "name": "bintu-vtrans US East (USE)",
+ "url": "rtmp://bintu-vtrans-use.nanocosmos.de/live"
+ },
+ {
+ "name": "bintu-vtrans Asia South (ASS)",
+ "url": "rtmp://bintu-vtrans-ass.nanocosmos.de/live"
+ },
+ {
+ "name": "bintu-vtrans Australia (AU)",
+ "url": "rtmp://bintu-vtrans-au.nanocosmos.de/live"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "profile": "baseline",
+ "bframes": 0,
+ "max video bitrate": 5000,
+ "max audio bitrate": 192,
+ "x264opts": "tune=zerolatency b-pyramid=0 scenecut=0"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Dacast",
+ "protocol": "RTMP",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "https://developer.dacast.com/v3/encoder-setup/"
+ }
+ ],
+ "recommended": {
+ "keyint": 1,
+ "profile": "high",
+ "max video bitrate": 7000,
+ "max audio bitrate": 128
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Bilibili Live - RTMP | 哔哩哔哩直播 - RTMP",
+ "more_info_link": "https://link.bilibili.com/p/help/index?id=4#/tools-tutorial",
+ "stream_key_link": "https://link.bilibili.com/p/center/index#/my-room/start-live",
+ "alt_names": [
+ "Bilibili Live"
+ ],
+ "servers": [
+ {
+ "name": "Global - Primary | 全球 - 主要",
+ "url": "rtmp://live-push.bilivideo.com/live-bvc/"
+ },
+ {
+ "name": "Non Chinese Mainland - Primary | 非中国大陆地区 - 主要",
+ "url": "rtmp://bdy.live-push.bilivideo.com/live-bvc/"
+ },
+ {
+ "name": "Chinese Mainland - Backup | 中国大陆地区 - 备用",
+ "url": "rtmp://txy2.live-push.bilivideo.com/live-bvc/"
+ },
+ {
+ "name": "Non Chinese Mainland - Backup | 非中国大陆地区 - 备用",
+ "url": "rtmp://txy.live-push.bilivideo.com/live-bvc/"
+ }
+ ],
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Volume.com",
+ "stream_key_link": "https://volume.com/b?show_key=1&webrtc=0",
+ "servers": [
+ {
+ "name": "Default - Recommended",
+ "url": "rtmp://live.volume.com/live-origin"
+ },
+ {
+ "name": "US - West",
+ "url": "rtmp://live-pdx.volume.com/live-origin"
+ },
+ {
+ "name": "US - East",
+ "url": "rtmp://live-ash.volume.com/live-origin"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 20000,
+ "max fps": 60
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "BoxCast",
+ "stream_key_link": "https://dashboard.boxcast.com/#/sources",
+ "servers": [
+ {
+ "name": "BoxCast",
+ "url": "rtmp://rtmp.boxcast.com/live"
+ }
+ ],
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Disciple Media",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://rtmp.disciplemedia.com/b-fme"
+ }
+ ],
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Jio Games",
+ "servers": [
+ {
+ "name": "Primary",
+ "url": "rtmp://livepub1.api.engageapps.jio/live"
+ },
+ {
+ "name": "Secondary",
+ "url": "rtmp://livepub2.api.engageapps.jio/live"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 32000,
+ "max audio bitrate": 256
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Kuaishou Live",
+ "stream_key_link": "https://studio.kuaishou.com/live/list",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://open-push.voip.yximgs.com/gifshow/"
+ },
+ {
+ "name": "North America",
+ "url": "rtmp://tx.push.yximgs.com/live/"
+ }
+ ],
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Playeur",
+ "alt_names": [
+ "Utreon"
+ ],
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://live.playeur.com:5222/app"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 5000,
+ "max audio bitrate": 160
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "PhoneLiveStreaming",
+ "stream_key_link": "https://app.phonelivestreaming.com/media/rtmp",
+ "servers": [
+ {
+ "name": "PhoneLiveStreaming",
+ "url": "rtmp://live.phonelivestreaming.com/live/"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 128,
+ "max audio bitrate": 160
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Sympla",
+ "servers": [
+ {
+ "name": "Sympla RTMP",
+ "url": "rtmp://rtmp.sympla.com.br:5222/app"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 5000,
+ "max audio bitrate": 160
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Livepush",
+ "more_info_link": "https://docs.livepush.io/en/articles/5065323-how-to-stream-live-from-obs-to-livepush",
+ "servers": [
+ {
+ "name": "Livepush Global (Default)",
+ "url": "rtmp://dc-global.livepush.io/live"
+ },
+ {
+ "name": "Chicago, US",
+ "url": "rtmp://us-central-ch.livepush.io/live"
+ },
+ {
+ "name": "New York, US",
+ "url": "rtmp://us-east-ny.livepush.io/live"
+ },
+ {
+ "name": "Los Angeles, US",
+ "url": "rtmp://us-west-la.livepush.io/live"
+ },
+ {
+ "name": "Miami, US",
+ "url": "rtmp://us-south-mia.livepush.io/live"
+ },
+ {
+ "name": "Dallas, US",
+ "url": "rtmp://us-central-dal.livepush.io/live"
+ },
+ {
+ "name": "Montreal, CA",
+ "url": "rtmp://ca-central-mon.livepush.io/live"
+ },
+ {
+ "name": "Toronto, CA",
+ "url": "rtmp://ca-south-tor.livepush.io/live"
+ },
+ {
+ "name": "Sydney, AU",
+ "url": "rtmp://au-east-syd.livepush.io/live"
+ },
+ {
+ "name": "London, UK",
+ "url": "rtmp://uk-central-ldn.livepush.io/live"
+ },
+ {
+ "name": "Milan, Italy",
+ "url": "rtmp://it-north-mln.livepush.io/live"
+ },
+ {
+ "name": "Paris, FR",
+ "url": "rtmp://fr-central-par.livepush.io/live"
+ },
+ {
+ "name": "Singapore",
+ "url": "rtmp://as-southeast-sg.livepush.io/live"
+ },
+ {
+ "name": "Bangalore, IN",
+ "url": "rtmp://in-south-blr.livepush.io/live"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 16000
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Vindral",
+ "more_info_link": "https://docs.vindral.com/docs/vindral-cdn/",
+ "stream_key_link": "https://portal.cdn.vindral.com/channels",
+ "servers": [
+ {
+ "name": "Global",
+ "url": "rtmps://rtmp.global.cdn.vindral.com/publish"
+ }
+ ],
+ "recommended": {
+ "keyint": 1,
+ "profile": "high",
+ "bframes": 0,
+ "max video bitrate": 20000,
+ "max audio bitrate": 192
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Whowatch (ふわっち)",
+ "more_info_link": "https://whowatch.tv/help/encoder",
+ "stream_key_link": "https://whowatch.tv/publish",
+ "servers": [
+ {
+ "name": "default",
+ "url": "rtmp://live.whowatch.tv/live/"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 1800,
+ "max audio bitrate": 192
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "IRLToolkit",
+ "stream_key_link": "https://irl.run/settings/ingest/",
+ "servers": [
+ {
+ "name": "Global (Recommended)",
+ "url": "rtmps://stream.global.irl.run/ingest"
+ },
+ {
+ "name": "Los Angeles, US",
+ "url": "rtmps://stream.lax.irl.run/ingest"
+ },
+ {
+ "name": "Dallas, US",
+ "url": "rtmps://stream.dal.irl.run/ingest"
+ },
+ {
+ "name": "New York, US",
+ "url": "rtmps://stream.ewr.irl.run/ingest"
+ },
+ {
+ "name": "Miami, US",
+ "url": "rtmps://stream.mia.irl.run/ingest"
+ },
+ {
+ "name": "Amsterdam, NL",
+ "url": "rtmps://stream.ams.irl.run/ingest"
+ },
+ {
+ "name": "Frankfurt, DE",
+ "url": "rtmps://stream.fra.irl.run/ingest"
+ },
+ {
+ "name": "Singapore",
+ "url": "rtmps://stream.sin.irl.run/ingest"
+ },
+ {
+ "name": "Tokyo, JP",
+ "url": "rtmps://stream.tyo.irl.run/ingest"
+ },
+ {
+ "name": "Sydney, AU",
+ "url": "rtmps://stream.syd.irl.run/ingest"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "bframes": 2,
+ "max video bitrate": 20000,
+ "max audio bitrate": 256
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Bitmovin",
+ "more_info_link": "https://developer.bitmovin.com/docs/overview",
+ "stream_key_link": "https://bitmovin.com/dashboard/streams?streamsTab=LIVE",
+ "servers": [
+ {
+ "name": "Streams Live",
+ "url": "rtmp://live-input.bitmovin.com/streams"
+ }
+ ],
+ "recommended": {
+ "keyint": 2
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Live Streamer Cafe",
+ "more_info_link": "https://livestreamercafe.com/help.php",
+ "stream_key_link": "https://livestreamercafe.com/profile.php",
+ "servers": [
+ {
+ "name": "Live Streamer Cafe Server",
+ "url": "rtmp://tophicles.com/live"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 6000
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Enchant.events",
+ "more_info_link": "https://docs.enchant.events/knowledge-base-y4pOb",
+ "servers": [
+ {
+ "name": "Primary RTMPS",
+ "url": "rtmps://stream.enchant.cloud:443/live"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "profile": "high",
+ "max video bitrate": 9000,
+ "max audio bitrate": 192
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Joystick.TV",
+ "more_info_link": "https://support.joystick.tv/live_streaming/",
+ "stream_key_link": "https://joystick.tv/stream-settings",
+ "servers": [
+ {
+ "name": "North America",
+ "url": "rtmp://live.joystick.tv/live/"
+ },
+ {
+ "name": "Europe",
+ "url": "rtmp://eu.live.joystick.tv/live/"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 7500,
+ "max audio bitrate": 192,
+ "max fps": 60,
+ "profile": "main",
+ "bframes": 0,
+ "x264opts": "tune=zerolatency scenecut=0"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Livepeer Studio",
+ "more_info_link": "https://docs.livepeer.org/guides/developing/stream-via-obs",
+ "stream_key_link": "https://livepeer.studio/dashboard/streams",
+ "servers": [
+ {
+ "name": "Global (RTMP)",
+ "url": "rtmp://rtmp.livepeer.com/live"
+ },
+ {
+ "name": "Global (RTMP Primary)",
+ "url": "rtmp://rtmp-a.livepeer.com/live"
+ },
+ {
+ "name": "Global (RTMP Backup)",
+ "url": "rtmp://rtmp-b.livepeer.com/live"
+ }
+ ],
+ "recommended": {
+ "keyint": 1,
+ "profile": "high",
+ "bframes": 0,
+ "max video bitrate": 20000,
+ "max audio bitrate": 512
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "MasterStream.iR | مستراستریم | ری استریم و استریم همزمان",
+ "common": false,
+ "more_info_link": "https://masterstream.ir/webpage/page/docs",
+ "stream_key_link": "https://masterstream.ir/managestreams.php",
+ "servers": [
+ {
+ "name": "Iran Server 1 - Bandwidth Required",
+ "url": "rtmp://live-vip1.masterstream.ir/live"
+ },
+ {
+ "name": "Iran Server 2 - Bandwidth Required",
+ "url": "rtmp://live-vip2.masterstream.ir/live"
+ },
+ {
+ "name": "Turkey Server 1",
+ "url": "rtmp://tr-live1.masterstream.ir/live"
+ },
+ {
+ "name": "Russia Server 1",
+ "url": "rtmp://ru-live1.masterstream.ir/live"
+ }
+ ],
+ "protocol": "RTMP",
+ "supported video codecs": [
+ "h264"
+ ],
+ "recommended": {
+ "keyint": 2,
+ "supported resolutions": [
+ "1920x1080",
+ "1280x720",
+ "852x480",
+ "640x360"
+ ],
+ "max video bitrate": 6000,
+ "max audio bitrate": 320,
+ "x264opts": "scenecut=0"
+ }
+ },
+ {
+ "name": "PandaTV | 팬더티비",
+ "common": false,
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://rtmp.pandalive.co.kr/app"
+ }
+ ],
+ "recommended": {
+ "keyint": 2,
+ "supported resolutions": [
+ "1920x1080",
+ "1280x720",
+ "852x480",
+ "640x360"
+ ],
+ "max video bitrate": 7500,
+ "max audio bitrate": 320,
+ "x264opts": "scenecut=0"
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "Vault - by CommanderRoot",
+ "common": false,
+ "more_info_link": "https://vault.root-space.eu/",
+ "stream_key_link": "https://vault.root-space.eu/recordings",
+ "servers": [
+ {
+ "name": "EU - Central",
+ "url": "rtmp://ingest-eu-central.vault.root-space.eu/app"
+ },
+ {
+ "name": "US - West",
+ "url": "rtmp://ingest-us-west.vault.root-space.eu/app"
+ }
+ ],
+ "protocol": "RTMP",
+ "supported video codecs": [
+ "h264"
+ ],
+ "supported audio codecs": [
+ "aac"
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 7800,
+ "max audio bitrate": 320,
+ "x264opts": "scenecut=0"
+ }
+ },
+ {
+ "name": "CHZZK",
+ "common": false,
+ "stream_key_link": "https://studio.chzzk.naver.com/setting",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://global-rtmp.lip2.navercorp.com:8080/relay"
+ }
+ ],
+ "supported video codecs": [
+ "h264"
+ ],
+ "recommended": {
+ "keyint": 1,
+ "bframes": 0,
+ "max fps": 60,
+ "max video bitrate": 8000,
+ "max audio bitrate": 192,
+ "x264opts": "tune=zerolatency scenecut=0",
+ "supported resolutions": [
+ "1920x1080"
+ ]
+ }
+ },
+ {
+ "name": "Streamway",
+ "common": false,
+ "more_info_link": "https://support.streamway.in/how-to-connect-obs-studio-to-streamway/",
+ "stream_key_link": "https://app.streamway.in/broadcasts",
+ "servers": [
+ {
+ "name": "Primary",
+ "url": "rtmp://injest.streamway.in/LiveApp"
+ },
+ {
+ "name": "Backup",
+ "url": "rtmps://bkp.streamway.in:443/live"
+ }
+ ],
+ "protocol": "RTMP",
+ "supported video codecs": [
+ "h264"
+ ],
+ "recommended": {
+ "keyint": 2
+ }
+ },
+ {
+ "name": "SharePlay.tv",
+ "common": false,
+ "stream_key_link": "https://playstudio.shareplay.tv/stream/settings",
+ "servers": [
+ {
+ "name": "Default (Auto Detect)",
+ "url": "rtmp://stream.shareplay.tv"
+ },
+ {
+ "name": "Miami, Florida, USA",
+ "url": "rtmp://live-us-mia-stream.shareplay.tv"
+ },
+ {
+ "name": "Chicago, Illinois, USA",
+ "url": "rtmp://live-us-ord-stream.shareplay.tv"
+ },
+ {
+ "name": "Washington D.C., USA",
+ "url": "rtmp://live-us-iad-stream.shareplay.tv"
+ },
+ {
+ "name": "Los Angeles, California, USA",
+ "url": "rtmp://live-us-lax-stream.shareplay.tv"
+ },
+ {
+ "name": "Milan, Italy",
+ "url": "rtmp://live-it-mil-stream.shareplay.tv"
+ },
+ {
+ "name": "Toronto, Canada",
+ "url": "rtmp://live-ca-yyz-stream.shareplay.tv"
+ },
+ {
+ "name": "London, UK",
+ "url": "rtmp://live-uk-lhr-stream.shareplay.tv"
+ },
+ {
+ "name": "Atlanta, Georgia, USA",
+ "url": "rtmp://live-us-atl-stream.shareplay.tv"
+ },
+ {
+ "name": "Dallas, Texas, USA",
+ "url": "rtmp://live-us-dfw-stream.shareplay.tv"
+ }
+ ],
+ "supported video codecs": [
+ "h264"
+ ],
+ "recommended": {
+ "keyint": 2,
+ "max video bitrate": 12000,
+ "max audio bitrate": 320
+ }
+ },
+ {
+ "name": "sheeta",
+ "common": false,
+ "more_info_link": "https://partner-support.sheeta.com/hc/ja/articles/4404573942425-%E7%94%9F%E6%94%BE%E9%80%81%E3%81%AE%E9%85%8D%E4%BF%A1%E6%96%B9%E6%B3%95",
+ "servers": [
+ {
+ "name": "Default",
+ "url": "rtmp://lsm.sheeta.com:1935/lsm"
+ }
+ ],
+ "protocol": "RTMP",
+ "supported video codecs": [
+ "h264"
+ ],
+ "supported audio codecs": [
+ "aac"
+ ],
+ "recommended": {
+ "keyint": 1,
+ "profile": "main",
+ "supported resolutions": [
+ "1920x1080",
+ "1280x720",
+ "854x480",
+ "640x480"
+ ],
+ "bitrate matrix": [
+ {
+ "res": "1920x1080",
+ "fps": 30,
+ "max bitrate": 6000
+ },
+ {
+ "res": "1280x720",
+ "fps": 30,
+ "max bitrate": 4700
+ },
+ {
+ "res": "854x480",
+ "fps": 30,
+ "max bitrate": 3400
+ },
+ {
+ "res": "640x480",
+ "fps": 30,
+ "max bitrate": 3400
+ },
+ {
+ "res": "1920x1080",
+ "fps": 60,
+ "max bitrate": 9000
+ },
+ {
+ "res": "1280x720",
+ "fps": 60,
+ "max bitrate": 7000
+ },
+ {
+ "res": "854x480",
+ "fps": 60,
+ "max bitrate": 5000
+ },
+ {
+ "res": "640x480",
+ "fps": 60,
+ "max bitrate": 5000
+ }
+ ],
+ "max fps": 60,
+ "max video bitrate": 9000,
+ "max audio bitrate": 512,
+ "x264opts": "scenecut=0",
+ "output": "rtmp_output"
+ }
+ },
+ {
+ "name": "Amazon IVS",
+ "supported video codecs": [
+ "h264"
+ ],
+ "servers": [
+ {
+ "name": "Asia: China, Hong Kong (6) (RTMPS)",
+ "url": "rtmps://hkg06.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: India, Bangalore (1) (RTMPS)",
+ "url": "rtmps://blr01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: India, Chennai (RTMPS)",
+ "url": "rtmps://maa01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: India, Hyderabad (1) (RTMPS)",
+ "url": "rtmps://hyd01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: India, Mumbai (RTMPS)",
+ "url": "rtmps://bom01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: India, New Delhi (RTMPS)",
+ "url": "rtmps://del01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Indonesia, Cikarang Barat (1) (RTMPS)",
+ "url": "rtmps://jkt01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Indonesia, Jakarta (2) (RTMPS)",
+ "url": "rtmps://jkt02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Japan, Osaka (1) (RTMPS)",
+ "url": "rtmps://osa01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Japan, Tokyo (3) (RTMPS)",
+ "url": "rtmps://tyo03.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Japan, Tokyo (5) (RTMPS)",
+ "url": "rtmps://tyo05.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Manila, Philippines (1) (RTMPS)",
+ "url": "rtmps://mnl01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Singapore (1) (RTMPS)",
+ "url": "rtmps://sin01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Singapore (4) (RTMPS)",
+ "url": "rtmps://sin04.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: South Korea, Seoul (3) (RTMPS)",
+ "url": "rtmps://sel03.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: South Korea, Seoul (4) (RTMPS)",
+ "url": "rtmps://sel04.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Taiwan, Taipei (1) (RTMPS)",
+ "url": "rtmps://tpe01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Taiwan, Taipei (3) (RTMPS)",
+ "url": "rtmps://tpe03.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Thailand, Bangkok (2) (RTMPS)",
+ "url": "rtmps://bkk02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Austria, Vienna (2) (RTMPS)",
+ "url": "rtmps://vie02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Czech Republic, Prague (RTMPS)",
+ "url": "rtmps://prg03.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Denmark, Copenhagen (RTMPS)",
+ "url": "rtmps://cph.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Finland, Helsinki (3) (RTMPS)",
+ "url": "rtmps://hel03.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: France, Marseille (RTMPS)",
+ "url": "rtmps://mrs.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: France, Marseille (2) (RTMPS)",
+ "url": "rtmps://mrs02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: France, Paris (10) (RTMPS)",
+ "url": "rtmps://cdg10.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: France, Paris (2) (RTMPS)",
+ "url": "rtmps://cdg02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Germany, Berlin (RTMPS)",
+ "url": "rtmps://ber.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Germany, Dusseldorf (1) (RTMPS)",
+ "url": "rtmps://dus01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Germany, Frankfurt (2) (RTMPS)",
+ "url": "rtmps://fra02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Germany, Frankfurt (5) (RTMPS)",
+ "url": "rtmps://fra05.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Germany, Frankfurt (6) (RTMPS)",
+ "url": "rtmps://fra06.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Germany, Munich (1) (RTMPS)",
+ "url": "rtmps://muc01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Italy, Milan (2) (RTMPS)",
+ "url": "rtmps://mil02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Netherlands, Amsterdam (2) (RTMPS)",
+ "url": "rtmps://ams02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Netherlands, Amsterdam (3) (RTMPS)",
+ "url": "rtmps://ams03.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Norway, Oslo (RTMPS)",
+ "url": "rtmps://osl.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Poland, Warsaw (2) (RTMPS)",
+ "url": "rtmps://waw02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Spain, Madrid (1) (RTMPS)",
+ "url": "rtmps://mad01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Spain, Madrid (2) (RTMPS)",
+ "url": "rtmps://mad02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Sweden, Stockholm (3) (RTMPS)",
+ "url": "rtmps://arn03.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Sweden, Stockholm (4) (RTMPS)",
+ "url": "rtmps://arn04.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: UK, London (3) (RTMPS)",
+ "url": "rtmps://lhr03.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: UK, London (4) (RTMPS)",
+ "url": "rtmps://lhr04.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: UK, London (8) (RTMPS)",
+ "url": "rtmps://lhr08.contribute.live-video.net/app"
+ },
+ {
+ "name": "NA: Canada, Quebec (RTMPS)",
+ "url": "rtmps://ymq03.contribute.live-video.net/app"
+ },
+ {
+ "name": "NA: Canada, Toronto (RTMPS)",
+ "url": "rtmps://yto.contribute.live-video.net/app"
+ },
+ {
+ "name": "NA: Mexico, Queretaro (3) (RTMPS)",
+ "url": "rtmps://qro03.contribute.live-video.net/app"
+ },
+ {
+ "name": "NA: Mexico, Queretaro (4) (RTMPS)",
+ "url": "rtmps://qro04.contribute.live-video.net/app"
+ },
+ {
+ "name": "Oceania: Australia, Sydney (2) (RTMPS)",
+ "url": "rtmps://syd02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Oceania: Australia, Sydney (3) (RTMPS)",
+ "url": "rtmps://syd03.contribute.live-video.net/app"
+ },
+ {
+ "name": "South America: Brazil, Fortaleza (1) (RTMPS)",
+ "url": "rtmps://for01.contribute.live-video.net/app"
+ },
+ {
+ "name": "South America: Brazil, Rio de Janeiro (3) (RTMPS)",
+ "url": "rtmps://rio03.contribute.live-video.net/app"
+ },
+ {
+ "name": "South America: Brazil, Rio de Janeiro (4) (RTMPS)",
+ "url": "rtmps://rio04.contribute.live-video.net/app"
+ },
+ {
+ "name": "South America: Brazil, Sao Paulo (RTMPS)",
+ "url": "rtmps://sao03.contribute.live-video.net/app"
+ },
+ {
+ "name": "South America: Brazil, Sao Paulo (5) (RTMPS)",
+ "url": "rtmps://sao05.contribute.live-video.net/app"
+ },
+ {
+ "name": "South America: Buenos Aires, Argentina (1) (RTMPS)",
+ "url": "rtmps://bue01.contribute.live-video.net/app"
+ },
+ {
+ "name": "South America: Colombia, Bogota (1) (RTMPS)",
+ "url": "rtmps://bog01.contribute.live-video.net/app"
+ },
+ {
+ "name": "US Central: Dallas, TX (RTMPS)",
+ "url": "rtmps://dfw.contribute.live-video.net/app"
+ },
+ {
+ "name": "US Central: Dallas, TX (2) (RTMPS)",
+ "url": "rtmps://dfw02.contribute.live-video.net/app"
+ },
+ {
+ "name": "US Central: Denver, CO (52) (RTMPS)",
+ "url": "rtmps://den52.contribute.live-video.net/app"
+ },
+ {
+ "name": "US Central: Garland, TX (56) (RTMPS)",
+ "url": "rtmps://dfw56.contribute.live-video.net/app"
+ },
+ {
+ "name": "US Central: Houston, TX (50) (RTMPS)",
+ "url": "rtmps://iah50.contribute.live-video.net/app"
+ },
+ {
+ "name": "US East: Ashburn, VA (5) (RTMPS)",
+ "url": "rtmps://iad05.contribute.live-video.net/app"
+ },
+ {
+ "name": "US East: Atlanta, GA (RTMPS)",
+ "url": "rtmps://atl.contribute.live-video.net/app"
+ },
+ {
+ "name": "US East: Chicago, IL (3) (RTMPS)",
+ "url": "rtmps://ord03.contribute.live-video.net/app"
+ },
+ {
+ "name": "US East: Chicago, IL (56) (RTMPS)",
+ "url": "rtmps://ord56.contribute.live-video.net/app"
+ },
+ {
+ "name": "US East: McAllen, TX (1) (RTMPS)",
+ "url": "rtmps://mfe01.contribute.live-video.net/app"
+ },
+ {
+ "name": "US East: Miami, FL (5) (RTMPS)",
+ "url": "rtmps://mia05.contribute.live-video.net/app"
+ },
+ {
+ "name": "US East: New York, NY (RTMPS)",
+ "url": "rtmps://jfk.contribute.live-video.net/app"
+ },
+ {
+ "name": "US East: New York, NY (50) (RTMPS)",
+ "url": "rtmps://jfk50.contribute.live-video.net/app"
+ },
+ {
+ "name": "US West: Los Angeles, CA (RTMPS)",
+ "url": "rtmps://lax.contribute.live-video.net/app"
+ },
+ {
+ "name": "US West: Salt Lake City, UT (RTMPS)",
+ "url": "rtmps://slc.contribute.live-video.net/app"
+ },
+ {
+ "name": "US West: San Francisco, CA (RTMPS)",
+ "url": "rtmps://sfo.contribute.live-video.net/app"
+ },
+ {
+ "name": "US West: San Jose, California (6) (RTMPS)",
+ "url": "rtmps://sjc06.contribute.live-video.net/app"
+ },
+ {
+ "name": "US West: Seattle, WA (RTMPS)",
+ "url": "rtmps://sea.contribute.live-video.net/app"
+ },
+ {
+ "name": "US West: Seattle, WA (2) (RTMPS)",
+ "url": "rtmps://sea02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: China, Hong Kong (6) (RTMP)",
+ "url": "rtmp://hkg06.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: India, Bangalore (1) (RTMP)",
+ "url": "rtmp://blr01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: India, Chennai (RTMP)",
+ "url": "rtmp://maa01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: India, Hyderabad (1) (RTMP)",
+ "url": "rtmp://hyd01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: India, Mumbai (RTMP)",
+ "url": "rtmp://bom01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: India, New Delhi (RTMP)",
+ "url": "rtmp://del01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Indonesia, Cikarang Barat (1) (RTMP)",
+ "url": "rtmp://jkt01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Indonesia, Jakarta (2) (RTMP)",
+ "url": "rtmp://jkt02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Japan, Osaka (1) (RTMP)",
+ "url": "rtmp://osa01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Japan, Tokyo (3) (RTMP)",
+ "url": "rtmp://tyo03.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Japan, Tokyo (5) (RTMP)",
+ "url": "rtmp://tyo05.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Manila, Philippines (1) (RTMP)",
+ "url": "rtmp://mnl01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Singapore (1) (RTMP)",
+ "url": "rtmp://sin01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Singapore (4) (RTMP)",
+ "url": "rtmp://sin04.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: South Korea, Seoul (3) (RTMP)",
+ "url": "rtmp://sel03.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: South Korea, Seoul (4) (RTMP)",
+ "url": "rtmp://sel04.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Taiwan, Taipei (1) (RTMP)",
+ "url": "rtmp://tpe01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Taiwan, Taipei (3) (RTMP)",
+ "url": "rtmp://tpe03.contribute.live-video.net/app"
+ },
+ {
+ "name": "Asia: Thailand, Bangkok (2) (RTMP)",
+ "url": "rtmp://bkk02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Austria, Vienna (2) (RTMP)",
+ "url": "rtmp://vie02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Czech Republic, Prague (RTMP)",
+ "url": "rtmp://prg03.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Denmark, Copenhagen (RTMP)",
+ "url": "rtmp://cph.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Finland, Helsinki (3) (RTMP)",
+ "url": "rtmp://hel03.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: France, Marseille (RTMP)",
+ "url": "rtmp://mrs.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: France, Marseille (2) (RTMP)",
+ "url": "rtmp://mrs02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: France, Paris (10) (RTMP)",
+ "url": "rtmp://cdg10.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: France, Paris (2) (RTMP)",
+ "url": "rtmp://cdg02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Germany, Berlin (RTMP)",
+ "url": "rtmp://ber.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Germany, Dusseldorf (1) (RTMP)",
+ "url": "rtmp://dus01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Germany, Frankfurt (2) (RTMP)",
+ "url": "rtmp://fra02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Germany, Frankfurt (5) (RTMP)",
+ "url": "rtmp://fra05.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Germany, Frankfurt (6) (RTMP)",
+ "url": "rtmp://fra06.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Germany, Munich (1) (RTMP)",
+ "url": "rtmp://muc01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Italy, Milan (2) (RTMP)",
+ "url": "rtmp://mil02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Netherlands, Amsterdam (2) (RTMP)",
+ "url": "rtmp://ams02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Netherlands, Amsterdam (3) (RTMP)",
+ "url": "rtmp://ams03.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Norway, Oslo (RTMP)",
+ "url": "rtmp://osl.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Poland, Warsaw (2) (RTMP)",
+ "url": "rtmp://waw02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Spain, Madrid (1) (RTMP)",
+ "url": "rtmp://mad01.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Spain, Madrid (2) (RTMP)",
+ "url": "rtmp://mad02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Sweden, Stockholm (3) (RTMP)",
+ "url": "rtmp://arn03.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: Sweden, Stockholm (4) (RTMP)",
+ "url": "rtmp://arn04.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: UK, London (3) (RTMP)",
+ "url": "rtmp://lhr03.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: UK, London (4) (RTMP)",
+ "url": "rtmp://lhr04.contribute.live-video.net/app"
+ },
+ {
+ "name": "Europe: UK, London (8) (RTMP)",
+ "url": "rtmp://lhr08.contribute.live-video.net/app"
+ },
+ {
+ "name": "NA: Canada, Quebec (RTMP)",
+ "url": "rtmp://ymq03.contribute.live-video.net/app"
+ },
+ {
+ "name": "NA: Canada, Toronto (RTMP)",
+ "url": "rtmp://yto.contribute.live-video.net/app"
+ },
+ {
+ "name": "NA: Mexico, Queretaro (3) (RTMP)",
+ "url": "rtmp://qro03.contribute.live-video.net/app"
+ },
+ {
+ "name": "NA: Mexico, Queretaro (4) (RTMP)",
+ "url": "rtmp://qro04.contribute.live-video.net/app"
+ },
+ {
+ "name": "Oceania: Australia, Sydney (2) (RTMP)",
+ "url": "rtmp://syd02.contribute.live-video.net/app"
+ },
+ {
+ "name": "Oceania: Australia, Sydney (3) (RTMP)",
+ "url": "rtmp://syd03.contribute.live-video.net/app"
+ },
+ {
+ "name": "South America: Brazil, Fortaleza (1) (RTMP)",
+ "url": "rtmp://for01.contribute.live-video.net/app"
+ },
+ {
+ "name": "South America: Brazil, Rio de Janeiro (3) (RTMP)",
+ "url": "rtmp://rio03.contribute.live-video.net/app"
+ },
+ {
+ "name": "South America: Brazil, Rio de Janeiro (4) (RTMP)",
+ "url": "rtmp://rio04.contribute.live-video.net/app"
+ },
+ {
+ "name": "South America: Brazil, Sao Paulo (RTMP)",
+ "url": "rtmp://sao03.contribute.live-video.net/app"
+ },
+ {
+ "name": "South America: Brazil, Sao Paulo (5) (RTMP)",
+ "url": "rtmp://sao05.contribute.live-video.net/app"
+ },
+ {
+ "name": "South America: Buenos Aires, Argentina (1) (RTMP)",
+ "url": "rtmp://bue01.contribute.live-video.net/app"
+ },
+ {
+ "name": "South America: Colombia, Bogota (1) (RTMP)",
+ "url": "rtmp://bog01.contribute.live-video.net/app"
+ },
+ {
+ "name": "US Central: Dallas, TX (RTMP)",
+ "url": "rtmp://dfw.contribute.live-video.net/app"
+ },
+ {
+ "name": "US Central: Dallas, TX (2) (RTMP)",
+ "url": "rtmp://dfw02.contribute.live-video.net/app"
+ },
+ {
+ "name": "US Central: Denver, CO (52) (RTMP)",
+ "url": "rtmp://den52.contribute.live-video.net/app"
+ },
+ {
+ "name": "US Central: Garland, TX (56) (RTMP)",
+ "url": "rtmp://dfw56.contribute.live-video.net/app"
+ },
+ {
+ "name": "US Central: Houston, TX (50) (RTMP)",
+ "url": "rtmp://iah50.contribute.live-video.net/app"
+ },
+ {
+ "name": "US East: Ashburn, VA (5) (RTMP)",
+ "url": "rtmp://iad05.contribute.live-video.net/app"
+ },
+ {
+ "name": "US East: Atlanta, GA (RTMP)",
+ "url": "rtmp://atl.contribute.live-video.net/app"
+ },
+ {
+ "name": "US East: Chicago, IL (3) (RTMP)",
+ "url": "rtmp://ord03.contribute.live-video.net/app"
+ },
+ {
+ "name": "US East: Chicago, IL (56) (RTMP)",
+ "url": "rtmp://ord56.contribute.live-video.net/app"
+ },
+ {
+ "name": "US East: McAllen, TX (1) (RTMP)",
+ "url": "rtmp://mfe01.contribute.live-video.net/app"
+ },
+ {
+ "name": "US East: Miami, FL (5) (RTMP)",
+ "url": "rtmp://mia05.contribute.live-video.net/app"
+ },
+ {
+ "name": "US East: New York, NY (RTMP)",
+ "url": "rtmp://jfk.contribute.live-video.net/app"
+ },
+ {
+ "name": "US East: New York, NY (50) (RTMP)",
+ "url": "rtmp://jfk50.contribute.live-video.net/app"
+ },
+ {
+ "name": "US West: Los Angeles, CA (RTMP)",
+ "url": "rtmp://lax.contribute.live-video.net/app"
+ },
+ {
+ "name": "US West: Salt Lake City, UT (RTMP)",
+ "url": "rtmp://slc.contribute.live-video.net/app"
+ },
+ {
+ "name": "US West: San Francisco, CA (RTMP)",
+ "url": "rtmp://sfo.contribute.live-video.net/app"
+ },
+ {
+ "name": "US West: San Jose, California (6) (RTMP)",
+ "url": "rtmp://sjc06.contribute.live-video.net/app"
+ },
+ {
+ "name": "US West: Seattle, WA (RTMP)",
+ "url": "rtmp://sea.contribute.live-video.net/app"
+ },
+ {
+ "name": "US West: Seattle, WA (2) (RTMP)",
+ "url": "rtmp://sea02.contribute.live-video.net/app"
+ }
+ ],
+ "multitrack_video_configuration_url": "https://ingest.contribute.live-video.net/api/v3/GetClientConfiguration",
+ "recommended": {
+ "keyint": 2,
+ "x264opts": "scenecut=0"
+ }
+ },
+ {
+ "name": "Dolby Millicast",
+ "common": false,
+ "more_info_link": "https://docs.dolby.io/streaming-apis/docs/using-obs",
+ "stream_key_link": "https://streaming.dolby.io",
+ "servers": [
+ {
+ "name": "Global (RTMPS)",
+ "url": "rtmps://rtmp-auto.millicast.com:443/v2/pub"
+ },
+ {
+ "name": "Global (RTMP)",
+ "url": "rtmp://rtmp-auto.millicast.com:1935/v2/pub"
+ },
+ {
+ "name": "Bangalore, India (RTMPS)",
+ "url": "rtmps://rtmp-blr-1.millicast.com:443/v2/pub"
+ },
+ {
+ "name": "Bangalore, India (RTMP)",
+ "url": "rtmp://rtmp-blr-1.millicast.com:1935/v2/pub"
+ },
+ {
+ "name": "Frankfurt, Germany (RTMPS)",
+ "url": "rtmps://rtmp-fra-1.millicast.com:443/v2/pub"
+ },
+ {
+ "name": "Frankfurt, Germany (RTMP)",
+ "url": "rtmp://rtmp-fra-1.millicast.com:1935/v2/pub"
+ },
+ {
+ "name": "Ashburn, Virginia, USA (RTMPS)",
+ "url": "rtmps://rtmp-iad-1.millicast.com:443/v2/pub"
+ },
+ {
+ "name": "Ashburn, Virginia, USA (RTMP)",
+ "url": "rtmp://rtmp-iad-1.millicast.com:1935/v2/pub"
+ },
+ {
+ "name": "London, England (RTMPS)",
+ "url": "rtmps://rtmp-lon-1.millicast.com:443/v2/pub"
+ },
+ {
+ "name": "London, England (RTMP)",
+ "url": "rtmp://rtmp-lon-1.millicast.com:1935/v2/pub"
+ },
+ {
+ "name": "Phoenix, AZ, USA (RTMPS)",
+ "url": "rtmps://rtmp-phx-1.millicast.com:443/v2/pub"
+ },
+ {
+ "name": "Phoenix, AZ, USA (RTMP)",
+ "url": "rtmp://rtmp-phx-1.millicast.com:1935/v2/pub"
+ },
+ {
+ "name": "Sao Paulo, Brazil (RTMPS)",
+ "url": "rtmps://rtmp-sao-1.millicast.com:443/v2/pub"
+ },
+ {
+ "name": "Sao Paulo, Brazil (RTMP)",
+ "url": "rtmp://rtmp-sao-1.millicast.com:1935/v2/pub"
+ },
+ {
+ "name": "Singapore (RTMPS)",
+ "url": "rtmps://rtmp-sgp-1.millicast.com:443/v2/pub"
+ },
+ {
+ "name": "Singapore (RTMP)",
+ "url": "rtmp://rtmp-sgp-1.millicast.com:1935/v2/pub"
+ },
+ {
+ "name": "Sydney, Australia (RTMPS)",
+ "url": "rtmps://rtmp-syd-1.millicast.com:443/v2/pub"
+ },
+ {
+ "name": "Sydney, Australia (RTMP)",
+ "url": "rtmp://rtmp-syd-1.millicast.com:1935/v2/pub"
+ }
+ ],
+ "supported video codecs": [
+ "h264",
+ "hevc",
+ "av1"
+ ],
+ "recommended": {
+ "keyint": 1,
+ "bframes": 0
+ }
+ },
+ {
+ "name": "NFHS Network",
+ "more_info_link": "https://support.nfhsnetwork.com/hc/en-us",
+ "stream_key_link": "https://console.nfhsnetwork.com/nfhs-events/",
+ "servers": [
+ {
+ "name": "Manual Broadcasts",
+ "url": "rtmp://video.nfhsnetwork.com/manual"
+ }
+ ],
+ "recommended": {
+ "supported resolutions": [
+ "1920x1080",
+ "1280x720",
+ "640x360"
+ ],
+ "max fps": 60
+ },
+ "supported video codecs": [
+ "h264"
+ ]
+ },
+ {
+ "name": "VRCDN - Live",
+ "more_info_link": "https://vrcdn.live",
+ "servers": [
+ {
+ "name": "Automatic",
+ "url": "rtmp://ingest.vrcdn.live/live"
+ }
+ ],
+ "supported video codecs": ["h264"],
+ "recommended": {
+ "keyint": 1,
+ "max video bitrate": 6000
+ }
+ }
+ ]
+}
diff --git a/dotfiles/.config/obs-studio/plugin_config/rtmp-services/twitch_ingests.json b/dotfiles/.config/obs-studio/plugin_config/rtmp-services/twitch_ingests.json
new file mode 100644
index 0000000..2cb31e4
--- /dev/null
+++ b/dotfiles/.config/obs-studio/plugin_config/rtmp-services/twitch_ingests.json
@@ -0,0 +1,625 @@
+{
+ "ingests": [
+ {
+ "_id": 0,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: Japan, Narita (10)",
+ "url_template": "rtmp://apn10.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://apn10.contribute.live-video.net/app/{stream_key}",
+ "priority": 0
+ },
+ {
+ "_id": 1,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: Japan, Tokyo (3)",
+ "url_template": "rtmp://tyo03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://tyo03.contribute.live-video.net/app/{stream_key}",
+ "priority": 1
+ },
+ {
+ "_id": 2,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: Japan, Tokyo (5)",
+ "url_template": "rtmp://tyo05.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://tyo05.contribute.live-video.net/app/{stream_key}",
+ "priority": 2
+ },
+ {
+ "_id": 3,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: Japan, Osaka (1)",
+ "url_template": "rtmp://osa01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://osa01.contribute.live-video.net/app/{stream_key}",
+ "priority": 3
+ },
+ {
+ "_id": 4,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: South Korea, Seoul (3)",
+ "url_template": "rtmp://sel03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://sel03.contribute.live-video.net/app/{stream_key}",
+ "priority": 4
+ },
+ {
+ "_id": 5,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: South Korea, Seoul (4)",
+ "url_template": "rtmp://sel04.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://sel04.contribute.live-video.net/app/{stream_key}",
+ "priority": 5
+ },
+ {
+ "_id": 6,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: Taiwan, Taipei (3)",
+ "url_template": "rtmp://tpe03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://tpe03.contribute.live-video.net/app/{stream_key}",
+ "priority": 6
+ },
+ {
+ "_id": 7,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: Taiwan, Taipei (1)",
+ "url_template": "rtmp://tpe01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://tpe01.contribute.live-video.net/app/{stream_key}",
+ "priority": 7
+ },
+ {
+ "_id": 8,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: China, Hong Kong (6)",
+ "url_template": "rtmp://hkg06.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://hkg06.contribute.live-video.net/app/{stream_key}",
+ "priority": 8
+ },
+ {
+ "_id": 9,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: Manila, Philippines (1)",
+ "url_template": "rtmp://mnl01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://mnl01.contribute.live-video.net/app/{stream_key}",
+ "priority": 9
+ },
+ {
+ "_id": 10,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: Thailand, Bangkok (2)",
+ "url_template": "rtmp://bkk02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://bkk02.contribute.live-video.net/app/{stream_key}",
+ "priority": 10
+ },
+ {
+ "_id": 11,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: Singapore (1)",
+ "url_template": "rtmp://sin01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://sin01.contribute.live-video.net/app/{stream_key}",
+ "priority": 11
+ },
+ {
+ "_id": 12,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: Indonesia, Jakarta (2)",
+ "url_template": "rtmp://jkt02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://jkt02.contribute.live-video.net/app/{stream_key}",
+ "priority": 12
+ },
+ {
+ "_id": 13,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: India, Hyderabad (1)",
+ "url_template": "rtmp://hyd01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://hyd01.contribute.live-video.net/app/{stream_key}",
+ "priority": 13
+ },
+ {
+ "_id": 14,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: India, Chennai (1)",
+ "url_template": "rtmp://maa01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://maa01.contribute.live-video.net/app/{stream_key}",
+ "priority": 14
+ },
+ {
+ "_id": 15,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: India, New Delhi (1)",
+ "url_template": "rtmp://del01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://del01.contribute.live-video.net/app/{stream_key}",
+ "priority": 15
+ },
+ {
+ "_id": 16,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: India, Bangalore (1)",
+ "url_template": "rtmp://blr01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://blr01.contribute.live-video.net/app/{stream_key}",
+ "priority": 16
+ },
+ {
+ "_id": 17,
+ "availability": 1.0,
+ "default": false,
+ "name": "Asia: India, Mumbai",
+ "url_template": "rtmp://bom01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://bom01.contribute.live-video.net/app/{stream_key}",
+ "priority": 17
+ },
+ {
+ "_id": 18,
+ "availability": 1.0,
+ "default": false,
+ "name": "US West: Seattle, WA (2)",
+ "url_template": "rtmp://sea02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://sea02.contribute.live-video.net/app/{stream_key}",
+ "priority": 18
+ },
+ {
+ "_id": 19,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Finland, Helsinki (3)",
+ "url_template": "rtmp://hel03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://hel03.contribute.live-video.net/app/{stream_key}",
+ "priority": 19
+ },
+ {
+ "_id": 20,
+ "availability": 1.0,
+ "default": false,
+ "name": "Oceania: Australia, Sydney (2)",
+ "url_template": "rtmp://syd02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://syd02.contribute.live-video.net/app/{stream_key}",
+ "priority": 20
+ },
+ {
+ "_id": 21,
+ "availability": 1.0,
+ "default": false,
+ "name": "Oceania: Australia, Sydney (3)",
+ "url_template": "rtmp://syd03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://syd03.contribute.live-video.net/app/{stream_key}",
+ "priority": 21
+ },
+ {
+ "_id": 22,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Sweden, Stockholm (3)",
+ "url_template": "rtmp://arn03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://arn03.contribute.live-video.net/app/{stream_key}",
+ "priority": 22
+ },
+ {
+ "_id": 23,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Sweden, Stockholm (4)",
+ "url_template": "rtmp://arn04.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://arn04.contribute.live-video.net/app/{stream_key}",
+ "priority": 23
+ },
+ {
+ "_id": 24,
+ "availability": 1.0,
+ "default": false,
+ "name": "US West: San Jose, California (6)",
+ "url_template": "rtmp://sjc06.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://sjc06.contribute.live-video.net/app/{stream_key}",
+ "priority": 24
+ },
+ {
+ "_id": 25,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Norway, Oslo",
+ "url_template": "rtmp://osl.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://osl.contribute.live-video.net/app/{stream_key}",
+ "priority": 25
+ },
+ {
+ "_id": 26,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Poland, Warsaw (2)",
+ "url_template": "rtmp://waw02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://waw02.contribute.live-video.net/app/{stream_key}",
+ "priority": 26
+ },
+ {
+ "_id": 27,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Denmark, Copenhagen",
+ "url_template": "rtmp://cph.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://cph.contribute.live-video.net/app/{stream_key}",
+ "priority": 27
+ },
+ {
+ "_id": 28,
+ "availability": 1.0,
+ "default": false,
+ "name": "US West: Los Angeles, CA",
+ "url_template": "rtmp://lax.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://lax.contribute.live-video.net/app/{stream_key}",
+ "priority": 28
+ },
+ {
+ "_id": 29,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Czech Republic, Prague",
+ "url_template": "rtmp://prg03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://prg03.contribute.live-video.net/app/{stream_key}",
+ "priority": 29
+ },
+ {
+ "_id": 30,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Austria, Vienna (2)",
+ "url_template": "rtmp://vie02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://vie02.contribute.live-video.net/app/{stream_key}",
+ "priority": 30
+ },
+ {
+ "_id": 31,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Netherlands, Amsterdam (3)",
+ "url_template": "rtmp://ams03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://ams03.contribute.live-video.net/app/{stream_key}",
+ "priority": 31
+ },
+ {
+ "_id": 32,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Netherlands, Amsterdam (2)",
+ "url_template": "rtmp://ams02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://ams02.contribute.live-video.net/app/{stream_key}",
+ "priority": 32
+ },
+ {
+ "_id": 33,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Germany, Dusseldorf (1)",
+ "url_template": "rtmp://dus01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://dus01.contribute.live-video.net/app/{stream_key}",
+ "priority": 33
+ },
+ {
+ "_id": 34,
+ "availability": 1.0,
+ "default": false,
+ "name": "US Central: Denver, CO (52)",
+ "url_template": "rtmp://den52.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://den52.contribute.live-video.net/app/{stream_key}",
+ "priority": 34
+ },
+ {
+ "_id": 35,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Germany, Munich (1)",
+ "url_template": "rtmp://muc01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://muc01.contribute.live-video.net/app/{stream_key}",
+ "priority": 35
+ },
+ {
+ "_id": 36,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: UK, London (8)",
+ "url_template": "rtmp://lhr08.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://lhr08.contribute.live-video.net/app/{stream_key}",
+ "priority": 36
+ },
+ {
+ "_id": 37,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: UK, London (3)",
+ "url_template": "rtmp://lhr03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://lhr03.contribute.live-video.net/app/{stream_key}",
+ "priority": 37
+ },
+ {
+ "_id": 38,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: France, Paris (2)",
+ "url_template": "rtmp://cdg02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://cdg02.contribute.live-video.net/app/{stream_key}",
+ "priority": 38
+ },
+ {
+ "_id": 39,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: France, Paris (10)",
+ "url_template": "rtmp://cdg10.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://cdg10.contribute.live-video.net/app/{stream_key}",
+ "priority": 39
+ },
+ {
+ "_id": 40,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Italy, Milan (2)",
+ "url_template": "rtmp://mil02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://mil02.contribute.live-video.net/app/{stream_key}",
+ "priority": 40
+ },
+ {
+ "_id": 41,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Germany, Frankfurt (5)",
+ "url_template": "rtmp://fra05.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://fra05.contribute.live-video.net/app/{stream_key}",
+ "priority": 41
+ },
+ {
+ "_id": 42,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Germany, Frankfurt (2)",
+ "url_template": "rtmp://fra02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://fra02.contribute.live-video.net/app/{stream_key}",
+ "priority": 42
+ },
+ {
+ "_id": 43,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: France, Marseille (2)",
+ "url_template": "rtmp://mrs02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://mrs02.contribute.live-video.net/app/{stream_key}",
+ "priority": 43
+ },
+ {
+ "_id": 44,
+ "availability": 1.0,
+ "default": false,
+ "name": "US East: Chicago, IL (3)",
+ "url_template": "rtmp://ord03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://ord03.contribute.live-video.net/app/{stream_key}",
+ "priority": 44
+ },
+ {
+ "_id": 45,
+ "availability": 1.0,
+ "default": false,
+ "name": "US East: Chicago, IL (56)",
+ "url_template": "rtmp://ord56.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://ord56.contribute.live-video.net/app/{stream_key}",
+ "priority": 45
+ },
+ {
+ "_id": 46,
+ "availability": 1.0,
+ "default": false,
+ "name": "NA: Canada, Toronto",
+ "url_template": "rtmp://yto.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://yto.contribute.live-video.net/app/{stream_key}",
+ "priority": 46
+ },
+ {
+ "_id": 47,
+ "availability": 1.0,
+ "default": false,
+ "name": "NA: Canada, Quebec",
+ "url_template": "rtmp://ymq03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://ymq03.contribute.live-video.net/app/{stream_key}",
+ "priority": 47
+ },
+ {
+ "_id": 48,
+ "availability": 1.0,
+ "default": false,
+ "name": "US Central: Garland, TX (56)",
+ "url_template": "rtmp://dfw56.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://dfw56.contribute.live-video.net/app/{stream_key}",
+ "priority": 48
+ },
+ {
+ "_id": 49,
+ "availability": 1.0,
+ "default": false,
+ "name": "US Central: Dallas, TX (2)",
+ "url_template": "rtmp://dfw02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://dfw02.contribute.live-video.net/app/{stream_key}",
+ "priority": 49
+ },
+ {
+ "_id": 50,
+ "availability": 1.0,
+ "default": false,
+ "name": "US Central: Houston, TX (50)",
+ "url_template": "rtmp://iah50.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://iah50.contribute.live-video.net/app/{stream_key}",
+ "priority": 50
+ },
+ {
+ "_id": 51,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Spain, Madrid (2)",
+ "url_template": "rtmp://mad02.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://mad02.contribute.live-video.net/app/{stream_key}",
+ "priority": 51
+ },
+ {
+ "_id": 52,
+ "availability": 1.0,
+ "default": false,
+ "name": "Europe: Spain, Madrid (1)",
+ "url_template": "rtmp://mad01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://mad01.contribute.live-video.net/app/{stream_key}",
+ "priority": 52
+ },
+ {
+ "_id": 53,
+ "availability": 1.0,
+ "default": false,
+ "name": "US East: McAllen, TX (1)",
+ "url_template": "rtmp://mfe01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://mfe01.contribute.live-video.net/app/{stream_key}",
+ "priority": 53
+ },
+ {
+ "_id": 54,
+ "availability": 1.0,
+ "default": false,
+ "name": "US East: New York, NY (50)",
+ "url_template": "rtmp://jfk50.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://jfk50.contribute.live-video.net/app/{stream_key}",
+ "priority": 54
+ },
+ {
+ "_id": 55,
+ "availability": 1.0,
+ "default": false,
+ "name": "US East: New York, NY",
+ "url_template": "rtmp://jfk.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://jfk.contribute.live-video.net/app/{stream_key}",
+ "priority": 55
+ },
+ {
+ "_id": 56,
+ "availability": 1.0,
+ "default": false,
+ "name": "US East: Ashburn, VA (5)",
+ "url_template": "rtmp://iad05.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://iad05.contribute.live-video.net/app/{stream_key}",
+ "priority": 56
+ },
+ {
+ "_id": 57,
+ "availability": 1.0,
+ "default": false,
+ "name": "US East: Atlanta, GA",
+ "url_template": "rtmp://atl.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://atl.contribute.live-video.net/app/{stream_key}",
+ "priority": 57
+ },
+ {
+ "_id": 58,
+ "availability": 1.0,
+ "default": false,
+ "name": "NA: Mexico, Queretaro (4)",
+ "url_template": "rtmp://qro04.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://qro04.contribute.live-video.net/app/{stream_key}",
+ "priority": 58
+ },
+ {
+ "_id": 59,
+ "availability": 1.0,
+ "default": false,
+ "name": "NA: Mexico, Queretaro (3)",
+ "url_template": "rtmp://qro03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://qro03.contribute.live-video.net/app/{stream_key}",
+ "priority": 59
+ },
+ {
+ "_id": 60,
+ "availability": 1.0,
+ "default": false,
+ "name": "US East: Miami, FL (5)",
+ "url_template": "rtmp://mia05.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://mia05.contribute.live-video.net/app/{stream_key}",
+ "priority": 60
+ },
+ {
+ "_id": 61,
+ "availability": 1.0,
+ "default": false,
+ "name": "South America: Colombia, Bogota (1)",
+ "url_template": "rtmp://bog01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://bog01.contribute.live-video.net/app/{stream_key}",
+ "priority": 61
+ },
+ {
+ "_id": 62,
+ "availability": 1.0,
+ "default": false,
+ "name": "South America: Brazil, Fortaleza (1)",
+ "url_template": "rtmp://for01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://for01.contribute.live-video.net/app/{stream_key}",
+ "priority": 62
+ },
+ {
+ "_id": 63,
+ "availability": 1.0,
+ "default": false,
+ "name": "South America : chile, Santiago (1)",
+ "url_template": "rtmp://scl01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://scl01.contribute.live-video.net/app/{stream_key}",
+ "priority": 63
+ },
+ {
+ "_id": 64,
+ "availability": 1.0,
+ "default": false,
+ "name": "South America: Buenos Aires, Argentina (1)",
+ "url_template": "rtmp://bue01.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://bue01.contribute.live-video.net/app/{stream_key}",
+ "priority": 64
+ },
+ {
+ "_id": 65,
+ "availability": 1.0,
+ "default": false,
+ "name": "South America: Brazil, Sao Paulo (5)",
+ "url_template": "rtmp://sao05.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://sao05.contribute.live-video.net/app/{stream_key}",
+ "priority": 65
+ },
+ {
+ "_id": 66,
+ "availability": 1.0,
+ "default": false,
+ "name": "South America: Brazil, Sao Paulo",
+ "url_template": "rtmp://sao03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://sao03.contribute.live-video.net/app/{stream_key}",
+ "priority": 66
+ },
+ {
+ "_id": 67,
+ "availability": 1.0,
+ "default": false,
+ "name": "South America: Brazil, Rio de Janeiro (4)",
+ "url_template": "rtmp://rio04.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://rio04.contribute.live-video.net/app/{stream_key}",
+ "priority": 67
+ },
+ {
+ "_id": 68,
+ "availability": 1.0,
+ "default": false,
+ "name": "South America: Brazil, Rio de Janeiro (3)",
+ "url_template": "rtmp://rio03.contribute.live-video.net/app/{stream_key}",
+ "url_template_secure": "rtmps://rio03.contribute.live-video.net/app/{stream_key}",
+ "priority": 68
+ }
+ ]
+}
diff --git a/dotfiles/.config/obs-studio/user.ini b/dotfiles/.config/obs-studio/user.ini
new file mode 100644
index 0000000..7222899
--- /dev/null
+++ b/dotfiles/.config/obs-studio/user.ini
@@ -0,0 +1,68 @@
+[General]
+Pre19Defaults=false
+Pre21Defaults=false
+Pre23Defaults=false
+Pre24.1Defaults=false
+ConfirmOnExit=true
+HotkeyFocusType=NeverDisableHotkeys
+FirstRun=true
+Language=zh-CN
+
+[BasicWindow]
+PreviewEnabled=true
+PreviewProgramMode=false
+SceneDuplicationMode=true
+SwapScenesMode=true
+SnappingEnabled=true
+ScreenSnapping=true
+SourceSnapping=true
+CenterSnapping=false
+SnapDistance=10
+SpacingHelpersEnabled=true
+RecordWhenStreaming=false
+KeepRecordingWhenStreamStops=false
+SysTrayEnabled=true
+SysTrayWhenStarted=false
+SaveProjectors=false
+ShowTransitions=true
+ShowListboxToolbars=true
+ShowStatusBar=true
+ShowSourceIcons=true
+ShowContextToolbars=true
+StudioModeLabels=true
+VerticalVolControl=false
+MultiviewMouseSwitch=true
+MultiviewDrawNames=true
+MultiviewDrawAreas=true
+MediaControlsCountdownTimer=true
+WarnBeforeStartingStream=false
+WarnBeforeStoppingStream=false
+WarnBeforeStoppingRecord=false
+geometry=AdnQywADAAAAAAAAAAAAAAAAA2oAAAPwAAAAAAAAAAAAAANqAAAD8AAAAAAAAAAAB2gAAAAAAAAAAAAAA2oAAAPw
+DockState=AAAA/wAAAAD9AAAAAQAAAAMAAANrAAAA/PwBAAAABvsAAAAUAHMAYwBlAG4AZQBzAEQAbwBjAGsBAAAAAAAAAKMAAACYAP////sAAAAWAHMAbwB1AHIAYwBlAHMARABvAGMAawEAAACnAAAAowAAAJgA////+wAAABIAbQBpAHgAZQByAEQAbwBjAGsBAAABTgAAAN4AAADeAP////sAAAAeAHQAcgBhAG4AcwBpAHQAaQBvAG4AcwBEAG8AYwBrAQAAAjAAAACIAAAAiAD////7AAAAGABjAG8AbgB0AHIAbwBsAHMARABvAGMAawEAAAK8AAAArwAAAK8A////+wAAABIAcwB0AGEAdABzAEQAbwBjAGsCAAACVgAAAbIAAAK8AAAAyAAAA2sAAAK4AAAABAAAAAQAAAAIAAAACPwAAAAA
+AlwaysOnTop=false
+EditPropertiesMode=false
+DocksLocked=false
+SideDocks=false
+AdvAudioVolumeType=1
+
+[Basic]
+Profile=Untitled
+ProfileDir=Untitled
+SceneCollection=Untitled
+SceneCollectionFile=Untitled
+ConfigOnNewProfile=true
+
+[Accessibility]
+SelectRed=255
+SelectGreen=65280
+SelectBlue=16744192
+MixerGreen=2522918
+MixerYellow=2523007
+MixerRed=2500223
+MixerGreenActive=5046092
+MixerYellowActive=5046271
+MixerRedActive=5000447
+
+[ScriptLogWindow]
+geometry=AdnQywADAAAAAAABAAAAGQAAAlgAAAGoAAAAAQAAABkAAAJYAAABqAAAAAAAAAAAB2gAAAABAAAAGQAAAlgAAAGo
diff --git a/dotfiles/.config/qt5ct/colors/catppuccin-mocha-lavender.conf b/dotfiles/.config/qt5ct/colors/catppuccin-mocha-lavender.conf
new file mode 100644
index 0000000..4d19c93
--- /dev/null
+++ b/dotfiles/.config/qt5ct/colors/catppuccin-mocha-lavender.conf
@@ -0,0 +1,4 @@
+[ColorScheme]
+active_colors= #ffcdd6f4, #ff45475a, #ff585b70, #ff313244, #ff11111b, #ff181825, #ffcdd6f4, #ffcdd6f4, #ffcdd6f4, #ff1e1e2e, #ff181825, #ff11111b, #ffb4befe, #ff11111b, #ff89b4fa, #ffb4befe, #ff181825, #ffffffff, #ff1e1e2e, #ffcdd6f4, #806c7086
+inactive_colors=#ff7f849c, #ff1e1e2e, #ff45475a, #ff313244, #ff11111b, #ff181825, #ff7f849c, #ffcdd6f4, #ff7f849c, #ff1e1e2e, #ff181825, #ff11111b, #ff313244, #ff7f849c, #ff7f849c, #ff7f849c, #ff181825, #ffffffff, #ff1e1e2e, #ffcdd6f4, #806c7086
+disabled_colors=#ff6c7086, #ff313244, #ff45475a, #ff313244, #ff11111b, #ff181825, #ff6c7086, #ffcdd6f4, #ff6c7086, #ff1e1e2e, #ff181825, #ff11111b, #ff181825, #ff6c7086, #ffa9bcdb, #ffc7cceb, #ff181825, #ffffffff, #ff1e1e2e, #ffcdd6f4, #806c7086
diff --git a/dotfiles/.config/qt5ct/qt5ct.conf b/dotfiles/.config/qt5ct/qt5ct.conf
new file mode 100644
index 0000000..5e69bad
--- /dev/null
+++ b/dotfiles/.config/qt5ct/qt5ct.conf
@@ -0,0 +1,35 @@
+[Appearance]
+color_scheme_path=/home/admin/.config/qt5ct/colors/catppuccin-mocha-lavender.conf
+custom_palette=true
+icon_theme=Papirus-Dark
+standard_dialogs=default
+style=kvantum
+
+[Fonts]
+fixed="Sarasa Gothic SC,16,-1,5,50,0,0,0,0,0,Regular"
+general="Sarasa Gothic SC,16,-1,5,50,0,0,0,0,0,Regular"
+
+[Interface]
+activate_item_on_single_click=1
+buttonbox_layout=0
+cursor_flash_time=1000
+dialog_buttons_have_icons=1
+double_click_interval=400
+gui_effects=@Invalid()
+keyboard_scheme=2
+menus_have_icons=true
+show_shortcuts_in_context_menus=true
+stylesheets=@Invalid()
+toolbutton_style=4
+underline_shortcut=1
+wheel_scroll_lines=3
+
+[PaletteEditor]
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x2{\0\0\0\xd2\0\0\x4\xf1\0\0\x2\xe2\0\0\x2{\0\0\0\xd2\0\0\x4\xf1\0\0\x2\xe2\0\0\0\0\x2\0\0\0\a\x80\0\0\x2{\0\0\0\xd2\0\0\x4\xf1\0\0\x2\xe2)
+
+[SettingsWindow]
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x3\xd6\0\0\x2\xaa\0\0\0\0\0\0\0\0\xff\xff\xff\xfe\xff\xff\xff\xfe\0\0\0\0\x2\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\x3\xd6\0\0\x2\xaa)
+
+[Troubleshooting]
+force_raster_widgets=1
+ignored_applications=@Invalid()
diff --git a/dotfiles/.config/qt6ct/colors/catppuccin-mocha-lavender.conf b/dotfiles/.config/qt6ct/colors/catppuccin-mocha-lavender.conf
new file mode 100644
index 0000000..4d19c93
--- /dev/null
+++ b/dotfiles/.config/qt6ct/colors/catppuccin-mocha-lavender.conf
@@ -0,0 +1,4 @@
+[ColorScheme]
+active_colors= #ffcdd6f4, #ff45475a, #ff585b70, #ff313244, #ff11111b, #ff181825, #ffcdd6f4, #ffcdd6f4, #ffcdd6f4, #ff1e1e2e, #ff181825, #ff11111b, #ffb4befe, #ff11111b, #ff89b4fa, #ffb4befe, #ff181825, #ffffffff, #ff1e1e2e, #ffcdd6f4, #806c7086
+inactive_colors=#ff7f849c, #ff1e1e2e, #ff45475a, #ff313244, #ff11111b, #ff181825, #ff7f849c, #ffcdd6f4, #ff7f849c, #ff1e1e2e, #ff181825, #ff11111b, #ff313244, #ff7f849c, #ff7f849c, #ff7f849c, #ff181825, #ffffffff, #ff1e1e2e, #ffcdd6f4, #806c7086
+disabled_colors=#ff6c7086, #ff313244, #ff45475a, #ff313244, #ff11111b, #ff181825, #ff6c7086, #ffcdd6f4, #ff6c7086, #ff1e1e2e, #ff181825, #ff11111b, #ff181825, #ff6c7086, #ffa9bcdb, #ffc7cceb, #ff181825, #ffffffff, #ff1e1e2e, #ffcdd6f4, #806c7086
diff --git a/dotfiles/.config/qt6ct/qt6ct.conf b/dotfiles/.config/qt6ct/qt6ct.conf
new file mode 100644
index 0000000..cf2c582
--- /dev/null
+++ b/dotfiles/.config/qt6ct/qt6ct.conf
@@ -0,0 +1,35 @@
+[Appearance]
+color_scheme_path=~/.config/qt6ct/colors/catppuccin-mocha-lavender.conf
+custom_palette=true
+icon_theme=Papirus-Dark
+standard_dialogs=default
+style=kvantum
+
+[Fonts]
+fixed="Sarasa Gothic SC,16,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,Regular"
+general="Sarasa Gothic SC,16,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,Regular"
+
+[Interface]
+activate_item_on_single_click=1
+buttonbox_layout=0
+cursor_flash_time=1000
+dialog_buttons_have_icons=1
+double_click_interval=400
+gui_effects=@Invalid()
+keyboard_scheme=2
+menus_have_icons=true
+show_shortcuts_in_context_menus=true
+stylesheets=@Invalid()
+toolbutton_style=4
+underline_shortcut=1
+wheel_scroll_lines=3
+
+[PaletteEditor]
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x2{\0\0\0\xd2\0\0\x4\xf1\0\0\x2\xe2\0\0\x2{\0\0\0\xd2\0\0\x4\xf1\0\0\x2\xe2\0\0\0\0\x2\0\0\0\a\x80\0\0\x2{\0\0\0\xd2\0\0\x4\xf1\0\0\x2\xe2)
+
+[SettingsWindow]
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\a\x7f\0\0\x4\x4\0\0\0\0\0\0\0\0\0\0\x2\xde\0\0\x2\x44\0\0\0\0\x2\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\a\x7f\0\0\x4\x4)
+
+[Troubleshooting]
+force_raster_widgets=1
+ignored_applications=@Invalid()
diff --git a/dotfiles/.config/starship.toml b/dotfiles/.config/starship.toml
new file mode 100644
index 0000000..557ecd0
--- /dev/null
+++ b/dotfiles/.config/starship.toml
@@ -0,0 +1,80 @@
+palette = "catppuccin_mocha"
+
+[palettes.catppuccin_mocha]
+rosewater = "#f5e0dc"
+flamingo = "#f2cdcd"
+pink = "#f5c2e7"
+mauve = "#cba6f7"
+red = "#f38ba8"
+maroon = "#eba0ac"
+peach = "#fab387"
+yellow = "#f9e2af"
+green = "#a6e3a1"
+teal = "#94e2d5"
+sky = "#89dceb"
+sapphire = "#74c7ec"
+blue = "#89b4fa"
+lavender = "#b4befe"
+text = "#cdd6f4"
+subtext1 = "#bac2de"
+subtext0 = "#a6adc8"
+overlay2 = "#9399b2"
+overlay1 = "#7f849c"
+overlay0 = "#6c7086"
+surface2 = "#585b70"
+surface1 = "#45475a"
+surface0 = "#313244"
+base = "#1e1e2e"
+mantle = "#181825"
+crust = "#11111b"
+
+continuation_prompt = '▶▶ '
+
+format = """
+$username\
+$hostname\
+$directory\
+$git_branch\
+$git_state\
+$git_status\
+$cmd_duration\
+$line_break\
+$python\
+$character"""
+
+[directory]
+style = "blue"
+
+[character]
+success_symbol = "[❯](purple)"
+error_symbol = "[❯](red)"
+vimcmd_symbol = "[❮](green)"
+
+[git_branch]
+format = "[$branch]($style)"
+style = "bright-black"
+
+[git_status]
+format = "[[(*$conflicted$untracked$modified$staged$renamed$deleted)](218) ($ahead_behind$stashed)]($style)"
+style = "cyan"
+conflicted = ""
+untracked = ""
+modified = ""
+staged = ""
+renamed = ""
+deleted = ""
+stashed = "≡"
+
+[git_state]
+format = '\([$state( $progress_current/$progress_total)]($style)\) '
+style = "bright-black"
+
+[cmd_duration]
+format = "[$duration]($style) "
+style = "yellow"
+
+[python]
+format = "[$virtualenv]($style) "
+style = "bright-black"
+
+
diff --git a/dotfiles/.config/strawberry/strawberry.conf b/dotfiles/.config/strawberry/strawberry.conf
new file mode 100644
index 0000000..4fbfc12
--- /dev/null
+++ b/dotfiles/.config/strawberry/strawberry.conf
@@ -0,0 +1,415 @@
+[Analyzer]
+framerate=25
+type=BlockAnalyzer
+
+[Appearance]
+background_image_do_not_cut=true
+background_image_keep_aspect_ratio=true
+background_image_max_size=0
+background_image_position=5
+background_image_stretch=false
+background_image_type=1
+blur_radius=0
+icon_size_configure_buttons=18
+icon_size_left_panel_buttons=28
+icon_size_play_control_buttons=36
+icon_size_playlist_buttons=28
+icon_size_tabbar_large_mode=34
+icon_size_tabbar_small_mode=30
+opacity_level=40
+playlist_playing_song_color=@Variant(\0\0\0\x43\0\xff\xff\0\0\0\0\0\0\0\0)
+style=default
+system_icons=false
+tab_color=@Variant(\0\0\0\x43\x2\xff\xffZ<33\x9f\x38\0\0)
+tab_gradient=true
+tab_system_color=true
+
+[Backend]
+AutoCrossfadeEnabled=false
+CrossfadeEnabled=false
+Device=@Invalid()
+FadeoutDuration=2000
+FadeoutEnabled=false
+FadeoutPauseDuration=250
+FadeoutPauseEnabled=false
+NoCrossfadeSameAlbum=true
+Output=autoaudiosink
+alsaplugin=3
+bs2b=false
+bufferduration=4000
+bufferhighwatermark=0.99
+bufferlowwatermark=0.33
+channels=2
+channels_enabled=false
+ebur128_loudness_normalization=false
+ebur128_target_level_lufs=-23
+http2=false
+rgcompression=true
+rgenabled=false
+rgfallbackgain=0
+rgmode=0
+rgpreamp=0
+strict_ssl=false
+volume_control=true
+
+[Behaviour]
+doubleclick_addmode=1
+doubleclick_playlist_addmode=1
+doubleclick_playmode=2
+keeprunning=true
+language=
+menu_playmode=2
+menu_previousmode=1
+playing_widget=true
+resumeplayback=false
+seek_step_sec=10
+showtrayicon=true
+startupbehaviour=3
+taskbar_progress=false
+trayicon_progress=false
+volume_increment=5
+
+[Collection]
+auto_open=true
+cache_size=160
+cache_size_unit=1
+cover_art_patterns=front, cover
+delete_files=false
+disk_cache_enable=false
+disk_cache_size=360
+disk_cache_size_unit=1
+expire_unavailable_songs=60
+group_by1=3
+group_by2=0
+group_by3=0
+group_by_version=1
+last_path=
+mark_songs_unavailable=true
+monitor=true
+overwrite_playcount=false
+overwrite_rating=false
+pretty_covers=true
+save_playcounts=false
+save_ratings=false
+separate_albums_by_grouping=false
+show_dividers=true
+song_ebur128_loudness_analysis=false
+song_tracking=false
+sort_skips_articles=true
+startup_scan=true
+various_artists=true
+
+[Context]
+AlbumEnable=true
+SearchCoverEnable=true
+SearchLyricsEnable=true
+SongLyricsEnable=true
+SummaryFmt=%album%
+TechnicalDataEnable=false
+TitleFmt=%title% - %artist%
+font_headline=Sarasa Gothic SC
+font_normal=Sarasa Gothic SC
+font_size_headline=16
+font_size_normal=14
+
+[Covers]
+providers=@Invalid()
+save_filename=2
+save_lowercase=true
+save_overwrite=false
+save_pattern=%albumartist-%album
+save_replace_spaces=true
+save_type=1
+types=art_unset, art_manual, art_automatic, art_embedded
+
+[Equalizer]
+enable_stereo_balancer=false
+enabled=false
+presets\1\name=Classical
+presets\1\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xff\xff\xff\xd8\xff\xff\xff\xd8\xff\xff\xff\xd8\xff\xff\xff\xce)
+presets\10\name=Live
+presets\10\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\xff\xff\xff\xe7\0\0\0\0\0\0\0\x14\0\0\0\x19\0\0\0\x1e\0\0\0\x1e\0\0\0\x14\0\0\0\xf\0\0\0\xf\0\0\0\n)
+presets\11\name=Party
+presets\11\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0#\0\0\0#\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0#\0\0\0#)
+presets\12\name=Pop
+presets\12\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\xff\xff\xff\xf6\0\0\0\x19\0\0\0#\0\0\0(\0\0\0\x19\xff\xff\xff\xfb\xff\xff\xff\xf1\xff\xff\xff\xf1\xff\xff\xff\xf6\xff\xff\xff\xf6)
+presets\13\name=Reggae
+presets\13\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\0\0\0\0\0\xff\xff\xff\xfb\xff\xff\xff\xe2\0\0\0\0\xff\xff\xff\xdd\xff\xff\xff\xdd\0\0\0\0\0\0\0\0\0\0\0\0)
+presets\14\name=Rock
+presets\14\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0(\0\0\0\x19\xff\xff\xff\xe2\xff\xff\xff\xd8\xff\xff\xff\xec\0\0\0\x14\0\0\0-\0\0\0\x37\0\0\0\x37\0\0\0\x37)
+presets\15\name=Ska
+presets\15\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\xff\xff\xff\xf1\xff\xff\xff\xe7\xff\xff\xff\xe7\xff\xff\xff\xfb\0\0\0\x14\0\0\0\x1e\0\0\0-\0\0\0\x32\0\0\0\x37\0\0\0\x32)
+presets\16\name=Soft
+presets\16\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\x19\0\0\0\n\xff\xff\xff\xfb\xff\xff\xff\xf1\xff\xff\xff\xfb\0\0\0\x14\0\0\0-\0\0\0\x32\0\0\0\x37\0\0\0<)
+presets\17\name=Soft Rock
+presets\17\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\x14\0\0\0\x14\0\0\0\n\xff\xff\xff\xfb\xff\xff\xff\xe7\xff\xff\xff\xe2\xff\xff\xff\xec\xff\xff\xff\xfb\0\0\0\xf\0\0\0-)
+presets\18\name=Techno
+presets\18\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0(\0\0\0\x1e\0\0\0\0\xff\xff\xff\xe2\xff\xff\xff\xe7\0\0\0\0\0\0\0(\0\0\0\x32\0\0\0\x32\0\0\0-)
+presets\19\name=Zero
+presets\19\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0)
+presets\2\name=Club
+presets\2\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x14\0\0\0\x1e\0\0\0\x1e\0\0\0\x1e\0\0\0\x14\0\0\0\0\0\0\0\0\0\0\0\0)
+presets\3\name=Custom
+presets\3\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0)
+presets\4\name=Dance
+presets\4\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\x32\0\0\0#\0\0\0\n\0\0\0\0\0\0\0\0\xff\xff\xff\xe2\xff\xff\xff\xd8\xff\xff\xff\xd8\0\0\0\0\0\0\0\0)
+presets\5\name=Full Bass
+presets\5\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\x46\0\0\0\x46\0\0\0\x46\0\0\0(\0\0\0\x14\xff\xff\xff\xd3\xff\xff\xff\xce\xff\xff\xff\xc9\xff\xff\xff\xc9\xff\xff\xff\xc9)
+presets\6\name=Full Bass + Treble
+presets\6\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0#\0\0\0\x1e\0\0\0\0\xff\xff\xff\xd8\xff\xff\xff\xe7\0\0\0\n\0\0\0-\0\0\0\x37\0\0\0<\0\0\0<)
+presets\7\name=Full Treble
+presets\7\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\xff\xff\xff\xce\xff\xff\xff\xce\xff\xff\xff\xce\xff\xff\xff\xe7\0\0\0\xf\0\0\0\x37\0\0\0P\0\0\0P\0\0\0P\0\0\0U)
+presets\8\name=Laptop/Headphones
+presets\8\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\x19\0\0\0\x32\0\0\0\x19\xff\xff\xff\xec\0\0\0\0\xff\xff\xff\xe2\xff\xff\xff\xd8\xff\xff\xff\xd8\0\0\0\0\0\0\0\0)
+presets\9\name=Large Hall
+presets\9\params=@Variant(\0\0\0\x7f\0\0\0\x12\x45qualizer::Params\0\0\0\0\0\0\0\0\x32\0\0\0\x32\0\0\0\x1e\0\0\0\x1e\0\0\0\0\xff\xff\xff\xe7\xff\xff\xff\xe7\xff\xff\xff\xe7\0\0\0\0\0\0\0\0)
+presets\size=19
+selected_preset=Custom
+stereo_balance=0
+
+[GlobalShortcuts]
+dec_volume=
+inc_volume=
+love=
+mute=
+next_track=Media Next
+pause=
+play=
+play_pause=Media Play
+prev_track=Media Previous
+repeat_mode=
+restart_or_prev_track=
+seek_backward=
+seek_forward=
+show_hide=
+show_osd=
+shuffle_mode=
+stop=Media Stop
+stop_after=
+toggle_pretty_osd=
+toggle_scrobbling=
+use_kglobalaccel=false
+use_x11=false
+
+[LastFM]
+enabled=false
+
+[LibreFM]
+enabled=false
+
+[ListenBrainz]
+enabled=false
+user_token=
+
+[Lyrics]
+providers=@Invalid()
+
+[MainWindow]
+current_tab=5
+do_not_show_sponsor_message=true
+file_path=
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\a\xf7\0\0\x4>\0\0\0\0\0\0\0\0\0\0\a\xf7\0\0\x4>\0\0\0\0\0\0\0\0\b\0\0\0\0\0\0\0\0\0\0\0\a\xf7\0\0\x4>)
+hidden=false
+maximized=false
+minimized=false
+search_for_cover_auto=true
+show_sidebar=true
+splitter_state=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x2\0\0\x1\x8a\0\0\x4W\0\xff\xff\xff\xff\x1\0\0\0\x1\0)
+tab_collection=1
+tab_context=0
+tab_devices=7
+tab_files=5
+tab_mode=1
+tab_playlists=3
+tab_queue=2
+tab_radios=6
+tab_smartplaylists=4
+
+[Moodbar]
+enabled=true
+save=false
+show=true
+style=4
+
+[NetworkProxy]
+engine=true
+hostname=
+mode=0
+password=
+port=0
+type=3
+use_authentication=false
+username=
+
+[OSD]
+Behaviour=1
+CustomText1=
+CustomText2=
+CustomTextEnabled=false
+ShowArt=true
+ShowOnPausePlayback=true
+ShowOnPlayModeChange=true
+ShowOnResumePlayback=false
+ShowOnVolumeChange=false
+Timeout=3000
+
+[OSDPretty]
+background_color=4284913379
+background_opacity=0.8500000238418579
+disable_duration=false
+fading=false
+font="Verdana,9,-1,5,400,0,0,0,0,0,0,0,0,0,0,1"
+foreground_color=4278190080
+popup_pos=@Point(1652 0)
+popup_screen=DP-3
+
+[Player]
+playback_playlist=1
+playback_position=179
+playback_state=2
+volume=50
+
+[Playlist]
+alternating_row_colors=true
+auto_sort=false
+column_alignments=@Variant(\0\0\0\x7f\0\0\0\x13\x43olumnAlignmentMap\0\0\0\0\xe\0\0\0\0\0\0\0\x81\0\0\0\x2\0\0\0\x81\0\0\0\x6\0\0\0\x82\0\0\0\a\0\0\0\x82\0\0\0\b\0\0\0\x82\0\0\0\t\0\0\0\x82\0\0\0\n\0\0\0\x82\0\0\0\f\0\0\0\x82\0\0\0\r\0\0\0\x82\0\0\0\xe\0\0\0\x82\0\0\0\x11\0\0\0\x82\0\0\0\x12\0\0\0\x81\0\0\0\x15\0\0\0\x82\0\0\0\x16\0\0\0\x82)
+continue_on_error=false
+delete_files=false
+editmetadatainline=false
+glow_effect=false
+greyout_songs_play=true
+greyout_songs_startup=true
+path_type=0
+playlist_clear=true
+rating_locked=false
+select_track=false
+show_bars=true
+show_toolbar=true
+state="@ByteArray(P,\x95\x10\x1\0\0\0 \0\0\0\b\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\x3\0\0\0\x4\0\0\0\x5\0\0\0\x6\0\0\0\a\0\0\0\t\0\0\0\n\0\0\0\v\0\0\0\f\0\0\0\r\0\0\0\xe\0\0\0\xf\0\0\0\x10\0\0\0\x11\0\0\0\x12\0\0\0\x13\0\0\0\x14\0\0\0\x15\0\0\0\x16\0\0\0\x17\0\0\0\x18\0\0\0\x19\0\0\0\x1a\0\0\0\x1b\0\0\0\x1c\0\0\0\x1d\0\0\0\x1e\0\0\0\x1f\0\0\0 \0\0\x1r\0\0\x1\x64\0\0\x1h\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x66\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0o\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x66\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x6\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\n\0\0\0\xe\0\0\0\x12\0\0\0 ?\xd0\xe5}\xdb\xf1\x97t?\xd0>\xc5y\xb2\xd6\x9c?\xd0k\xa6/\xa2--\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?\xb2\xbf\xff\xcf\x9e\xd2{\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?\xb4K\xe\x1a\xe6\xbf\xd7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?\xb2\xb5L\0`\0\xbb\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0)"
+state_version=1
+warn_close_playlist=true
+write_metadata=false
+
+[PlaylistSequence]
+repeat_mode=3
+shuffle_mode=0
+
+[Qobuz]
+albums_group_by1=1
+albums_group_by2=4
+albums_group_by3=0
+albums_group_by_version=1
+albums_separate_albums_by_grouping=false
+artists_group_by1=1
+artists_group_by2=4
+artists_group_by3=0
+artists_group_by_version=1
+artists_separate_albums_by_grouping=false
+search_group_by1=1
+search_group_by2=4
+search_group_by3=0
+search_group_by_version=1
+songs_group_by1=1
+songs_group_by2=4
+songs_group_by3=0
+songs_group_by_version=1
+songs_separate_albums_by_grouping=false
+tab=artists
+
+[Scrobbler]
+albumartist=false
+enabled=false
+love_button=false
+offline=false
+scrobble_button=false
+show_error_dialog=true
+sources=collection, file, cd, device, subsonic, tidal, qobuz, spotify, stream, somafm, radioparadise, unknown
+strip_remastered=true
+submit=0
+
+[SerializedSmartPlaylists]
+songs_version=3
+
+[SettingsDialog]
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x4\0\0\0 \0\0\a\xfb\0\0\x4^\0\0\0\x4\0\0\0 \0\0\a\xfb\0\0\x4^\0\0\0\0\0\0\0\0\b\0\0\0\0\x4\0\0\0 \0\0\a\xfb\0\0\x4^)
+
+[Spotify]
+albums_group_by1=1
+albums_group_by2=4
+albums_group_by3=0
+albums_group_by_version=1
+albums_separate_albums_by_grouping=false
+artists_group_by1=1
+artists_group_by2=4
+artists_group_by3=0
+artists_group_by_version=1
+artists_separate_albums_by_grouping=false
+search_group_by1=1
+search_group_by2=4
+search_group_by3=0
+search_group_by_version=1
+songs_group_by1=1
+songs_group_by2=4
+songs_group_by3=0
+songs_group_by_version=1
+songs_separate_albums_by_grouping=false
+tab=artists
+
+[Subsonic]
+group_by1=1
+group_by2=4
+group_by3=0
+group_by_version=1
+separate_albums_by_grouping=false
+
+[Tidal]
+albums_group_by1=1
+albums_group_by2=4
+albums_group_by3=0
+albums_group_by_version=1
+albums_separate_albums_by_grouping=false
+artists_group_by1=1
+artists_group_by2=4
+artists_group_by3=0
+artists_group_by_version=1
+artists_separate_albums_by_grouping=false
+search_group_by1=1
+search_group_by2=4
+search_group_by3=0
+search_group_by_version=1
+songs_group_by1=1
+songs_group_by2=4
+songs_group_by3=0
+songs_group_by_version=1
+songs_separate_albums_by_grouping=false
+tab=artists
+
+[Transcoder]
+faac\bitrate=320000
+faac\midside=true
+faac\profile=2
+faac\shortctl=0
+faac\tns=false
+ffenc_wmav2\bitrate=320000
+flacenc\quality=5
+lamemp3enc\bitrate=320
+lamemp3enc\cbr=false
+lamemp3enc\encoding-engine-quality=2
+lamemp3enc\mono=false
+lamemp3enc\quality=10
+lamemp3enc\target=1
+opusenc\bitrate=320000
+speexenc\abr=0
+speexenc\bitrate=0
+speexenc\complexity=3
+speexenc\dtx=false
+speexenc\mode=0
+speexenc\nframes=1
+speexenc\quality=10
+speexenc\vad=false
+speexenc\vbr=false
+vorbisenc\bitrate=-1
+vorbisenc\managed=false
+vorbisenc\max-bitrate=-1
+vorbisenc\min-bitrate=-1
+vorbisenc\quality=1
diff --git a/dotfiles/.config/swappy/config b/dotfiles/.config/swappy/config
new file mode 100644
index 0000000..d1eb6bb
--- /dev/null
+++ b/dotfiles/.config/swappy/config
@@ -0,0 +1,11 @@
+[Default]
+auto_save = false
+early_exit = true
+fill_shape = false
+line_size = 5
+paint_mode = brush
+save_dir = ~/Pictures/Screenshots
+save_filename_format = SCREENSHOT-%Y-%m-%d-%H:%M:%S.png
+show_panel = false
+text_font = Sarasa Gothic SC
+text_size = 20
diff --git a/dotfiles/.config/waybar/config.jsonc b/dotfiles/.config/waybar/config.jsonc
new file mode 100644
index 0000000..681e134
--- /dev/null
+++ b/dotfiles/.config/waybar/config.jsonc
@@ -0,0 +1,171 @@
+{
+ "layer": "top",
+ "position": "top",
+ //"height": 20,
+ "margin-left": 10,
+ "margin-bottom": 0,
+ "margin-right": 10,
+ "spacing": 8,
+ "modules-left": [
+ "custom/startmenu",
+ "backlight",
+ "battery",
+ "network",
+ "hyprland/workspaces",
+ "niri/workspaces",
+ "sway/workspaces"
+ ],
+ "modules-center": [
+ "wlr/taskbar"
+ ],
+ "modules-right": [
+ "custom/screenshot",
+ "tray",
+ "custom/wl-gammarelay-brightness",
+ "custom/wl-gammarelay-temperature",
+ "wireplumber",
+ "clock",
+ "custom/swaync",
+ ],
+
+ // -------------------------------------------------------------------------
+ // Modules
+ // -------------------------------------------------------------------------
+
+ "custom/startmenu": {
+ "format": " ",
+ "tooltip": false,
+ "on-click": "wlogout",
+ "on-click-right": "fuzzel",
+ },
+
+ "backlight": {
+ "device": "intel_backlight",
+ "format": "{icon} {percent}%",
+ "format-icons": [""],
+ "on-scroll-down": "brightnessctl s 2%-",
+ "on-scroll-up": "brightnessctl s +2%",
+ },
+
+ "battery": {
+ "interval": 5,
+ "states": {
+ "good": 95,
+ "warning": 15,
+ "critical": 10,
+ },
+ "format": "{icon} {capacity}%",
+ "format-charging": " {capacity}%",
+ "format-plugged": " {capacity}%",
+ "format-icons": ["", "", "", "", ""],
+ },
+
+ "network": {
+ "interval": 3,
+ "format": "{bandwidthUpBytes} {bandwidthDownBytes}",
+ "format-disconnected": " ",
+ "on-click": "alacritty -e zenith",
+ "on-click-right": "corestats",
+ "tooltip-format": "{ifname}\n{ipaddr}/{cidr}\n",
+ },
+
+ "hyprland/workspaces": {
+ "all-outputs": true,
+ "format": "{name}",
+ "on-scroll-down": "hyprctl dispatch workspace e+1 1>/dev/null",
+ "on-scroll-up": "hyprctl dispatch workspace e-1 1>/dev/null",
+ "sort-by-number": true,
+ "active-only": false,
+ },
+
+ "niri/workspaces": {
+ "format": "{icon}",
+ },
+
+ "sway/workspaces": {
+ "all-outputs": true,
+ "format": "{name}",
+ },
+
+ "wlr/taskbar": {
+ "format": "{icon}",
+ "icon-size": 22,
+ "spacing": 3,
+ "tooltip-format": "{title}",
+ "ignore-list": [],
+ "on-click": "activate",
+ "on-click-middle": "close",
+ },
+
+ "custom/screenshot": {
+ "format": " ",
+ "on-click": "sh ~/.config/waybar/scripts/Screenshot-Area.sh",
+ "on-click-right": "nemo ~/Pictures/Screenshots",
+ "on-click-middle": "sh ~/.config/waybar/scripts/Screenshot-Fullscreen.sh",
+ "tooltip": false,
+ },
+
+ "tray": {
+ "spacing": 8,
+ },
+
+ "custom/wl-gammarelay-brightness": {
+ "format": "{}%",
+ "exec": "wl-gammarelay-rs watch {bp}",
+ "on-click": "busctl --user set-property rs.wl-gammarelay / rs.wl.gammarelay Brightness d 0.7",
+ "on-click-right": "busctl --user set-property rs.wl-gammarelay / rs.wl.gammarelay Brightness d 1",
+ "on-scroll-up": "busctl --user -- call rs.wl-gammarelay / rs.wl.gammarelay UpdateBrightness d +0.02",
+ "on-scroll-down": "busctl --user -- call rs.wl-gammarelay / rs.wl.gammarelay UpdateBrightness d -0.02",
+ "tooltip": false
+ },
+ "custom/wl-gammarelay-temperature": {
+ "format": "{}K",
+ "exec": "wl-gammarelay-rs watch {t}",
+ "on-click": "busctl --user set-property rs.wl-gammarelay / rs.wl.gammarelay Temperature q 4500",
+ "on-click-right": "busctl --user set-property rs.wl-gammarelay / rs.wl.gammarelay Temperature q 6500",
+ "on-scroll-up": "busctl --user -- call rs.wl-gammarelay / rs.wl.gammarelay UpdateTemperature n +100",
+ "on-scroll-down": "busctl --user -- call rs.wl-gammarelay / rs.wl.gammarelay UpdateTemperature n -100",
+ "tooltip": false
+ },
+
+ "wireplumber": {
+ "on-click": "pwvucontrol",
+ "on-click-right": "easyeffects",
+ "on-click-middle": "swayosd-client --output-volume mute-toggle",
+ "on-scroll-down": "swayosd-client --output-volume -2",
+ "on-scroll-up": "swayosd-client --output-volume +2",
+ "format": "{icon} {volume}%",
+ "format-muted": "MUTE",
+ "format-source": "",
+ "format-source-muted": "",
+ "format-icons": {
+ "default": ["", "", ""],
+ },
+ },
+
+ "clock": {
+ "interval": 60,
+ "align": 0,
+ "rotate": 0,
+ "tooltip-format": "{calendar}",
+ "format": " {:%H:%M}",
+ "format-alt": " {:%a %b %d, %G}",
+ },
+
+ "custom/swaync": {
+ "tooltip": true,
+ "format": " {icon} ",
+ "format-icons": {
+ "notification": "",
+ "none": "",
+ "dnd-notification": "",
+ "dnd-none": "",
+ },
+ "return-type": "json",
+ "exec-if": "which swaync-client",
+ "exec": "swaync-client -swb",
+ "on-click": "swaync-client -t -sw",
+ "escape": true,
+ },
+}
+
diff --git a/dotfiles/.config/waybar/mocha.css b/dotfiles/.config/waybar/mocha.css
new file mode 100644
index 0000000..75cfb9d
--- /dev/null
+++ b/dotfiles/.config/waybar/mocha.css
@@ -0,0 +1,26 @@
+@define-color rosewater #f5e0dc;
+@define-color flamingo #f2cdcd;
+@define-color pink #f5c2e7;
+@define-color mauve #cba6f7;
+@define-color red #f38ba8;
+@define-color maroon #eba0ac;
+@define-color peach #fab387;
+@define-color yellow #f9e2af;
+@define-color green #a6e3a1;
+@define-color teal #94e2d5;
+@define-color sky #89dceb;
+@define-color sapphire #74c7ec;
+@define-color blue #89b4fa;
+@define-color lavender #b4befe;
+@define-color text #cdd6f4;
+@define-color subtext1 #bac2de;
+@define-color subtext0 #a6adc8;
+@define-color overlay2 #9399b2;
+@define-color overlay1 #7f849c;
+@define-color overlay0 #6c7086;
+@define-color surface2 #585b70;
+@define-color surface1 #45475a;
+@define-color surface0 #313244;
+@define-color base #1e1e2e;
+@define-color mantle #181825;
+@define-color crust #11111b;
diff --git a/dotfiles/.config/waybar/scripts/Screenshot-Area.sh b/dotfiles/.config/waybar/scripts/Screenshot-Area.sh
new file mode 100644
index 0000000..ee12ad2
--- /dev/null
+++ b/dotfiles/.config/waybar/scripts/Screenshot-Area.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+grim -g "$(slurp)" - | swappy -f -
diff --git a/dotfiles/.config/waybar/scripts/Screenshot-Fullscreen.sh b/dotfiles/.config/waybar/scripts/Screenshot-Fullscreen.sh
new file mode 100644
index 0000000..ce131b7
--- /dev/null
+++ b/dotfiles/.config/waybar/scripts/Screenshot-Fullscreen.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+grim - | wl-copy -t image/png;notify-send "Screenshot copied to clipboard"
diff --git a/dotfiles/.config/waybar/scripts/Screenshot-Hyprland-Window.sh b/dotfiles/.config/waybar/scripts/Screenshot-Hyprland-Window.sh
new file mode 100644
index 0000000..08305ba
--- /dev/null
+++ b/dotfiles/.config/waybar/scripts/Screenshot-Hyprland-Window.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+grim -g "$(hyprctl clients -j | jq '.[] | select(.hidden | not) | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"' -r | slurp)" - | swappy -f -
diff --git a/dotfiles/.config/waybar/scripts/Screenshot-OCR.sh b/dotfiles/.config/waybar/scripts/Screenshot-OCR.sh
new file mode 100644
index 0000000..eebdf67
--- /dev/null
+++ b/dotfiles/.config/waybar/scripts/Screenshot-OCR.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+
+## only support EN
+grim -g "$(slurp)" - | tesseract -l "eng" stdin stdout | wl-copy;notify-send "OCR content copied to clipboard"
diff --git a/dotfiles/.config/waybar/scripts/Screenshot-sway-Window.sh b/dotfiles/.config/waybar/scripts/Screenshot-sway-Window.sh
new file mode 100644
index 0000000..4d0977c
--- /dev/null
+++ b/dotfiles/.config/waybar/scripts/Screenshot-sway-Window.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+grim -g "$(swaymsg -t get_tree | jq -r '.. | select(.pid? and .visible?) | .rect | "\(.x),\(.y) \(.width)x\(.height)"' | slurp)" - | swappy -f -
diff --git a/dotfiles/.config/waybar/style.css b/dotfiles/.config/waybar/style.css
new file mode 100644
index 0000000..c79b262
--- /dev/null
+++ b/dotfiles/.config/waybar/style.css
@@ -0,0 +1,133 @@
+@import "mocha.css";
+
+* {
+ /* https://docs.gtk.org/gtk3/css-overview.html#colors */
+ color: @text;
+ font-family: "JetBrainsMono Nerd Font";
+ font-size: 12pt;
+ font-weight: bold;
+ border-radius: 8px;
+ transition-property: background-color;
+ transition-duration: 0.5s;
+}
+@keyframes blink_red {
+ to {
+ background-color: @red;
+ color: @base;
+ }
+}
+.warning,
+.critical,
+.urgent {
+ animation-name: blink_red;
+ animation-duration: 2s;
+ animation-timing-function: linear;
+ animation-iteration-count: infinite;
+ animation-direction: alternate;
+}
+window#waybar {
+ background-color: @mantle;
+ border: 2px solid alpha(@crust, 0.3);
+}
+/*
+window > box {
+ margin-left: 5px;
+ margin-right: 5px;
+ margin-top: 5px;
+ background-color: shade(@base, 0.9);
+ padding: 3px;
+ padding-left: 8px;
+ border: 2px none @blue;
+}
+*/
+#workspaces {
+ padding-left: 0px;
+ padding-right: 4px;
+}
+#workspaces button {
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-left: 6px;
+ padding-right: 6px;
+}
+#workspaces button.active {
+ background-color: @surface2;
+ color: @base;
+}
+#workspaces button.urgent {
+ color: @base;
+}
+#workspaces button:hover {
+ background-color: @surface0;
+ color: @base;
+}
+tooltip {
+ background: @mantle;
+}
+tooltip label {
+ color: @subtext1;
+}
+#custom-launcher {
+ font-size: 20px;
+ padding-left: 8px;
+ padding-right: 6px;
+ color: #7ebae4;
+}
+
+#custom-powermenu {
+ color: @red;
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+#memory {
+ color: @teal;
+}
+#cpu {
+ color: @maroon;
+}
+#clock {
+ color: @subtext1;
+}
+
+#idle_inhibitor {
+ color: @pink;
+ padding-right: 8px;
+}
+#battery {
+ min-width: 55px;
+ color: @sky;
+}
+#battery.charging,
+#battery.full,
+#battery.plugged {
+ color: @green;
+}
+#battery.warning:not(.charging) {
+ color: @yellow;
+}
+#battery.critical:not(.charging) {
+ color: @red;
+}
+#custom-wall {
+ color: @sky;
+}
+#temperature {
+ color: @sky;
+}
+#backlight {
+ color: @peach;
+}
+#pulseaudio {
+ color: @flamingo;
+}
+#network {
+ color: @sapphire;
+}
+#network.disconnected {
+ color: @subtext0;
+}
+#tray {
+ padding-right: 8px;
+ padding-left: 10px;
+}
diff --git a/dotfiles/.config/wlogout/layout b/dotfiles/.config/wlogout/layout
new file mode 100644
index 0000000..30b3392
--- /dev/null
+++ b/dotfiles/.config/wlogout/layout
@@ -0,0 +1,36 @@
+{
+ "label" : "lock",
+ "action" : "hyprlock",
+ "text" : "Lock",
+ "keybind" : "l"
+}
+{
+ "label" : "hibernate",
+ "action" : "systemctl hibernate",
+ "text" : "Hibernate",
+ "keybind" : "h"
+}
+{
+ "label" : "logout",
+ "action" : "loginctl terminate-user $USER",
+ "text" : "Logout",
+ "keybind" : "e"
+}
+{
+ "label" : "shutdown",
+ "action" : "systemctl poweroff",
+ "text" : "Shutdown",
+ "keybind" : "s"
+}
+{
+ "label" : "suspend",
+ "action" : "systemctl suspend",
+ "text" : "Suspend",
+ "keybind" : "u"
+}
+{
+ "label" : "reboot",
+ "action" : "systemctl reboot",
+ "text" : "Reboot",
+ "keybind" : "r"
+}
diff --git a/dotfiles/.config/xarchiver/xarchiverrc b/dotfiles/.config/xarchiver/xarchiverrc
new file mode 100644
index 0000000..382ab63
--- /dev/null
+++ b/dotfiles/.config/xarchiver/xarchiverrc
@@ -0,0 +1,29 @@
+[xarchiver]
+preferred_format=0
+prefer_unzip=true
+confirm_deletion=true
+sort_filename_content=false
+advanced_isearch=true
+auto_expand=true
+store_output=false
+icon_size=4
+show_archive_comment=false
+show_sidebar=true
+show_location_bar=true
+show_toolbar=true
+preferred_custom_cmd=
+preferred_temp_dir=/tmp
+preferred_extract_dir=/tmp
+allow_sub_dir=0
+ensure_directory=true
+overwrite=false
+full_path=2
+touch=false
+fresh=false
+update=false
+store_path=false
+updadd=true
+freshen=false
+recurse=true
+solid_archive=false
+remove_files=false
diff --git a/dotfiles/.config/zed/keymap.json b/dotfiles/.config/zed/keymap.json
new file mode 100644
index 0000000..c81d4ad
--- /dev/null
+++ b/dotfiles/.config/zed/keymap.json
@@ -0,0 +1,18 @@
+[
+ {
+ "context": "Editor",
+ "bindings": {
+ "ctrl-q": null,
+ "ctrl-/": "workspace::ToggleBottomDock",
+ "ctrl-\\": "workspace::ToggleLeftDock"
+ }
+ },
+ {
+ "context": "Workspace",
+ "bindings": {
+ "ctrl-q": null,
+ "ctrl-/": "workspace::ToggleBottomDock",
+ "ctrl-\\": "workspace::ToggleLeftDock"
+ }
+ }
+]
diff --git a/dotfiles/.config/zed/settings.json b/dotfiles/.config/zed/settings.json
new file mode 100644
index 0000000..44f6d85
--- /dev/null
+++ b/dotfiles/.config/zed/settings.json
@@ -0,0 +1,65 @@
+{
+ "assistant": {
+ "enabled": false,
+ "version": "2"
+ },
+ "auto_install_extensions": {
+ "catppucchin-icons": true,
+ "catppuccin": true,
+ "nix": true
+ },
+ "auto_update": false,
+ "base_keymap": "VSCode",
+ "features": {
+ "copilot": false,
+ "inline_completion_provider": "none"
+ },
+ "hour_format": "hour24",
+ "icon_theme": {
+ "dark": "Catppuccin Mocha",
+ "light": "Catppuccin Mocha",
+ "mode": "system"
+ },
+ "load_direnv": "shell_hook",
+ "lsp": {
+ "nix": {
+ "binary": {
+ "path_lookup": true
+ }
+ }
+ },
+ "show_whitespaces": "all",
+ "terminal": {
+ "alternate_scroll": "off",
+ "blinking": "off",
+ "button": true,
+ "copy_on_select": false,
+ "detect_venv": {
+ "on": {
+ "activate_script": "default",
+ "directories": [".env", "env", ".venv", "venv"]
+ }
+ },
+ "dock": "bottom",
+ "env": {
+ "TERM": "alacritty"
+ },
+ "font_family": "JetBrainsMono Nerd Font",
+ "font_features": null,
+ "font_size": null,
+ "line_height": "comfortable",
+ "option_as_meta": false,
+ "shell": "system",
+ "toolbar": {
+ "breadcrumbs": false,
+ "title": true
+ },
+ "working_directory": "current_project_directory"
+ },
+ "theme": {
+ "dark": "Catppuccin Mocha",
+ "light": "Catppuccin Mocha",
+ "mode": "system"
+ },
+ "vim_mode": false
+}
diff --git a/dotfiles/.config/zellij/config.kdl b/dotfiles/.config/zellij/config.kdl
new file mode 100644
index 0000000..6a8808a
--- /dev/null
+++ b/dotfiles/.config/zellij/config.kdl
@@ -0,0 +1,466 @@
+//
+// THIS FILE WAS AUTOGENERATED BY ZELLIJ, THE PREVIOUS FILE AT THIS LOCATION WAS COPIED TO: /home/dich/.config/zellij/config.kdl.bak.1
+//
+
+keybinds clear-defaults=true {
+ locked {
+ bind "Ctrl g" { SwitchToMode "normal"; }
+ }
+ pane {
+ bind "left" { MoveFocus "left"; }
+ bind "down" { MoveFocus "down"; }
+ bind "up" { MoveFocus "up"; }
+ bind "right" { MoveFocus "right"; }
+ bind "c" { SwitchToMode "renamepane"; PaneNameInput 0; }
+ bind "d" { NewPane "down"; SwitchToMode "normal"; }
+ bind "e" { TogglePaneEmbedOrFloating; SwitchToMode "normal"; }
+ bind "f" { ToggleFocusFullscreen; SwitchToMode "normal"; }
+ bind "h" { MoveFocus "left"; }
+ bind "i" { TogglePanePinned; SwitchToMode "normal"; }
+ bind "j" { MoveFocus "down"; }
+ bind "k" { MoveFocus "up"; }
+ bind "l" { MoveFocus "right"; }
+ bind "n" { NewPane; SwitchToMode "normal"; }
+ bind "p" { SwitchFocus; }
+ bind "Ctrl p" { SwitchToMode "normal"; }
+ bind "r" { NewPane "right"; SwitchToMode "normal"; }
+ bind "w" { ToggleFloatingPanes; SwitchToMode "normal"; }
+ bind "z" { TogglePaneFrames; SwitchToMode "normal"; }
+ }
+ tab {
+ bind "left" { GoToPreviousTab; }
+ bind "down" { GoToNextTab; }
+ bind "up" { GoToPreviousTab; }
+ bind "right" { GoToNextTab; }
+ bind "1" { GoToTab 1; SwitchToMode "normal"; }
+ bind "2" { GoToTab 2; SwitchToMode "normal"; }
+ bind "3" { GoToTab 3; SwitchToMode "normal"; }
+ bind "4" { GoToTab 4; SwitchToMode "normal"; }
+ bind "5" { GoToTab 5; SwitchToMode "normal"; }
+ bind "6" { GoToTab 6; SwitchToMode "normal"; }
+ bind "7" { GoToTab 7; SwitchToMode "normal"; }
+ bind "8" { GoToTab 8; SwitchToMode "normal"; }
+ bind "9" { GoToTab 9; SwitchToMode "normal"; }
+ bind "[" { BreakPaneLeft; SwitchToMode "normal"; }
+ bind "]" { BreakPaneRight; SwitchToMode "normal"; }
+ bind "b" { BreakPane; SwitchToMode "normal"; }
+ bind "h" { GoToPreviousTab; }
+ bind "j" { GoToNextTab; }
+ bind "k" { GoToPreviousTab; }
+ bind "l" { GoToNextTab; }
+ bind "n" { NewTab; SwitchToMode "normal"; }
+ bind "r" { SwitchToMode "renametab"; TabNameInput 0; }
+ bind "s" { ToggleActiveSyncTab; SwitchToMode "normal"; }
+ bind "Ctrl t" { SwitchToMode "normal"; }
+ bind "x" { CloseTab; SwitchToMode "normal"; }
+ bind "tab" { ToggleTab; }
+ }
+ resize {
+ bind "left" { Resize "Increase left"; }
+ bind "down" { Resize "Increase down"; }
+ bind "up" { Resize "Increase up"; }
+ bind "right" { Resize "Increase right"; }
+ bind "+" { Resize "Increase"; }
+ bind "-" { Resize "Decrease"; }
+ bind "=" { Resize "Increase"; }
+ bind "H" { Resize "Decrease left"; }
+ bind "J" { Resize "Decrease down"; }
+ bind "K" { Resize "Decrease up"; }
+ bind "L" { Resize "Decrease right"; }
+ bind "h" { Resize "Increase left"; }
+ bind "j" { Resize "Increase down"; }
+ bind "k" { Resize "Increase up"; }
+ bind "l" { Resize "Increase right"; }
+ bind "Ctrl n" { SwitchToMode "normal"; }
+ }
+ move {
+ bind "left" { MovePane "left"; }
+ bind "down" { MovePane "down"; }
+ bind "up" { MovePane "up"; }
+ bind "right" { MovePane "right"; }
+ bind "h" { MovePane "left"; }
+ bind "Ctrl h" { SwitchToMode "normal"; }
+ bind "j" { MovePane "down"; }
+ bind "k" { MovePane "up"; }
+ bind "l" { MovePane "right"; }
+ bind "n" { MovePane; }
+ bind "p" { MovePaneBackwards; }
+ bind "tab" { MovePane; }
+ }
+ scroll {
+ bind "Alt left" { MoveFocusOrTab "left"; SwitchToMode "normal"; }
+ bind "Alt down" { MoveFocus "down"; SwitchToMode "normal"; }
+ bind "Alt up" { MoveFocus "up"; SwitchToMode "normal"; }
+ bind "Alt right" { MoveFocusOrTab "right"; SwitchToMode "normal"; }
+ bind "e" { EditScrollback; SwitchToMode "normal"; }
+ bind "Alt h" { MoveFocusOrTab "left"; SwitchToMode "normal"; }
+ bind "Alt j" { MoveFocus "down"; SwitchToMode "normal"; }
+ bind "Alt k" { MoveFocus "up"; SwitchToMode "normal"; }
+ bind "Alt l" { MoveFocusOrTab "right"; SwitchToMode "normal"; }
+ bind "s" { SwitchToMode "entersearch"; SearchInput 0; }
+ }
+ search {
+ bind "c" { SearchToggleOption "CaseSensitivity"; }
+ bind "n" { Search "down"; }
+ bind "o" { SearchToggleOption "WholeWord"; }
+ bind "p" { Search "up"; }
+ bind "w" { SearchToggleOption "Wrap"; }
+ }
+ session {
+ bind "a" {
+ LaunchOrFocusPlugin "zellij:about" {
+ floating true
+ move_to_focused_tab true
+ }
+ SwitchToMode "normal"
+ }
+ bind "c" {
+ LaunchOrFocusPlugin "configuration" {
+ floating true
+ move_to_focused_tab true
+ }
+ SwitchToMode "normal"
+ }
+ bind "Ctrl o" { SwitchToMode "normal"; }
+ bind "p" {
+ LaunchOrFocusPlugin "plugin-manager" {
+ floating true
+ move_to_focused_tab true
+ }
+ SwitchToMode "normal"
+ }
+ bind "w" {
+ LaunchOrFocusPlugin "session-manager" {
+ floating true
+ move_to_focused_tab true
+ }
+ SwitchToMode "normal"
+ }
+ }
+ shared_except "locked" {
+ bind "Alt +" { Resize "Increase"; }
+ bind "Alt -" { Resize "Decrease"; }
+ bind "Alt =" { Resize "Increase"; }
+ bind "Alt [" { PreviousSwapLayout; }
+ bind "Alt ]" { NextSwapLayout; }
+ bind "Alt f" { ToggleFloatingPanes; }
+ bind "Ctrl g" { SwitchToMode "locked"; }
+ bind "Alt i" { MoveTab "left"; }
+ bind "Alt n" { NewPane; }
+ bind "Alt o" { MoveTab "right"; }
+ bind "Ctrl q" { Quit; }
+ }
+ shared_except "locked" "move" {
+ bind "Ctrl h" { SwitchToMode "move"; }
+ }
+ shared_except "locked" "session" {
+ bind "Ctrl o" { SwitchToMode "session"; }
+ }
+ shared_except "locked" "scroll" {
+ bind "Alt left" { MoveFocusOrTab "left"; }
+ bind "Alt down" { MoveFocus "down"; }
+ bind "Alt up" { MoveFocus "up"; }
+ bind "Alt right" { MoveFocusOrTab "right"; }
+ bind "Alt h" { MoveFocusOrTab "left"; }
+ bind "Alt j" { MoveFocus "down"; }
+ bind "Alt k" { MoveFocus "up"; }
+ bind "Alt l" { MoveFocusOrTab "right"; }
+ }
+ shared_except "locked" "scroll" "search" "tmux" {
+ bind "Ctrl b" { SwitchToMode "tmux"; }
+ }
+ shared_except "locked" "scroll" "search" {
+ bind "Ctrl s" { SwitchToMode "scroll"; }
+ }
+ shared_except "locked" "tab" {
+ bind "Ctrl t" { SwitchToMode "tab"; }
+ }
+ shared_except "locked" "pane" {
+ bind "Ctrl p" { SwitchToMode "pane"; }
+ }
+ shared_except "locked" "resize" {
+ bind "Ctrl n" { SwitchToMode "resize"; }
+ }
+ shared_except "normal" "locked" "entersearch" {
+ bind "enter" { SwitchToMode "normal"; }
+ }
+ shared_except "normal" "locked" "entersearch" "renametab" "renamepane" {
+ bind "esc" { SwitchToMode "normal"; }
+ }
+ shared_among "pane" "tmux" {
+ bind "x" { CloseFocus; SwitchToMode "normal"; }
+ }
+ shared_among "scroll" "search" {
+ bind "PageDown" { PageScrollDown; }
+ bind "PageUp" { PageScrollUp; }
+ bind "left" { PageScrollUp; }
+ bind "down" { ScrollDown; }
+ bind "up" { ScrollUp; }
+ bind "right" { PageScrollDown; }
+ bind "Ctrl b" { PageScrollUp; }
+ bind "Ctrl c" { ScrollToBottom; SwitchToMode "normal"; }
+ bind "d" { HalfPageScrollDown; }
+ bind "Ctrl f" { PageScrollDown; }
+ bind "h" { PageScrollUp; }
+ bind "j" { ScrollDown; }
+ bind "k" { ScrollUp; }
+ bind "l" { PageScrollDown; }
+ bind "Ctrl s" { SwitchToMode "normal"; }
+ bind "u" { HalfPageScrollUp; }
+ }
+ entersearch {
+ bind "Ctrl c" { SwitchToMode "scroll"; }
+ bind "esc" { SwitchToMode "scroll"; }
+ bind "enter" { SwitchToMode "search"; }
+ }
+ renametab {
+ bind "esc" { UndoRenameTab; SwitchToMode "tab"; }
+ }
+ shared_among "renametab" "renamepane" {
+ bind "Ctrl c" { SwitchToMode "normal"; }
+ }
+ renamepane {
+ bind "esc" { UndoRenamePane; SwitchToMode "pane"; }
+ }
+ shared_among "session" "tmux" {
+ bind "d" { Detach; }
+ }
+ tmux {
+ bind "left" { MoveFocus "left"; SwitchToMode "normal"; }
+ bind "down" { MoveFocus "down"; SwitchToMode "normal"; }
+ bind "up" { MoveFocus "up"; SwitchToMode "normal"; }
+ bind "right" { MoveFocus "right"; SwitchToMode "normal"; }
+ bind "space" { NextSwapLayout; }
+ bind "\"" { NewPane "down"; SwitchToMode "normal"; }
+ bind "%" { NewPane "right"; SwitchToMode "normal"; }
+ bind "," { SwitchToMode "renametab"; }
+ bind "[" { SwitchToMode "scroll"; }
+ bind "Ctrl b" { Write 2; SwitchToMode "normal"; }
+ bind "c" { NewTab; SwitchToMode "normal"; }
+ bind "h" { MoveFocus "left"; SwitchToMode "normal"; }
+ bind "j" { MoveFocus "down"; SwitchToMode "normal"; }
+ bind "k" { MoveFocus "up"; SwitchToMode "normal"; }
+ bind "l" { MoveFocus "right"; SwitchToMode "normal"; }
+ bind "n" { GoToNextTab; SwitchToMode "normal"; }
+ bind "o" { FocusNextPane; }
+ bind "p" { GoToPreviousTab; SwitchToMode "normal"; }
+ bind "z" { ToggleFocusFullscreen; SwitchToMode "normal"; }
+ }
+}
+
+// Plugin aliases - can be used to change the implementation of Zellij
+// changing these requires a restart to take effect
+plugins {
+ about location="zellij:about"
+ compact-bar location="zellij:compact-bar"
+ configuration location="zellij:configuration"
+ filepicker location="zellij:strider" {
+ cwd "/"
+ }
+ plugin-manager location="zellij:plugin-manager"
+ session-manager location="zellij:session-manager"
+ status-bar location="zellij:status-bar"
+ strider location="zellij:strider"
+ tab-bar location="zellij:tab-bar"
+ welcome-screen location="zellij:session-manager" {
+ welcome_screen true
+ }
+}
+
+// Plugins to load in the background when a new session starts
+// eg. "file:/path/to/my-plugin.wasm"
+// eg. "https://example.com/my-plugin.wasm"
+load_plugins {
+}
+
+// Use a simplified UI without special fonts (arrow glyphs)
+// Options:
+// - true
+// - false (Default)
+//
+// simplified_ui true
+
+// Choose the theme that is specified in the themes section.
+// Default: default
+//
+// theme "dracula"
+
+// Choose the base input mode of zellij.
+// Default: normal
+//
+default_mode "normal"
+
+// Choose the path to the default shell that zellij will use for opening new panes
+// Default: $SHELL
+//
+// default_shell "fish"
+
+// Choose the path to override cwd that zellij will use for opening new panes
+//
+// default_cwd "/tmp"
+
+// The name of the default layout to load on startup
+// Default: "default"
+//
+// default_layout "compact"
+
+// The folder in which Zellij will look for layouts
+// (Requires restart)
+//
+// layout_dir "/tmp"
+
+// The folder in which Zellij will look for themes
+// (Requires restart)
+//
+// theme_dir "/tmp"
+
+// Toggle enabling the mouse mode.
+// On certain configurations, or terminals this could
+// potentially interfere with copying text.
+// Options:
+// - true (default)
+// - false
+//
+// mouse_mode false
+
+// Toggle having pane frames around the panes
+// Options:
+// - true (default, enabled)
+// - false
+//
+// pane_frames false
+
+// When attaching to an existing session with other users,
+// should the session be mirrored (true)
+// or should each user have their own cursor (false)
+// (Requires restart)
+// Default: false
+//
+// mirror_session true
+
+// Choose what to do when zellij receives SIGTERM, SIGINT, SIGQUIT or SIGHUP
+// eg. when terminal window with an active zellij session is closed
+// (Requires restart)
+// Options:
+// - detach (Default)
+// - quit
+//
+// on_force_close "quit"
+
+// Configure the scroll back buffer size
+// This is the number of lines zellij stores for each pane in the scroll back
+// buffer. Excess number of lines are discarded in a FIFO fashion.
+// (Requires restart)
+// Valid values: positive integers
+// Default value: 10000
+//
+// scroll_buffer_size 10000
+
+// Provide a command to execute when copying text. The text will be piped to
+// the stdin of the program to perform the copy. This can be used with
+// terminal emulators which do not support the OSC 52 ANSI control sequence
+// that will be used by default if this option is not set.
+// Examples:
+//
+// copy_command "xclip -selection clipboard" // x11
+// copy_command "wl-copy" // wayland
+// copy_command "pbcopy" // osx
+//
+// copy_command "pbcopy"
+
+// Choose the destination for copied text
+// Allows using the primary selection buffer (on x11/wayland) instead of the system clipboard.
+// Does not apply when using copy_command.
+// Options:
+// - system (default)
+// - primary
+//
+// copy_clipboard "primary"
+
+// Enable automatic copying (and clearing) of selection when releasing mouse
+// Default: true
+//
+// copy_on_select true
+
+// Path to the default editor to use to edit pane scrollbuffer
+// Default: $EDITOR or $VISUAL
+// scrollback_editor "/usr/bin/vim"
+
+// A fixed name to always give the Zellij session.
+// Consider also setting `attach_to_session true,`
+// otherwise this will error if such a session exists.
+// Default:
+//
+// session_name "My singleton session"
+
+// When `session_name` is provided, attaches to that session
+// if it is already running or creates it otherwise.
+// Default: false
+//
+// attach_to_session true
+
+// Toggle between having Zellij lay out panes according to a predefined set of layouts whenever possible
+// Options:
+// - true (default)
+// - false
+//
+// auto_layout false
+
+// Whether sessions should be serialized to the cache folder (including their tabs/panes, cwds and running commands) so that they can later be resurrected
+// Options:
+// - true (default)
+// - false
+//
+// session_serialization false
+
+// Whether pane viewports are serialized along with the session, default is false
+// Options:
+// - true
+// - false (default)
+//
+// serialize_pane_viewport false
+
+// Scrollback lines to serialize along with the pane viewport when serializing sessions, 0
+// defaults to the scrollback size. If this number is higher than the scrollback size, it will
+// also default to the scrollback size. This does nothing if `serialize_pane_viewport` is not true.
+//
+// scrollback_lines_to_serialize 10000
+
+// Enable or disable the rendering of styled and colored underlines (undercurl).
+// May need to be disabled for certain unsupported terminals
+// (Requires restart)
+// Default: true
+//
+// styled_underlines false
+
+// How often in seconds sessions are serialized
+//
+// serialization_interval 10000
+
+// Enable or disable writing of session metadata to disk (if disabled, other sessions might not know
+// metadata info on this session)
+// (Requires restart)
+// Default: false
+//
+// disable_session_metadata false
+
+// Enable or disable support for the enhanced Kitty Keyboard Protocol (the host terminal must also support it)
+// (Requires restart)
+// Default: true (if the host terminal supports it)
+//
+// support_kitty_keyboard_protocol false
+
+// Whether to stack panes when resizing beyond a certain size
+// Default: true
+//
+// stacked_resize false
+
+// Whether to show tips on startup
+// Default: true
+//
+show_startup_tips false
+
+// Whether to show release notes on first version run
+// Default: true
+//
+// show_release_notes false
diff --git a/dotfiles/.local/share/fcitx5/themes/catppuccin-mocha-flamingo/arrow.png b/dotfiles/.local/share/fcitx5/themes/catppuccin-mocha-flamingo/arrow.png
new file mode 100644
index 0000000..b10ddb5
Binary files /dev/null and b/dotfiles/.local/share/fcitx5/themes/catppuccin-mocha-flamingo/arrow.png differ
diff --git a/dotfiles/.local/share/fcitx5/themes/catppuccin-mocha-flamingo/radio.png b/dotfiles/.local/share/fcitx5/themes/catppuccin-mocha-flamingo/radio.png
new file mode 100644
index 0000000..d2d87ec
Binary files /dev/null and b/dotfiles/.local/share/fcitx5/themes/catppuccin-mocha-flamingo/radio.png differ
diff --git a/dotfiles/.local/share/fcitx5/themes/catppuccin-mocha-flamingo/theme.conf b/dotfiles/.local/share/fcitx5/themes/catppuccin-mocha-flamingo/theme.conf
new file mode 100644
index 0000000..e32d456
--- /dev/null
+++ b/dotfiles/.local/share/fcitx5/themes/catppuccin-mocha-flamingo/theme.conf
@@ -0,0 +1,110 @@
+# vim: ft=dosini
+[Metadata]
+Name=Catppuccin Mocha Flamingo
+Version=0.2
+Author=justTOBBI and Isabelinc
+Description=Catppuccin Mocha Flamingo Color Theme
+ScaleWithDPI=True
+
+[InputPanel]
+# 字体
+Font=Sarasa Gothic SC 14
+# 非选中候选字颜色
+# Blue
+NormalColor=#89b4fa
+# 选中候选字颜色
+# Flamingo
+HighlightCandidateColor=#f2cdcd
+# 高亮前景颜色(输入字符颜色)
+# Flamingo
+HighlightColor=#f2cdcd
+# 输入字符背景颜色
+# Surface 0
+HighlightBackgroundColor=#313244
+
+Spacing=3
+
+[InputPanel/TextMargin]
+# 候选字对左边距
+Left=10
+# 候选字对右边距
+Right=10
+# 候选字向上边距
+Top=6
+# 候选字向下边距
+Bottom=6
+
+[InputPanel/Background]
+# Surface 0
+Color=#313244
+# Surface 0
+BorderColor=#313244
+BorderWidth=2
+
+[InputPanel/Background/Margin]
+Left=2
+Right=2
+Top=2
+Bottom=2
+
+[InputPanel/Highlight]
+# Surface 0
+Color=#313244
+
+[InputPanel/Highlight/Margin]
+# 高亮区域左边距
+Left=10
+# 高亮区域右边距
+Right=10
+# 高亮区域上边距
+Top=7
+# 高亮区域下边距
+Bottom=7
+
+[Menu]
+Font=Sarasa Gothic SC 14
+# Text
+NormalColor=#cdd6f4
+Spacing=3
+
+[Menu/Background]
+# Surface 0
+Color=#313244
+
+[Menu/Background/Margin]
+Left=2
+Right=2
+Top=2
+Bottom=2
+
+[Menu/ContentMargin]
+Left=2
+Right=2
+Top=2
+Bottom=2
+
+[Menu/Highlight]
+# Pink
+Color=#f5c2e7
+
+[Menu/Highlight/Margin]
+Left=10
+Right=10
+Top=5
+Bottom=5
+
+[Menu/Separator]
+# Base
+Color=#1e1e2e
+
+[Menu/CheckBox]
+Image=radio.png
+
+[Menu/SubMenu]
+Image=arrow.png
+
+[Menu/TextMargin]
+Left=5
+Right=5
+Top=5
+Bottom=5
diff --git a/dotfiles/.local/share/oculante/config.json b/dotfiles/.local/share/oculante/config.json
new file mode 100644
index 0000000..e747bbd
--- /dev/null
+++ b/dotfiles/.local/share/oculante/config.json
@@ -0,0 +1,66 @@
+{
+ "accent_color": [255, 0, 75],
+ "background_color": [30, 30, 30],
+ "vsync": true,
+ "force_redraw": false,
+ "shortcuts": {
+ "AlwaysOnTop": ["T"],
+ "Fullscreen": ["F"],
+ "InfoMode": ["I"],
+ "EditMode": ["E"],
+ "NextImage": ["Right"],
+ "FirstImage": ["Home"],
+ "LastImage": ["End"],
+ "PreviousImage": ["Left"],
+ "RedChannel": ["R"],
+ "GreenChannel": ["G"],
+ "BlueChannel": ["B"],
+ "AlphaChannel": ["A"],
+ "RGBChannel": ["U"],
+ "RGBAChannel": ["C"],
+ "ResetView": ["V"],
+ "ZoomOut": ["Minus"],
+ "ZoomIn": ["Equals"],
+ "ZoomActualSize": ["Key1"],
+ "ZoomDouble": ["Key2"],
+ "ZoomThree": ["Key3"],
+ "ZoomFour": ["Key4"],
+ "ZoomFive": ["Key5"],
+ "CompareNext": ["C", "LShift"],
+ "PanLeft": ["LShift", "Left"],
+ "PanRight": ["LShift", "Right"],
+ "PanUp": ["LShift", "Up"],
+ "PanDown": ["Down", "LShift"],
+ "DeleteFile": ["Delete"],
+ "ClearImage": ["Delete", "LShift"],
+ "LosslessRotateRight": ["RBracket"],
+ "LosslessRotateLeft": ["LBracket"],
+ "Copy": ["C", "LControl"],
+ "Paste": ["LControl", "V"],
+ "Browse": ["LControl", "O"],
+ "Quit": ["Q"],
+ "ZenMode": ["Z"]
+ },
+ "keep_view": false,
+ "max_cache": 30,
+ "show_scrub_bar": false,
+ "wrap_folder": true,
+ "keep_edits": false,
+ "title_format": "{APP} | {VERSION} | {FULLPATH}",
+ "info_enabled": false,
+ "edit_enabled": false,
+ "show_checker_background": false,
+ "show_minimap": false,
+ "show_frame": false,
+ "current_channel": "Rgba",
+ "svg_scale": 1.0,
+ "zen_mode": false,
+ "theme": "Dark",
+ "linear_mag_filter": false,
+ "linear_min_filter": true,
+ "use_mipmaps": true,
+ "fit_image_on_window_resize": true,
+ "zoom_multiplier": 1.0,
+ "borderless": false,
+ "min_window_size": [800, 800]
+}
diff --git a/dotfiles/.local/share/wallpapers/nixos-1.png b/dotfiles/.local/share/wallpapers/nixos-1.png
new file mode 100644
index 0000000..2cd684f
Binary files /dev/null and b/dotfiles/.local/share/wallpapers/nixos-1.png differ
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 0000000..205b136
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,837 @@
+{
+ "nodes": {
+ "base16": {
+ "inputs": {
+ "fromYaml": "fromYaml"
+ },
+ "locked": {
+ "lastModified": 1746562888,
+ "narHash": "sha256-YgNJQyB5dQiwavdDFBMNKk1wyS77AtdgDk/VtU6wEaI=",
+ "owner": "SenchoPens",
+ "repo": "base16.nix",
+ "rev": "806a1777a5db2a1ef9d5d6f493ef2381047f2b89",
+ "type": "github"
+ },
+ "original": {
+ "owner": "SenchoPens",
+ "repo": "base16.nix",
+ "type": "github"
+ }
+ },
+ "base16-fish": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1622559957,
+ "narHash": "sha256-PebymhVYbL8trDVVXxCvZgc0S5VxI7I1Hv4RMSquTpA=",
+ "owner": "tomyun",
+ "repo": "base16-fish",
+ "rev": "2f6dd973a9075dabccd26f1cded09508180bf5fe",
+ "type": "github"
+ },
+ "original": {
+ "owner": "tomyun",
+ "repo": "base16-fish",
+ "type": "github"
+ }
+ },
+ "base16-helix": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1748408240,
+ "narHash": "sha256-9M2b1rMyMzJK0eusea0x3lyh3mu5nMeEDSc4RZkGm+g=",
+ "owner": "tinted-theming",
+ "repo": "base16-helix",
+ "rev": "6c711ab1a9db6f51e2f6887cc3345530b33e152e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "tinted-theming",
+ "repo": "base16-helix",
+ "type": "github"
+ }
+ },
+ "base16-vim": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1732806396,
+ "narHash": "sha256-e0bpPySdJf0F68Ndanwm+KWHgQiZ0s7liLhvJSWDNsA=",
+ "owner": "tinted-theming",
+ "repo": "base16-vim",
+ "rev": "577fe8125d74ff456cf942c733a85d769afe58b7",
+ "type": "github"
+ },
+ "original": {
+ "owner": "tinted-theming",
+ "repo": "base16-vim",
+ "rev": "577fe8125d74ff456cf942c733a85d769afe58b7",
+ "type": "github"
+ }
+ },
+ "chaotic": {
+ "inputs": {
+ "flake-schemas": "flake-schemas",
+ "home-manager": "home-manager",
+ "jovian": "jovian",
+ "nixpkgs": "nixpkgs",
+ "rust-overlay": "rust-overlay"
+ },
+ "locked": {
+ "lastModified": 1751313278,
+ "narHash": "sha256-H7i6eH7z9sAtl+NUU7ArUxcSIsegmh9xn31ZbTB5PO4=",
+ "owner": "chaotic-cx",
+ "repo": "nyx",
+ "rev": "2678df2ed81d2343979a5a19d7a087e1cfa953e8",
+ "type": "github"
+ },
+ "original": {
+ "owner": "chaotic-cx",
+ "ref": "nyxpkgs-unstable",
+ "repo": "nyx",
+ "type": "github"
+ }
+ },
+ "daeuniverse": {
+ "inputs": {
+ "flake-parts": "flake-parts",
+ "nixpkgs": "nixpkgs_2"
+ },
+ "locked": {
+ "lastModified": 1750820125,
+ "narHash": "sha256-WDN3/TUs9vqZVXL6jMjl+D0pNsHJ4oO4muMVxnIc5hk=",
+ "owner": "daeuniverse",
+ "repo": "flake.nix",
+ "rev": "2eeb017f69333eea5bc348c555ebcefa0269a071",
+ "type": "github"
+ },
+ "original": {
+ "owner": "daeuniverse",
+ "repo": "flake.nix",
+ "type": "github"
+ }
+ },
+ "disko": {
+ "inputs": {
+ "nixpkgs": [
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1750903843,
+ "narHash": "sha256-Ng9+f0H5/dW+mq/XOKvB9uwvGbsuiiO6HrPdAcVglCs=",
+ "owner": "nix-community",
+ "repo": "disko",
+ "rev": "83c4da299c1d7d300f8c6fd3a72ac46cb0d59aae",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-community",
+ "repo": "disko",
+ "type": "github"
+ }
+ },
+ "firefox-gnome-theme": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1748383148,
+ "narHash": "sha256-pGvD/RGuuPf/4oogsfeRaeMm6ipUIznI2QSILKjKzeA=",
+ "owner": "rafaelmardojai",
+ "repo": "firefox-gnome-theme",
+ "rev": "4eb2714fbed2b80e234312611a947d6cb7d70caf",
+ "type": "github"
+ },
+ "original": {
+ "owner": "rafaelmardojai",
+ "repo": "firefox-gnome-theme",
+ "type": "github"
+ }
+ },
+ "flake-compat": {
+ "locked": {
+ "lastModified": 1747046372,
+ "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=",
+ "owner": "edolstra",
+ "repo": "flake-compat",
+ "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885",
+ "type": "github"
+ },
+ "original": {
+ "owner": "edolstra",
+ "repo": "flake-compat",
+ "type": "github"
+ }
+ },
+ "flake-parts": {
+ "inputs": {
+ "nixpkgs-lib": "nixpkgs-lib"
+ },
+ "locked": {
+ "lastModified": 1738453229,
+ "narHash": "sha256-7H9XgNiGLKN1G1CgRh0vUL4AheZSYzPm+zmZ7vxbJdo=",
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "rev": "32ea77a06711b758da0ad9bd6a844c5740a87abd",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "type": "github"
+ }
+ },
+ "flake-parts_2": {
+ "inputs": {
+ "nixpkgs-lib": [
+ "nixvim",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1749398372,
+ "narHash": "sha256-tYBdgS56eXYaWVW3fsnPQ/nFlgWi/Z2Ymhyu21zVM98=",
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "rev": "9305fe4e5c2a6fcf5ba6a3ff155720fbe4076569",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "type": "github"
+ }
+ },
+ "flake-parts_3": {
+ "inputs": {
+ "nixpkgs-lib": [
+ "stylix",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1743550720,
+ "narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=",
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "rev": "c621e8422220273271f52058f618c94e405bb0f5",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "type": "github"
+ }
+ },
+ "flake-schemas": {
+ "locked": {
+ "lastModified": 1721999734,
+ "narHash": "sha256-G5CxYeJVm4lcEtaO87LKzOsVnWeTcHGKbKxNamNWgOw=",
+ "rev": "0a5c42297d870156d9c57d8f99e476b738dcd982",
+ "revCount": 75,
+ "type": "tarball",
+ "url": "https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.1.5/0190ef2f-61e0-794b-ba14-e82f225e55e6/source.tar.gz"
+ },
+ "original": {
+ "type": "tarball",
+ "url": "https://flakehub.com/f/DeterminateSystems/flake-schemas/%3D0.1.5.tar.gz"
+ }
+ },
+ "flake-utils": {
+ "inputs": {
+ "systems": "systems"
+ },
+ "locked": {
+ "lastModified": 1731533236,
+ "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "type": "github"
+ }
+ },
+ "fromYaml": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1731966426,
+ "narHash": "sha256-lq95WydhbUTWig/JpqiB7oViTcHFP8Lv41IGtayokA8=",
+ "owner": "SenchoPens",
+ "repo": "fromYaml",
+ "rev": "106af9e2f715e2d828df706c386a685698f3223b",
+ "type": "github"
+ },
+ "original": {
+ "owner": "SenchoPens",
+ "repo": "fromYaml",
+ "type": "github"
+ }
+ },
+ "git-hooks": {
+ "inputs": {
+ "flake-compat": [
+ "stylix",
+ "flake-compat"
+ ],
+ "gitignore": "gitignore",
+ "nixpkgs": [
+ "stylix",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1747372754,
+ "narHash": "sha256-2Y53NGIX2vxfie1rOW0Qb86vjRZ7ngizoo+bnXU9D9k=",
+ "owner": "cachix",
+ "repo": "git-hooks.nix",
+ "rev": "80479b6ec16fefd9c1db3ea13aeb038c60530f46",
+ "type": "github"
+ },
+ "original": {
+ "owner": "cachix",
+ "repo": "git-hooks.nix",
+ "type": "github"
+ }
+ },
+ "gitignore": {
+ "inputs": {
+ "nixpkgs": [
+ "stylix",
+ "git-hooks",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1709087332,
+ "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
+ "owner": "hercules-ci",
+ "repo": "gitignore.nix",
+ "rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hercules-ci",
+ "repo": "gitignore.nix",
+ "type": "github"
+ }
+ },
+ "gnome-shell": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1744584021,
+ "narHash": "sha256-0RJ4mJzf+klKF4Fuoc8VN8dpQQtZnKksFmR2jhWE1Ew=",
+ "owner": "GNOME",
+ "repo": "gnome-shell",
+ "rev": "52c517c8f6c199a1d6f5118fae500ef69ea845ae",
+ "type": "github"
+ },
+ "original": {
+ "owner": "GNOME",
+ "ref": "48.1",
+ "repo": "gnome-shell",
+ "type": "github"
+ }
+ },
+ "home-manager": {
+ "inputs": {
+ "nixpkgs": [
+ "chaotic",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1751238753,
+ "narHash": "sha256-hJUPWfz/h+QgXKaKovPwFAdNBnALsvVMggAPgBB+Qvw=",
+ "owner": "nix-community",
+ "repo": "home-manager",
+ "rev": "cab8104e9236fab1eb9a702165454ffed353c20f",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-community",
+ "repo": "home-manager",
+ "type": "github"
+ }
+ },
+ "home-manager_2": {
+ "inputs": {
+ "nixpkgs": [
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1751309344,
+ "narHash": "sha256-zmb01yyOXttyhJD3kRtW6Pkt1lsPbJvN3P92/GnI0tk=",
+ "owner": "nix-community",
+ "repo": "home-manager",
+ "rev": "78fc50f1cf8e57a974ff4bfe654563fce43d6289",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-community",
+ "repo": "home-manager",
+ "type": "github"
+ }
+ },
+ "home-manager_3": {
+ "inputs": {
+ "nixpkgs": [
+ "stylix",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1748737919,
+ "narHash": "sha256-5kvBbLYdp+n7Ftanjcs6Nv+UO6sBhelp6MIGJ9nWmjQ=",
+ "owner": "nix-community",
+ "repo": "home-manager",
+ "rev": "5675a9686851d9626560052a032c4e14e533c1fa",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-community",
+ "repo": "home-manager",
+ "type": "github"
+ }
+ },
+ "ixx": {
+ "inputs": {
+ "flake-utils": [
+ "nixvim",
+ "nuschtosSearch",
+ "flake-utils"
+ ],
+ "nixpkgs": [
+ "nixvim",
+ "nuschtosSearch",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1748294338,
+ "narHash": "sha256-FVO01jdmUNArzBS7NmaktLdGA5qA3lUMJ4B7a05Iynw=",
+ "owner": "NuschtOS",
+ "repo": "ixx",
+ "rev": "cc5f390f7caf265461d4aab37e98d2292ebbdb85",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NuschtOS",
+ "ref": "v0.0.8",
+ "repo": "ixx",
+ "type": "github"
+ }
+ },
+ "jovian": {
+ "inputs": {
+ "nix-github-actions": "nix-github-actions",
+ "nixpkgs": [
+ "chaotic",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1750403547,
+ "narHash": "sha256-XDDINMbHTtKQeSRpX5mwq20z23Wg/I/G4JUinA3V8Xg=",
+ "owner": "Jovian-Experiments",
+ "repo": "Jovian-NixOS",
+ "rev": "52b86b86d925ec00c836ecc6d36f9c947bb15736",
+ "type": "github"
+ },
+ "original": {
+ "owner": "Jovian-Experiments",
+ "repo": "Jovian-NixOS",
+ "type": "github"
+ }
+ },
+ "nix-github-actions": {
+ "inputs": {
+ "nixpkgs": [
+ "chaotic",
+ "jovian",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1729697500,
+ "narHash": "sha256-VFTWrbzDlZyFHHb1AlKRiD/qqCJIripXKiCSFS8fAOY=",
+ "owner": "zhaofengli",
+ "repo": "nix-github-actions",
+ "rev": "e418aeb728b6aa5ca8c5c71974e7159c2df1d8cf",
+ "type": "github"
+ },
+ "original": {
+ "owner": "zhaofengli",
+ "ref": "matrix-name",
+ "repo": "nix-github-actions",
+ "type": "github"
+ }
+ },
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1751011381,
+ "narHash": "sha256-krGXKxvkBhnrSC/kGBmg5MyupUUT5R6IBCLEzx9jhMM=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "30e2e2857ba47844aa71991daa6ed1fc678bcbb7",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs-lib": {
+ "locked": {
+ "lastModified": 1738452942,
+ "narHash": "sha256-vJzFZGaCpnmo7I6i416HaBLpC+hvcURh/BQwROcGIp8=",
+ "type": "tarball",
+ "url": "https://github.com/NixOS/nixpkgs/archive/072a6db25e947df2f31aab9eccd0ab75d5b2da11.tar.gz"
+ },
+ "original": {
+ "type": "tarball",
+ "url": "https://github.com/NixOS/nixpkgs/archive/072a6db25e947df2f31aab9eccd0ab75d5b2da11.tar.gz"
+ }
+ },
+ "nixpkgs_2": {
+ "locked": {
+ "lastModified": 1739866667,
+ "narHash": "sha256-EO1ygNKZlsAC9avfcwHkKGMsmipUk1Uc0TbrEZpkn64=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "73cf49b8ad837ade2de76f87eb53fc85ed5d4680",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs_3": {
+ "locked": {
+ "lastModified": 1751011381,
+ "narHash": "sha256-krGXKxvkBhnrSC/kGBmg5MyupUUT5R6IBCLEzx9jhMM=",
+ "owner": "nixos",
+ "repo": "nixpkgs",
+ "rev": "30e2e2857ba47844aa71991daa6ed1fc678bcbb7",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nixos",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs_4": {
+ "locked": {
+ "lastModified": 1748460289,
+ "narHash": "sha256-7doLyJBzCllvqX4gszYtmZUToxKvMUrg45EUWaUYmBg=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "96ec055edbe5ee227f28cdbc3f1ddf1df5965102",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixvim": {
+ "inputs": {
+ "flake-parts": "flake-parts_2",
+ "nixpkgs": [
+ "nixpkgs"
+ ],
+ "nuschtosSearch": "nuschtosSearch",
+ "systems": "systems_2"
+ },
+ "locked": {
+ "lastModified": 1751144320,
+ "narHash": "sha256-KJsKiGfkfXFB23V26NQ1p+UPsexI6NKtivnrwSlWWdQ=",
+ "owner": "nix-community",
+ "repo": "nixvim",
+ "rev": "ceb52aece5d571b37096945c2815604195a04eb4",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-community",
+ "repo": "nixvim",
+ "type": "github"
+ }
+ },
+ "nur": {
+ "inputs": {
+ "flake-parts": [
+ "stylix",
+ "flake-parts"
+ ],
+ "nixpkgs": [
+ "stylix",
+ "nixpkgs"
+ ],
+ "treefmt-nix": "treefmt-nix"
+ },
+ "locked": {
+ "lastModified": 1748730660,
+ "narHash": "sha256-5LKmRYKdPuhm8j5GFe3AfrJL8dd8o57BQ34AGjJl1R0=",
+ "owner": "nix-community",
+ "repo": "NUR",
+ "rev": "2c0bc52fe14681e9ef60e3553888c4f086e46ecb",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-community",
+ "repo": "NUR",
+ "type": "github"
+ }
+ },
+ "nuschtosSearch": {
+ "inputs": {
+ "flake-utils": "flake-utils",
+ "ixx": "ixx",
+ "nixpkgs": [
+ "nixvim",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1749730855,
+ "narHash": "sha256-L3x2nSlFkXkM6tQPLJP3oCBMIsRifhIDPMQQdHO5xWo=",
+ "owner": "NuschtOS",
+ "repo": "search",
+ "rev": "8dfe5879dd009ff4742b668d9c699bc4b9761742",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NuschtOS",
+ "repo": "search",
+ "type": "github"
+ }
+ },
+ "root": {
+ "inputs": {
+ "chaotic": "chaotic",
+ "daeuniverse": "daeuniverse",
+ "disko": "disko",
+ "home-manager": "home-manager_2",
+ "nixpkgs": "nixpkgs_3",
+ "nixvim": "nixvim",
+ "stylix": "stylix"
+ }
+ },
+ "rust-overlay": {
+ "inputs": {
+ "nixpkgs": [
+ "chaotic",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1751165203,
+ "narHash": "sha256-3QhlpAk2yn+ExwvRLtaixWsVW1q3OX3KXXe0l8VMLl4=",
+ "owner": "oxalica",
+ "repo": "rust-overlay",
+ "rev": "90f547b90e73d3c6025e66c5b742d6db51c418c3",
+ "type": "github"
+ },
+ "original": {
+ "owner": "oxalica",
+ "repo": "rust-overlay",
+ "type": "github"
+ }
+ },
+ "stylix": {
+ "inputs": {
+ "base16": "base16",
+ "base16-fish": "base16-fish",
+ "base16-helix": "base16-helix",
+ "base16-vim": "base16-vim",
+ "firefox-gnome-theme": "firefox-gnome-theme",
+ "flake-compat": "flake-compat",
+ "flake-parts": "flake-parts_3",
+ "git-hooks": "git-hooks",
+ "gnome-shell": "gnome-shell",
+ "home-manager": "home-manager_3",
+ "nixpkgs": "nixpkgs_4",
+ "nur": "nur",
+ "systems": "systems_3",
+ "tinted-foot": "tinted-foot",
+ "tinted-kitty": "tinted-kitty",
+ "tinted-schemes": "tinted-schemes",
+ "tinted-tmux": "tinted-tmux",
+ "tinted-zed": "tinted-zed"
+ },
+ "locked": {
+ "lastModified": 1751296480,
+ "narHash": "sha256-PMuzVs9khM7cYrjUCXQeV2OP6WVtbsmdZwa4Cc21y0o=",
+ "owner": "danth",
+ "repo": "stylix",
+ "rev": "4ead8043f70cc3b951e704a1f6e40c8a10230e61",
+ "type": "github"
+ },
+ "original": {
+ "owner": "danth",
+ "repo": "stylix",
+ "type": "github"
+ }
+ },
+ "systems": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_2": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_3": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "tinted-foot": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1726913040,
+ "narHash": "sha256-+eDZPkw7efMNUf3/Pv0EmsidqdwNJ1TaOum6k7lngDQ=",
+ "owner": "tinted-theming",
+ "repo": "tinted-foot",
+ "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4",
+ "type": "github"
+ },
+ "original": {
+ "owner": "tinted-theming",
+ "repo": "tinted-foot",
+ "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4",
+ "type": "github"
+ }
+ },
+ "tinted-kitty": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1735730497,
+ "narHash": "sha256-4KtB+FiUzIeK/4aHCKce3V9HwRvYaxX+F1edUrfgzb8=",
+ "owner": "tinted-theming",
+ "repo": "tinted-kitty",
+ "rev": "de6f888497f2c6b2279361bfc790f164bfd0f3fa",
+ "type": "github"
+ },
+ "original": {
+ "owner": "tinted-theming",
+ "repo": "tinted-kitty",
+ "type": "github"
+ }
+ },
+ "tinted-schemes": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1748180480,
+ "narHash": "sha256-7n0XiZiEHl2zRhDwZd/g+p38xwEoWtT0/aESwTMXWG4=",
+ "owner": "tinted-theming",
+ "repo": "schemes",
+ "rev": "87d652edd26f5c0c99deda5ae13dfb8ece2ffe31",
+ "type": "github"
+ },
+ "original": {
+ "owner": "tinted-theming",
+ "repo": "schemes",
+ "type": "github"
+ }
+ },
+ "tinted-tmux": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1748740859,
+ "narHash": "sha256-OEM12bg7F4N5WjZOcV7FHJbqRI6jtCqL6u8FtPrlZz4=",
+ "owner": "tinted-theming",
+ "repo": "tinted-tmux",
+ "rev": "57d5f9683ff9a3b590643beeaf0364da819aedda",
+ "type": "github"
+ },
+ "original": {
+ "owner": "tinted-theming",
+ "repo": "tinted-tmux",
+ "type": "github"
+ }
+ },
+ "tinted-zed": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1725758778,
+ "narHash": "sha256-8P1b6mJWyYcu36WRlSVbuj575QWIFZALZMTg5ID/sM4=",
+ "owner": "tinted-theming",
+ "repo": "base16-zed",
+ "rev": "122c9e5c0e6f27211361a04fae92df97940eccf9",
+ "type": "github"
+ },
+ "original": {
+ "owner": "tinted-theming",
+ "repo": "base16-zed",
+ "type": "github"
+ }
+ },
+ "treefmt-nix": {
+ "inputs": {
+ "nixpkgs": [
+ "stylix",
+ "nur",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1733222881,
+ "narHash": "sha256-JIPcz1PrpXUCbaccEnrcUS8jjEb/1vJbZz5KkobyFdM=",
+ "owner": "numtide",
+ "repo": "treefmt-nix",
+ "rev": "49717b5af6f80172275d47a418c9719a31a78b53",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "treefmt-nix",
+ "type": "github"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+}
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000..a87fe91
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,27 @@
+{
+ description = "🥶";
+
+ inputs = {
+ chaotic.url = "github:chaotic-cx/nyx/nyxpkgs-unstable";
+ daeuniverse.url = "github:daeuniverse/flake.nix";
+ disko.inputs.nixpkgs.follows = "nixpkgs";
+ disko.url = "github:nix-community/disko";
+ home-manager.inputs.nixpkgs.follows = "nixpkgs";
+ home-manager.url = "github:nix-community/home-manager";
+ nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
+ nixvim.inputs.nixpkgs.follows = "nixpkgs";
+ nixvim.url = "github:nix-community/nixvim";
+ stylix.url = "github:danth/stylix";
+ };
+ outputs = inputs: let
+ hostname = "woonix";
+ username = "dich";
+ in {
+ nixosConfigurations = {
+ "${hostname}" = inputs.nixpkgs.lib.nixosSystem {
+ modules = [./hosts];
+ specialArgs = {inherit hostname inputs username;};
+ };
+ };
+ };
+}
diff --git a/home/cli/alejandra.nix b/home/cli/alejandra.nix
new file mode 100644
index 0000000..626bce0
--- /dev/null
+++ b/home/cli/alejandra.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ alejandra
+ ];
+}
diff --git a/home/cli/atuin.nix b/home/cli/atuin.nix
new file mode 100644
index 0000000..749a8d7
--- /dev/null
+++ b/home/cli/atuin.nix
@@ -0,0 +1,5 @@
+_: {
+ programs.atuin = {
+ enable = true;
+ };
+}
diff --git a/home/cli/deadnix.nix b/home/cli/deadnix.nix
new file mode 100644
index 0000000..b9d4964
--- /dev/null
+++ b/home/cli/deadnix.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ deadnix
+ ];
+}
diff --git a/home/cli/direnv.nix b/home/cli/direnv.nix
new file mode 100644
index 0000000..37f6d99
--- /dev/null
+++ b/home/cli/direnv.nix
@@ -0,0 +1,6 @@
+_: {
+ programs.direnv = {
+ enable = true;
+ nix-direnv.enable = true;
+ };
+}
diff --git a/home/cli/expect.nix b/home/cli/expect.nix
new file mode 100644
index 0000000..0099e0e
--- /dev/null
+++ b/home/cli/expect.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ expect
+ ];
+}
diff --git a/home/cli/fastfetch.nix b/home/cli/fastfetch.nix
new file mode 100644
index 0000000..defd935
--- /dev/null
+++ b/home/cli/fastfetch.nix
@@ -0,0 +1,5 @@
+_: {
+ programs.fastfetch = {
+ enable = true;
+ };
+}
diff --git a/home/cli/fd.nix b/home/cli/fd.nix
new file mode 100644
index 0000000..cd17b26
--- /dev/null
+++ b/home/cli/fd.nix
@@ -0,0 +1,6 @@
+_: {
+ programs.fd = {
+ enable = true;
+ hidden = true;
+ };
+}
diff --git a/home/cli/fzf.nix b/home/cli/fzf.nix
new file mode 100644
index 0000000..4164e84
--- /dev/null
+++ b/home/cli/fzf.nix
@@ -0,0 +1,5 @@
+_: {
+ programs.fzf = {
+ enable = true;
+ };
+}
diff --git a/home/cli/just.nix b/home/cli/just.nix
new file mode 100644
index 0000000..99878ba
--- /dev/null
+++ b/home/cli/just.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ just
+ ];
+}
diff --git a/home/cli/nom.nix b/home/cli/nom.nix
new file mode 100644
index 0000000..79724e1
--- /dev/null
+++ b/home/cli/nom.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ nix-output-monitor
+ ];
+}
diff --git a/home/cli/nushell.nix b/home/cli/nushell.nix
new file mode 100644
index 0000000..c47d21c
--- /dev/null
+++ b/home/cli/nushell.nix
@@ -0,0 +1,5 @@
+_: {
+ programs.nushell = {
+ enable = true;
+ };
+}
diff --git a/home/cli/onefetch.nix b/home/cli/onefetch.nix
new file mode 100644
index 0000000..dcecf4c
--- /dev/null
+++ b/home/cli/onefetch.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ onefetch
+ ];
+}
diff --git a/home/cli/ripgrep.nix b/home/cli/ripgrep.nix
new file mode 100644
index 0000000..4d6b57e
--- /dev/null
+++ b/home/cli/ripgrep.nix
@@ -0,0 +1,5 @@
+_: {
+ programs.ripgrep = {
+ enable = true;
+ };
+}
diff --git a/home/cli/starship.nix b/home/cli/starship.nix
new file mode 100644
index 0000000..934bae2
--- /dev/null
+++ b/home/cli/starship.nix
@@ -0,0 +1,5 @@
+_: {
+ programs.starship = {
+ enable = true;
+ };
+}
diff --git a/home/cli/tesseract.nix b/home/cli/tesseract.nix
new file mode 100644
index 0000000..61a65b2
--- /dev/null
+++ b/home/cli/tesseract.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ tesseract
+ ];
+}
diff --git a/home/cli/zoxide.nix b/home/cli/zoxide.nix
new file mode 100644
index 0000000..8fa0b33
--- /dev/null
+++ b/home/cli/zoxide.nix
@@ -0,0 +1,5 @@
+_: {
+ programs.zoxide = {
+ enable = true;
+ };
+}
diff --git a/home/default.nix b/home/default.nix
new file mode 100644
index 0000000..c1b8ca0
--- /dev/null
+++ b/home/default.nix
@@ -0,0 +1,35 @@
+{
+ hostname,
+ lib,
+ username,
+ ...
+}: let
+ inherit (import ../hosts/${hostname}/env.nix) StateVersion;
+ ls = lib.filesystem.listFilesRecursive;
+in {
+ imports =
+ ls ./cli
+ ++ ls ./gui
+ ++ ls ./tui
+ ++ ls ./wayland;
+
+ home = {
+ file = {
+ ".config" = {
+ force = true;
+ recursive = true;
+ source = ../dotfiles/.config;
+ };
+ ".local" = {
+ force = true;
+ recursive = true;
+ source = ../dotfiles/.local;
+ };
+ };
+ homeDirectory = "/home/${username}";
+ stateVersion = StateVersion;
+ username = "${username}";
+ };
+
+ programs.home-manager.enable = true;
+}
diff --git a/home/gui/archiver/peazip.nix b/home/gui/archiver/peazip.nix
new file mode 100644
index 0000000..8b8801a
--- /dev/null
+++ b/home/gui/archiver/peazip.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ peazip
+ ];
+}
diff --git a/home/gui/browser/floorp.nix b/home/gui/browser/floorp.nix
new file mode 100644
index 0000000..6a1b126
--- /dev/null
+++ b/home/gui/browser/floorp.nix
@@ -0,0 +1,52 @@
+_: {
+ programs = {
+ floorp = {
+ enable = true;
+ languagePacks = ["en-US"];
+ policies = {
+ DisableAccounts = true;
+ DisableAppUpdate = true;
+ DisableFirefoxAccounts = true;
+ DisableFirefoxScreenshots = true;
+ DisableFirefoxStudies = true;
+ DisablePocket = true;
+ DisableTelemetry = true;
+ DisplayBookmarksToolbar = "newtab";
+ DisplayMenuBar = "default-off";
+ DontCheckDefaultBrowser = true;
+ EnableTrackingProtection = {
+ Cryptomining = true;
+ Fingerprinting = true;
+ Locked = true;
+ Value = true;
+ };
+ OverrideFirstRunPage = "";
+ OverridePostUpdatePage = "";
+ Preferences = {
+ "browser.contentblocking.category" = {
+ Value = "strict";
+ Status = "locked";
+ };
+ "browser.formfill.enable" = false;
+ "browser.newtabpage.activity-stream.feeds.section.topstories" = false;
+ "browser.newtabpage.activity-stream.feeds.snippets" = false;
+ "browser.newtabpage.activity-stream.section.highlights.includeBookmarks" = false;
+ "browser.newtabpage.activity-stream.section.highlights.includeDownloads" = false;
+ "browser.newtabpage.activity-stream.section.highlights.includePocket" = false;
+ "browser.newtabpage.activity-stream.section.highlights.includeVisited" = false;
+ "browser.newtabpage.activity-stream.showSponsored" = false;
+ "browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
+ "browser.newtabpage.activity-stream.system.showSponsored" = false;
+ "browser.search.suggest.enabled" = false;
+ "browser.search.suggest.enabled.private" = false;
+ "browser.topsites.contile.enabled" = false;
+ "browser.urlbar.showSearchSuggestionsFirst" = false;
+ "browser.urlbar.suggest.searches" = false;
+ "extensions.pocket.enabled" = false;
+ "extensions.screenshots.disabled" = true;
+ };
+ SearchBar = "unified";
+ };
+ };
+ };
+}
diff --git a/home/gui/code-editor&IDE/zed-editor.nix b/home/gui/code-editor&IDE/zed-editor.nix
new file mode 100644
index 0000000..94288a7
--- /dev/null
+++ b/home/gui/code-editor&IDE/zed-editor.nix
@@ -0,0 +1,82 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ nil
+ nixd
+ zed-editor
+ ];
+
+ # programs.zed-editor = {
+ # enable = true;
+ # package = pkgs.zed-editor-fhs;
+
+ # userSettings = {
+ # assistant = {
+ # enabled = false;
+ # version = "2";
+ # };
+ # auto_install_extensions = {
+ # catppuccin = true;
+ # catppucchin-icons = true;
+ # nix = true;
+ # };
+ # auto_update = false;
+ # base_keymap = "VSCode";
+ # features = {
+ # copilot = false;
+ # inline_completion_provider = "none";
+ # };
+ # hour_format = "hour24";
+ # icon_theme = {
+ # dark = "Catppuccin Mocha";
+ # light = "Catppuccin Mocha";
+ # mode = "system";
+ # };
+ # load_direnv = "shell_hook";
+ # lsp = {
+ # nix = {
+ # binary = {
+ # path_lookup = true;
+ # };
+ # };
+ # };
+ # show_whitespaces = "all";
+ # terminal = {
+ # alternate_scroll = "off";
+ # blinking = "off";
+ # button = false;
+ # copy_on_select = false;
+ # detect_venv = {
+ # on = {
+ # directories = [
+ # ".env"
+ # "env"
+ # ".venv"
+ # "venv"
+ # ];
+ # activate_script = "default";
+ # };
+ # };
+ # dock = "bottom";
+ # font_family = "JetBrainsMono Nerd Font";
+ # font_features = null;
+ # font_size = null;
+ # line_height = "comfortable";
+ # shell = "system";
+ # toolbar = {
+ # breadcrumbs = false;
+ # };
+ # option_as_meta = false;
+ # toolbar = {
+ # title = true;
+ # };
+ # working_directory = "current_project_directory";
+ # };
+ # theme = {
+ # dark = "Catppuccin Mocha";
+ # light = "Catppuccin Mocha";
+ # mode = "system";
+ # };
+ # vim_mode = false;
+ # };
+ # };
+}
diff --git a/home/gui/communication/legcord.nix b/home/gui/communication/legcord.nix
new file mode 100644
index 0000000..4ba3e18
--- /dev/null
+++ b/home/gui/communication/legcord.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ legcord
+ ];
+}
diff --git a/home/gui/communication/materialgram.nix b/home/gui/communication/materialgram.nix
new file mode 100644
index 0000000..8d0224c
--- /dev/null
+++ b/home/gui/communication/materialgram.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ materialgram
+ ];
+}
diff --git a/home/gui/ebook-reader/foliate.nix b/home/gui/ebook-reader/foliate.nix
new file mode 100644
index 0000000..985b8c6
--- /dev/null
+++ b/home/gui/ebook-reader/foliate.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ foliate
+ ];
+}
diff --git a/home/gui/file-manager/nemo.nix b/home/gui/file-manager/nemo.nix
new file mode 100644
index 0000000..2e19cfa
--- /dev/null
+++ b/home/gui/file-manager/nemo.nix
@@ -0,0 +1,14 @@
+{pkgs, ...}: {
+ dconf.settings = {
+ "org/nemo/preferences" = {
+ "date-font-choice" = "no-mono";
+ "date-format" = "iso";
+ "default-folder-viewer" = "list-view";
+ "show-hidden-files" = true;
+ };
+ };
+
+ home.packages = with pkgs; [
+ nemo
+ ];
+}
diff --git a/home/gui/file-sync/syncthingtray.nix b/home/gui/file-sync/syncthingtray.nix
new file mode 100644
index 0000000..d72a735
--- /dev/null
+++ b/home/gui/file-sync/syncthingtray.nix
@@ -0,0 +1,6 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ syncthing
+ syncthingtray
+ ];
+}
diff --git a/home/gui/image-viewer/oculante.nix b/home/gui/image-viewer/oculante.nix
new file mode 100644
index 0000000..27ef707
--- /dev/null
+++ b/home/gui/image-viewer/oculante.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ oculante
+ ];
+}
diff --git a/home/gui/localsend/localsend.nix b/home/gui/localsend/localsend.nix
new file mode 100644
index 0000000..8b56a97
--- /dev/null
+++ b/home/gui/localsend/localsend.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ localsend
+ ];
+}
diff --git a/home/gui/media-player/vlc.nix b/home/gui/media-player/vlc.nix
new file mode 100644
index 0000000..4ccdb40
--- /dev/null
+++ b/home/gui/media-player/vlc.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ vlc
+ ];
+}
diff --git a/home/gui/music-player/strawberry.nix b/home/gui/music-player/strawberry.nix
new file mode 100644
index 0000000..5b542d7
--- /dev/null
+++ b/home/gui/music-player/strawberry.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ strawberry
+ ];
+}
diff --git a/home/gui/office/onlyoffice.nix b/home/gui/office/onlyoffice.nix
new file mode 100644
index 0000000..2da7f65
--- /dev/null
+++ b/home/gui/office/onlyoffice.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ onlyoffice-bin
+ ];
+}
diff --git a/home/gui/password-manager/keepassxc.nix b/home/gui/password-manager/keepassxc.nix
new file mode 100644
index 0000000..aabcae9
--- /dev/null
+++ b/home/gui/password-manager/keepassxc.nix
@@ -0,0 +1,6 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ git-credential-keepassxc
+ keepassxc
+ ];
+}
diff --git a/home/gui/screencast/obs-studio.nix b/home/gui/screencast/obs-studio.nix
new file mode 100644
index 0000000..7f1087a
--- /dev/null
+++ b/home/gui/screencast/obs-studio.nix
@@ -0,0 +1,5 @@
+_: {
+ programs.obs-studio = {
+ enable = true;
+ };
+}
diff --git a/home/gui/terminal/alacritty.nix b/home/gui/terminal/alacritty.nix
new file mode 100644
index 0000000..e33c843
--- /dev/null
+++ b/home/gui/terminal/alacritty.nix
@@ -0,0 +1,5 @@
+_: {
+ programs.alacritty = {
+ enable = true;
+ };
+}
diff --git a/home/gui/virtual-machine-manager/virt-manager.nix b/home/gui/virtual-machine-manager/virt-manager.nix
new file mode 100644
index 0000000..560b7c0
--- /dev/null
+++ b/home/gui/virtual-machine-manager/virt-manager.nix
@@ -0,0 +1,21 @@
+{
+ hostname,
+ lib,
+ pkgs,
+ ...
+}: let
+ inherit (import ../../../hosts/${hostname}/env.nix) QEMU-VM-Use-Case;
+in
+ with lib;
+ mkIf QEMU-VM-Use-Case {
+ dconf.settings = {
+ "org/virt-manager/virt-manager/connections" = {
+ autoconnect = ["qemu:///system"];
+ uris = ["qemu:///system"];
+ };
+ };
+
+ home.packages = with pkgs; [
+ virt-manager
+ ];
+ }
diff --git a/home/tui/btop.nix b/home/tui/btop.nix
new file mode 100644
index 0000000..8f8c990
--- /dev/null
+++ b/home/tui/btop.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ btop
+ ];
+}
diff --git a/home/tui/nixvim/keymaps.nix b/home/tui/nixvim/keymaps.nix
new file mode 100644
index 0000000..b2ac14f
--- /dev/null
+++ b/home/tui/nixvim/keymaps.nix
@@ -0,0 +1,225 @@
+_: {
+ programs.nixvim = {
+ extraConfigLua = ''
+ function ToggleLineNumber()
+ if vim.wo.number then
+ vim.wo.number = false
+ else
+ vim.wo.number = true
+ vim.wo.relativenumber = false
+ end
+ end
+
+ function ToggleRelativeLineNumber()
+ if vim.wo.relativenumber then
+ vim.wo.relativenumber = false
+ else
+ vim.wo.relativenumber = true
+ vim.wo.number = false
+ end
+ end
+
+ function ToggleWrap()
+ vim.wo.wrap = not vim.wo.wrap
+ end
+
+ if vim.lsp.inlay_hint then
+ vim.keymap.set('n', 'uh', function()
+ vim.lsp.inlay_hint(0, nil)
+ end, { desc = 'Toggle Inlay Hints' })
+ end
+ '';
+ keymaps = [
+ {
+ action = " norm! ggVG";
+ key = "";
+ mode = "i";
+ options.desc = "Select all lines in buffer";
+ }
+ {
+ action = "c";
+ key = "wd";
+ mode = "n";
+ options = {
+ desc = "Delete window";
+ silent = true;
+ };
+ }
+ {
+ action = "s";
+ key = "-";
+ mode = "n";
+ options = {
+ desc = "Split window below";
+ silent = true;
+ };
+ }
+ {
+ action = "v";
+ key = "|";
+ mode = "n";
+ options = {
+ desc = "Split window right";
+ silent = true;
+ };
+ }
+ {
+ action = "m .+1==";
+ key = "";
+ mode = "n";
+ options.desc = "Move line down";
+ }
+ {
+ action = "m .-2==";
+ key = "";
+ mode = "n";
+ options.desc = "Move line up";
+ }
+ {
+ action = "quitall";
+ key = "qq";
+ mode = "n";
+ options = {
+ desc = "Quit all";
+ silent = true;
+ };
+ }
+ {
+ action = "w";
+ key = "";
+ mode = "n";
+ options = {
+ desc = "Save file";
+ silent = true;
+ };
+ }
+ {
+ action = "j";
+ key = "";
+ mode = "n";
+ options.desc = "Move To Window Down";
+ }
+ {
+ action = "h";
+ key = "";
+ mode = "n";
+ options.desc = "Move To Window Left";
+ }
+ {
+ action = "l";
+ key = "";
+ mode = "n";
+ options.desc = "Move To Window Right";
+ }
+ {
+ action = "k";
+ key = "";
+ mode = "n";
+ options.desc = "Move To Window Up";
+ }
+ {
+ action = "\"_d";
+ key = "D";
+ mode = [
+ "n"
+ "v"
+ ];
+ options.desc = "Delete to void register";
+ }
+ {
+ action = "noh";
+ key = "";
+ mode = [
+ "n"
+ "i"
+ ];
+ options = {
+ desc = "Escape and clear hlsearch";
+ silent = true;
+ };
+ }
+ {
+ action = ":lua ToggleLineNumber()";
+ key = "ul";
+ mode = "n";
+ options = {
+ desc = "Toggle Line Numbers";
+ silent = true;
+ };
+ }
+ {
+ action = ":lua ToggleRelativeLineNumber()";
+ key = "uL";
+ mode = "n";
+ options = {
+ desc = "Toggle Relative Line Numbers";
+ silent = true;
+ };
+ }
+ {
+ action = ":lua ToggleWrap()";
+ key = "uw";
+ mode = "n";
+ options = {
+ desc = "Toggle Line Wrap";
+ silent = true;
+ };
+ }
+ {
+ action = "\"+y";
+ key = "y";
+ mode = [
+ "n"
+ "v"
+ ];
+ options.desc = "Copy to system clipboard";
+ }
+ {
+ action = ":m '>+1gv=gv";
+ key = "";
+ mode = "v";
+ options.desc = "Move line Down";
+ }
+ {
+ action = ":m '<-2gv=gv";
+ key = "";
+ mode = "v";
+ options.desc = "Move line up";
+ }
+ {
+ action = "q" = {
+ action = "setloclist";
+ desc = "Open diagnostic [Q]uickfix list";
+ };
+ };
+
+ extra = [
+ {
+ mode = "n";
+ key = "gd";
+ action.__raw = "require('telescope.builtin').lsp_definitions";
+ options = {
+ desc = "LSP: [G]oto [D]efinition";
+ };
+ }
+ {
+ mode = "n";
+ key = "gr";
+ action.__raw = "require('telescope.builtin').lsp_references";
+ options = {
+ desc = "LSP: [G]oto [R]eferences";
+ };
+ }
+ {
+ mode = "n";
+ key = "gI";
+ action.__raw = "require('telescope.builtin').lsp_implementations";
+ options = {
+ desc = "LSP: [G]oto [I]mplementation";
+ };
+ }
+ {
+ mode = "n";
+ key = "D";
+ action.__raw = "require('telescope.builtin').lsp_type_definitions";
+ options = {
+ desc = "LSP: Type [D]efinition";
+ };
+ }
+ {
+ mode = "n";
+ key = "ds";
+ action.__raw = "require('telescope.builtin').lsp_document_symbols";
+ options = {
+ desc = "LSP: [D]ocument [S]ymbols";
+ };
+ }
+ {
+ mode = "n";
+ key = "ws";
+ action.__raw = "require('telescope.builtin').lsp_dynamic_workspace_symbols";
+ options = {
+ desc = "LSP: [W]orkspace [S]ymbols";
+ };
+ }
+ ];
+
+ lspBuf = {
+ "rn" = {
+ action = "rename";
+ desc = "LSP: [R]e[n]ame";
+ };
+ "ca" = {
+ action = "code_action";
+ desc = "LSP: [C]ode [A]ction";
+ };
+ "gD" = {
+ action = "declaration";
+ desc = "LSP: [G]oto [D]eclaration";
+ };
+ };
+ };
+
+ servers = {
+ # clangd = {
+ # enable = true;
+ # };
+ # lua_ls = {
+ # enable = true;
+ # settings = {
+ # completion = {
+ # callSnippet = "Replace";
+ # };
+ # };
+ # };
+ # gopls = {
+ # enable = true;
+ # };
+ # pyright = {
+ # enable = true;
+ # };
+ # rust_analyzer = {
+ # enable = true;
+ # };
+ # ...etc. See `https://nix-community.github.io/nixvim/plugins/lsp` for a list of pre-configured LSPs
+
+ # Some languages (like typscript) have entire language plugins that can be useful:
+ # `https://nix-community.github.io/nixvim/plugins/typescript-tools/index.html?highlight=typescript-tools#pluginstypescript-toolspackage`
+
+ # But for many setups the LSP (`ts_ls`) will work just fine
+ ts_ls = {
+ enable = true;
+ };
+ };
+ };
+ };
+ };
+}
diff --git a/home/tui/nixvim/plugins/mini.nix b/home/tui/nixvim/plugins/mini.nix
new file mode 100755
index 0000000..dd4b16d
--- /dev/null
+++ b/home/tui/nixvim/plugins/mini.nix
@@ -0,0 +1,23 @@
+_: {
+ programs.nixvim = {
+ plugins.mini = {
+ enable = true;
+
+ modules = {
+ ai = {
+ n_lines = 500;
+ };
+ statusline = {
+ use_icons.__raw = "vim.g.have_nerd_font";
+ };
+ surround = {
+ };
+ };
+ };
+ extraConfigLua = ''
+ require('mini.statusline').section_location = function()
+ return '%2l:%-2v'
+ end
+ '';
+ };
+}
diff --git a/home/tui/nixvim/plugins/nvim-cmp.nix b/home/tui/nixvim/plugins/nvim-cmp.nix
new file mode 100755
index 0000000..eb8df75
--- /dev/null
+++ b/home/tui/nixvim/plugins/nvim-cmp.nix
@@ -0,0 +1,56 @@
+_: {
+ programs.nixvim = {
+ plugins.cmp = {
+ enable = true;
+
+ settings = {
+ completion = {
+ completeopt = "menu,menuone,noinsert";
+ };
+
+ mapping = {
+ "" = "cmp.mapping.select_next_item()";
+ "" = "cmp.mapping.select_prev_item()";
+ "" = "cmp.mapping.scroll_docs(-4)";
+ "" = "cmp.mapping.scroll_docs(4)";
+ "" = "cmp.mapping.confirm { select = true }";
+ "" = "cmp.mapping.complete {}";
+ "" = ''
+ cmp.mapping(function()
+ if luasnip.expand_or_locally_jumpable() then
+ luasnip.expand_or_jump()
+ end
+ end, { 'i', 's' })
+ '';
+ "" = ''
+ cmp.mapping(function()
+ if luasnip.locally_jumpable(-1) then
+ luasnip.jump(-1)
+ end
+ end, { 'i', 's' })
+ '';
+ };
+
+ snippet = {
+ expand = ''
+ function(args)
+ require('luasnip').lsp_expand(args.body)
+ end
+ '';
+ };
+
+ sources = [
+ {
+ name = "luasnip";
+ }
+ {
+ name = "nvim_lsp";
+ }
+ {
+ name = "path";
+ }
+ ];
+ };
+ };
+ };
+}
diff --git a/home/tui/nixvim/plugins/nvim-tree.nix b/home/tui/nixvim/plugins/nvim-tree.nix
new file mode 100644
index 0000000..431d30d
--- /dev/null
+++ b/home/tui/nixvim/plugins/nvim-tree.nix
@@ -0,0 +1,17 @@
+_: {
+ programs.nixvim = {
+ plugins.nvim-tree = {
+ enable = true;
+ };
+
+ keymaps = [
+ {
+ key = "";
+ action = "NvimTreeToggle";
+ options = {
+ desc = "NvimTree Toggle";
+ };
+ }
+ ];
+ };
+}
diff --git a/home/tui/nixvim/plugins/telescope.nix b/home/tui/nixvim/plugins/telescope.nix
new file mode 100755
index 0000000..54926da
--- /dev/null
+++ b/home/tui/nixvim/plugins/telescope.nix
@@ -0,0 +1,137 @@
+_: {
+ programs.nixvim = {
+ plugins.telescope = {
+ enable = true;
+
+ extensions = {
+ fzf-native.enable = true;
+ ui-select.enable = true;
+ };
+
+ keymaps = {
+ "sh" = {
+ mode = "n";
+ action = "help_tags";
+ options = {
+ desc = "[S]earch [H]elp";
+ };
+ };
+ "sk" = {
+ mode = "n";
+ action = "keymaps";
+ options = {
+ desc = "[S]earch [K]eymaps";
+ };
+ };
+ "sf" = {
+ mode = "n";
+ action = "find_files";
+ options = {
+ desc = "[S]earch [F]iles";
+ };
+ };
+ "ss" = {
+ mode = "n";
+ action = "builtin";
+ options = {
+ desc = "[S]earch [S]elect Telescope";
+ };
+ };
+ "sw" = {
+ mode = "n";
+ action = "grep_string";
+ options = {
+ desc = "[S]earch current [W]ord";
+ };
+ };
+ "sg" = {
+ mode = "n";
+ action = "live_grep";
+ options = {
+ desc = "[S]earch by [G]rep";
+ };
+ };
+ "sd" = {
+ mode = "n";
+ action = "diagnostics";
+ options = {
+ desc = "[S]earch [D]iagnostics";
+ };
+ };
+ "sr" = {
+ mode = "n";
+ action = "resume";
+ options = {
+ desc = "[S]earch [R]esume";
+ };
+ };
+ "s" = {
+ mode = "n";
+ action = "oldfiles";
+ options = {
+ desc = "[S]earch Recent Files ('.' for repeat)";
+ };
+ };
+ "" = {
+ mode = "n";
+ action = "buffers";
+ options = {
+ desc = "[ ] Find existing buffers";
+ };
+ };
+ };
+ settings = {
+ extensions.__raw = "{ ['ui-select'] = { require('telescope.themes').get_dropdown() } }";
+ };
+ };
+
+ keymaps = [
+ {
+ mode = "n";
+ key = "/";
+ action.__raw = ''
+ function()
+ require('telescope.builtin').current_buffer_fuzzy_find(
+ require('telescope.themes').get_dropdown {
+ winblend = 10,
+ previewer = false
+ }
+ )
+ end
+ '';
+ options = {
+ desc = "[/] Fuzzily search in current buffer";
+ };
+ }
+ {
+ mode = "n";
+ key = "s/";
+ action.__raw = ''
+ function()
+ require('telescope.builtin').live_grep {
+ grep_open_files = true,
+ prompt_title = 'Live Grep in Open Files'
+ }
+ end
+ '';
+ options = {
+ desc = "[S]earch [/] in Open Files";
+ };
+ }
+ {
+ mode = "n";
+ key = "sn";
+ action.__raw = ''
+ function()
+ require('telescope.builtin').find_files {
+ cwd = vim.fn.stdpath 'config'
+ }
+ end
+ '';
+ options = {
+ desc = "[S]earch [N]eovim files";
+ };
+ }
+ ];
+ };
+}
diff --git a/home/tui/nixvim/plugins/toggleterm.nix b/home/tui/nixvim/plugins/toggleterm.nix
new file mode 100644
index 0000000..7689496
--- /dev/null
+++ b/home/tui/nixvim/plugins/toggleterm.nix
@@ -0,0 +1,66 @@
+_: {
+ programs.nixvim = {
+ keymaps = [
+ {
+ action = "2ToggleTerm";
+ key = "";
+ mode = "t";
+ options.desc = "Open/Close Terminal 2";
+ }
+ {
+ action = "wincmd j";
+ key = "";
+ mode = "t";
+ options.desc = "Go to Down window";
+ }
+ {
+ action = "wincmd h";
+ key = "";
+ mode = "t";
+ options.desc = "Go to Left window";
+ }
+ {
+ action = "wincmd l";
+ key = "";
+ mode = "t";
+ options.desc = "Go to Right window";
+ }
+ {
+ action = "wincmd k";
+ key = "";
+ mode = "t";
+ options.desc = "Go to Up window";
+ }
+ ];
+ plugins.toggleterm = {
+ enable = true;
+ settings = {
+ close_on_exit = true;
+ direction = "horizontal"; # 'vertical' | 'horizontal' | 'tab' | 'float'
+ float_opts = {
+ border = "single"; # 'single' | 'double' | 'shadow' | 'curved' | ... other options supported by win open
+ height = 20;
+ width = 80;
+ winblend = 0;
+ };
+ hide_numbers = true;
+ insert_mappings = true;
+ open_mapping = "[[]]";
+ persist_mode = true;
+ shade_terminals = true;
+ shell = "nu";
+ size = ''
+ function(term)
+ if term.direction == "horizontal" then
+ return 30
+ elseif term.direction == "vertical" then
+ return vim.o.columns * 0.4
+ end
+ end
+ '';
+ start_in_insert = true;
+ terminal_mappings = true;
+ };
+ };
+ };
+}
diff --git a/home/tui/nixvim/plugins/treesitter.nix b/home/tui/nixvim/plugins/treesitter.nix
new file mode 100755
index 0000000..0f12a82
--- /dev/null
+++ b/home/tui/nixvim/plugins/treesitter.nix
@@ -0,0 +1,35 @@
+_: {
+ programs.nixvim = {
+ plugins.treesitter = {
+ enable = true;
+
+ settings = {
+ ensureInstalled = [
+ "bash"
+ "c"
+ "diff"
+ "html"
+ "lua"
+ "luadoc"
+ "markdown"
+ "markdown_inline"
+ "query"
+ "vim"
+ "vimdoc"
+ ];
+
+ highlight = {
+ additional_vim_regex_highlighting = true;
+ enable = true;
+ };
+
+ indent = {
+ enable = true;
+ disable = [
+ "ruby"
+ ];
+ };
+ };
+ };
+ };
+}
diff --git a/home/tui/nixvim/plugins/ui.nix b/home/tui/nixvim/plugins/ui.nix
new file mode 100644
index 0000000..ac60531
--- /dev/null
+++ b/home/tui/nixvim/plugins/ui.nix
@@ -0,0 +1,189 @@
+_: {
+ programs.nixvim = {
+ plugins = {
+ alpha = {
+ enable = true;
+ layout = let
+ padding = val: {
+ type = "padding";
+ inherit val;
+ };
+ in [
+ (padding 4)
+ {
+ opts = {
+ hl = "AlphaHeader";
+ position = "center";
+ };
+ type = "text";
+ val = [
+ " ███╗ ██╗ ███████╗ ██████╗ ██╗ ██╗ ██╗ ███╗ ███╗"
+ " ████╗ ██║ ██╔════╝██╔═══██╗ ██║ ██║ ██║ ████╗ ████║"
+ " ██╔██╗ ██║ █████╗ ██║ ██║ ██║ ██║ ██║ ██╔████╔██║"
+ " ██║╚██╗██║ ██╔══╝ ██║ ██║ ╚██╗ ██╔╝ ██║ ██║╚██╔╝██║"
+ " ██║ ╚████║ ███████╗╚██████╔╝ ╚████╔╝ ██║ ██║ ╚═╝ ██║"
+ " ╚═╝ ╚═══╝ ╚══════╝ ╚═════╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝"
+ ];
+ }
+ (padding 6)
+ {
+ type = "button";
+ val = " Find File";
+ on_press.raw = "require('telescope.builtin').find_files";
+ opts = {
+ keymap = [
+ "n"
+ "f"
+ ":Telescope find_files "
+ {
+ noremap = true;
+ silent = true;
+ nowait = true;
+ }
+ ];
+ shortcut = "f";
+
+ position = "center";
+ cursor = 3;
+ width = 40;
+ align_shortcut = "right";
+ hl_shortcut = "Keyword";
+ };
+ }
+ (padding 1)
+ {
+ type = "button";
+ val = " New File";
+ on_press.__raw = "function() vim.cmd[[ene]] end";
+ opts = {
+ keymap = [
+ "n"
+ "n"
+ ":ene startinsert "
+ {
+ noremap = true;
+ silent = true;
+ nowait = true;
+ }
+ ];
+ shortcut = "n";
+
+ position = "center";
+ cursor = 3;
+ width = 40;
+ align_shortcut = "right";
+ hl_shortcut = "Keyword";
+ };
+ }
+ (padding 1)
+ {
+ type = "button";
+ val = " Recent Files";
+ on_press.raw = "require('telescope.builtin').oldfiles";
+ opts = {
+ keymap = [
+ "n"
+ "r"
+ ":Telescope oldfiles "
+ {
+ noremap = true;
+ silent = true;
+ nowait = true;
+ }
+ ];
+ shortcut = "r";
+
+ position = "center";
+ cursor = 3;
+ width = 40;
+ align_shortcut = "right";
+ hl_shortcut = "Keyword";
+ };
+ }
+ (padding 1)
+ {
+ type = "button";
+ val = " Find Word";
+ on_press.raw = "require('telescope.builtin').live_grep";
+ opts = {
+ keymap = [
+ "n"
+ "w"
+ ":Telescope live_grep "
+ {
+ noremap = true;
+ silent = true;
+ nowait = true;
+ }
+ ];
+ shortcut = "w";
+
+ position = "center";
+ cursor = 3;
+ width = 40;
+ align_shortcut = "right";
+ hl_shortcut = "Keyword";
+ };
+ }
+ (padding 1)
+ {
+ type = "button";
+ val = " Restore Session";
+ on_press.raw = "require('persistence').load()";
+ opts = {
+ keymap = [
+ "n"
+ "s"
+ ":lua require('persistence').load()"
+ {
+ noremap = true;
+ silent = true;
+ nowait = true;
+ }
+ ];
+ shortcut = "s";
+
+ position = "center";
+ cursor = 3;
+ width = 40;
+ align_shortcut = "right";
+ hl_shortcut = "Keyword";
+ };
+ }
+ (padding 1)
+ {
+ type = "button";
+ val = " Quit Neovim";
+ on_press.__raw = "function() vim.cmd[[qa]] end";
+ opts = {
+ keymap = [
+ "n"
+ "q"
+ ":qa"
+ {
+ noremap = true;
+ silent = true;
+ nowait = true;
+ }
+ ];
+ shortcut = "q";
+
+ position = "center";
+ cursor = 3;
+ width = 40;
+ align_shortcut = "right";
+ hl_shortcut = "Keyword";
+ };
+ }
+ ];
+ };
+ dressing.enable = true;
+ neoscroll.enable = true;
+ nui.enable = true;
+ persistence.enable = true;
+ todo-comments.enable = true;
+ trim.enable = true;
+ web-devicons.enable = true;
+ };
+ };
+}
diff --git a/home/tui/nixvim/plugins/which-key.nix b/home/tui/nixvim/plugins/which-key.nix
new file mode 100755
index 0000000..18d227a
--- /dev/null
+++ b/home/tui/nixvim/plugins/which-key.nix
@@ -0,0 +1,43 @@
+_: {
+ programs.nixvim = {
+ plugins.which-key = {
+ enable = true;
+ settings = {
+ spec = [
+ {
+ __unkeyed-1 = "c";
+ group = "[C]ode";
+ }
+ {
+ __unkeyed-1 = "d";
+ group = "[D]ocument";
+ }
+ {
+ __unkeyed-1 = "h";
+ group = "Git [H]unk";
+ mode = [
+ "n"
+ "v"
+ ];
+ }
+ {
+ __unkeyed-1 = "r";
+ group = "[R]ename";
+ }
+ {
+ __unkeyed-1 = "s";
+ group = "[S]earch";
+ }
+ {
+ __unkeyed-1 = "t";
+ group = "[T]oggle";
+ }
+ {
+ __unkeyed-1 = "w";
+ group = "[W]orkspace";
+ }
+ ];
+ };
+ };
+ };
+}
diff --git a/home/tui/termshark.nix b/home/tui/termshark.nix
new file mode 100644
index 0000000..2d04be3
--- /dev/null
+++ b/home/tui/termshark.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ termshark
+ ];
+}
diff --git a/home/tui/zellij.nix b/home/tui/zellij.nix
new file mode 100644
index 0000000..f134261
--- /dev/null
+++ b/home/tui/zellij.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ zellij
+ ];
+}
diff --git a/home/wayland/blueman-applet.nix b/home/wayland/blueman-applet.nix
new file mode 100644
index 0000000..96a08d9
--- /dev/null
+++ b/home/wayland/blueman-applet.nix
@@ -0,0 +1,5 @@
+{hostname, ...}: let
+ inherit (import ../../hosts/${hostname}/env.nix) Bluetooth;
+in {
+ services.blueman-applet.enable = Bluetooth;
+}
diff --git a/home/wayland/brightnessctl.nix b/home/wayland/brightnessctl.nix
new file mode 100644
index 0000000..f5103b0
--- /dev/null
+++ b/home/wayland/brightnessctl.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ brightnessctl
+ ];
+}
diff --git a/home/wayland/easyeffects.nix b/home/wayland/easyeffects.nix
new file mode 100644
index 0000000..b574958
--- /dev/null
+++ b/home/wayland/easyeffects.nix
@@ -0,0 +1,3 @@
+_: {
+ services.easyeffects.enable = true;
+}
diff --git a/home/wayland/fcitx5.nix b/home/wayland/fcitx5.nix
new file mode 100644
index 0000000..5f381ea
--- /dev/null
+++ b/home/wayland/fcitx5.nix
@@ -0,0 +1,25 @@
+{pkgs, ...}: {
+ home.file.".local/share/fcitx5/rime" = {
+ force = true;
+ recursive = true;
+ source = pkgs.fetchFromGitHub {
+ hash = "sha256-s3r8cdEliiPnKWs64Wgi0rC9Ngl1mkIrLnr2tIcyXWw=";
+ owner = "iDvel";
+ repo = "rime-ice";
+ tag = "2025.04.06";
+ };
+ };
+
+ i18n.inputMethod = {
+ enable = true;
+ fcitx5 = {
+ addons = with pkgs; [
+ fcitx5-gtk
+ fcitx5-rime
+ libsForQt5.fcitx5-qt
+ ];
+ waylandFrontend = true;
+ };
+ type = "fcitx5";
+ };
+}
diff --git a/home/wayland/fuzzel.nix b/home/wayland/fuzzel.nix
new file mode 100644
index 0000000..fa9991d
--- /dev/null
+++ b/home/wayland/fuzzel.nix
@@ -0,0 +1,5 @@
+_: {
+ programs.fuzzel = {
+ enable = true;
+ };
+}
diff --git a/home/wayland/hyprland.nix b/home/wayland/hyprland.nix
new file mode 100644
index 0000000..b3644dd
--- /dev/null
+++ b/home/wayland/hyprland.nix
@@ -0,0 +1,60 @@
+{
+ hostname,
+ lib,
+ pkgs,
+ ...
+}:
+let
+ inherit (import ../../hosts/${hostname}/env.nix)
+ GPU-Nvidia
+ MonitorSettings
+ KeyboardLayout
+ ScaleLevel
+ WM
+ ;
+in
+with lib;
+mkIf (WM == "Hyprland") {
+ home.packages = with pkgs; [
+ xorg.xprop
+ ];
+ wayland.windowManager.hyprland = {
+ enable = true;
+ plugins = [
+ pkgs.hyprlandPlugins.hy3
+ ];
+ systemd = {
+ enable = true;
+ variables = [ "--all" ];
+ };
+ xwayland.enable = true;
+ extraConfig = concatStrings [
+ ''
+ ${MonitorSettings}
+ $KEYBOARDLAYOUT = ${KeyboardLayout}
+ $SCALE = ${ScaleLevel}
+ source = ~/.config/hypr/hyprland/*
+ ''
+ ];
+ settings = mkIf GPU-Nvidia {
+ env = [
+ "__GLX_VENDOR_LIBRARY_NAME,nvidia"
+ "GBM_BACKEND,nvidia-drm"
+ "LIBVA_DRIVER_NAME,nvidia"
+ "NVD_BACKEND,direct"
+ "WLR_NO_HARDWARE_CURSORS,1"
+ ];
+ };
+ };
+ xdg.portal = {
+ config = {
+ common = {
+ default = [ "gtk" ];
+ };
+ };
+ extraPortals = [
+ pkgs.xdg-desktop-portal-gtk
+ pkgs.xdg-desktop-portal-hyprland
+ ];
+ };
+}
diff --git a/home/wayland/hyprlock.nix b/home/wayland/hyprlock.nix
new file mode 100644
index 0000000..d2ace82
--- /dev/null
+++ b/home/wayland/hyprlock.nix
@@ -0,0 +1,5 @@
+_: {
+ programs.hyprlock = {
+ enable = true;
+ };
+}
diff --git a/home/wayland/hyprpolkitagent.nix b/home/wayland/hyprpolkitagent.nix
new file mode 100644
index 0000000..eaf5705
--- /dev/null
+++ b/home/wayland/hyprpolkitagent.nix
@@ -0,0 +1,3 @@
+_: {
+ services.hyprpolkitagent.enable = true;
+}
diff --git a/home/wayland/linux-wifi-hotspot.nix b/home/wayland/linux-wifi-hotspot.nix
new file mode 100644
index 0000000..5efc5fc
--- /dev/null
+++ b/home/wayland/linux-wifi-hotspot.nix
@@ -0,0 +1,15 @@
+{
+ hostname,
+ lib,
+ pkgs,
+ ...
+}: let
+ inherit (import ../../hosts/${hostname}/env.nix) HotSpot-Use-Case;
+in
+ with lib;
+ mkIf HotSpot-Use-Case
+ {
+ home.packages = with pkgs; [
+ linux-wifi-hotspot
+ ];
+ }
diff --git a/home/wayland/nm-applet.nix b/home/wayland/nm-applet.nix
new file mode 100644
index 0000000..eee5e31
--- /dev/null
+++ b/home/wayland/nm-applet.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ networkmanagerapplet
+ ];
+}
diff --git a/home/wayland/playerctl.nix b/home/wayland/playerctl.nix
new file mode 100644
index 0000000..c8516af
--- /dev/null
+++ b/home/wayland/playerctl.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ playerctl
+ ];
+}
diff --git a/home/wayland/pwvucontrol.nix b/home/wayland/pwvucontrol.nix
new file mode 100644
index 0000000..365c45b
--- /dev/null
+++ b/home/wayland/pwvucontrol.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ pwvucontrol
+ ];
+}
diff --git a/home/wayland/screenshot.nix b/home/wayland/screenshot.nix
new file mode 100644
index 0000000..91fafa3
--- /dev/null
+++ b/home/wayland/screenshot.nix
@@ -0,0 +1,8 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ grim
+ jq
+ slurp
+ swappy
+ ];
+}
diff --git a/home/wayland/swaync.nix b/home/wayland/swaync.nix
new file mode 100644
index 0000000..48c9c9a
--- /dev/null
+++ b/home/wayland/swaync.nix
@@ -0,0 +1,3 @@
+_: {
+ services.swaync.enable = true;
+}
diff --git a/home/wayland/swayosd.nix b/home/wayland/swayosd.nix
new file mode 100644
index 0000000..5bc23bd
--- /dev/null
+++ b/home/wayland/swayosd.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ swayosd
+ ];
+}
diff --git a/home/wayland/swww.nix b/home/wayland/swww.nix
new file mode 100644
index 0000000..6cf8ed5
--- /dev/null
+++ b/home/wayland/swww.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ swww
+ ];
+}
diff --git a/home/wayland/theme.nix b/home/wayland/theme.nix
new file mode 100644
index 0000000..f2f06a7
--- /dev/null
+++ b/home/wayland/theme.nix
@@ -0,0 +1,51 @@
+{pkgs, ...}: {
+ fonts.fontconfig = {
+ defaultFonts = {
+ emoji = ["Noto Color Emoji"];
+ monospace = ["JetBrainsMono Nerd Font Mono"];
+ sansSerif = ["Sarasa Gothic SC"];
+ serif = ["Sarasa Gothic SC"];
+ };
+ enable = true;
+ };
+
+ gtk = {
+ gtk3.extraConfig = {
+ gtk-application-prefer-dark-theme = true;
+ };
+ gtk4.extraConfig = {
+ gtk-application-prefer-dark-theme = true;
+ };
+ iconTheme = {
+ name = "Papirus-Dark";
+ package = pkgs.papirus-icon-theme;
+ };
+ };
+
+ home.packages = with pkgs; [
+ libsForQt5.qtstyleplugin-kvantum
+ libsForQt5.qt5ct
+ qt6ct
+ ];
+
+ qt = {
+ enable = true;
+ style.name = "kvantum";
+ };
+
+ stylix = {
+ autoEnable = true;
+ targets = {
+ fcitx5.enable = false;
+ floorp.enable = false;
+ hyprland.enable = false;
+ kde.enable = false;
+ mpv.enable = false;
+ nixvim.enable = false;
+ sway.enable = false;
+ waybar.enable = false;
+ yazi.enable = false;
+ zed.enable = false;
+ };
+ };
+}
diff --git a/home/wayland/waybar.nix b/home/wayland/waybar.nix
new file mode 100644
index 0000000..e64891e
--- /dev/null
+++ b/home/wayland/waybar.nix
@@ -0,0 +1,5 @@
+_: {
+ programs.waybar = {
+ enable = true;
+ };
+}
diff --git a/home/wayland/waytrogen.nix b/home/wayland/waytrogen.nix
new file mode 100644
index 0000000..415455e
--- /dev/null
+++ b/home/wayland/waytrogen.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ waytrogen
+ ];
+}
diff --git a/home/wayland/wl-clipboard-rs.nix b/home/wayland/wl-clipboard-rs.nix
new file mode 100644
index 0000000..6f36a6f
--- /dev/null
+++ b/home/wayland/wl-clipboard-rs.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ wl-clipboard-rs
+ ];
+}
diff --git a/home/wayland/wl-gammarelay-rs.nix b/home/wayland/wl-gammarelay-rs.nix
new file mode 100644
index 0000000..97b219e
--- /dev/null
+++ b/home/wayland/wl-gammarelay-rs.nix
@@ -0,0 +1,5 @@
+{pkgs, ...}: {
+ home.packages = with pkgs; [
+ wl-gammarelay-rs
+ ];
+}
diff --git a/home/wayland/wlogout.nix b/home/wayland/wlogout.nix
new file mode 100644
index 0000000..c749348
--- /dev/null
+++ b/home/wayland/wlogout.nix
@@ -0,0 +1,5 @@
+_: {
+ programs.wlogout = {
+ enable = true;
+ };
+}
diff --git a/home/wayland/xdg.nix b/home/wayland/xdg.nix
new file mode 100644
index 0000000..a30c1ee
--- /dev/null
+++ b/home/wayland/xdg.nix
@@ -0,0 +1,106 @@
+{config, ...}: {
+ xdg = {
+ enable = true;
+ mimeApps = let
+ archiver-extract-smart = ["peazip-extract-smart.desktop"];
+ archiver-useless-options = [
+ "peazip-extract.desktop"
+ "peazip-extract-desktop.desktop"
+ "peazip-extract-documents.desktop"
+ "peazip-extract-downloads.desktop"
+ "peazip-extract-here.desktop"
+ ];
+ browser = ["brave-browser.desktop"];
+ editor = ["dev.zed.Zed.desktop"];
+ filemanager = ["nemo.desktop"];
+ image-viewer = ["oculante.desktop"];
+ media-player = ["vlc.desktop"];
+ in {
+ associations = {
+ added = {
+ "application/x-directory" = ["peazip-add-to-archive.desktop"];
+ "inode/directory" = ["peazip-add-to-archive.desktop"];
+ };
+ removed = {
+ "application/iso" = archiver-useless-options;
+ "application/x-7z-compressed" = archiver-useless-options;
+ "application/x-ace-compressed" = archiver-useless-options;
+ "application/x-bzip2" = archiver-useless-options;
+ "application/x-gzip" = archiver-useless-options;
+ "application/x-rar-compressed" = archiver-useless-options;
+ "application/x-tar" = archiver-useless-options;
+ "application/zip" = archiver-useless-options;
+ };
+ };
+ enable = true;
+ defaultApplications = {
+ "application/iso" = archiver-extract-smart;
+ "application/zip" = archiver-extract-smart;
+ "application/x-7z-compressed" = archiver-extract-smart;
+ "application/x-ace-compressed" = archiver-useless-options;
+ "application/x-bzip2" = archiver-extract-smart;
+ "application/x-gzip" = archiver-extract-smart;
+ "application/x-rar-compressed" = archiver-extract-smart;
+ "application/x-tar" = archiver-extract-smart;
+
+ "application/json" = browser;
+ "application/pdf" = browser;
+ "application/rdf+xml" = browser;
+ "application/rss+xml" = browser;
+ "application/xhtml+xml" = browser;
+ "application/xhtml_xml" = browser;
+ "application/xml" = browser;
+ "application/x-extension-htm" = browser;
+ "application/x-extension-html" = browser;
+ "application/x-extension-shtml" = browser;
+ "application/x-extension-xht" = browser;
+ "application/x-extension-xhtml" = browser;
+ "text/html" = browser;
+ "text/xml" = browser;
+ "x-scheme-handler/http" = browser;
+ "x-scheme-handler/https" = browser;
+ "x-scheme-handler/unknown" = browser;
+
+ "application/x-wine-extension-ini" = editor;
+ "text/plain" = editor;
+
+ "x-scheme-handler/about" = filemanager;
+ "x-scheme-handler/ftp" = filemanager;
+
+ "image/*" = image-viewer;
+ "image/avif" = image-viewer;
+ "image/gif" = image-viewer;
+ "image/jpeg" = image-viewer;
+ "image/png" = image-viewer;
+ "image/webp" = image-viewer;
+
+ "audio/*" = media-player;
+ "video/*" = media-player;
+
+ "x-scheme-handler/tg" = ["io.github.kukuruzka165.materialgram.desktop"];
+ };
+ };
+ portal = {
+ config = {
+ common = {
+ "org.freedesktop.impl.portal.FileChooser" = "gtk";
+ };
+ };
+ enable = true;
+ };
+ userDirs = {
+ enable = true;
+ createDirectories = false;
+ documents = "$HOME/Documents";
+ download = "$HOME/Downloads";
+ music = "$HOME/Music";
+ pictures = "$HOME/Pictures";
+ publicShare = "/var/empty";
+ templates = "/var/empty";
+ videos = "$HOME/Videos";
+ extraConfig = {
+ XDG_SCREENSHOTS_DIR = "${config.xdg.userDirs.pictures}/Screenshots";
+ };
+ };
+ };
+}
diff --git a/hosts/default.nix b/hosts/default.nix
new file mode 100644
index 0000000..2a0aefb
--- /dev/null
+++ b/hosts/default.nix
@@ -0,0 +1,21 @@
+{
+ hostname,
+ inputs,
+ username,
+ ...
+}: {
+ imports = with inputs; [
+ ./${hostname}
+ chaotic.nixosModules.default
+ daeuniverse.nixosModules.daed
+ disko.nixosModules.disko
+ stylix.nixosModules.stylix
+ home-manager.nixosModules.home-manager
+ {
+ home-manager = {
+ extraSpecialArgs = {inherit hostname inputs username;};
+ users.${username} = import ../home;
+ };
+ }
+ ];
+}
diff --git a/hosts/example/default.nix b/hosts/example/default.nix
new file mode 100644
index 0000000..3f69c62
--- /dev/null
+++ b/hosts/example/default.nix
@@ -0,0 +1,32 @@
+{
+ lib,
+ pkgs,
+ username,
+ ...
+}: {
+ imports =
+ [
+ ./hardware.nix
+ ]
+ ++ lib.filesystem.listFilesRecursive ../../modules;
+
+ # Define users
+ # If use nixos-anywhere to install, hashedPassword should be declared before installation
+ users = {
+ # users.root = {
+ # hashedPassword = "xxxxxx"; could be generated by mkpasswd
+ # };
+ users."${username}" = {
+ extraGroups = [
+ "libvirtd"
+ "networkmanager"
+ "wheel"
+ ];
+ # hashedPassword = "";
+ homeMode = "755";
+ ignoreShellProgramCheck = true;
+ isNormalUser = true;
+ shell = pkgs.nushell;
+ };
+ };
+}
diff --git a/hosts/example/env.nix b/hosts/example/env.nix
new file mode 100644
index 0000000..d73485b
--- /dev/null
+++ b/hosts/example/env.nix
@@ -0,0 +1,66 @@
+{
+ # Specific Use Cases
+ ## Hardware related
+ Bluetooth = false;
+ ### See https://github.com/blueman-project/blueman
+
+ GPU-AMD = false;
+ ### See https://nixos.wiki/wiki/AMD_GPU
+
+ GPU-Nvidia = false;
+ ### See https://nixos.wiki/wiki/Nvidia
+
+ GPU-Intel = false;
+ ### See https://nixos.wiki/wiki/Intel_Graphics
+
+ HotSpot-Use-Case = false;
+ ### See https://nixos.wiki/wiki/Internet_Connection_Sharing
+
+ ZFS-Networking-HostID = "";
+ ### See https://search.nixos.org/options?channel=unstable&show=networking.hostId&from=0&size=30&sort=relevance&query=networking.hostId
+ ### Could be generated by `head -c4 /dev/urandom | od -A none -t x4`
+
+ ZFS-Use-Case = false;
+ ### See https://openzfs.github.io/openzfs-docs/Getting%20Started/NixOS/index.html
+
+ ## Software related
+ QEMU-VM-Use-Case = false;
+ ### See https://github.com/qemu/qemu ; https://github.com/virt-manager/virt-manager
+
+ Transparent-Proxy = false;
+ ### See https://github.com/daeuniverse/daed
+
+ # Options
+ ## System related
+ BootLoader = "systemd-boot";
+ ### Possible options: grub ; grub-mirror ; systemd-boot # See https://nixos.wiki/wiki/Bootloader https://search.nixos.org/options?channel=unstable&from=0&size=50&sort=relevance&type=packages&query=mirroredBoots
+
+ KernelPackages = "linuxPackages_cachyos";
+ ### See https://search.nixos.org/options?show=boot.kernelPackages https://www.nyx.chaotic.cx/#using-sched-ext-schedulers
+
+ KeyboardLayout = "us";
+ ### See https://en.wikipedia.org/wiki/Keyboard_layout
+
+ Locale = "en_US.UTF-8";
+ ### See https://docs.moodle.org/405/en/Table_of_locales
+
+ StateVersion = "25.05";
+ ### See https://mynixos.com/nixpkgs/option/system.stateVersion
+
+ TimeZone = "Asia/Singapore";
+ ### See https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
+
+ ## Wayland related
+ MonitorSettings = "monitor = , preferred, auto, auto";
+ ### MonitorSettings For Hyprland See https://wiki.hyprland.org/Configuring/Monitors/
+
+ OutputSettings = "output * scale 1";
+ ### OutputSettings For sway See https://github.com/swaywm/sway/wiki#display-configuration
+
+ ScaleLevel = "1";
+ ### For Hyprland see https://wiki.hyprland.org/Configuring/XWayland/#hidpi-xwayland
+ ### For sway see https://github.com/swaywm/sway/wiki#hidpi
+
+ WM = "Hyprland";
+ ### Possible options: Hyprland ; niri ; sway
+}
diff --git a/hosts/example/hardware.nix b/hosts/example/hardware.nix
new file mode 100644
index 0000000..27f1a46
--- /dev/null
+++ b/hosts/example/hardware.nix
@@ -0,0 +1,39 @@
+{
+ config,
+ lib,
+ modulesPath,
+ ...
+}: {
+ imports = [
+ (modulesPath + "/installer/scan/not-detected.nix")
+ ];
+
+ boot.initrd.availableKernelModules = ["xhci_pci" "ehci_pci" "ahci" "nvme" "usbhid" "sd_mod"];
+ boot.initrd.kernelModules = [];
+ # boot.kernelModules = [ "kvm-amd" ];# For AMD CPU
+ boot.kernelModules = ["kvm-intel"];
+ boot.extraModulePackages = [];
+
+ fileSystems."/" = {
+ device = "/dev/disk/by-uuid/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+ fsType = "ext4";
+ };
+
+ fileSystems."/boot" = {
+ device = "/dev/disk/by-uuid/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+ fsType = "vfat";
+ options = ["fmask=0022" "dmask=0022"];
+ };
+
+ 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..useDHCP`.
+ networking.useDHCP = lib.mkDefault true;
+
+ nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
+ # hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; # For AMD CPU
+ hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; # For Intel CPU
+}
diff --git a/install.sh b/install.sh
new file mode 100644
index 0000000..f880455
--- /dev/null
+++ b/install.sh
@@ -0,0 +1,68 @@
+#!/usr/bin/env bash
+
+# Check if running on NixOS
+if [ -n "$(cat /etc/os-release | grep -i nixos)" ]; then
+ echo "Current running NixOS, going next step"
+ echo "----------------------------------------------------------------"
+else
+ echo "Please install under NixOS host"
+ exit
+fi
+
+# Check if boot directory exists in order to detect NixOS LiveCD environment
+if [ -d "/boot" ]; then
+ echo "Running on installed NixOS, going next step"
+ echo "----------------------------------------------------------------"
+else
+ echo "Please install under installed NixOS not in LiveCD"
+ exit 1
+fi
+
+# Get username
+if [ "$(whoami)" == "root" ]; then
+ echo "Please install as a normal user rather than root"
+ exit 1
+else
+ echo "Successfully get the username, going next step"
+ echo "----------------------------------------------------------------"
+fi
+
+echo "Default options are in brackets [ ]"
+echo "Just press enter as default"
+echo "----------------------------------------------------------------"
+sleep 2
+
+# Input hostname
+read -p "Enter Hostname: [ nixos ] " hostName
+if [ -z "$hostName" ]; then
+ hostName="nixos"
+fi
+
+mkdir hosts/"$hostName"
+cp hosts/example/*.nix hosts/"$hostName"
+sed -i "/^\s*hostname[[:space:]]*=[[:space:]]*\"/s/\"\(.*\)\"/\"$hostName\"/" ./flake.nix
+
+userName=$(whoami)
+sed -i "/^\s*username[[:space:]]*=[[:space:]]*\"/s/\"\(.*\)\"/\"$userName\"/" ./flake.nix
+
+nixos-generate-config --show-hardware-config > ./hosts/$hostName/hardware.nix
+
+git add .
+
+echo "Now going to build, stay online and don't power down."
+echo "----------------------------------------------------------------"
+sleep 2
+
+NIX_CONFIG="experimental-features = nix-command flakes"
+sudo nixos-rebuild switch --flake .#${hostName}
+
+echo "----------------------------------------------------------------"
+
+# Remove useless nix-channel files
+sudo rm -rf /nix/var/nix/profiles/per-user/root/channels /root/.nix-defexpr/channels
+
+echo "----------------------------------------------------------------"
+echo "Jobs done."
+echo "Live long and prosper!"
+echo "Please reboot to get a brand new system."
+echo "If there goes something wrong, please do report, thank you!"
diff --git a/modules/drivers/amd-gpu.nix b/modules/drivers/amd-gpu.nix
new file mode 100644
index 0000000..52af45c
--- /dev/null
+++ b/modules/drivers/amd-gpu.nix
@@ -0,0 +1,14 @@
+{
+ hostname,
+ lib,
+ pkgs,
+ ...
+}: let
+ inherit (import ../../hosts/${hostname}/env.nix) GPU-AMD;
+in
+ with lib; {
+ config = mkIf GPU-AMD {
+ systemd.tmpfiles.rules = ["L+ /opt/rocm/hip - - - - ${pkgs.rocmPackages.clr}"];
+ services.xserver.videoDrivers = ["amdgpu"];
+ };
+ }
diff --git a/modules/drivers/bluetooth.nix b/modules/drivers/bluetooth.nix
new file mode 100644
index 0000000..57ee4ee
--- /dev/null
+++ b/modules/drivers/bluetooth.nix
@@ -0,0 +1,16 @@
+{
+ hostname,
+ lib,
+ ...
+}: let
+ inherit (import ../../hosts/${hostname}/env.nix) Bluetooth;
+in
+ with lib; {
+ config = mkIf Bluetooth {
+ hardware.bluetooth = {
+ enable = lib.mkDefault true;
+ powerOnBoot = lib.mkDefault true;
+ };
+ services.blueman.enable = lib.mkDefault true;
+ };
+ }
diff --git a/modules/services/audio.nix b/modules/services/audio.nix
new file mode 100644
index 0000000..fb49a6e
--- /dev/null
+++ b/modules/services/audio.nix
@@ -0,0 +1,13 @@
+_: {
+ services = {
+ pipewire = {
+ enable = true;
+ alsa.enable = true;
+ alsa.support32Bit = true;
+ audio.enable = true;
+ jack.enable = true;
+ pulse.enable = true;
+ wireplumber.enable = true;
+ };
+ };
+}
diff --git a/modules/services/daed.nix b/modules/services/daed.nix
new file mode 100644
index 0000000..eafe34d
--- /dev/null
+++ b/modules/services/daed.nix
@@ -0,0 +1,14 @@
+{
+ hostname,
+ lib,
+ ...
+}:
+with lib; let
+ inherit (import ../../hosts/${hostname}/env.nix) Transparent-Proxy;
+in {
+ config = mkIf Transparent-Proxy {
+ services.daed = {
+ enable = true;
+ };
+ };
+}
diff --git a/modules/services/ddm.nix b/modules/services/ddm.nix
new file mode 100644
index 0000000..26fb907
--- /dev/null
+++ b/modules/services/ddm.nix
@@ -0,0 +1,29 @@
+{
+ hostname,
+ pkgs,
+ ...
+}: let
+ inherit (import ../../hosts/${hostname}/env.nix) WM;
+in {
+ services = {
+ greetd = {
+ enable = true;
+ vt = 1;
+ settings = {
+ default_session = {
+ user = "greeter";
+ command = "${pkgs.greetd.tuigreet}/bin/tuigreet -c ${WM} -t --user-menu";
+ };
+ };
+ };
+ };
+ systemd.services.greetd.serviceConfig = {
+ Type = "idle";
+ StandardInput = "tty";
+ StandardOutput = "tty";
+ StandardError = "journal";
+ TTYReset = true;
+ TTYVHangup = true;
+ TTYVTDisallocate = true;
+ };
+}
diff --git a/modules/services/keyd.nix b/modules/services/keyd.nix
new file mode 100644
index 0000000..fdbe109
--- /dev/null
+++ b/modules/services/keyd.nix
@@ -0,0 +1,25 @@
+_: {
+ services.keyd = {
+ enable = true;
+ keyboards = {
+ default = {
+ ids = ["*"];
+ settings = {
+ main = {
+ capslock = "overload(alt, esc)";
+ };
+ "alt" = {
+ c = "backspace";
+ d = "delete";
+ e = "enter";
+ h = "left";
+ j = "down";
+ k = "up";
+ l = "right";
+ capslock = "capslock";
+ };
+ };
+ };
+ };
+ };
+}
diff --git a/modules/services/misc.nix b/modules/services/misc.nix
new file mode 100644
index 0000000..3e51195
--- /dev/null
+++ b/modules/services/misc.nix
@@ -0,0 +1,13 @@
+_: {
+ services = {
+ fstrim = {
+ enable = true;
+ interval = "weekly";
+ };
+ gvfs.enable = true;
+ scx = {
+ enable = true;
+ scheduler = "scx_lavd";
+ };
+ };
+}
diff --git a/modules/services/ntp.nix b/modules/services/ntp.nix
new file mode 100644
index 0000000..eade20e
--- /dev/null
+++ b/modules/services/ntp.nix
@@ -0,0 +1,22 @@
+_: {
+ services.ntpd-rs = {
+ enable = true;
+ settings = {
+ source = [
+ {
+ address = "ntppool1.time.nl";
+ mode = "nts";
+ }
+ {
+ address = "ntppool2.time.nl";
+ mode = "nts";
+ }
+ {
+ address = "nts.netnod.se";
+ mode = "nts";
+ }
+ ];
+ };
+ useNetworkingTimeServers = false;
+ };
+}
diff --git a/modules/services/qemu.nix b/modules/services/qemu.nix
new file mode 100644
index 0000000..7efe5f0
--- /dev/null
+++ b/modules/services/qemu.nix
@@ -0,0 +1,16 @@
+{
+ hostname,
+ lib,
+ ...
+}:
+with lib; let
+ inherit (import ../../hosts/${hostname}/env.nix) QEMU-VM-Use-Case;
+in {
+ config = mkIf QEMU-VM-Use-Case {
+ services = {
+ spice-vdagentd.enable = true;
+ spice-webdavd.enable = true;
+ };
+ virtualisation.libvirtd.enable = true;
+ };
+}
diff --git a/modules/system/bootstrap.nix b/modules/system/bootstrap.nix
new file mode 100644
index 0000000..9f4573d
--- /dev/null
+++ b/modules/system/bootstrap.nix
@@ -0,0 +1,148 @@
+{
+ config,
+ hostname,
+ lib,
+ pkgs,
+ ...
+}: let
+ inherit
+ (import ../../hosts/${hostname}/env.nix)
+ BootLoader
+ KernelPackages
+ KeyboardLayout
+ Locale
+ StateVersion
+ TimeZone
+ ZFS-Use-Case
+ ;
+in
+ with lib; {
+ boot = {
+ bcache.enable = false;
+ consoleLogLevel = 2; # Only errors and warnings are displayed
+ extraModprobeConfig = "blacklist mei mei_hdcp mei_me mei_pxp iTCO_wdt pstore sp5100_tco";
+ extraModulePackages = [
+ config.boot.kernelPackages.v4l2loopback # v4l2loopback is for OBS Virtual Cam Support
+ ];
+ initrd = {
+ compressor = "zstd";
+ compressorArgs = ["-T0" "-19" "--long"];
+ systemd.enable = true;
+ verbose = false;
+ };
+ kernel.sysctl = {
+ "kernel.core_pattern" = "|/bin/false"; # Disable automatic core dumps
+ "vm.max_map_count" = 2147483642; # Needed For Some Steam Games
+ };
+ kernelModules = ["v4l2loopback"]; # v4l2loopback is for OBS Virtual Cam Support
+ kernelPackages = pkgs.${KernelPackages};
+ kernelParams = ["audit=0" "console=tty1" "erst_disable" "nmi_watchdog=0" "noatime" "nowatchdog"];
+ loader = {
+ grub = mkIf (strings.hasInfix "grub" BootLoader) {
+ configurationLimit = 50;
+ device = "nodev";
+ efiInstallAsRemovable = true;
+ efiSupport = true;
+ enable = true;
+ mirroredBoots = mkIf (BootLoader == "grub-mirror") [
+ {
+ devices = ["nodev"];
+ path = "/boot";
+ }
+ {
+ devices = ["nodev"];
+ path = "/boot-mirror";
+ }
+ ];
+ theme = mkForce "${pkgs.minimal-grub-theme}";
+ zfsSupport = ZFS-Use-Case;
+ };
+ systemd-boot = mkIf (BootLoader == "systemd-boot") {
+ configurationLimit = 50;
+ editor = false;
+ enable = true;
+ };
+ timeout = 3;
+ };
+ tmp.cleanOnBoot = true;
+ };
+
+ console = {
+ earlySetup = true;
+ keyMap = KeyboardLayout;
+ };
+
+ hardware.graphics = {
+ enable = true;
+ enable32Bit = true;
+ };
+
+ i18n = {
+ defaultLocale = Locale;
+ extraLocaleSettings = {
+ LC_ADDRESS = Locale;
+ LC_IDENTIFICATION = Locale;
+ LC_MEASUREMENT = Locale;
+ LC_MONETARY = Locale;
+ LC_NAME = Locale;
+ LC_NUMERIC = Locale;
+ LC_PAPER = Locale;
+ LC_TELEPHONE = Locale;
+ LC_TIME = Locale;
+ };
+ };
+
+ networking = {
+ dhcpcd.extraConfig = "nohook resolv.conf";
+ firewall.enable = false;
+ hostName = hostname;
+ nameservers = ["127.0.0.1" "::1"];
+ networkmanager = {
+ dns = "none";
+ enable = true;
+ };
+ resolvconf.enable = mkForce false;
+ };
+
+ security = {
+ rtkit.enable = true;
+ sudo.enable = false;
+ sudo-rs = {
+ enable = true;
+ execWheelOnly = true;
+ };
+ pam.services = {
+ hyprlock = {};
+ login.kwallet.enable = mkForce false;
+ };
+ polkit = {
+ enable = true;
+ extraConfig = ''
+ polkit.addRule(function(action, subject) {
+ if (
+ subject.isInGroup("users")
+ && (
+ action.id == "org.freedesktop.login1.reboot" ||
+ action.id == "org.freedesktop.login1.reboot-multiple-sessions" ||
+ action.id == "org.freedesktop.login1.power-off" ||
+ action.id == "org.freedesktop.login1.power-off-multiple-sessions"
+ )
+ )
+ {
+ return polkit.Result.YES;
+ }
+ })
+ '';
+ };
+ };
+
+ system = {
+ rebuild.enableNg = true;
+ stateVersion = StateVersion;
+ };
+
+ time = {
+ hardwareClockInLocalTime = false;
+ timeZone = TimeZone;
+ };
+ }
diff --git a/modules/system/environment.nix b/modules/system/environment.nix
new file mode 100644
index 0000000..6d21327
--- /dev/null
+++ b/modules/system/environment.nix
@@ -0,0 +1,83 @@
+{
+ hostname,
+ pkgs,
+ ...
+}: let
+ inherit (import ../../hosts/${hostname}/env.nix) ScaleLevel;
+in {
+ environment = {
+ variables = {
+ EDITOR = "nvim";
+ TERMINAL = "alacritty";
+
+ _JAVA_AWT_WM_NONREPARENTING = 1;
+ AWT_TOOLKIT = "MToolkit";
+ CLUTTER_BACKEND = "wayland";
+ ELECTRON_OZONE_PLATFORM_HINT = "wayland";
+ GDK_BACKEND = "wayland";
+ GDK_SCALE = "${ScaleLevel}";
+ GTK_USE_PORTAL = 1;
+ MOZ_ENABLE_WAYLAND = 1;
+ NIXOS_OZONE_WL = 1;
+ QT_AUTO_SCREEN_SCALE_FACTOR = 1;
+ QT_QPA_PLATFORM = "wayland";
+ QT_WAYLAND_DISABLE_WINDOWDECORATION = 1;
+ SDL_HINT_VIDEODRIVER = "wayland";
+ XDG_SESSION_TYPE = "wayland";
+ SDL_VIDEODRIVER = "wayland";
+
+ QT_IM_MODULE = "fcitx";
+ SDL_IM_MODULE = "fcitx";
+ XMODIFIERS = "@im=fcitx";
+ };
+
+ systemPackages = with pkgs; [
+ # Archive
+ gnutar
+ p7zip
+ unzipNLS
+ xz
+ zip
+ zstd
+
+ # Greeter with ddm
+ greetd.tuigreet
+
+ # For OBS virtual cam support
+ v4l-utils
+
+ # Editor
+ neovim
+
+ # Networking tool
+ curl
+ nexttrace
+ aria2
+ syncthing
+
+ #Blog
+ zola
+ go
+ pnpm
+
+ #Android
+ android-tools
+ payload-dumper-go
+
+ # Misc
+ libnotify
+ libvirt
+ lm_sensors
+ ];
+ };
+
+ programs = {
+ dconf.enable = true;
+ fuse.userAllowOther = true;
+ git = {
+ enable = true;
+ package = pkgs.gitMinimal;
+ };
+ ssh.startAgent = true;
+ };
+}
diff --git a/modules/system/minimize.nix b/modules/system/minimize.nix
new file mode 100644
index 0000000..a5c690f
--- /dev/null
+++ b/modules/system/minimize.nix
@@ -0,0 +1,70 @@
+{lib, ...}:
+with lib; {
+ # Minimize boot
+ boot = {
+ bcache.enable = mkForce false;
+ binfmt.addEmulatedSystemsToNixSandbox = mkForce false;
+ };
+
+ # Disable unnecessary documentation
+ documentation.enable = mkForce false;
+ documentation.doc.enable = mkForce false;
+ documentation.info.enable = mkForce false;
+ documentation.man.enable = mkForce false;
+ documentation.nixos.enable = mkForce false;
+
+ # Minimize environment
+ environment = {
+ defaultPackages = mkForce [];
+ };
+
+ # Disable unnecessary programs
+ programs = {
+ bash = {
+ completion.enable = mkForce false;
+ enableLsColors = mkForce false;
+ };
+ command-not-found.enable = mkForce false;
+ nano.enable = mkForce false;
+ };
+
+ # Minimize services
+ services = {
+ gnome.gnome-keyring.enable = mkForce false;
+ journald = {
+ extraConfig = ''
+ Storage=volatile
+ Compress=yes
+ SystemMaxUse=50M
+ RuntimeMaxUse=10M
+ MaxFileSec=1day
+ MaxRetentionSec=1month
+ RateLimitInterval=30s
+ RateLimitBurst=1000
+ '';
+ };
+ resolved.enable = mkForce false;
+ timesyncd.enable = mkForce false;
+ };
+
+ # Minimize systemd services
+ systemd = {
+ coredump.enable = mkForce false;
+ enableEmergencyMode = mkForce false;
+ network.wait-online.enable = mkForce false;
+ oomd.enable = mkForce false;
+ services = {
+ mount-pstore.enable = mkForce false;
+ NetworkManager-wait-online.enable = mkForce false;
+ systemd-bsod.enable = mkForce false;
+ systemd-importd.enable = mkForce false;
+ systemd-journal-flush.enable = mkForce false;
+ systemd-pstore.enable = mkForce false;
+ };
+ };
+
+ # Disable xdg autostart
+ xdg = {
+ autostart.enable = mkForce false;
+ };
+}
diff --git a/modules/system/nix.nix b/modules/system/nix.nix
new file mode 100644
index 0000000..7403c6a
--- /dev/null
+++ b/modules/system/nix.nix
@@ -0,0 +1,50 @@
+{
+ inputs,
+ lib,
+ ...
+}:
+with lib; {
+ environment.etc."nix/inputs/nixpkgs".source = "${inputs.nixpkgs}";
+ nix = {
+ channel.enable = false;
+ gc = {
+ automatic = true;
+ dates = "weekly";
+ options = "--delete-older-than 7d";
+ };
+ optimise = {
+ automatic = true;
+ dates = ["weekly"];
+ };
+ # package = pkgs.lix; # use lix instead of nix would cause clan-cli error
+ registry.nixpkgs.flake = inputs.nixpkgs;
+ settings = {
+ auto-optimise-store = true;
+ builders-use-substitutes = true;
+ experimental-features = ["nix-command" "flakes"];
+ connect-timeout = 5;
+ gc-keep-derivations = false;
+ gc-keep-outputs = false;
+ keep-going = true;
+ log-lines = 25;
+ nix-path = mkForce "nixpkgs=/etc/nix/inputs/nixpkgs";
+ substituters = [
+ "https://cache.garnix.io" # See https://github.com/daeuniverse/flake.nix
+ "https://cache.nixos.org" # See https://nixos.wiki/wiki/Binary_Cache
+ "https://chaotic-nyx.cachix.org" # See https://github.com/chaotic-cx/nyx
+ "https://nix-community.cachix.org" # See https://nix-community.org/cache/
+ ];
+ trusted-public-keys = [
+ "cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g="
+ "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
+ "chaotic-nyx.cachix.org-1:HfnXSw4pj95iI/n17rIDy40agHj12WfF+Gqk6SonIT8="
+ "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
+ ];
+ warn-dirty = false;
+ };
+ };
+ nixpkgs = {
+ config.allowUnfree = false;
+ hostPlatform = "x86_64-linux";
+ };
+}
diff --git a/modules/system/stylix.nix b/modules/system/stylix.nix
new file mode 100644
index 0000000..c14073f
--- /dev/null
+++ b/modules/system/stylix.nix
@@ -0,0 +1,52 @@
+{
+ config,
+ pkgs,
+ ...
+}: {
+ stylix = {
+ enable = true;
+ # catppuccin-mocha base16Scheme # See https://github.com/catppuccin/base16
+ # base16Scheme = {
+ # base00 = "1e1e2e"; # base
+ # base01 = "181825"; # mantle
+ # base02 = "313244"; # surface0
+ # base03 = "45475a"; # surface1
+ # base04 = "585b70"; # surface2
+ # base05 = "cdd6f4"; # text
+ # base06 = "f5e0dc"; # rosewater
+ # base07 = "b4befe"; # lavender
+ # base08 = "f38ba8"; # red
+ # base09 = "fab387"; # peach
+ # base0A = "f9e2af"; # yellow
+ # base0B = "a6e3a1"; # green
+ # base0C = "94e2d5"; # teal
+ # base0D = "89b4fa"; # blue
+ # base0E = "cba6f7"; # mauve
+ # base0F = "f2cdcd"; # flamingo
+ # };
+ cursor = {
+ name = "Bibata-Modern-Ice";
+ package = pkgs.bibata-cursors;
+ size = 24;
+ };
+ fonts = {
+ monospace = {
+ name = "JetBrainsMono Nerd Font Mono";
+ package = pkgs.nerd-fonts.jetbrains-mono;
+ };
+ sansSerif = {
+ name = "Sarasa Gothic SC";
+ package = pkgs.sarasa-gothic;
+ };
+ serif = config.stylix.fonts.sansSerif;
+ sizes = {
+ applications = 16;
+ desktop = 14;
+ popups = 12;
+ terminal = 12;
+ };
+ };
+ image = ../../dotfiles/.local/share/wallpapers/nixos-1.png;
+ polarity = "dark";
+ };
+}
diff --git a/modules/system/zfs.nix b/modules/system/zfs.nix
new file mode 100644
index 0000000..21c8f57
--- /dev/null
+++ b/modules/system/zfs.nix
@@ -0,0 +1,42 @@
+{
+ hostname,
+ lib,
+ pkgs,
+ ...
+}: let
+ inherit
+ (import ../../hosts/${hostname}/env.nix)
+ KernelPackages
+ ZFS-Networking-HostID
+ ZFS-Use-Case
+ ;
+in
+ with lib; {
+ config = mkIf ZFS-Use-Case {
+ boot = {
+ kernelParams = ["zfs_force=1"];
+ supportedFilesystems = ["zfs"];
+ zfs = {
+ devNodes = "/dev/disk/by-id";
+ forceImportRoot = false;
+ package = mkIf (strings.hasInfix "linuxPackages_cachyos" KernelPackages) pkgs.zfs_cachyos;
+ };
+ };
+ networking.hostId = ZFS-Networking-HostID;
+ services.zfs = {
+ autoScrub = {
+ enable = true;
+ interval = "weekly";
+ };
+ trim = {
+ enable = true; # HDD no need
+ interval = "weekly";
+ };
+ autoSnapshot.enable = true;
+ };
+ systemd.services = {
+ zfs-share.enable = mkForce false;
+ zfs-zed.enable = mkForce false;
+ };
+ };
+ }