diff --git a/roles/sway/files/sway.config b/roles/sway/files/sway.config
new file mode 100644
index 0000000..29483b4
--- /dev/null
+++ b/roles/sway/files/sway.config
@@ -0,0 +1,307 @@
+# efault config for sway
+#
+# Copy this to ~/.config/sway/config and edit it to your liking.
+#
+# Read `man 5 sway` for a complete reference.
+
+### Variables
+#
+# Logo key. Use Mod1 for Alt.
+set $mod Mod4
+# Home row direction keys, like vim
+set $left h
+set $down j
+set $up k
+set $right l
+# Your preferred terminal emulator
+set $term alacritty
+# Your preferred application launcher
+# Note: pass the final command to swaymsg so that the resulting window can be opened
+# on the original workspace that the command was run on.
+#set $menu dmenu_path | dmenu | xargs swaymsg exec --
+set $bemenu bemenu -i -l 15 -m all --tf=#2e9ef4 --hf=#2e9ef4
+set $menu j4-dmenu-desktop --dmenu="$bemenu" --term='alacritty' | xargs swaymsg exec --
+
+font pango:Segoe UI Regular 10
+
+### Output configuration
+#
+# Default wallpaper (more resolutions are available in /usr/share/backgrounds/sway/)
+#output * bg [enter a path here and uncomment] fill
+#
+#
+# Example configuration:
+#
+# output HDMI-A-1 resolution 1920x1080 position 1920,0
+#
+# You can get the names of your outputs by running: swaymsg -t get_outputs
+
+#output * adaptive_sync on
+
+### Idle configuration
+#
+# Example configuration:
+#
+# exec swayidle -w \
+# timeout 300 'swaylock -f -c 000000' \
+# timeout 600 'swaymsg "output * dpms off"' resume 'swaymsg "output * dpms on"' \
+# before-sleep 'swaylock -f -c 000000'
+#
+# This will lock your screen after 300 seconds of inactivity, then turn off
+# your displays after another 300 seconds, and turn your screens back on when
+# resumed. It will also lock your screen before your computer goes to sleep.
+
+### Input configuration
+#
+# Example configuration:
+#
+# input "2:14:SynPS/2_Synaptics_TouchPad" {
+# dwt enabled
+# tap enabled
+# natural_scroll enabled
+# middle_emulation enabled
+# }
+#
+# You can get the names of your inputs by running: swaymsg -t get_inputs
+# Read `man 5 sway-input` for more information about this section.
+
+ input * {
+ xkb_layout "pl"
+ }
+
+ # NV4x ADL touchpad
+ input "10248:257:FTCS1000:00_2808:0101_Touchpad" {
+ dwt enabled
+ tap enabled
+ natural_scroll enabled
+ middle_emulation enabled
+ scroll_factor 0.5
+ pointer_accel 0.0
+ }
+
+### Key bindings
+#
+# Basics:
+#
+ # Start a terminal
+ bindsym $mod+Return exec $term
+
+ # Kill focused window
+ bindsym $mod+Shift+q kill
+
+ # Start your launcher
+ bindsym $mod+d exec $menu
+ bindsym Alt+Space exec $menu
+
+ # Drag floating windows by holding down $mod and left mouse button.
+ # Resize them with right mouse button + $mod.
+ # Despite the name, also works for non-floating windows.
+ # Change normal to inverse to use left mouse button for resizing and right
+ # mouse button for dragging.
+ floating_modifier $mod normal
+
+ # Reload the configuration file
+ bindsym $mod+Shift+c reload
+
+ # Exit sway (logs you out of your Wayland session)
+ bindsym $mod+Shift+e exec Scripts/sway/dmenu-sway-exit.sh -m "$bemenu"
+#
+# Moving around:
+#
+ # Move your focus around
+ bindsym $mod+$left focus left
+ bindsym $mod+$down focus down
+ bindsym $mod+$up focus up
+ bindsym $mod+$right focus right
+ # Or use $mod+[up|down|left|right]
+ bindsym $mod+Left focus left
+ bindsym $mod+Down focus down
+ bindsym $mod+Up focus up
+ bindsym $mod+Right focus right
+
+ # Move the focused window with the same, but add Shift
+ bindsym $mod+Shift+$left move left
+ bindsym $mod+Shift+$down move down
+ bindsym $mod+Shift+$up move up
+ bindsym $mod+Shift+$right move right
+ # Ditto, with arrow keys
+ bindsym $mod+Shift+Left move left
+ bindsym $mod+Shift+Down move down
+ bindsym $mod+Shift+Up move up
+ bindsym $mod+Shift+Right move right
+#
+# Workspaces:
+#
+ # Switch to workspace
+ bindsym $mod+1 workspace number 1
+ bindsym $mod+2 workspace number 2
+ bindsym $mod+3 workspace number 3
+ bindsym $mod+4 workspace number 4
+ bindsym $mod+5 workspace number 5
+ bindsym $mod+6 workspace number 6
+ bindsym $mod+7 workspace number 7
+ bindsym $mod+8 workspace number 8
+ bindsym $mod+9 workspace number 9
+ bindsym $mod+0 workspace number 10
+ # Move focused container to workspace
+ bindsym $mod+Shift+1 move container to workspace number 1
+ bindsym $mod+Shift+2 move container to workspace number 2
+ bindsym $mod+Shift+3 move container to workspace number 3
+ bindsym $mod+Shift+4 move container to workspace number 4
+ bindsym $mod+Shift+5 move container to workspace number 5
+ bindsym $mod+Shift+6 move container to workspace number 6
+ bindsym $mod+Shift+7 move container to workspace number 7
+ bindsym $mod+Shift+8 move container to workspace number 8
+ bindsym $mod+Shift+9 move container to workspace number 9
+ bindsym $mod+Shift+0 move container to workspace number 10
+ # Note: workspaces can have any name you want, not just numbers.
+ # We just use 1-10 as the default.
+ bindsym $mod+bracketleft workspace prev
+ bindsym $mod+bracketright workspace next
+ bindsym $mod+braceleft move container to workspace prev
+ bindsym $mod+braceright move container to workspace next
+ bindsym $mod+Ctrl+Left move workspace to output left
+ bindsym $mod+Ctrl+Right move workspace to output right
+ bindsym $mod+Ctrl+Up move workspace to output up
+ bindsym $mod+Ctrl+Down move workspace to output downbindgesture
+ # Touchpad gestures
+ bindgesture swipe:3:right workspace prev
+ bindgesture swipe:3:left workspace next
+#
+# Layout stuff:
+#
+ # You can "split" the current object of your focus with
+ # $mod+b or $mod+v, for horizontal and vertical splits
+ # respectively.
+ bindsym $mod+b splith
+ bindsym $mod+v splitv
+
+ # Switch the current container between different layout styles
+ bindsym $mod+s layout stacking
+ bindsym $mod+w layout tabbed
+ bindsym $mod+e layout toggle split
+
+ # Make the current focus fullscreen
+ bindsym $mod+f fullscreen
+
+ # Toggle the current focus between tiling and floating mode
+ bindsym $mod+Shift+space floating toggle
+
+ # Swap focus between the tiling area and the floating area
+ bindsym $mod+space focus mode_toggle
+
+ # Move focus to the parent container
+ bindsym $mod+a focus parent
+#
+# Scratchpad:
+#
+ # Sway has a "scratchpad", which is a bag of holding for windows.
+ # You can send windows there and get them back later.
+
+ # Move the currently focused window to the scratchpad
+ bindsym $mod+Shift+minus move scratchpad
+
+ # Show the next scratchpad window or hide the focused scratchpad window.
+ # If there are multiple scratchpad windows, this command cycles through them.
+ bindsym $mod+minus scratchpad show
+
+
+#
+# Resizing containers:
+#
+mode "resize" {
+ # left will shrink the containers width
+ # right will grow the containers width
+ # up will shrink the containers height
+ # down will grow the containers height
+ bindsym $left resize shrink width 10px
+ bindsym $down resize grow height 10px
+ bindsym $up resize shrink height 10px
+ bindsym $right resize grow width 10px
+
+ # Ditto, with arrow keys
+ bindsym Left resize shrink width 10px
+ bindsym Down resize grow height 10px
+ bindsym Up resize shrink height 10px
+ bindsym Right resize grow width 10px
+
+ # Return to default mode
+ bindsym Return mode "default"
+ bindsym Escape mode "default"
+}
+bindsym $mod+r mode "resize"
+
+#
+# Status Bar:
+#
+# Read `man 5 sway-bar` for more information about this section.
+bar {
+ position top
+
+ swaybar_command waybar
+
+}
+
+####################################
+## User config ##
+####################################
+
+smart_borders on
+default_border pixel 2
+
+# Multimedia keys
+bindsym XF86MonBrightnessDown exec brightnessctl set 4%- --exponent=2 && light -G | cut -d'.' -f1 > $SWAYSOCK.wob
+bindsym XF86MonBrightnessUp exec brightnessctl set 4%+ --exponent=2 && light -G | cut -d'.' -f1 > $SWAYSOCK.wob
+bindsym XF86AudioRaiseVolume exec pamixer -ui 5 && pamixer --get-volume > $SWAYSOCK.wob
+bindsym XF86AudioLowerVolume exec pamixer -ud 5 && pamixer --get-volume > $SWAYSOCK.wob
+bindsym XF86AudioMute exec pamixer --toggle-mute && ( pamixer --get-mute && echo 0 > $SWAYSOCK.wob ) || pamixer --get-volume > $SWAYSOCK.wob
+bindsym XF86AudioMicMute exec pactl set-source-mute @DEFAULT_SOURCE@ toggle
+bindsym XF86AudioPlay exec playerctl play-pause
+bindsym XF86AudioNext exec playerctl next
+bindsym XF86AudioPrev exec playerctl previous
+
+# Screenshots
+bindsym Print exec grimshot copy output
+bindsym Ctrl+Print exec grimshot copy area
+bindsym $mod+Print exec grimshot copy active
+bindsym Shift+Print exec grimshot save output
+bindsym Shift+Ctrl+Print exec grimshot save area
+bindsym Shift+$mod+Print exec grimshot save active
+
+# Lid switching, lid close needs a special handler in case we're docked
+bindswitch --reload --locked lid:off output eDP-1 enable
+bindswitch --reload --locked lid:on exec sway_lid_handler.sh
+
+# Screen locking
+bindsym $mod+End exec swaylock -f -c 000000
+
+# Special keys
+bindsym XF86Display exec wdisplays
+bindsym XF86NotificationCenter exec playerctl play-pause
+bindsym XF86PickupPhone exec playerctl previous
+bindsym XF86HangupPhone exec playerctl next
+
+exec dex -a -s ~/.config/autostart/
+
+exec_always sway_lid_handler.sh
+#exec_always "killall wlsunset; wlsunset -t 5200 -l 54.4 -L 18.6"
+exec /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
+exec nm-applet --indicator
+exec blueman-applet
+exec mako
+exec mkfifo $SWAYSOCK.wob && tail -f $SWAYSOCK.wob | wob --background-color=#00000080 -a bottom -M 100
+
+exec swayidle -w \
+ lock 'swaylock -f -c 000000' \
+ timeout 300 'swaylock -f -c 000000' \
+ timeout 600 'swaymsg "output * dpms off"' \
+ resume 'swaymsg "output * dpms on"' \
+ before-sleep 'playerctl -a pause; swaymsg output eDP-1 enable; swaylock -f -c 000000' \
+ after-resume 'sway_lid_handler.sh'
+
+for_window [app_id="blueman-manager"] floating enable
+for_window [app_id="Alacritty"] max_render_time 1
+for_window [class="^.*"] inhibit_idle fullscreen
+for_window [app_id="^.*"] inhibit_idle fullscreen
+
+include /etc/sway/config.d/*
diff --git a/roles/sway/files/sway_lid_handler.sh b/roles/sway/files/sway_lid_handler.sh
new file mode 100755
index 0000000..7b6f247
--- /dev/null
+++ b/roles/sway/files/sway_lid_handler.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+#sleep 1
+state=$(awk 'NF>1{print $NF}' /proc/acpi/button/lid/LID/state)
+n=$(swaymsg -t get_outputs -p | grep -c "Output")
+
+if [[ $state = "closed" && $n -gt "1" ]]
+then
+ swaymsg output eDP-1 disable
+else
+ swaymsg output eDP-1 enable
+fi
diff --git a/roles/sway/files/waybar.config b/roles/sway/files/waybar.config
new file mode 100644
index 0000000..1852f0f
--- /dev/null
+++ b/roles/sway/files/waybar.config
@@ -0,0 +1,147 @@
+{
+ // "layer": "top", // Waybar at top layer
+ // "position": "bottom", // Waybar position (top|bottom|left|right)
+ "height": 30, // Waybar height (to be removed for auto height)
+ // "width": 1280, // Waybar width
+ // Choose the order of the modules
+ "modules-left": ["sway/workspaces", "sway/mode"],
+ "modules-center": [],
+ "modules-right": ["custom/media", "idle_inhibitor", "pulseaudio", "battery", "tray", "clock"],
+ // Modules configuration
+ // "sway/workspaces": {
+ // "disable-scroll": true,
+ // "all-outputs": true,
+ // "format": "{name}: {icon}",
+ // "format-icons": {
+ // "1": "",
+ // "2": "",
+ // "3": "",
+ // "4": "",
+ // "5": "",
+ // "urgent": "",
+ // "focused": "",
+ // "default": ""
+ // }
+ // },
+ "sway/mode": {
+ "format": "{}"
+ },
+ "mpd": {
+ "format": "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}{artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) ⸨{songPosition}|{queueLength}⸩ ",
+ "format-disconnected": "Disconnected ",
+ "format-stopped": "{consumeIcon}{randomIcon}{repeatIcon}{singleIcon}Stopped ",
+ "unknown-tag": "N/A",
+ "interval": 2,
+ "consume-icons": {
+ "on": " "
+ },
+ "random-icons": {
+ "off": " ",
+ "on": " "
+ },
+ "repeat-icons": {
+ "on": " "
+ },
+ "single-icons": {
+ "on": "1 "
+ },
+ "state-icons": {
+ "paused": "",
+ "playing": ""
+ },
+ "tooltip-format": "MPD (connected)",
+ "tooltip-format-disconnected": "MPD (disconnected)"
+ },
+ "idle_inhibitor": {
+ "format": "{icon}",
+ "format-icons": {
+ "activated": "",
+ "deactivated": ""
+ }
+ },
+ "tray": {
+ // "icon-size": 21,
+ "spacing": 10
+ },
+ "clock": {
+ // "timezone": "America/New_York",
+ "format": "{:%H:%M}",
+ "tooltip-format": "{:%Y %B }\n{calendar}",
+ //"format-alt": "{:%A %Y-%m-%d}"
+ "format-alt": "{:%a, %b %d %H:%M}",
+ },
+ "cpu": {
+ "format": "{usage}% ",
+ "tooltip": false
+ },
+ "memory": {
+ "format": "{}% "
+ },
+ "temperature": {
+ // "thermal-zone": 2,
+ "hwmon-path-abs": "/sys/bus/pci/devices/0000:00:18.3/hwmon",
+ "input-filename": "temp2_input",
+ "critical-threshold": 80,
+ // "format-critical": "{temperatureC}°C {icon}",
+ "format": "{temperatureC}°C {icon}",
+ "format-icons": ["", "", ""]
+ },
+ "backlight": {
+ // "device": "acpi_video1",
+ "format": "{percent}% {icon}",
+ "format-icons": ["", ""]
+ },
+ "battery": {
+ "states": {
+ // "good": 95,
+ //"warning": 30,
+ //"critical": 15
+ },
+ "format": "{capacity}% {icon}",
+ "format-charging": "{capacity}% ",
+ "format-plugged": "{capacity}% ",
+ "format-alt": "{time} {icon}",
+ // "format-good": "", // An empty format will hide the module
+ // "format-full": "",
+ "format-icons": ["", "", "", "", ""]
+ },
+ "battery#bat2": {
+ "bat": "BAT2"
+ },
+ "network": {
+ // "interface": "wlp2*", // (Optional) To force the use of this interface
+ "format-wifi": "{essid} ({signalStrength}%) ",
+ "format-ethernet": "{ipaddr}/{cidr} ",
+ "format-linked": "(No IP) ",
+ "format-disconnected": "Disconnected ⚠",
+ "format-alt": "{ifname}: {ipaddr}/{cidr}"
+ },
+ "pulseaudio": {
+ // "scroll-step": 1, // %, can be a float
+ "format": "{volume}% {icon} {format_source}",
+ "format-bluetooth": "{volume}% {icon} {format_source}",
+ "format-bluetooth-muted": " {icon} {format_source}",
+ "format-muted": " {format_source}",
+ "format-source": "{volume}% ",
+ "format-source-muted": "",
+ "format-icons": {
+ "headphone": "",
+ "hands-free": "",
+ "headset": "",
+ "phone": "",
+ "portable": "",
+ "car": "",
+ "default": ["", "", ""]
+ },
+ "on-click": "pavucontrol"
+ },
+ "custom/media": {
+ "interval": 5,
+ "format": "{icon} {}",
+ "format-icons": {
+ "default": ""
+ },
+ "exec": "playerctl -p spotify metadata --format '{{artist}} - {{title}}' | sed 's/&/&/g'",
+ "exec-if": "[ `playerctl -p spotify status` = 'Playing' ]"
+ }
+}
diff --git a/roles/sway/files/waybar.style.css b/roles/sway/files/waybar.style.css
new file mode 100644
index 0000000..8c0d0c6
--- /dev/null
+++ b/roles/sway/files/waybar.style.css
@@ -0,0 +1,204 @@
+* {
+ border: none;
+ border-radius: 0;
+ /* `otf-font-awesome` is required to be installed for icons */
+ font-family: Segoe UI, Roboto, Helvetica, Arial, sans-serif;
+ font-size: 10pt;
+ min-height: 0;
+}
+
+window#waybar {
+ background-color: rgba(43, 48, 59, 0.5);
+ border-bottom: 3px solid rgba(100, 114, 125, 0.5);
+ color: #ffffff;
+ transition-property: background-color;
+ transition-duration: .5s;
+}
+
+window#waybar.hidden {
+ opacity: 0.2;
+}
+
+/*
+window#waybar.empty {
+ background-color: transparent;
+}
+window#waybar.solo {
+ background-color: #FFFFFF;
+}
+*/
+
+window#waybar.termite {
+ background-color: #3F3F3F;
+}
+
+window#waybar.chromium {
+ background-color: #000000;
+ border: none;
+}
+
+#workspaces button {
+ padding: 0 6px;
+ background-color: transparent;
+ color: #ffffff;
+ border-bottom: 3px solid transparent;
+}
+
+/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */
+#workspaces button:hover {
+ background: rgba(0, 0, 0, 0.2);
+ box-shadow: inherit;
+ border-bottom: 3px solid #ffffff;
+}
+
+#workspaces button.focused {
+ background-color: #64727D;
+ border-bottom: 3px solid #ffffff;
+}
+
+#workspaces button.urgent {
+ background-color: #eb4d4b;
+}
+
+#mode {
+ background-color: #64727D;
+ border-bottom: 3px solid #ffffff;
+}
+
+#clock,
+#battery,
+#cpu,
+#memory,
+#temperature,
+#backlight,
+#network,
+#pulseaudio,
+#custom-media,
+#tray,
+#mode,
+#idle_inhibitor,
+#mpd {
+ padding: 0 10px;
+ margin: 0 4px;
+ color: #ffffff;
+}
+
+/*
+#clock {
+ background-color: #64727D;
+}
+
+#battery {
+ background-color: #ffffff;
+ color: #000000;
+}
+
+#battery.charging {
+ color: #ffffff;
+ background-color: #26A65B;
+}
+
+@keyframes blink {
+ to {
+ background-color: #ffffff;
+ color: #000000;
+ }
+}
+
+#battery.critical:not(.charging) {
+ background-color: #f53c3c;
+ color: #ffffff;
+ animation-name: blink;
+ animation-duration: 0.5s;
+ animation-timing-function: linear;
+ animation-iteration-count: infinite;
+ animation-direction: alternate;
+}
+
+label:focus {
+ background-color: #000000;
+}
+
+#cpu {
+ background-color: #2ecc71;
+ color: #000000;
+}
+
+#memory {
+ background-color: #9b59b6;
+}
+
+#backlight {
+ background-color: #90b1b1;
+}
+
+#network {
+ background-color: #2980b9;
+}
+
+#network.disconnected {
+ background-color: #f53c3c;
+}
+
+#pulseaudio {
+ background-color: #f1c40f;
+ color: #000000;
+}
+
+#pulseaudio.muted {
+ background-color: #90b1b1;
+ color: #2a5c45;
+}
+
+#custom-media {
+ background-color: #66cc99;
+ color: #2a5c45;
+ min-width: 100px;
+}
+
+#custom-media.custom-spotify {
+ background-color: #66cc99;
+}
+
+#custom-media.custom-vlc {
+ background-color: #ffa000;
+}
+
+#temperature {
+ background-color: #f0932b;
+}
+
+#temperature.critical {
+ background-color: #eb4d4b;
+}
+
+#tray {
+ background-color: #2980b9;
+}
+
+#idle_inhibitor {
+ background-color: #2d3436;
+}
+
+#idle_inhibitor.activated {
+ background-color: #ecf0f1;
+ color: #2d3436;
+}
+
+#mpd {
+ background-color: #66cc99;
+ color: #2a5c45;
+}
+
+#mpd.disconnected {
+ background-color: #f53c3c;
+}
+
+#mpd.stopped {
+ background-color: #90b1b1;
+}
+
+#mpd.paused {
+ background-color: #51a37a;
+}
+*/
diff --git a/roles/sway/tasks/main.yml b/roles/sway/tasks/main.yml
new file mode 100644
index 0000000..2630dd6
--- /dev/null
+++ b/roles/sway/tasks/main.yml
@@ -0,0 +1,64 @@
+---
+- name: Install Sway and friends
+ become: true
+ dnf:
+ name:
+ - sway # Window manager / Wayland compositor
+ - swayidle # Idle daemon
+ - swaylock # Lock screen
+ - swaybg # Wallpaper setting tool
+ - sway-systemd # SystemD integration glue
+ - waybar # Top bar
+ - bemenu # Application launcher, scriptable menu
+ - j4-dmenu-desktop # App launcher generator for bemenu
+ - kanshi # Dynamic monitor configuration daemon
+ - mako # Notification daemon
+ - alacritty # Terminal emulator
+ - xdg-desktop-portal # Screen sharing / file picking service
+ - xdg-desktop-portal-wlr # For screen sharing in wlroots based compositors
+ - xdg-desktop-portal-gtk # For file pickers in Flatpak apps
+ - wdisplays # Graphical monitor configuration tool
+ - grimshot # Screenshot tool
+ - dex # Autostart manager
+ - wob # Overlay bar, for volume and brightness
+ - network-manager-applet # Network manager applet
+ - blueman # Bluetooth manager
+ - playerctl # Media hotkeys, pause on suspend handling
+ - brightnessctl # Internal display brightness control
+ - pavucontrol # Audio control panel
+ - light # Brightness status for wob
+ state: latest
+
+- name: Ensure sway config directory exists
+ file:
+ path: "{{ home_dir }}/.config/sway"
+ state: directory
+
+- name: Install default sway config from template
+ copy:
+ src: "files/sway.config"
+ dest: "{{ home_dir }}/.config/sway/config"
+ mode: '0644'
+
+- name: Ensure waybar config directory exists
+ file:
+ path: "{{ home_dir }}/.config/waybar"
+ state: directory
+
+- name: Install waybar config from template
+ copy:
+ src: "files/waybar.config"
+ dest: "{{ home_dir }}/.config/waybar/config"
+ mode: '0644'
+
+- name: Install waybar style from template
+ copy:
+ src: "files/waybar.style.css"
+ dest: "{{ home_dir }}/.config/waybar/style.css"
+ mode: '0644'
+
+- name: Install lid handler script
+ copy:
+ src: "files/sway_lid_handler.sh"
+ dest: "{{ home_dir }}/.local/bin/sway_lid_handler.sh"
+ mode: '0755'