diff --git a/.gitignore b/.gitignore
new file mode 100755
index 0000000..9ac159d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+apps/.config/JetBrains/**/settingsSync
+apps/.config/JetBrains/**/fus/
+apps/.config/JetBrains/**/*.db
+apps/.config/JetBrains/**/*.db-shm
+apps/.config/JetBrains/**/*.db-wal
+apps/.config/obsidian/
+apps/.config/kwalletrc
diff --git a/.stowrc b/.stowrc
new file mode 100755
index 0000000..1943577
--- /dev/null
+++ b/.stowrc
@@ -0,0 +1 @@
+--target=/home/end
diff --git a/README.md b/README.md
old mode 100644
new mode 100755
diff --git a/apps/.config/.gitignore b/apps/.config/.gitignore
new file mode 100644
index 0000000..e51a0ce
--- /dev/null
+++ b/apps/.config/.gitignore
@@ -0,0 +1,44 @@
+# Browser/Electron caches
+*/Cache/
+*/Code Cache/
+*/GPUCache/
+*/DawnGraphiteCache/
+*/DawnWebGPUCache/
+*/Crashpad/
+*/IndexedDB/
+*/Local Storage/
+*/Session Storage/
+*/Shared Dictionary/
+*/WebStorage/
+*/.org.chromium.Chromium.*
+
+# Logs and runtime state
+*.log
+*/Cookies
+*/Cookies-journal
+*/DIPS
+*/DIPS-wal
+*/SharedStorage
+*/SharedStorage-wal
+*/TransportSecurity
+*/Trust Tokens
+*/Trust Tokens-journal
+*/Network Persistent State
+
+# Secrets
+github-copilot/apps.json
+
+# JetBrains runtime
+JetBrains/*/event-log-metadata/
+JetBrains/*/workspace/
+JetBrains/*/tasks/
+JetBrains/*/settingsSync/
+JetBrains/*/*.db
+JetBrains/*/options/recentProjects.xml
+JetBrains/*/options/trusted-paths.xml
+JetBrains/*/options/usage.statistics.xml
+JetBrains/*/options/features.usage.statistics.xml
+JetBrains/*/options/window.state.xml
+# AGS runtime / build artifacts
+ags/node_modules/
+ags/@girs/
diff --git a/apps/.config/ags/app.ts b/apps/.config/ags/app.ts
new file mode 100644
index 0000000..fe7697b
--- /dev/null
+++ b/apps/.config/ags/app.ts
@@ -0,0 +1,17 @@
+import app from "ags/gtk4/app"
+import style from "./style.scss"
+import Bar from "./widget/Bar"
+import NotificationCenter from "./widget/NotificationCenter"
+import NotificationPopup from "./widget/NotificationPopup"
+import ClockCenter from "./widget/ClockCenter"
+
+app.start({
+ css: style,
+ main() {
+ const monitors = app.get_monitors()
+ monitors.map(Bar)
+ monitors.map(NotificationCenter)
+ monitors.map(NotificationPopup)
+ monitors.map(ClockCenter)
+ },
+})
diff --git a/apps/.config/ags/env.d.ts b/apps/.config/ags/env.d.ts
new file mode 100644
index 0000000..792ebfd
--- /dev/null
+++ b/apps/.config/ags/env.d.ts
@@ -0,0 +1,21 @@
+declare const SRC: string
+
+declare module "inline:*" {
+ const content: string
+ export default content
+}
+
+declare module "*.scss" {
+ const content: string
+ export default content
+}
+
+declare module "*.blp" {
+ const content: string
+ export default content
+}
+
+declare module "*.css" {
+ const content: string
+ export default content
+}
diff --git a/apps/.config/ags/package.json b/apps/.config/ags/package.json
new file mode 100644
index 0000000..cbf736c
--- /dev/null
+++ b/apps/.config/ags/package.json
@@ -0,0 +1,10 @@
+{
+ "dependencies": {
+ "ags": "*",
+ "gnim": "*"
+ },
+ "prettier": {
+ "semi": false,
+ "tabWidth": 2
+ }
+}
diff --git a/apps/.config/ags/style.scss b/apps/.config/ags/style.scss
new file mode 100644
index 0000000..65c7317
--- /dev/null
+++ b/apps/.config/ags/style.scss
@@ -0,0 +1,530 @@
+// palette
+$bg: #0b0d1a;
+$surface: #0f1120;
+$surface2: #141628;
+$overlay: #1a1d35;
+$purple: #c792ea;
+$purple-dim: #9a70c7;
+$cyan: #4ec9b0;
+$green: #99c794;
+$pink: #ec5f89;
+$yellow: #fac863;
+$red: #f97b58;
+$text: #cdd6f4;
+$subtext: #7f849c;
+$border: rgba(78, 201, 176, 0.15);
+
+* {
+ font-family: "Maple Mono NF", monospace;
+ font-size: 13px;
+ color: $text;
+ -gtk-icon-style: regular;
+}
+
+// bar
+window.bar {
+ background: transparent;
+}
+
+.bar-centerbox {
+ background: $surface;
+ border-radius: 12px;
+ margin: 6px 8px 0;
+ border: 1px solid $border;
+ padding: 2px 6px;
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.5);
+}
+
+
+// modules
+.module {
+ background: $surface2;
+ border-radius: 8px;
+ padding: 1px 8px;
+ margin: 2px 2px;
+ border: 1px solid $border;
+ label {
+ color: $text;
+ }
+}
+
+.module-icon {
+ font-size: 14px;
+ margin-right: 4px;
+}
+
+.workspaces {
+ background: transparent;
+ border: none;
+ padding: 0;
+ margin: 0 4px;
+
+ .ws-dot {
+ font-size: 8px;
+ margin: 0 2px;
+ color: $subtext;
+ transition: all 200ms ease;
+ &.active {
+ color: $purple;
+ font-size: 11px;
+ }
+ &.focused {
+ color: $cyan;
+ }
+ }
+}
+
+.window-title {
+ background: transparent;
+ border: none;
+ padding: 0 6px;
+ color: $subtext;
+ font-size: 12px;
+}
+
+.clock-module {
+ .time {
+ color: $text;
+ font-weight: bold;
+ font-size: 14px;
+ }
+ .date {
+ color: $subtext;
+ font-size: 11px;
+ margin-left: 6px;
+ }
+}
+
+.media-module {
+ min-width: 120px;
+ .media-icon {
+ color: $cyan;
+ }
+ .media-title {
+ color: $text;
+ font-size: 12px;
+ }
+ .media-btn {
+ background: transparent;
+ border: none;
+ padding: 0 3px;
+ color: $subtext;
+ border-radius: 6px;
+ &:hover {
+ color: $purple;
+ background: $overlay;
+ }
+ }
+}
+
+.volume-module {
+ .vol-icon {
+ color: $cyan;
+ }
+ .vol-muted {
+ color: $pink;
+ }
+}
+
+.brightness-module {
+ .bright-icon {
+ color: $yellow;
+ }
+}
+
+.mullvad-module {
+ &.on {
+ box-shadow: inset 0 0 0 1px $green;
+ border-radius: 9px;
+ }
+ &.off {
+ box-shadow: inset 0 0 0 1px $red;
+ border-radius: 9px;
+ }
+}
+
+.tailscale-module {
+ &.on {
+ box-shadow: inset 0 0 0 1px $green;
+ border-radius: 9px;
+ }
+ &.off {
+ box-shadow: inset 0 0 0 1px $red;
+ border-radius: 9px;
+ }
+}
+
+.vpn-status-label {
+ font-size: 12px;
+ font-weight: bold;
+}
+.vpn-detail {
+ color: $subtext;
+ font-size: 11px;
+}
+
+.network-module {
+ .net-icon {
+ color: $green;
+ }
+ .net-disconnected {
+ color: $pink;
+ }
+ .net-strength {
+ color: $subtext;
+ font-size: 11px;
+ }
+ .net-wired {
+ color: $cyan;
+ }
+}
+
+.battery-module {
+ .bat-icon {
+ color: $green;
+ }
+ .bat-charging {
+ color: $yellow;
+ }
+ .bat-low {
+ color: $pink;
+ }
+ .bat-label {
+ font-size: 12px;
+ }
+}
+
+.sysstat-module {
+ .stat-icon {
+ color: $purple;
+ }
+ .stat-label {
+ font-size: 12px;
+ }
+}
+
+.weather-module {
+ .weather-text {
+ font-size: 12px;
+ }
+ .unit-toggle {
+ background: $overlay;
+ border: 1px solid $border;
+ border-radius: 6px;
+ padding: 0 4px;
+ margin: 0;
+ min-height: 0;
+ min-width: 0;
+ font-size: 11px;
+ color: $subtext;
+ &:hover {
+ color: $cyan;
+ border-color: $cyan;
+ }
+ }
+}
+
+.notif-bell {
+ .bell-icon {
+ color: $subtext;
+ }
+ .bell-count {
+ color: $pink;
+ font-size: 10px;
+ font-weight: bold;
+ }
+ &.has-notifs .bell-icon {
+ color: $purple;
+ }
+}
+
+// tray
+.tray-module {
+ background: $surface2;
+ border-radius: 8px;
+ padding: 1px 4px;
+ margin: 2px 2px;
+ border: 1px solid $border;
+
+ .tray-item {
+ background: transparent;
+ border: none;
+ padding: 1px 2px;
+ border-radius: 6px;
+ min-height: 0;
+ min-width: 0;
+ &:hover {
+ background: $overlay;
+ }
+ > button {
+ background: transparent;
+ border: none;
+ padding: 0;
+ margin: 0;
+ box-shadow: none;
+ min-height: 0;
+ min-width: 0;
+ &:hover,
+ &:active,
+ &:checked {
+ background: transparent;
+ box-shadow: none;
+ }
+ }
+ > button > image {
+ opacity: 0;
+ min-width: 0;
+ min-height: 0;
+ }
+ }
+}
+
+// volume popover
+.open-mixer-btn {
+ background: $overlay;
+ border: 1px solid $border;
+ border-radius: 8px;
+ padding: 4px 10px;
+ color: $subtext;
+ margin-top: 4px;
+ &:hover {
+ color: $cyan;
+ border-color: $cyan;
+ }
+}
+
+.vol-pct {
+ color: $subtext;
+ font-size: 11px;
+}
+.mic-icon {
+ color: $green;
+}
+
+// notifications
+window.notification-popup {
+ background: transparent;
+}
+
+.notif-popup-inner {
+ padding: 8px;
+}
+
+.notif-toast {
+ background: $surface;
+ border: 1px solid $border;
+ border-radius: 14px;
+ padding: 12px 14px;
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.5);
+ min-width: 320px;
+
+ .notif-app {
+ color: $purple;
+ font-size: 11px;
+ font-weight: bold;
+ }
+ .notif-close {
+ background: transparent;
+ border: none;
+ padding: 0 4px;
+ color: $subtext;
+ border-radius: 6px;
+ font-size: 11px;
+ &:hover {
+ color: $pink;
+ background: $overlay;
+ }
+ }
+ .notif-summary {
+ color: $text;
+ font-size: 13px;
+ font-weight: bold;
+ }
+ .notif-body {
+ color: $subtext;
+ font-size: 12px;
+ }
+}
+
+window.notification-center {
+ background: rgba(22, 22, 30, 0.85);
+ border-left: 1px solid $border;
+}
+
+.notif-center-inner {
+ padding: 16px 12px;
+ min-width: 340px;
+}
+
+.notif-center-header {
+ margin-bottom: 4px;
+ .notif-center-title {
+ font-size: 14px;
+ font-weight: bold;
+ color: $text;
+ }
+ .notif-clear-all {
+ background: $overlay;
+ border: 1px solid $border;
+ border-radius: 8px;
+ padding: 2px 10px;
+ color: $subtext;
+ font-size: 11px;
+ &:hover {
+ color: $pink;
+ border-color: $pink;
+ }
+ }
+}
+
+.notif-card {
+ background: $surface;
+ border: 1px solid $border;
+ border-radius: 12px;
+ padding: 10px 12px;
+
+ .notif-app {
+ color: $purple;
+ font-size: 11px;
+ font-weight: bold;
+ }
+ .notif-close {
+ background: transparent;
+ border: none;
+ padding: 0 4px;
+ color: $subtext;
+ border-radius: 6px;
+ font-size: 11px;
+ &:hover {
+ color: $pink;
+ background: $overlay;
+ }
+ }
+ .notif-summary {
+ color: $text;
+ font-size: 13px;
+ font-weight: bold;
+ }
+ .notif-body {
+ color: $subtext;
+ font-size: 12px;
+ }
+}
+
+.notif-empty {
+ color: $subtext;
+ font-size: 12px;
+}
+
+// clock popover
+.clock-tz-label {
+ color: $subtext;
+ font-size: 12px;
+}
+.clock-section-title {
+ color: $subtext;
+ font-size: 11px;
+ font-weight: bold;
+}
+
+.tz-btn {
+ background: transparent;
+ border: none;
+ border-radius: 6px;
+ padding: 3px 8px;
+ color: $text;
+ font-size: 12px;
+ &:hover {
+ background: $overlay;
+ color: $purple;
+ }
+}
+
+calendar {
+ background: $surface2;
+ border: 1px solid $border;
+ border-radius: 10px;
+ padding: 4px;
+ color: $text;
+
+ &:selected {
+ background: $purple;
+ color: $bg;
+ border-radius: 6px;
+ }
+ &.highlight {
+ color: $cyan;
+ font-weight: bold;
+ }
+ header {
+ color: $text;
+ font-weight: bold;
+ }
+ button {
+ background: transparent;
+ border: none;
+ color: $subtext;
+ border-radius: 4px;
+ }
+ button:hover {
+ background: $overlay;
+ color: $text;
+ }
+ button.day {
+ color: $text;
+ }
+ button.day:selected {
+ background: $purple;
+ color: $bg;
+ }
+ button.day.today {
+ color: $purple;
+ font-weight: bold;
+ }
+ button.day.other-month {
+ color: $subtext;
+ opacity: 0.5;
+ }
+}
+
+.clock-center-inner {
+ padding: 14px 12px;
+ min-width: 260px;
+}
+
+// popovers — reset GTK4's internal `contents` node padding
+popover > contents {
+ padding: 0;
+ margin: 0;
+ background: transparent;
+ border: none;
+ box-shadow: none;
+}
+
+popover {
+ background: $surface;
+ border: 1px solid $border;
+ border-radius: 12px;
+ padding: 12px;
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
+
+ scale {
+ min-width: 160px;
+ trough {
+ background: $overlay;
+ border-radius: 8px;
+ min-height: 6px;
+ }
+ highlight {
+ background: $purple;
+ border-radius: 8px;
+ }
+ slider {
+ background: $text;
+ border-radius: 50%;
+ min-width: 14px;
+ min-height: 14px;
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
+ }
+ }
+}
diff --git a/apps/.config/ags/tsconfig.json b/apps/.config/ags/tsconfig.json
new file mode 100644
index 0000000..2bb1f01
--- /dev/null
+++ b/apps/.config/ags/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "https://json.schemastore.org/tsconfig",
+ "compilerOptions": {
+ "strict": true,
+ "module": "ES2022",
+ "target": "ES2020",
+ "lib": ["ES2023"],
+ "moduleResolution": "Bundler",
+ // "checkJs": true,
+ // "allowJs": true,
+ "jsx": "react-jsx",
+ "jsxImportSource": "ags/gtk4"
+ }
+}
diff --git a/apps/.config/ags/widget/Bar.tsx b/apps/.config/ags/widget/Bar.tsx
new file mode 100644
index 0000000..51ffa80
--- /dev/null
+++ b/apps/.config/ags/widget/Bar.tsx
@@ -0,0 +1,64 @@
+import { Astal, Gtk, Gdk } from "ags/gtk4"
+import app from "ags/gtk4/app"
+
+import Workspaces from "./modules/Workspaces"
+import WindowTitle from "./modules/WindowTitle"
+import Clock from "./modules/Clock"
+import Media from "./modules/Media"
+import SysStats from "./modules/SysStats"
+import Weather from "./modules/Weather"
+import Network from "./modules/Network"
+import Battery from "./modules/Battery"
+import Brightness from "./modules/Brightness"
+import Volume from "./modules/Volume"
+import NotifBell from "./modules/NotifBell"
+import Tray from "./modules/Tray"
+import Mullvad from "./modules/Mullvad"
+import Tailscale from "./modules/Tailscale"
+
+export default function Bar(gdkmonitor: Gdk.Monitor) {
+ const { TOP, LEFT, RIGHT } = Astal.WindowAnchor
+
+ return (
+
+
+
+ {/* Left */}
+
+
+
+
+
+ {/* Center */}
+
+
+
+
+
+ {/* Right */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/.config/ags/widget/ClockCenter.tsx b/apps/.config/ags/widget/ClockCenter.tsx
new file mode 100644
index 0000000..1c1c8a0
--- /dev/null
+++ b/apps/.config/ags/widget/ClockCenter.tsx
@@ -0,0 +1,90 @@
+import { Astal, Gtk, Gdk } from "ags/gtk4"
+import app from "ags/gtk4/app"
+import { execAsync } from "ags/process"
+import { createState, createComputed, For } from "ags"
+import { interval } from "ags/time"
+
+const TIMEZONES = [
+ "America/Phoenix", "America/New_York", "America/Chicago",
+ "America/Denver", "America/Los_Angeles", "America/Anchorage",
+ "Pacific/Honolulu", "Europe/London", "Europe/Paris",
+ "Europe/Berlin", "Europe/Rome", "Europe/Moscow",
+ "Asia/Dubai", "Asia/Kolkata", "Asia/Bangkok",
+ "Asia/Shanghai", "Asia/Tokyo", "Asia/Seoul",
+ "Australia/Sydney", "Pacific/Auckland",
+]
+
+export default function ClockCenter(gdkmonitor: Gdk.Monitor) {
+ const { TOP } = Astal.WindowAnchor
+
+ const [time, setTime] = createState("")
+ const [date, setDate] = createState("")
+ const [tz, setTz] = createState("")
+
+ function pollTime() { execAsync(["date", "+%H:%M:%S"]).then(s => setTime(s.trim())).catch(() => {}) }
+ function pollDate() { execAsync(["date", "+%A, %B %d"]).then(s => setDate(s.trim())).catch(() => {}) }
+ function pollTz() { execAsync(["date", "+%Z"]).then(s => setTz(s.trim())).catch(() => {}) }
+
+ pollTime(); pollDate(); pollTz()
+ interval(1000, pollTime)
+ interval(60000, pollDate)
+ interval(10000, pollTz)
+
+ const [search, setSearch] = createState("")
+ const filtered = createComputed(() => {
+ const q = search().toLowerCase()
+ return TIMEZONES.filter(t => t.toLowerCase().includes(q))
+ })
+
+ const win = (
+ {
+ if (!isActive) app.toggle_window("clock-center")
+ }}
+ >
+
+ {
+ if (keyval === Gdk.KEY_Escape) app.toggle_window("clock-center")
+ }}
+ />
+
+
+
+
+
+
+
+ setSearch(text)}
+ />
+
+
+ zone}>
+ {zone => (
+
+ )}
+
+
+
+
+
+ ) as unknown as Astal.Window
+
+ return win
+}
diff --git a/apps/.config/ags/widget/NotificationCenter.tsx b/apps/.config/ags/widget/NotificationCenter.tsx
new file mode 100644
index 0000000..deefe32
--- /dev/null
+++ b/apps/.config/ags/widget/NotificationCenter.tsx
@@ -0,0 +1,98 @@
+import { Astal, Gtk, Gdk } from "ags/gtk4"
+import app from "ags/gtk4/app"
+import { For } from "ags"
+import { history, removeNotif, clearAll, type NotifEntry } from "./notifStore"
+
+function NotifCard({ entry }: { entry: NotifEntry }) {
+ const rightClick = new Gtk.GestureClick()
+ rightClick.button = 3
+ rightClick.connect("pressed", () => {
+ removeNotif(entry.id)
+ try { entry.notif.dismiss() } catch {}
+ })
+
+ // Left click only fires when clicking the card background (not child widgets)
+ const leftClick = new Gtk.GestureClick()
+ leftClick.button = 1
+ leftClick.propagation_phase = Gtk.PropagationPhase.TARGET
+ leftClick.connect("pressed", () => {
+ try { entry.notif.invoke("default") } catch {}
+ app.toggle_window("notification-center")
+ })
+
+ const box = (
+
+
+
+
+
+ {entry.summary
+ ?
+ : <>>
+ }
+ {entry.body
+ ?
+ : <>>
+ }
+
+ ) as unknown as Gtk.Box
+
+ box.add_controller(leftClick)
+ box.add_controller(rightClick)
+ return box
+}
+
+export default function NotificationCenter(gdkmonitor: Gdk.Monitor) {
+ const { RIGHT, TOP, BOTTOM } = Astal.WindowAnchor
+
+ return (
+
+
+ {
+ if (keyval === Gdk.KEY_Escape) app.toggle_window("notification-center")
+ }}
+ />
+
+
+
+ )
+}
diff --git a/apps/.config/ags/widget/NotificationPopup.tsx b/apps/.config/ags/widget/NotificationPopup.tsx
new file mode 100644
index 0000000..202c981
--- /dev/null
+++ b/apps/.config/ags/widget/NotificationPopup.tsx
@@ -0,0 +1,69 @@
+import { Astal, Gtk, Gdk } from "ags/gtk4"
+import app from "ags/gtk4/app"
+import Notifd from "gi://AstalNotifd"
+import Pango from "gi://Pango"
+import { createBinding, For } from "ags"
+import { timeout } from "ags/time"
+import { addNotif } from "./notifStore"
+
+type N = ReturnType["notifications"][0]
+
+function Toast({ notif }: { notif: N }) {
+ const gesture = new Gtk.GestureClick()
+ gesture.button = 3
+ gesture.connect("pressed", () => { try { notif.dismiss() } catch {} })
+
+ const box = (
+
+
+
+
+
+ {notif.summary
+ ?
+ : <>>
+ }
+ {notif.body
+ ?
+ : <>>
+ }
+
+ ) as unknown as Gtk.Box
+
+ box.add_controller(gesture)
+ return box
+}
+
+export default function NotificationPopup(gdkmonitor: Gdk.Monitor) {
+ const notifd = Notifd.get_default()
+ const notifs = createBinding(notifd, "notifications")
+ const { TOP, RIGHT } = Astal.WindowAnchor
+
+ notifd.connect("notified", (_self: typeof notifd, id: number) => {
+ const notif = notifd.get_notification(id)
+ if (!notif) return
+ addNotif(notif)
+ const ms = notif.expire_timeout > 0 ? notif.expire_timeout : 10000
+ timeout(ms, () => { try { notif.dismiss() } catch {} })
+ })
+
+ return (
+
+ )
+}
diff --git a/apps/.config/ags/widget/modules/Battery.tsx b/apps/.config/ags/widget/modules/Battery.tsx
new file mode 100644
index 0000000..265199d
--- /dev/null
+++ b/apps/.config/ags/widget/modules/Battery.tsx
@@ -0,0 +1,78 @@
+import { Gtk } from "ags/gtk4"
+import { execAsync } from "ags/process"
+import { createState } from "ags"
+import { interval } from "ags/time"
+
+interface BatState {
+ pct: number
+ charging: boolean
+ timeLeft: string
+}
+
+function parseBat(out: string): BatState {
+ const lines = out.split("\n")
+ let pct = 100, charging = false, timeLeft = ""
+ for (const line of lines) {
+ const l = line.trim()
+ if (l.startsWith("percentage:")) pct = parseInt(l.split(":")[1]) || 100
+ if (l.startsWith("state:")) charging = l.includes("charging") && !l.includes("discharging")
+ if (l.startsWith("time to empty:") || l.startsWith("time to full:"))
+ timeLeft = `~${l.split(":").slice(1).join(":").trim()}`
+ }
+ return { pct, charging, timeLeft }
+}
+
+export default function Battery() {
+ const [bat, setBat] = createState({ pct: 100, charging: false, timeLeft: "" })
+
+ function poll() {
+ execAsync(["upower", "-i", "/org/freedesktop/UPower/devices/battery_BAT1"])
+ .then(out => setBat(parseBat(out)))
+ .catch(() => {})
+ }
+
+ poll()
+ interval(5000, poll)
+
+ const popover = new Gtk.Popover()
+ popover.set_has_arrow(false)
+
+ const content = (
+
+
+ ) as unknown as Gtk.Widget
+
+ popover.set_child(content)
+
+ const btn = (
+
+ ) as unknown as Gtk.Button
+
+ popover.set_parent(btn)
+ return btn
+}
diff --git a/apps/.config/ags/widget/modules/Brightness.tsx b/apps/.config/ags/widget/modules/Brightness.tsx
new file mode 100644
index 0000000..9d131f4
--- /dev/null
+++ b/apps/.config/ags/widget/modules/Brightness.tsx
@@ -0,0 +1,52 @@
+import { Gtk } from "ags/gtk4"
+import { execAsync } from "ags/process"
+import { createState } from "ags"
+import { interval } from "ags/time"
+
+export default function Brightness() {
+ const [brightness, setBrightness] = createState({ cur: 0, max: 100 })
+
+ function poll() {
+ execAsync(["brightnessctl", "info"])
+ .then(out => {
+ const cur = parseInt(out.match(/Current brightness: (\d+)/)?.[1] ?? "0")
+ const max = parseInt(out.match(/Max brightness: (\d+)/)?.[1] ?? "100")
+ setBrightness({ cur, max })
+ }).catch(() => {})
+ }
+
+ poll()
+ interval(2000, poll)
+
+ const pct = brightness(b => Math.round((b.cur / b.max) * 100))
+ const icon = pct(p => p > 66 ? "" : p > 33 ? "" : "")
+
+ const popover = new Gtk.Popover()
+ popover.set_has_arrow(false)
+
+ const content = (
+
+
+ execAsync(["brightnessctl", "set", `${Math.round(self.value)}%`]).catch(() => {})}
+ />
+
+ ) as unknown as Gtk.Widget
+
+ popover.set_child(content)
+
+ const btn = (
+
+ ) as unknown as Gtk.Button
+
+ popover.set_parent(btn)
+ return btn
+}
diff --git a/apps/.config/ags/widget/modules/Clock.tsx b/apps/.config/ags/widget/modules/Clock.tsx
new file mode 100644
index 0000000..084929b
--- /dev/null
+++ b/apps/.config/ags/widget/modules/Clock.tsx
@@ -0,0 +1,27 @@
+import { createState } from "ags"
+import { interval } from "ags/time"
+import { execAsync } from "ags/process"
+import { Gtk } from "ags/gtk4"
+import app from "ags/gtk4/app"
+
+export default function Clock() {
+ const [time, setTime] = createState("")
+ const [date, setDate] = createState("")
+
+ function pollTime() { execAsync(["date", "+%H:%M:%S"]).then(s => setTime(s.trim())).catch(() => {}) }
+ function pollDate() { execAsync(["date", "+%a %b %d"]).then(s => setDate(s.trim())).catch(() => {}) }
+
+ pollTime(); pollDate()
+ interval(1000, pollTime)
+ interval(60000, pollDate)
+
+ return (
+
+ )
+}
diff --git a/apps/.config/ags/widget/modules/Media.tsx b/apps/.config/ags/widget/modules/Media.tsx
new file mode 100644
index 0000000..0334886
--- /dev/null
+++ b/apps/.config/ags/widget/modules/Media.tsx
@@ -0,0 +1,55 @@
+import { Gtk } from "ags/gtk4"
+import { execAsync } from "ags/process"
+import { createState } from "ags"
+import { interval } from "ags/time"
+
+interface MprisInfo {
+ title: string
+ artist: string
+ playing: boolean
+ player: string
+}
+
+const empty: MprisInfo = { title: "", artist: "", playing: false, player: "" }
+
+export default function Media() {
+ const [media, setMedia] = createState(empty)
+
+ function poll() {
+ execAsync("playerctl metadata --format '{{title}}|||{{artist}}|||{{status}}|||{{playerName}}'")
+ .then(out => {
+ const [title, artist, status, player] = out.trim().split("|||")
+ setMedia({ title: title || "", artist: artist || "", playing: status === "Playing", player: player || "" })
+ })
+ .catch(() => setMedia(empty))
+ }
+
+ poll()
+ interval(2000, poll)
+
+ return (
+ m.title !== "")}
+ >
+ m.title ? `${m.title}${m.artist ? " — " + m.artist : ""}` : "")}
+ />
+
+
+
+
+ )
+}
diff --git a/apps/.config/ags/widget/modules/Mullvad.tsx b/apps/.config/ags/widget/modules/Mullvad.tsx
new file mode 100644
index 0000000..71de25f
--- /dev/null
+++ b/apps/.config/ags/widget/modules/Mullvad.tsx
@@ -0,0 +1,76 @@
+import { Gtk } from "ags/gtk4"
+import { execAsync } from "ags/process"
+import { interval } from "ags/time"
+import { createState } from "ags"
+
+const FAVORITES = [
+ { label: "Phoenix", cmd: "mullvad relay set location us phx" },
+ { label: "Los Angeles", cmd: "mullvad relay set location us lax" },
+ { label: "Switzerland", cmd: "mullvad relay set location ch" },
+]
+
+export default function Mullvad() {
+ const [status, setStatus] = createState({ connected: false, location: "", ip: "" })
+
+ function poll() {
+ execAsync("mullvad status").then(out => {
+ const connected = out.toLowerCase().startsWith("connected")
+ const locMatch = out.match(/location:\s+(.+?)\./)
+ const ipMatch = out.match(/IPv4:\s+([\d.]+)/)
+ setStatus({ connected, location: locMatch?.[1]?.trim() ?? "", ip: ipMatch?.[1] ?? "" })
+ }).catch(() => {})
+ }
+
+ poll()
+ interval(5000, poll)
+
+ const popover = new Gtk.Popover()
+ popover.set_has_arrow(false)
+
+ const favBtns = FAVORITES.map(({ label, cmd }) => (
+
+ ))
+
+ const content = (
+
+ s.connected ? " Connected" : " Disconnected")} xalign={0} class="vpn-status-label" />
+ s.location || "—")} xalign={0} class="vpn-detail" />
+ s.ip || "—")} xalign={0} class="vpn-detail" />
+
+ {favBtns}
+
+
+
+ ) as unknown as Gtk.Widget
+
+ popover.set_child(content)
+
+ const icon = new Gtk.Image({ iconName: "mullvad-vpn", pixelSize: 16 })
+
+ const btn = (
+
+ ) as unknown as Gtk.Button
+
+ btn.set_child(icon)
+
+ const gesture = new Gtk.GestureClick()
+ gesture.button = 3
+ gesture.connect("pressed", () => popover.popup())
+ btn.add_controller(gesture)
+ popover.set_parent(btn)
+
+ return btn
+}
diff --git a/apps/.config/ags/widget/modules/Network.tsx b/apps/.config/ags/widget/modules/Network.tsx
new file mode 100644
index 0000000..11cb7ba
--- /dev/null
+++ b/apps/.config/ags/widget/modules/Network.tsx
@@ -0,0 +1,60 @@
+import { Gtk } from "ags/gtk4"
+import { execAsync } from "ags/process"
+import { createState } from "ags"
+import { interval } from "ags/time"
+
+type NetState = { type: "none" | "wifi" | "wired" | "rfkill"; ssid: string; strength: number; ip: string }
+
+export default function Network() {
+ const [net, setNet] = createState({ type: "none", ssid: "", strength: 0, ip: "" })
+ const [showIp, setShowIp] = createState(false)
+
+ function poll() {
+ execAsync(["bash", "-c", "rfkill list wifi | grep -q 'Hard blocked: yes\\|Soft blocked: yes' && echo rfkill; nmcli -t -f device,type,state dev 2>/dev/null | grep ':ethernet:connected' | head -1; echo '---'; nmcli -t -f active,ssid,signal dev wifi 2>/dev/null | grep '^yes' | head -1; echo '---'; ip -4 route get 1.1.1.1 2>/dev/null | grep -oP '(?<=src )[\\d.]+'"])
+ .then(out => {
+ if (out.startsWith("rfkill")) { setNet({ type: "rfkill", ssid: "", strength: 0, ip: "" }); return }
+ const [eth, wifi, ip] = out.split("---").map((s: string) => s.trim())
+ if (eth) { setNet({ type: "wired", ssid: "", strength: 0, ip: ip || "" }); return }
+ const parts = wifi?.split(":") ?? []
+ if (parts.length >= 3 && parts[0] === "yes")
+ setNet({ type: "wifi", ssid: parts[1], strength: parseInt(parts[2]) || 0, ip: ip || "" })
+ else
+ setNet({ type: "none", ssid: "", strength: 0, ip: "" })
+ }).catch(() => {})
+ }
+
+ poll()
+ interval(5000, poll)
+
+ const icon = net(n => {
+ if (n.type === "rfkill") return ""
+ if (n.type === "wired") return ""
+ if (n.type === "none") return ""
+ if (n.strength > 75) return ""
+ if (n.strength > 50) return ""
+ if (n.strength > 25) return ""
+ return ""
+ })
+
+ const labelText = net(n => {
+ if (n.type === "rfkill") return "rfkill"
+ if (showIp()) return n.ip || "no ip"
+ if (n.type === "wired") return "wired"
+ if (n.type === "wifi") return n.ssid || "connected"
+ return "offline"
+ })
+
+ return (
+
+ )
+}
diff --git a/apps/.config/ags/widget/modules/NotifBell.tsx b/apps/.config/ags/widget/modules/NotifBell.tsx
new file mode 100644
index 0000000..b25db9b
--- /dev/null
+++ b/apps/.config/ags/widget/modules/NotifBell.tsx
@@ -0,0 +1,25 @@
+import { Gtk } from "ags/gtk4"
+import app from "ags/gtk4/app"
+import { history } from "../notifStore"
+
+export default function NotifBell() {
+ return (
+
+ )
+}
diff --git a/apps/.config/ags/widget/modules/SysStats.tsx b/apps/.config/ags/widget/modules/SysStats.tsx
new file mode 100644
index 0000000..6ef5e0f
--- /dev/null
+++ b/apps/.config/ags/widget/modules/SysStats.tsx
@@ -0,0 +1,35 @@
+import { Gtk } from "ags/gtk4"
+import { createState } from "ags"
+import { interval } from "ags/time"
+import { execAsync } from "ags/process"
+
+export default function SysStats() {
+ const [cpu, setCpu] = createState("0")
+ const [ram, setRam] = createState("0")
+
+ function pollCpu() {
+ execAsync(["bash", "-c", "grep -m1 '^cpu ' /proc/stat | awk '{u=$2+$4; t=$2+$3+$4+$5; if(t>0) print int(u/t*100); else print 0}'"]).then(s => setCpu(s.trim())).catch(() => {})
+ }
+
+ function pollRam() {
+ execAsync(["bash", "-c", "free | awk '/^Mem:/{printf \"%d\", $3/$2*100}'"]).then(s => setRam(s.trim())).catch(() => {})
+ }
+
+ pollCpu()
+ pollRam()
+ interval(2000, pollCpu)
+ interval(5000, pollRam)
+
+ return (
+
+
+
+ `${c}%`)} />
+
+
+
+ `${r}%`)} />
+
+
+ )
+}
diff --git a/apps/.config/ags/widget/modules/Tailscale.tsx b/apps/.config/ags/widget/modules/Tailscale.tsx
new file mode 100644
index 0000000..3c22ea9
--- /dev/null
+++ b/apps/.config/ags/widget/modules/Tailscale.tsx
@@ -0,0 +1,60 @@
+import { Gtk } from "ags/gtk4"
+import { execAsync } from "ags/process"
+import { interval } from "ags/time"
+import { createState } from "ags"
+
+export default function Tailscale() {
+ const [status, setStatus] = createState({ up: false, ip: "", peers: 0 })
+
+ function poll() {
+ execAsync("tailscale status --json").then(out => {
+ try {
+ const j = JSON.parse(out)
+ setStatus({
+ up: j.BackendState === "Running",
+ ip: j.TailscaleIPs?.[0] ?? "",
+ peers: Object.keys(j.Peer ?? {}).length,
+ })
+ } catch {}
+ }).catch(() => {})
+ }
+
+ poll()
+ interval(5000, poll)
+
+ const popover = new Gtk.Popover()
+ popover.set_has_arrow(false)
+
+ const content = (
+
+ s.up ? " Running" : " Stopped")} xalign={0} class="vpn-status-label" />
+ s.ip ? `IP: ${s.ip}` : "No IP")} xalign={0} class="vpn-detail" />
+ `Peers: ${s.peers}`)} xalign={0} class="vpn-detail" />
+
+ ) as unknown as Gtk.Widget
+
+ popover.set_child(content)
+
+ const icon = new Gtk.Image({ iconName: "tailscale", pixelSize: 16 })
+
+ const btn = (
+
+ ) as unknown as Gtk.Button
+
+ btn.set_child(icon)
+
+ const gesture = new Gtk.GestureClick()
+ gesture.button = 3
+ gesture.connect("pressed", () => popover.popup())
+ btn.add_controller(gesture)
+ popover.set_parent(btn)
+
+ return btn
+}
diff --git a/apps/.config/ags/widget/modules/Tray.tsx b/apps/.config/ags/widget/modules/Tray.tsx
new file mode 100644
index 0000000..c21c3a3
--- /dev/null
+++ b/apps/.config/ags/widget/modules/Tray.tsx
@@ -0,0 +1,36 @@
+import { Gtk } from "ags/gtk4"
+import AstalTray from "gi://AstalTray"
+import { createBinding, For } from "ags"
+
+export default function Tray() {
+ const tray = AstalTray.get_default()
+ const items = createBinding(tray, "items")
+
+ return (
+ i.length > 0)}>
+ item.item_id}>
+ {item => {
+ const btn = new Gtk.Button()
+ btn.add_css_class("tray-item")
+ btn.valign = Gtk.Align.CENTER
+ btn.child = new Gtk.Image({ gicon: item.gicon, pixel_size: 16 })
+ btn.connect("clicked", () => item.activate(0, 0))
+
+ if (item.menu_model) {
+ const pop = new Gtk.PopoverMenu({ menu_model: item.menu_model })
+ if (item.action_group)
+ pop.insert_action_group("dbusmenu", item.action_group)
+ pop.set_parent(btn)
+
+ const gesture = new Gtk.GestureClick()
+ gesture.button = 3
+ gesture.connect("pressed", () => pop.popup())
+ btn.add_controller(gesture)
+ }
+
+ return btn
+ }}
+
+
+ )
+}
diff --git a/apps/.config/ags/widget/modules/Volume.tsx b/apps/.config/ags/widget/modules/Volume.tsx
new file mode 100644
index 0000000..70e452b
--- /dev/null
+++ b/apps/.config/ags/widget/modules/Volume.tsx
@@ -0,0 +1,85 @@
+import { Gtk } from "ags/gtk4"
+import { execAsync } from "ags/process"
+import { createState } from "ags"
+import { interval } from "ags/time"
+
+export default function Volume() {
+ const [spk, setSpk] = createState({ vol: 0, muted: false })
+ const [mic, setMic] = createState({ vol: 0, muted: false })
+
+ function pollSpk() {
+ execAsync(["wpctl", "get-volume", "@DEFAULT_AUDIO_SINK@"])
+ .then(out => {
+ const match = out.match(/Volume: ([\d.]+)/)
+ setSpk({ vol: match ? Math.round(parseFloat(match[1]) * 100) : 0, muted: out.includes("[MUTED]") })
+ }).catch(() => {})
+ }
+
+ function pollMic() {
+ execAsync(["wpctl", "get-volume", "@DEFAULT_AUDIO_SOURCE@"])
+ .then(out => {
+ const match = out.match(/Volume: ([\d.]+)/)
+ setMic({ vol: match ? Math.round(parseFloat(match[1]) * 100) : 0, muted: out.includes("[MUTED]") })
+ }).catch(() => {})
+ }
+
+ pollSpk(); pollMic()
+ interval(1000, pollSpk)
+ interval(1000, pollMic)
+
+ const spkIcon = spk(({ vol, muted }) => {
+ if (muted) return ""
+ if (vol === 0) return ""
+ if (vol < 50) return ""
+ return ""
+ })
+
+ const popover = new Gtk.Popover()
+ popover.set_has_arrow(false)
+
+ const content = (
+
+
+
+
+ `${v.vol}%`)} class="vol-pct" />
+
+ v.vol)}
+ widthRequest={180}
+ onNotifyValue={self => execAsync(["wpctl", "set-volume", "@DEFAULT_AUDIO_SINK@", `${self.value / 100}`]).catch(() => {})}
+ />
+
+ `module-icon ${m.muted ? "vol-muted" : "mic-icon"}`)} label={mic(m => m.muted ? "" : "")} />
+
+ `${v.vol}%`)} class="vol-pct" />
+
+ v.vol)}
+ widthRequest={180}
+ onNotifyValue={self => execAsync(["wpctl", "set-volume", "@DEFAULT_AUDIO_SOURCE@", `${self.value / 100}`]).catch(() => {})}
+ />
+
+
+ ) as unknown as Gtk.Widget
+
+ popover.set_child(content)
+
+ const btn = (
+
+ ) as unknown as Gtk.Button
+
+ popover.set_parent(btn)
+ return btn
+}
diff --git a/apps/.config/ags/widget/modules/Weather.tsx b/apps/.config/ags/widget/modules/Weather.tsx
new file mode 100644
index 0000000..bad8457
--- /dev/null
+++ b/apps/.config/ags/widget/modules/Weather.tsx
@@ -0,0 +1,49 @@
+import { Gtk } from "ags/gtk4"
+import GLib from "gi://GLib"
+import { execAsync } from "ags/process"
+import { interval } from "ags/time"
+import { createState, createEffect } from "ags"
+
+const UNIT_FILE = `${GLib.get_home_dir()}/.config/ags/.weather-unit`
+const LOCATION = "Phoenix"
+
+function readUnit(): "m" | "u" {
+ try {
+ const [ok, contents] = GLib.file_get_contents(UNIT_FILE)
+ return ok && new TextDecoder().decode(contents).trim() === "u" ? "u" : "m"
+ } catch { return "m" }
+}
+
+export default function Weather() {
+ const [unit, setUnit] = createState<"m" | "u">(readUnit())
+ const [text, setText] = createState("")
+
+ function fetch() {
+ execAsync(`curl -sf 'wttr.in/${LOCATION}?format=%c%t&${unit()}'`)
+ .then(s => setText(s.trim().replace(/\s+/g, " ").replace(/\+(\d)/g, "$1")))
+ .catch(() => {})
+ }
+
+ createEffect(() => {
+ unit() // subscribe — re-fetch when unit changes
+ fetch()
+ })
+
+ interval(1800000, fetch)
+
+ return (
+ t !== "")}>
+
+
+
+ )
+}
diff --git a/apps/.config/ags/widget/modules/WindowTitle.tsx b/apps/.config/ags/widget/modules/WindowTitle.tsx
new file mode 100644
index 0000000..55b1f9b
--- /dev/null
+++ b/apps/.config/ags/widget/modules/WindowTitle.tsx
@@ -0,0 +1,32 @@
+import { createState } from "ags"
+import { interval } from "ags/time"
+import { execAsync } from "ags/process"
+import { Gtk } from "ags/gtk4"
+
+interface NiriWindow {
+ title: string | null
+ app_id: string | null
+}
+
+export default function WindowTitle() {
+ const [win, setWin] = createState({ title: null, app_id: null })
+
+ function poll() {
+ execAsync(["niri", "msg", "--json", "focused-window"])
+ .then(out => { try { setWin(JSON.parse(out)) } catch {} })
+ .catch(() => setWin({ title: null, app_id: null }))
+ }
+
+ poll()
+ interval(1000, poll)
+
+ return (
+ w.title ?? w.app_id ?? "")}
+ />
+ )
+}
diff --git a/apps/.config/ags/widget/modules/Workspaces.tsx b/apps/.config/ags/widget/modules/Workspaces.tsx
new file mode 100644
index 0000000..13be16e
--- /dev/null
+++ b/apps/.config/ags/widget/modules/Workspaces.tsx
@@ -0,0 +1,46 @@
+import { createState } from "ags"
+import { interval } from "ags/time"
+import { execAsync } from "ags/process"
+import { Gtk } from "ags/gtk4"
+import { For } from "ags"
+
+interface NiriWorkspace {
+ id: number
+ idx: number
+ name: string | null
+ output: string
+ is_active: boolean
+ is_focused: boolean
+ active_window_id: number | null
+}
+
+export default function Workspaces() {
+ const [workspaces, setWorkspaces] = createState([])
+
+ function poll() {
+ execAsync(["niri", "msg", "--json", "workspaces"])
+ .then(out => {
+ try {
+ const ws = JSON.parse(out).sort((a: NiriWorkspace, b: NiriWorkspace) => a.idx - b.idx)
+ setWorkspaces(ws)
+ } catch {}
+ })
+ .catch(() => {})
+ }
+
+ poll()
+ interval(1000, poll)
+
+ return (
+
+ ws.id}>
+ {ws => (
+
+ )}
+
+
+ )
+}
diff --git a/apps/.config/ags/widget/notifStore.ts b/apps/.config/ags/widget/notifStore.ts
new file mode 100644
index 0000000..18607e2
--- /dev/null
+++ b/apps/.config/ags/widget/notifStore.ts
@@ -0,0 +1,42 @@
+import { createState } from "ags"
+import Notifd from "gi://AstalNotifd"
+
+type N = ReturnType["notifications"][0]
+
+export type NotifEntry = {
+ id: number
+ app_name: string
+ summary: string
+ body: string
+ notif: N
+}
+
+export const [history, setHistory] = createState([])
+
+const PRIVATE_APPS = ["signal", "Signal"]
+
+export function addNotif(notif: N) {
+ const private_ = PRIVATE_APPS.some(a => (notif.app_name || "").toLowerCase().includes(a.toLowerCase()))
+ setHistory(h => {
+ if (h.some(e => e.id === notif.id)) return h
+ return [...h, {
+ id: notif.id,
+ app_name: notif.app_name || "",
+ summary: notif.summary || "",
+ body: private_ ? "" : notif.body || "",
+ notif,
+ }]
+ })
+}
+
+export function removeNotif(id: number) {
+ setHistory(h => h.filter(e => e.id !== id))
+}
+
+export function clearAll() {
+ const notifd = Notifd.get_default()
+ for (const n of notifd.get_notifications()) {
+ try { n.dismiss() } catch {}
+ }
+ setHistory([])
+}
diff --git a/apps/.config/autostart/Hackatime Desktop.desktop b/apps/.config/autostart/Hackatime Desktop.desktop
new file mode 100755
index 0000000..4947c2f
--- /dev/null
+++ b/apps/.config/autostart/Hackatime Desktop.desktop
@@ -0,0 +1,8 @@
+[Desktop Entry]
+Type=Application
+Version=1.0
+Name=Hackatime Desktop
+Comment=Hackatime Desktopstartup script
+Exec=/home/end/Github/hackatime-desktop/src-tauri/target/release/desktop --minimized
+StartupNotify=false
+Terminal=false
\ No newline at end of file
diff --git a/apps/.config/btop/btop.conf b/apps/.config/btop/btop.conf
new file mode 100644
index 0000000..3cd0510
--- /dev/null
+++ b/apps/.config/btop/btop.conf
@@ -0,0 +1,272 @@
+#? Config file for btop v.1.4.6
+
+#* 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 = "mariana-purple"
+
+#* If the theme set background should be shown, set to False if you want terminal background transparency.
+theme_background = false
+
+#* 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
+
+#* Use terminal synchronized output sequences to reduce flickering on supported terminals.
+terminal_sync = 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 = "cpu mem net proc"
+
+#* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs.
+update_ms = 1000
+
+#* 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 = "memory"
+
+#* 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
+
+#* Should cpu and memory usage display be preserved for dead processes when paused.
+keep_dead_proc_usage = 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
+
+#* Shows the CPU package current power consumption in watts. Requires running `make setcap` or `make setuid` or running with sudo.
+show_cpu_watts = 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
+
+#* How to calculate CPU frequency, available values: "first", "range", "lowest", "highest" and "average".
+freq_mode = "first"
+
+#* 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 " ".
+#* Only disks matching the filter will be shown. Prepend exclude= to only show disks not matching the filter. Examples: disk_filter="/boot /home/user", 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 = true
+
+#* 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 "~/.local/state/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"
+
+#* Automatically save current settings to config file on exit.
+save_config_on_exit = true
+
+#* 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
+
+#* Set which GPU vendors to show. Available values are "nvidia amd intel"
+shown_gpus = "nvidia amd intel"
+
+#* 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/apps/.config/firewall/applet.conf b/apps/.config/firewall/applet.conf
new file mode 100644
index 0000000..3f1d929
--- /dev/null
+++ b/apps/.config/firewall/applet.conf
@@ -0,0 +1,2 @@
+[General]
+notifications=true
diff --git a/apps/.config/mimeapps.list b/apps/.config/mimeapps.list
new file mode 100644
index 0000000..e8997d8
--- /dev/null
+++ b/apps/.config/mimeapps.list
@@ -0,0 +1,353 @@
+[Added Associations]
+application/json=vscodium-3.desktop;vscodium-2.desktop;/home/end/.local/share/applications/code-3.desktop;
+application/pdf=zen.desktop;helium.desktop;
+application/vnd.microsoft.portable-executable=wine-2.desktop;
+audio/AMR=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/AMR-WB=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/aac=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/ac3=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/annodex=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/basic=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/flac=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/midi=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/mobile-xmf=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/mp2=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/mp4=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/mpeg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/mpegurl=vlc.desktop;
+audio/ogg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/prs.sid=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/usac=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/vnd.audible.aax=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/vnd.audible.aaxc=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/vnd.dts=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/vnd.dts.hd=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/vnd.rn-realaudio=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/vnd.wave=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/vorbis=vlc.desktop;
+audio/webm=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-adpcm=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-aifc=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-aiff=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-amzxml=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-ape=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-dff=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-dsf=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-flac=vlc.desktop;
+audio/x-flac+ogg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-gsm=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-iriver-pla=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-it=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-m4b=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-m4r=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-matroska=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-minipsf=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-mo3=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-mod=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-mp3=vlc.desktop;
+audio/x-mpegurl=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-ms-asx=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-ms-wma=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-musepack=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-oggflac=vlc.desktop;
+audio/x-opus+ogg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-pn-audibleaudio=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-pn-realaudio=vlc.desktop;
+audio/x-psf=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-psflib=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-riff=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-s3m=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-scpls=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-speex=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-speex+ogg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-stm=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-tak=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-tta=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-voc=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-vorbis=vlc.desktop;
+audio/x-vorbis+ogg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-wav=vlc.desktop;
+audio/x-wavpack=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-wavpack-correction=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-xi=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-xm=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+audio/x-xmf=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+image/apng=firefox.desktop;
+image/gif=firefox.desktop;
+image/jpeg=firefox.desktop;
+inode/directory=org.gnome.Nautilus.desktop;yazi.desktop;
+text/cache-manifest=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/calendar=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;org.mozilla.Thunderbird.desktop;
+text/css=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/csv=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;dev.zed.Zed-Dev.desktop;
+text/csv-schema=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/enriched=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/htmlh=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/javascript=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/jscript.encode=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/julia=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/lrs=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/markdown=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/org=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/plain=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/rfc822-headers=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/richtext=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/rust=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/sgml=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/spreadsheet=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/tab-separated-values=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/tcl=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/troff=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/vbscript=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/vcard=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/vnd.trolltech.linguist=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/vnd.wap.wml=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/x-component=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/x-google-video-pointer=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/x-iMelody=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/x-maven+xml=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/x-mrml=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/x-opml+xml=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/x-patch=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/x-xmi=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+text/x-xslfo=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+video/3gpp=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/3gpp2=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/annodex=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/dv=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/isivideo=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/mj2=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/mp2t=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/mp4=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/mpeg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/ogg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/quicktime=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/vnd.avi=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/vnd.mpegurl=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/vnd.radgamettools.bink=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/vnd.radgamettools.smacker=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/vnd.rn-realvideo=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/vnd.vivo=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/vnd.youtube.yt=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/wavelet=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/webm=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/x-anim=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/x-flic=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/x-flv=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/x-javafx=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/x-matroska=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/x-matroska-3d=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/x-mjpeg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/x-mng=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/x-ms-wmp=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/x-ms-wmv=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/x-nsv=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/x-ogm+ogg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/x-sgi-movie=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+video/x-theora+ogg=vlc.desktop;org.gnome.Showtime.desktop;org.gnome.Totem.desktop;firefox.desktop;mpv.desktop;mplayer.desktop;audacity.desktop;org.musicbrainz.Picard.desktop;
+x-scheme-handler/about=zen.desktop;
+x-scheme-handler/mailto=org.mozilla.Thunderbird.desktop;
+x-scheme-handler/sgnl=signal-desktop.desktop;signal.desktop;
+x-scheme-handler/signalcaptcha=signal-desktop.desktop;signal.desktop;
+x-scheme-handler/slack=slack.desktop;Slack.desktop;
+x-scheme-handler/unknown=zen.desktop;
+x-scheme-handler/x-github-client=github-desktop.desktop;GitHub Desktop.desktop;
+x-scheme-handler/x-github-desktop-auth=github-desktop.desktop;GitHub Desktop.desktop;
+
+[Default Applications]
+x-scheme-handler/http=helium.desktop
+x-scheme-handler/https=helium.desktop
+text/html=helium.desktop
+application/json=vscodium-3.desktop;
+application/pdf=helium.desktop
+application/vnd.microsoft.portable-executable=wine-2.desktop;
+audio/AMR=vlc.desktop;
+audio/AMR-WB=vlc.desktop;
+audio/aac=vlc.desktop;
+audio/ac3=vlc.desktop;
+audio/annodex=vlc.desktop;
+audio/basic=vlc.desktop;
+audio/flac=vlc.desktop;
+audio/midi=vlc.desktop;
+audio/mobile-xmf=vlc.desktop;
+audio/mp2=vlc.desktop;
+audio/mp4=vlc.desktop;
+audio/mpeg=vlc.desktop;
+audio/mpegurl=vlc.desktop;
+audio/ogg=vlc.desktop;
+audio/prs.sid=vlc.desktop;
+audio/usac=vlc.desktop;
+audio/vnd.audible.aax=vlc.desktop;
+audio/vnd.audible.aaxc=vlc.desktop;
+audio/vnd.dts=vlc.desktop;
+audio/vnd.dts.hd=vlc.desktop;
+audio/vnd.rn-realaudio=vlc.desktop;
+audio/vnd.wave=vlc.desktop;
+audio/vorbis=vlc.desktop;
+audio/webm=vlc.desktop;
+audio/x-adpcm=vlc.desktop;
+audio/x-aifc=vlc.desktop;
+audio/x-aiff=vlc.desktop;
+audio/x-amzxml=vlc.desktop;
+audio/x-ape=vlc.desktop;
+audio/x-dff=vlc.desktop;
+audio/x-dsf=vlc.desktop;
+audio/x-flac=vlc.desktop;
+audio/x-flac+ogg=vlc.desktop;
+audio/x-gsm=vlc.desktop;
+audio/x-iriver-pla=vlc.desktop;
+audio/x-it=vlc.desktop;
+audio/x-m4b=vlc.desktop;
+audio/x-m4r=vlc.desktop;
+audio/x-matroska=vlc.desktop;
+audio/x-minipsf=vlc.desktop;
+audio/x-mo3=vlc.desktop;
+audio/x-mod=vlc.desktop;
+audio/x-mp3=vlc.desktop;
+audio/x-mpegurl=vlc.desktop;
+audio/x-ms-asx=vlc.desktop;
+audio/x-ms-wma=vlc.desktop;
+audio/x-musepack=vlc.desktop;
+audio/x-oggflac=vlc.desktop;
+audio/x-opus+ogg=vlc.desktop;
+audio/x-pn-audibleaudio=vlc.desktop;
+audio/x-pn-realaudio=vlc.desktop;
+audio/x-psf=vlc.desktop;
+audio/x-psflib=vlc.desktop;
+audio/x-riff=vlc.desktop;
+audio/x-s3m=vlc.desktop;
+audio/x-scpls=vlc.desktop;
+audio/x-speex=vlc.desktop;
+audio/x-speex+ogg=vlc.desktop;
+audio/x-stm=vlc.desktop;
+audio/x-tak=vlc.desktop;
+audio/x-tta=vlc.desktop;
+audio/x-voc=vlc.desktop;
+audio/x-vorbis=vlc.desktop;
+audio/x-vorbis+ogg=vlc.desktop;
+audio/x-wav=vlc.desktop;
+audio/x-wavpack=vlc.desktop;
+audio/x-wavpack-correction=vlc.desktop;
+audio/x-xi=vlc.desktop;
+audio/x-xm=vlc.desktop;
+audio/x-xmf=vlc.desktop;
+inode/directory=org.gnome.Nautilus.desktop;
+text/cache-manifest=dev.zed.Zed.desktop;
+text/calendar=org.mozilla.Thunderbird.desktop
+text/css=dev.zed.Zed.desktop;
+text/csv=dev.zed.Zed-Dev.desktop
+text/csv-schema=dev.zed.Zed.desktop;
+text/enriched=dev.zed.Zed.desktop;
+text/htmlh=dev.zed.Zed.desktop;
+text/javascript=dev.zed.Zed.desktop;
+text/jscript.encode=dev.zed.Zed.desktop;
+text/julia=dev.zed.Zed.desktop;
+text/lrs=dev.zed.Zed.desktop;
+text/markdown=dev.zed.Zed.desktop;
+text/org=dev.zed.Zed.desktop;
+text/plain=dev.zed.Zed.desktop;
+text/rfc822-headers=dev.zed.Zed.desktop;
+text/richtext=dev.zed.Zed.desktop;
+text/rust=dev.zed.Zed.desktop;
+text/sgml=dev.zed.Zed.desktop;
+text/spreadsheet=dev.zed.Zed.desktop;
+text/tab-separated-values=dev.zed.Zed.desktop;
+text/tcl=dev.zed.Zed.desktop;
+text/troff=dev.zed.Zed.desktop;
+text/vbscript=dev.zed.Zed.desktop;
+text/vcard=dev.zed.Zed.desktop;
+text/vnd.trolltech.linguist=dev.zed.Zed.desktop;
+text/vnd.wap.wml=dev.zed.Zed.desktop;
+text/x-component=dev.zed.Zed.desktop;
+text/x-google-video-pointer=dev.zed.Zed.desktop;
+text/x-iMelody=dev.zed.Zed.desktop;
+text/x-maven+xml=dev.zed.Zed.desktop;
+text/x-mrml=dev.zed.Zed.desktop;
+text/x-opml+xml=dev.zed.Zed.desktop;
+text/x-patch=dev.zed.Zed.desktop;
+text/x-xmi=dev.zed.Zed.desktop;
+text/x-xslfo=dev.zed.Zed.desktop;
+video/3gpp=vlc.desktop;
+video/3gpp2=vlc.desktop;
+video/annodex=vlc.desktop;
+video/dv=vlc.desktop;
+video/isivideo=vlc.desktop;
+video/mj2=vlc.desktop;
+video/mp2t=vlc.desktop;
+video/mp4=vlc.desktop;
+video/mpeg=vlc.desktop;
+video/ogg=vlc.desktop;
+video/quicktime=vlc.desktop;
+video/vnd.avi=vlc.desktop;
+video/vnd.mpegurl=vlc.desktop;
+video/vnd.radgamettools.bink=vlc.desktop;
+video/vnd.radgamettools.smacker=vlc.desktop;
+video/vnd.rn-realvideo=vlc.desktop;
+video/vnd.vivo=vlc.desktop;
+video/vnd.youtube.yt=vlc.desktop;
+video/wavelet=vlc.desktop;
+video/webm=vlc.desktop;
+video/x-anim=vlc.desktop;
+video/x-flic=vlc.desktop;
+video/x-flv=vlc.desktop;
+video/x-javafx=vlc.desktop;
+video/x-matroska=vlc.desktop;
+video/x-matroska-3d=vlc.desktop;
+video/x-mjpeg=vlc.desktop;
+video/x-mng=vlc.desktop;
+video/x-ms-wmp=vlc.desktop;
+video/x-ms-wmv=vlc.desktop;
+video/x-nsv=vlc.desktop;
+video/x-ogm+ogg=vlc.desktop;
+video/x-sgi-movie=vlc.desktop;
+video/x-theora+ogg=vlc.desktop;
+x-scheme-handler/adskidmgr=adskidmgr-opener.desktop;
+x-scheme-handler/discord=vesktop.desktop
+x-scheme-handler/sgnl=signal.desktop
+x-scheme-handler/signalcaptcha=signal.desktop
+x-scheme-handler/slack=slack.desktop
+x-scheme-handler/x-github-client=github-desktop.desktop
+x-scheme-handler/x-github-desktop-auth=github-desktop.desktop
+x-scheme-handler/tel=helium.desktop
+x-scheme-handler/claude-cli=claude-code-url-handler.desktop
+x-scheme-handler/pttp=CiscoPacketTracerPtsa-9.0.0.desktop
+application/x-pka=CiscoPacketTracer-9.0.0.desktop
+application/x-pkt=CiscoPacketTracer-9.0.0.desktop
+application/x-pkz=CiscoPacketTracer-9.0.0.desktop
+application/x-pksz=CiscoPacketTracer-9.0.0.desktop
+x-scheme-handler/hackatime=desktop-handler.desktop
+
+[Removed Associations]
+audio/aac=org.gnome.Decibels.desktop;
+audio/flac=org.gnome.Decibels.desktop;
+audio/mp2=org.gnome.Decibels.desktop;
+audio/mp4=org.gnome.Decibels.desktop;
+audio/mpeg=org.gnome.Decibels.desktop;
+audio/vnd.wave=org.gnome.Decibels.desktop;
+audio/x-aiff=org.gnome.Decibels.desktop;
+audio/x-ape=org.gnome.Decibels.desktop;
+audio/x-m4b=org.gnome.Decibels.desktop;
+audio/x-mpegurl=org.gnome.Decibels.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;dev.zed.Zed.desktop;libreoffice-writer.desktop;vscodium-wayland.desktop;
+audio/x-opus+ogg=org.gnome.Decibels.desktop;
+audio/x-speex=org.gnome.Decibels.desktop;
+audio/x-vorbis+ogg=org.gnome.Decibels.desktop;
+audio/x-wavpack=org.gnome.Decibels.desktop;
+text/calendar=org.gnome.Calendar.desktop;
+text/csv=libreoffice-calc.desktop;
+text/spreadsheet=libreoffice-calc.desktop;
+text/tab-separated-values=libreoffice-calc.desktop;
+text/vbscript=wine-extension-vbs.desktop;
+text/vcard=org.mozilla.Thunderbird.desktop;
+text/vnd.trolltech.linguist=linguist.desktop;firefox.desktop;com.google.Chrome.desktop;google-chrome.desktop;zen.desktop;
+text/vnd.wap.wml=firefox.desktop;com.google.Chrome.desktop;google-chrome.desktop;zen.desktop;
+text/x-component=firefox.desktop;com.google.Chrome.desktop;google-chrome.desktop;zen.desktop;
+text/x-google-video-pointer=vlc.desktop;org.gnome.Totem.desktop;
+text/x-maven+xml=firefox.desktop;com.google.Chrome.desktop;google-chrome.desktop;zen.desktop;
+text/x-mrml=firefox.desktop;com.google.Chrome.desktop;google-chrome.desktop;zen.desktop;
+text/x-opml+xml=firefox.desktop;com.google.Chrome.desktop;google-chrome.desktop;zen.desktop;
+text/x-patch=org.kde.kompare.desktop;
+text/x-xmi=firefox.desktop;com.google.Chrome.desktop;google-chrome.desktop;zen.desktop;
+text/x-xslfo=firefox.desktop;com.google.Chrome.desktop;google-chrome.desktop;zen.desktop;
+video/vnd.mpegurl=dev.zed.Zed.desktop;vscodium-wayland.desktop;vscodium.desktop;code-6.desktop;code-5.desktop;code-4.desktop;org.gnome.TextEditor.desktop;vim.desktop;libreoffice-writer.desktop;
+video/vnd.youtube.yt=io.mrarm.mcpelauncher-ui-qt.desktop;org.gnome.Nautilus.desktop;org.prismlauncher.PrismLauncher.desktop;peazip.desktop;
+video/x-mjpeg=feh.desktop;com.google.Chrome.desktop;swappy.desktop;google-chrome.desktop;org.gnome.Loupe.desktop;
diff --git a/apps/.config/niri/config.kdl b/apps/.config/niri/config.kdl
new file mode 100644
index 0000000..59ef251
--- /dev/null
+++ b/apps/.config/niri/config.kdl
@@ -0,0 +1,653 @@
+// This config is in the KDL format: https://kdl.dev
+// "/-" comments out the following node.
+// Check the wiki for a full description of the configuration:
+// https://github.com/YaLTeR/niri/wiki/Configuration:-Introduction
+
+// Input device configuration.
+// Find the full list of options on the wiki:
+// https://github.com/YaLTeR/niri/wiki/Configuration:-Input
+input {
+ keyboard {
+ xkb {
+ // You can set rules, model, layout, variant and options.
+ // For more information, see xkeyboard-config(7).
+
+ // For example:
+ layout "us"
+ variant "altgr-intl" // or "intl"
+ options "lv3:ralt_switch" // Enable Right Alt as AltGr
+ }
+
+ // Enable numlock on startup, omitting this setting disables it.
+ numlock
+ }
+
+ // Next sections include libinput settings.
+ // Omitting settings disables them, or leaves them at their default values.
+ touchpad {
+ // off
+ tap
+ // dwt
+ // dwtp
+ // drag false
+ // drag-lock
+ natural-scroll
+ // accel-speed 0.2
+ // accel-profile "flat"
+ // scroll-method "two-finger"
+ // disabled-on-external-mouse
+ }
+
+ mouse {
+ // off
+ // natural-scroll
+ // accel-speed 0.2
+ // accel-profile "flat"
+ // scroll-method "no-scroll"
+ }
+
+ trackpoint {
+ // off
+ // natural-scroll
+ // accel-speed 0.2
+ // accel-profile "flat"
+ // scroll-method "on-button-down"
+ // scroll-button 273
+ // middle-emulation
+ }
+
+ // Uncomment this to make the mouse warp to the center of newly focused windows.
+ // warp-mouse-to-focus
+
+ // Focus windows and outputs automatically when moving the mouse into them.
+ // Setting max-scroll-amount="0%" makes it work only on windows already fully on screen.
+ // focus-follows-mouse max-scroll-amount="0%"
+}
+
+workspace "main"
+workspace "comms"
+
+// You can configure outputs by their name, which you can find
+// by running `niri msg outputs` while inside a niri instance.
+// The built-in laptop monitor is usually called "eDP-1".
+// Find more information on the wiki:
+// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs
+// Remember to uncomment the node by removing "/-"!
+output "eDP-1" {
+ // Uncomment this line to disable this output.
+ // off
+
+ // Resolution and, optionally, refresh rate of the output.
+ // The format is "x" or "x@".
+ // If the refresh rate is omitted, niri will pick the highest refresh rate
+ // for the resolution.
+ // If the mode is omitted altogether or is invalid, niri will pick one automatically.
+ // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.
+ mode "2560x1600@165.000"
+
+ // You can use integer or fractional scale, for example use 1.5 for 150% scale.
+ scale 1.5
+
+ // Enable variable refresh rate (VRR / FreeSync / G-Sync).
+ variable-refresh-rate
+
+ // Transform allows to rotate the output counter-clockwise, valid values are:
+ // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.
+ transform "normal"
+
+ // Position of the output in the global coordinate space.
+ // This affects directional monitor actions like "focus-monitor-left", and cursor movement.
+ // The cursor can only move between directly adjacent outputs.
+ // Output scale and rotation has to be taken into account for positioning:
+ // outputs are sized in logical, or scaled, pixels.
+ // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,
+ // so to put another output directly adjacent to it on the right, set its x to 1920.
+ // If the position is unset or results in an overlap, the output is instead placed
+ // automatically.
+ position x=0 y=0
+}
+
+// Settings that influence how windows are positioned and sized.
+// Find more information on the wiki:
+// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout
+layout {
+ // Set gaps around windows in logical pixels.
+ gaps 8
+
+ // When to center a column when changing focus, options are:
+ // - "never", default behavior, focusing an off-screen column will keep at the left
+ // or right edge of the screen.
+ // - "always", the focused column will always be centered.
+ // - "on-overflow", focusing a column will center it if it doesn't fit
+ // together with the previously focused column.
+ center-focused-column "never"
+
+ // You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between.
+ preset-column-widths {
+ // Proportion sets the width as a fraction of the output width, taking gaps into account.
+ // For example, you can perfectly fit four windows sized "proportion 0.25" on an output.
+ // The default preset widths are 1/3, 1/2 and 2/3 of the output.
+ proportion 0.33333
+ proportion 0.5
+ proportion 0.66667
+
+ // Fixed sets the width in logical pixels exactly.
+ // fixed 1920
+ }
+
+ // You can also customize the heights that "switch-preset-window-height" (Mod+Shift+R) toggles between.
+ // preset-window-heights { }
+
+ // You can change the default width of the new windows.
+ default-column-width { proportion 0.5; }
+ // If you leave the brackets empty, the windows themselves will decide their initial width.
+ // default-column-width {}
+
+ // By default focus ring and border are rendered as a solid background rectangle
+ // behind windows. That is, they will show up through semitransparent windows.
+ // This is because windows using client-side decorations can have an arbitrary shape.
+ //
+ // If you don't like that, you should uncomment `prefer-no-csd` below.
+ // Niri will draw focus ring and border *around* windows that agree to omit their
+ // client-side decorations.
+ //
+ // Alternatively, you can override it with a window rule called
+ // `draw-border-with-background`.
+
+ // You can change how the focus ring looks.
+ focus-ring {
+ // Uncomment this line to disable the focus ring.
+ // off
+
+ // How many logical pixels the ring extends out from the windows.
+ width 4
+
+ // Colors can be set in a variety of ways:
+ // - CSS named colors: "red"
+ // - RGB hex: "#rgb", "#rgba", "#rrggbb", "#rrggbbaa"
+ // - CSS-like notation: "rgb(255, 127, 0)", rgba(), hsl() and a few others.
+
+ // Color of the ring on the active monitor.
+ active-color "#0f0a67ff"
+
+ // Color of the ring on inactive monitors.
+ inactive-color "#505050"
+
+ // You can also use gradients. They take precedence over solid colors.
+ // Gradients are rendered the same as CSS linear-gradient(angle, from, to).
+ // The angle is the same as in linear-gradient, and is optional,
+ // defaulting to 180 (top-to-bottom gradient).
+ // You can use any CSS linear-gradient tool on the web to set these up.
+ // Changing the color space is also supported, check the wiki for more info.
+ //
+ active-gradient from="#c792ea" to="#5fb3b3" angle=45
+
+ // You can also color the gradient relative to the entire view
+ // of the workspace, rather than relative to just the window itself.
+ // To do that, set relative-to="workspace-view".
+ //
+ inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
+ }
+
+ // You can also add a border. It's similar to the focus ring, but always visible.
+ border {
+ // The settings are the same as for the focus ring.
+ // If you enable the border, you probably want to disable the focus ring.
+ off
+
+ width 4
+ active-color "#ffc87f"
+ inactive-color "#505050"
+
+ // Color of the border around windows that request your attention.
+ urgent-color "#9b0000"
+
+ // active-gradient from="#ffbb66" to="#ffc880" angle=45 relative-to="workspace-view"
+ // inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
+ }
+
+ // You can enable drop shadows for windows.
+ shadow {
+ // Uncomment the next line to enable shadows.
+ on
+
+ // By default, the shadow draws only around its window, and not behind it.
+ // Uncomment this setting to make the shadow draw behind its window.
+ //
+ // Note that niri has no way of knowing about the CSD window corner
+ // radius. It has to assume that windows have square corners, leading to
+ // shadow artifacts inside the CSD rounded corners. This setting fixes
+ // those artifacts.
+ //
+ // However, instead you may want to set prefer-no-csd and/or
+ // geometry-corner-radius. Then, niri will know the corner radius and
+ // draw the shadow correctly, without having to draw it behind the
+ // window. These will also remove client-side shadows if the window
+ // draws any.
+ //
+ // draw-behind-window true
+
+ // You can change how shadows look. The values below are in logical
+ // pixels and match the CSS box-shadow properties.
+
+ // Softness controls the shadow blur radius.
+ softness 30
+
+ // Spread expands the shadow.
+ spread 5
+
+ // Offset moves the shadow relative to the window.
+ offset x=0 y=5
+
+ // You can also change the shadow color and opacity.
+ color "#0007"
+ }
+
+ // Struts shrink the area occupied by windows, similarly to layer-shell panels.
+ // You can think of them as a kind of outer gaps. They are set in logical pixels.
+ // Left and right struts will cause the next window to the side to always be visible.
+ // Top and bottom struts will simply add outer gaps in addition to the area occupied by
+ // layer-shell panels and regular gaps.
+ struts {
+ // left 64
+ // right 64
+ // top 64
+ // bottom 64
+ }
+}
+
+// Add lines like this to spawn processes at startup.
+// Note that running niri as a session supports xdg-desktop-autostart,
+// which may be more convenient to use.
+// See the binds section below for more spawn examples.
+
+spawn-at-startup "bash" "-c" "ags run /home/end/.config/ags"
+spawn-at-startup "vicinae" "server"
+spawn-at-startup "/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1"
+spawn-at-startup "wallpaper-init"
+spawn-at-startup "signal-desktop"
+spawn-at-startup "discord"
+spawn-at-startup "zen-browser"
+spawn-at-startup "qpwgraph" "--minimized"
+spawn-at-startup "wezterm"
+
+
+// Uncomment this line to ask the clients to omit their client-side decorations if possible.
+// If the client will specifically ask for CSD, the request will be honored.
+// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.
+// This option will also fix border/focus ring drawing behind some semitransparent windows.
+// After enabling or disabling this, you need to restart the apps for this to take effect.
+prefer-no-csd
+
+// You can change the path where screenshots are saved.
+// A ~ at the front will be expanded to the home directory.
+// The path is formatted with strftime(3) to give you the screenshot date and time.
+screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"
+
+// You can also set this to null to disable saving screenshots to disk.
+// screenshot-path null
+
+// Animation settings.
+// The wiki explains how to configure individual animations:
+// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations
+animations {
+ // Uncomment to turn off all animations.
+ // off
+
+ // Slow down all animations by this factor. Values below 1 speed them up instead.
+ // slowdown 3.0
+
+ // Window open: springy feel
+ window-open {
+ spring damping-ratio=0.8 stiffness=400 epsilon=0.0001
+ }
+
+ // Window close: quick ease out
+ window-close {
+ duration-ms 150
+ curve "ease-out-cubic"
+ }
+
+ // Workspace switch: smooth spring
+ workspace-switch {
+ spring damping-ratio=1.0 stiffness=500 epsilon=0.0001
+ }
+
+ // Column movement
+ horizontal-view-movement {
+ spring damping-ratio=1.0 stiffness=500 epsilon=0.0001
+ }
+}
+
+// Window rules let you adjust behavior for individual windows.
+// Find more information on the wiki:
+// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules
+
+// Work around WezTerm's initial configure bug
+// by setting an empty default-column-width.
+window-rule {
+ // This regular expression is intentionally made as specific as possible,
+ // since this is the default config, and we want no false positives.
+ // You can get away with just app-id="wezterm" if you want.
+ match app-id=r#"^org\.wezfurlong\.wezterm$"#
+ default-column-width {}
+}
+
+// Open the Firefox picture-in-picture player as floating by default.
+window-rule {
+ // This app-id regular expression will work for both:
+ // - host Firefox (app-id is "firefox")
+ // - Flatpak Firefox (app-id is "org.mozilla.firefox")
+ match app-id=r#"firefox$"# title="^Picture-in-Picture$"
+ open-floating false
+}
+
+// Example: block out two password managers from screen capture.
+// (This example rule is commented out with a "/-" in front.)
+window-rule {
+ match app-id=r#"^org\.keepassxc\.KeePassXC$"#
+ match app-id=r#"^org\.gnome\.World\.Secrets$"#
+ match app-id=r#"^signal$"#
+ match app-id=r#"^com\.discordapp\.Discord$"#
+ /- match app-id=r#"^org\.wezfurlong\.wezterm$"#
+ match app-id=r#"^Bitwarden$"#
+ block-out-from "screen-capture"
+}
+
+// Example: enable rounded corners for all windows.
+// (This example rule is commented out with a "/-" in front.)
+window-rule {
+ geometry-corner-radius 12
+ clip-to-geometry true
+}
+
+// Workspace 1: productivity / personal
+window-rule {
+ match app-id="helium"
+ match app-id=r#"^org\.wezfurlong\.wezterm$"#
+ match app-id="obsidian"
+ match app-id="thunderbird"
+ open-on-workspace "main"
+}
+
+// Workspace 2: comms / social
+window-rule {
+ match app-id="steam"
+ match app-id=r#"^signal$"#
+ match app-id=r#"^com\.discordapp\.Discord$"#
+ match app-id="discord"
+ match app-id=r#"zen-browser$"#
+ match app-id="slack"
+ open-on-workspace "comms"
+}
+
+// Float pavucontrol
+window-rule {
+ match app-id="org.pulseaudio.pavucontrol"
+ open-floating true
+}
+
+binds {
+ // Keys consist of modifiers separated by + signs, followed by an XKB key name
+ // in the end. To find an XKB name for a particular key, you may use a program
+ // like wev.
+ //
+ // "Mod" is a special modifier equal to Super when running on a TTY, and to Alt
+ // when running as a winit window.
+ //
+ // Most actions that you can bind here can also be invoked programmatically with
+ // `niri msg action do-something`.
+
+ // Mod-Shift-/, which is usually the same as Mod-?,
+ // shows a list of important hotkeys.
+ Mod+Shift+Slash { show-hotkey-overlay; }
+
+ // Suggested binds for running programs: terminal, app launcher, screen locker.
+ Mod+T hotkey-overlay-title="Open a Terminal: fish" { spawn "wezterm"; }
+ Mod+B hotkey-overlay-title="Open Browser: Helium" { spawn "helium"; }
+ Mod+D hotkey-overlay-title="Run an Application: vicinae" { spawn "vicinae" "toggle"; }
+ Super+Alt+L hotkey-overlay-title="Lock the Screen: hyprlock" { spawn "hyprlock"; }
+
+ // You can also use a shell. Do this if you need pipes, multiple commands, etc.
+ // Note: the entire command goes as a single argument in the end.
+ // Mod+T { spawn "bash" "-c" "notify-send hello && exec wezterm"; }
+
+ // Example volume keys mappings for PipeWire & WirePlumber.
+ // The allow-when-locked=true property makes them work even when the session is locked.
+ XF86AudioRaiseVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"; }
+ XF86AudioLowerVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"; }
+ XF86AudioMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; }
+ XF86AudioMicMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; }
+ XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "set" "5%+"; }
+ XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "set" "5%-"; }
+
+ // Open/close the Overview: a zoomed-out view of workspaces and windows.
+ // You can also move the mouse into the top-left hot corner,
+ // or do a four-finger swipe up on a touchpad.
+ Mod+O repeat=false { toggle-overview; }
+
+ Mod+Q { close-window; }
+
+ Mod+Left { focus-column-left; }
+ Mod+Down { focus-window-down; }
+ Mod+Up { focus-window-up; }
+ Mod+Right { focus-column-right; }
+ Mod+H { focus-column-left; }
+ Mod+J { focus-window-down; }
+ Mod+K { focus-window-up; }
+ Mod+L { focus-column-right; }
+
+ Mod+Ctrl+Left { move-column-left; }
+ Mod+Ctrl+Down { move-window-down; }
+ Mod+Ctrl+Up { move-window-up; }
+ Mod+Ctrl+Right { move-column-right; }
+ Mod+Ctrl+H { move-column-left; }
+ Mod+Ctrl+J { move-window-down; }
+ Mod+Ctrl+K { move-window-up; }
+ Mod+Ctrl+L { move-column-right; }
+
+ // Alternative commands that move across workspaces when reaching
+ // the first or last window in a column.
+ // Mod+J { focus-window-or-workspace-down; }
+ // Mod+K { focus-window-or-workspace-up; }
+ // Mod+Ctrl+J { move-window-down-or-to-workspace-down; }
+ // Mod+Ctrl+K { move-window-up-or-to-workspace-up; }
+
+ Mod+Home { focus-column-first; }
+ Mod+End { focus-column-last; }
+ Mod+Ctrl+Home { move-column-to-first; }
+ Mod+Ctrl+End { move-column-to-last; }
+
+ Mod+Shift+Left { focus-monitor-left; }
+ Mod+Shift+Down { focus-monitor-down; }
+ Mod+Shift+Up { focus-monitor-up; }
+ Mod+Shift+Right { focus-monitor-right; }
+ Mod+Shift+H { focus-monitor-left; }
+ Mod+Shift+J { focus-monitor-down; }
+ Mod+Shift+K { focus-monitor-up; }
+ Mod+Shift+L { focus-monitor-right; }
+
+ Mod+Shift+Ctrl+Left { move-column-to-monitor-left; }
+ Mod+Shift+Ctrl+Down { move-column-to-monitor-down; }
+ Mod+Shift+Ctrl+Up { move-column-to-monitor-up; }
+ Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }
+ Mod+Shift+Ctrl+H { move-column-to-monitor-left; }
+ Mod+Shift+Ctrl+J { move-column-to-monitor-down; }
+ Mod+Shift+Ctrl+K { move-column-to-monitor-up; }
+ Mod+Shift+Ctrl+L { move-column-to-monitor-right; }
+
+ // Alternatively, there are commands to move just a single window:
+ // Mod+Shift+Ctrl+Left { move-window-to-monitor-left; }
+ // ...
+
+ // And you can also move a whole workspace to another monitor:
+ // Mod+Shift+Ctrl+Left { move-workspace-to-monitor-left; }
+ // ...
+
+ Mod+Page_Down { focus-workspace-down; }
+ Mod+Page_Up { focus-workspace-up; }
+ Mod+U { focus-workspace-down; }
+ Mod+I { focus-workspace-up; }
+ Mod+Ctrl+Page_Down { move-column-to-workspace-down; }
+ Mod+Ctrl+Page_Up { move-column-to-workspace-up; }
+ Mod+Ctrl+U { move-column-to-workspace-down; }
+ Mod+Ctrl+I { move-column-to-workspace-up; }
+
+ // Alternatively, there are commands to move just a single window:
+ // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }
+ // ...
+
+ Mod+Shift+Page_Down { move-workspace-down; }
+ Mod+Shift+Page_Up { move-workspace-up; }
+ Mod+Shift+U { move-workspace-down; }
+ Mod+Shift+I { move-workspace-up; }
+
+ // You can bind mouse wheel scroll ticks using the following syntax.
+ // These binds will change direction based on the natural-scroll setting.
+ //
+ // To avoid scrolling through workspaces really fast, you can use
+ // the cooldown-ms property. The bind will be rate-limited to this value.
+ // You can set a cooldown on any bind, but it's most useful for the wheel.
+ Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
+ Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
+ Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }
+ Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; }
+
+ Mod+WheelScrollRight { focus-column-right; }
+ Mod+WheelScrollLeft { focus-column-left; }
+ Mod+Ctrl+WheelScrollRight { move-column-right; }
+ Mod+Ctrl+WheelScrollLeft { move-column-left; }
+
+ // Usually scrolling up and down with Shift in applications results in
+ // horizontal scrolling; these binds replicate that.
+ Mod+Shift+WheelScrollDown { focus-column-right; }
+ Mod+Shift+WheelScrollUp { focus-column-left; }
+ Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }
+ Mod+Ctrl+Shift+WheelScrollUp { move-column-left; }
+
+ // Similarly, you can bind touchpad scroll "ticks".
+ // Touchpad scrolling is continuous, so for these binds it is split into
+ // discrete intervals.
+ // These binds are also affected by touchpad's natural-scroll, so these
+ // example binds are "inverted", since we have natural-scroll enabled for
+ // touchpads by default.
+ // Mod+TouchpadScrollDown { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02+"; }
+ // Mod+TouchpadScrollUp { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02-"; }
+
+ // You can refer to workspaces by index. However, keep in mind that
+ // niri is a dynamic workspace system, so these commands are kind of
+ // "best effort". Trying to refer to a workspace index bigger than
+ // the current workspace count will instead refer to the bottommost
+ // (empty) workspace.
+ //
+ // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on
+ // will all refer to the 3rd workspace.
+ Mod+1 { focus-workspace 1; }
+ Mod+2 { focus-workspace 2; }
+ Mod+3 { focus-workspace 3; }
+ Mod+4 { focus-workspace 4; }
+ Mod+5 { focus-workspace 5; }
+ Mod+6 { focus-workspace 6; }
+ Mod+7 { focus-workspace 7; }
+ Mod+8 { focus-workspace 8; }
+ Mod+9 { focus-workspace 9; }
+ Mod+Ctrl+1 { move-column-to-workspace 1; }
+ Mod+Ctrl+2 { move-column-to-workspace 2; }
+ Mod+Ctrl+3 { move-column-to-workspace 3; }
+ Mod+Ctrl+4 { move-column-to-workspace 4; }
+ Mod+Ctrl+5 { move-column-to-workspace 5; }
+ Mod+Ctrl+6 { move-column-to-workspace 6; }
+ Mod+Ctrl+7 { move-column-to-workspace 7; }
+ Mod+Ctrl+8 { move-column-to-workspace 8; }
+ Mod+Ctrl+9 { move-column-to-workspace 9; }
+
+ // Alternatively, there are commands to move just a single window:
+ // Mod+Ctrl+1 { move-window-to-workspace 1; }
+
+ // Switches focus between the current and the previous workspace.
+ // Mod+Tab { focus-workspace-previous; }
+
+ // The following binds move the focused window in and out of a column.
+ // If the window is alone, they will consume it into the nearby column to the side.
+ // If the window is already in a column, they will expel it out.
+ Mod+BracketLeft { consume-or-expel-window-left; }
+ Mod+BracketRight { consume-or-expel-window-right; }
+
+ // Consume one window from the right to the bottom of the focused column.
+ Mod+Comma { consume-window-into-column; }
+ // Expel the bottom window from the focused column to the right.
+ Mod+Period { expel-window-from-column; }
+
+ Mod+R { switch-preset-column-width; }
+ Mod+Shift+R { switch-preset-window-height; }
+ Mod+Ctrl+R { reset-window-height; }
+ Mod+F { maximize-column; }
+ Mod+Shift+F { fullscreen-window; }
+
+ // Expand the focused column to space not taken up by other fully visible columns.
+ // Makes the column "fill the rest of the space".
+ Mod+Ctrl+F { expand-column-to-available-width; }
+
+ Mod+C { center-column; }
+
+ // Center all fully visible columns on screen.
+ Mod+Ctrl+C { center-visible-columns; }
+
+ // Finer width adjustments.
+ // This command can also:
+ // * set width in pixels: "1000"
+ // * adjust width in pixels: "-5" or "+5"
+ // * set width as a percentage of screen width: "25%"
+ // * adjust width as a percentage of screen width: "-10%" or "+10%"
+ // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,
+ // set-column-width "100" will make the column occupy 200 physical screen pixels.
+ Mod+Minus { set-column-width "-10%"; }
+ Mod+Equal { set-column-width "+10%"; }
+
+ // Finer height adjustments when in column with other windows.
+ Mod+Shift+Minus { set-window-height "-10%"; }
+ Mod+Shift+Equal { set-window-height "+10%"; }
+
+ // Move the focused window between the floating and the tiling layout.
+ Mod+V { toggle-window-floating; }
+ Mod+Shift+V { switch-focus-between-floating-and-tiling; }
+
+ // Toggle tabbed column display mode.
+ // Windows in this column will appear as vertical tabs,
+ // rather than stacked on top of each other.
+ Mod+W { toggle-column-tabbed-display; }
+
+ // Actions to switch layouts.
+ // Note: if you uncomment these, make sure you do NOT have
+ // a matching layout switch hotkey configured in xkb options above.
+ // Having both at once on the same hotkey will break the switching,
+ // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).
+ // Mod+Space { switch-layout "next"; }
+ // Mod+Shift+Space { switch-layout "prev"; }
+
+ Print { screenshot; }
+ Shift+Print { screenshot-screen; }
+ Ctrl+Print { screenshot-screen; }
+ Alt+Print { screenshot-window; }
+
+ // Applications such as remote-desktop clients and software KVM switches may
+ // request that niri stops processing the keyboard shortcuts defined here
+ // so they may, for example, forward the key presses as-is to a remote machine.
+ // It's a good idea to bind an escape hatch to toggle the inhibitor,
+ // so a buggy application can't hold your session hostage.
+ //
+ // The allow-inhibiting=false property can be applied to other binds as well,
+ // which ensures niri always processes them, even when an inhibitor is active.
+ Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }
+
+ // The quit action will show a confirmation dialog to avoid accidental exits.
+ Mod+Shift+E { quit; }
+ Ctrl+Alt+Delete { quit; }
+
+ // Powers off the monitors. To turn them back on, do any input like
+ // moving the mouse or pressing any other key.
+ Mod+Shift+P { power-off-monitors; }
+}
+environment {
+ ELECTRON_OZONE_PLATFORM_HINT "auto"
+}
diff --git a/apps/.config/obsidian/Preferences b/apps/.config/obsidian/Preferences
new file mode 100644
index 0000000..13b5167
--- /dev/null
+++ b/apps/.config/obsidian/Preferences
@@ -0,0 +1 @@
+{"browser":{"enable_spellchecking":true},"migrated_user_scripts_toggle":true,"partition":{"per_host_zoom_levels":{"100268245138109095":{}}},"spellcheck":{"dictionaries":["en-US"],"dictionary":""}}
\ No newline at end of file
diff --git a/apps/.config/pavucontrol.ini b/apps/.config/pavucontrol.ini
new file mode 100644
index 0000000..652dee0
--- /dev/null
+++ b/apps/.config/pavucontrol.ini
@@ -0,0 +1,9 @@
+[window]
+width=744
+height=897
+sinkInputType=0
+sourceOutputType=1
+sinkType=0
+sourceType=1
+showVolumeMeters=1
+hideUnavailableCardProfiles=0
diff --git a/apps/.config/starship.toml b/apps/.config/starship.toml
new file mode 100644
index 0000000..aa10733
--- /dev/null
+++ b/apps/.config/starship.toml
@@ -0,0 +1,124 @@
+format = """
+$username\
+$hostname\
+$directory\
+$git_branch\
+$git_status\
+$python\
+$nodejs\
+$rust\
+$golang\
+$java\
+$cmd_duration\
+$fill\
+$status\
+$time\
+$line_break\
+$character"""
+
+palette = "mariana"
+
+[palettes.mariana]
+purple = "#c792ea"
+cyan = "#4ec9b0"
+green = "#99c794"
+yellow = "#fac863"
+pink = "#ec5f89"
+red = "#f97b58"
+text = "#d8dee9"
+subtext = "#8892a4"
+bg = "#16161e"
+
+[username]
+style_user = "bold purple"
+style_root = "bold red"
+format = "[$user]($style)"
+show_always = true
+
+[hostname]
+style = "bold cyan"
+format = "[@$hostname]($style) "
+ssh_only = false
+
+[directory]
+style = "bold cyan"
+format = "[$path]($style)[$read_only]($read_only_style) "
+truncation_length = 5
+truncate_to_repo = false
+home_symbol = "~"
+read_only = " "
+read_only_style = "red"
+
+[git_branch]
+symbol = " "
+style = "bold purple"
+format = "[$symbol$branch]($style) "
+
+[git_status]
+style = "yellow"
+format = "([$all_status$ahead_behind]($style) )"
+ahead = "⇡${count}"
+behind = "⇣${count}"
+diverged = "⇕⇡${ahead_count}⇣${behind_count}"
+modified = "!${count}"
+untracked = "?${count}"
+staged = "+${count}"
+deleted = "✘${count}"
+stashed = "\\$${count}"
+
+[python]
+symbol = " "
+style = "yellow"
+format = "[$symbol$version]($style) "
+detect_extensions = ["py"]
+detect_files = [".python-version", "Pipfile", "requirements.txt", "setup.py", "pyproject.toml"]
+
+[nodejs]
+symbol = " "
+style = "green"
+format = "[$symbol$version]($style) "
+detect_extensions = ["js", "ts", "mjs", "cjs", "mts", "cts"]
+detect_files = ["package.json", ".nvmrc"]
+
+[rust]
+symbol = " "
+style = "red"
+format = "[$symbol$version]($style) "
+
+[golang]
+symbol = " "
+style = "cyan"
+format = "[$symbol$version]($style) "
+
+[java]
+symbol = " "
+style = "red"
+format = "[$symbol$version]($style) "
+
+[cmd_duration]
+min_time = 2000
+style = "yellow"
+format = "[ $duration]($style) "
+
+[fill]
+symbol = " "
+
+[status]
+disabled = false
+style = "bold pink"
+format = "[✗ $status]($style) "
+success_symbol = ""
+
+[time]
+disabled = false
+style = "bold subtext"
+format = "[$time]($style)"
+time_format = "%H:%M"
+
+[character]
+success_symbol = "[❯](bold purple)"
+error_symbol = "[❯](bold pink)"
+vimcmd_symbol = "[❮](bold green)"
+
+[line_break]
+disabled = false
diff --git a/apps/.config/systemd/user/xdg-desktop-portal-wlr.service.d/override.conf b/apps/.config/systemd/user/xdg-desktop-portal-wlr.service.d/override.conf
new file mode 100644
index 0000000..a9d0b9b
--- /dev/null
+++ b/apps/.config/systemd/user/xdg-desktop-portal-wlr.service.d/override.conf
@@ -0,0 +1,8 @@
+[Unit]
+StartLimitIntervalSec=60
+StartLimitBurst=10
+
+[Service]
+ExecStart=
+ExecStart=/usr/lib/xdg-desktop-portal-wlr -c %h/.config/xdg-desktop-portal-wlr/config
+RestartSec=2
diff --git a/apps/.config/topgrade.toml b/apps/.config/topgrade.toml
new file mode 100644
index 0000000..988a62a
--- /dev/null
+++ b/apps/.config/topgrade.toml
@@ -0,0 +1,360 @@
+# Include any additional configuration file(s)
+# [include] sections are processed in the order you write them
+# Files in $CONFIG_DIR/topgrade.d/ are automatically included before this file
+[include]
+# paths = ["/etc/topgrade.toml"]
+
+
+[misc]
+# Run `sudo -v` to cache credentials at the start of the run
+# This avoids a blocking password prompt in the middle of an unattended run
+# (default: false)
+# pre_sudo = false
+
+# Sudo command to be used
+# sudo_command = "sudo"
+
+# Disable specific steps - same options as the command line flag
+# disable = ["system", "emacs"]
+
+# Ignore failures for these steps
+# ignore_failures = ["powershell"]
+
+# List of remote machines with Topgrade installed on them
+# remote_topgrades = ["toothless", "pi", "parnas"]
+
+# Path to Topgrade executable on remote machines
+# remote_topgrade_path = ".cargo/bin/topgrade"
+
+# Arguments to pass to SSH when upgrading remote systems
+# ssh_arguments = "-o ConnectTimeout=2"
+
+# Arguments to pass tmux when pulling Repositories
+# tmux_arguments = "-S /var/tmux.sock"
+
+# Do not set the terminal title (default: true)
+# set_title = true
+
+# Display the time in step titles (default: true)
+# display_time = true
+
+# Don't ask for confirmations (no default value)
+# assume_yes = true
+
+# Do not ask to retry failed steps (default: false)
+# no_retry = true
+
+# Run inside tmux (default: false)
+# run_in_tmux = true
+
+# Changes the way topgrade interacts with
+# the tmux session, creating the session
+# and only attaching to it if not inside tmux
+# (default: "attach_if_not_in_session", allowed values: "attach_if_not_in_session", "attach_always")
+# tmux_session_mode = "attach_if_not_in_session"
+
+# Cleanup temporary or old files (default: false)
+# cleanup = true
+
+# Send a notification for every step (default: false)
+# notify_each_step = false
+
+# Skip sending a notification at the end of a run (default: false)
+# skip_notify = true
+
+# The Bash-it branch to update (default: "stable")
+# bashit_branch = "stable"
+
+# Run specific steps - same options as the command line flag
+# only = ["system", "emacs"]
+
+# Whether to self update
+#
+# this will be ignored if the binary is built without self update support
+#
+# available also via setting the environment variable TOPGRADE_NO_SELF_UPGRADE)
+# no_self_update = true
+
+# Extra tracing filter directives
+# These are prepended to the `--log-filter` argument
+# See: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives
+# log_filters = ["topgrade::command=debug", "warn"]
+
+
+# Commands to run before anything
+[pre_commands]
+# "Emacs Snapshot" = "rm -rf ~/.emacs.d/elpa.bak && cp -rl ~/.emacs.d/elpa ~/.emacs.d/elpa.bak"
+
+
+# Commands to run after anything
+[post_commands]
+# "Emacs Snapshot" = "rm -rf ~/.emacs.d/elpa.bak && cp -rl ~/.emacs.d/elpa ~/.emacs.d/elpa.bak"
+
+
+# Custom commands
+[commands]
+# "Python Environment" = "~/dev/.env/bin/pip install -i https://pypi.python.org/simple -U --upgrade-strategy eager jupyter"
+# "Custom command using interactive shell (unix)" = "-i vim_upgrade"
+
+
+[python]
+# enable_pip_review = true ###disabled by default
+# enable_pip_review_local = true ###disabled by default
+# enable_pipupgrade = true ###disabled by default
+# pipupgrade_arguments = "-y -u --pip-path pip" ###disabled by default
+
+# For the poetry step, by default, Topgrade skips its update if poetry is not
+# installed with the official script. This configuration entry forces Topgrade
+# to run the update in this case.
+#
+# (default: false)
+# poetry_force_self_update = true
+
+
+[conda]
+# Additional named conda environments to update (`conda env update -n env_name`)
+# env_names = [
+# "Toolbox",
+# "PyTorch"
+# ]
+# Additional conda environment paths to update (`conda env update -p env_path`)
+# env_paths = [
+# "~/webserver/.conda/",
+# "~/experiments/.conda/"
+# ]
+
+
+[composer]
+# self_update = true
+
+
+[brew]
+# For the BrewCask step
+# If `Repo Cask Upgrade` exists, then use the `-a` option.
+# Otherwise, use the `--greedy` option.
+# greedy_cask = true
+
+# For the BrewCask step
+# If `Repo Cask Upgrade` does not exist, then use the `--greedy_latest` option.
+# NOTE: the above entry `greedy_cask` contains this entry, though you can enable
+# both of them, they won't clash with each other.
+# greedy_latest = true
+
+# For the BrewCask step
+# If `Repo Cask Upgrade` does not exist, then use the `--greedy_auto_updates` option.
+# NOTE: the above entry `greedy_cask` contains this entry, though you can enable
+# both of them, they won't clash with each other.
+# greedy_auto_updates = true
+
+# For the BrewFormula step
+# Execute `brew autoremove` after the step.
+# autoremove = true
+
+# For the BrewFormula step
+# Upgrade formulae built from the HEAD branch; `brew upgrade --fetch-HEAD`
+# fetch_head = true
+
+
+[linux]
+# Arch Package Manager to use.
+# Allowed values:
+# autodetect, aura, garuda_update, pacman, pamac, paru, pikaur, trizen, yay
+# arch_package_manager = "pacman"
+
+# Arguments to pass yay (or paru) when updating packages
+# yay_arguments = "--nodevel"
+
+# Arguments to pass dnf when updating packages
+# dnf_arguments = "--refresh"
+
+# aura_aur_arguments = "-kx"
+
+# aura_pacman_arguments = ""
+# garuda_update_arguments = ""
+
+# show_arch_news = true
+
+# trizen_arguments = "--devel"
+
+# pikaur_arguments = ""
+
+# pamac_arguments = "--no-devel"
+
+# enable_tlmgr = true
+
+# emerge_sync_flags = "-q"
+
+# emerge_update_flags = "-uDNa --with-bdeps=y world"
+
+# redhat_distro_sync = false
+
+# suse_dup = false
+
+# rpm_ostree = false
+
+# For Fedora/CentOS/RHEL Atomic variants, if `bootc` is available and this configuration entry is set to true, use
+# it to do the update - Will also supersede rpm-ostree if enabled
+# (default: false)
+# bootc = false
+
+# nix_arguments = "--flake"
+
+# nix_env_arguments = "--prebuilt-only"
+
+# Extra Home Manager arguments
+# home_manager_arguments = ["--flake", "file"]
+
+
+[git]
+# How many repos to pull at max in parallel
+# max_concurrency = 5
+
+# Additional git repositories to pull
+# repos = [
+# "~/src/*/",
+# "~/.config/something"
+# ]
+
+# Don't pull the predefined git repos
+# pull_predefined = false
+
+# Arguments to pass Git when pulling Repositories
+# arguments = "--rebase --autostash"
+
+
+[windows]
+# Manually select Windows updates
+# accept_all_updates = false
+
+# Controls whether to automatically reboot the computer when updates are
+# installed that request it. (default: "no", allowed values: "yes", "no", "ask")
+# updates_auto_reboot = "yes"
+
+# open_remotes_in_new_terminal = true
+
+# wsl_update_pre_release = true
+
+# wsl_update_use_web_download = true
+
+# The default for winget_install_silently is true,
+# this example turns off silent install.
+# winget_install_silently = false
+
+# Causes Topgrade to rename itself during the run to allow package managers
+# to upgrade it. Use this only if you installed Topgrade by using a package
+# manager such as Scoop or Cargo
+# self_rename = true
+
+# Use sudo to elevate privileges for the Windows Package Manager (winget)
+# Only use this option if you want to run the Winget step in sudo-mode.
+# Running winget in sudo-mode is generally not recommended, as not every
+# package supports installing / upgrading in sudo-mode and it may cause issues
+# with some packages or may even cause the Winget-step to fail.
+# If any problems occur, please try running Topgrade without this option first
+# before reporting an issue.
+# (default: false)
+# winget_use_sudo = true
+
+
+[npm]
+# Use sudo if the NPM directory isn't owned by the current user
+# use_sudo = true
+
+
+[yarn]
+# Run `yarn global upgrade` with `sudo`
+# use_sudo = true
+
+
+[deno]
+# Upgrade deno executable to the given version.
+# version = "stable"
+
+
+[vim]
+# For `vim-plug`, execute `PlugUpdate!` instead of `PlugUpdate`
+# force_plug_update = true
+
+
+[firmware]
+# Offer to update firmware; if false just check for and display available updates
+# upgrade = true
+
+
+[vagrant]
+# Vagrant directories
+# directories = []
+
+# power on vagrant boxes if needed
+# power_on = true
+
+# Always suspend vagrant boxes instead of powering off
+# always_suspend = true
+
+
+[flatpak]
+# Use sudo for updating the system-wide installation
+# use_sudo = true
+
+
+[distrobox]
+# use_root = false
+
+# containers = ["archlinux-latest"]
+[containers]
+# Specify the containers to ignore while updating (Wildcard supported)
+# ignored_containers = ["ghcr.io/rancher-sandbox/rancher-desktop/rdx-proxy:latest", "docker.io*"]
+# Specify the runtime to use for containers (default: "docker", allowed values: "docker", "podman")
+# runtime = "podman"
+
+[lensfun]
+# If disabled, Topgrade invokes `lensfun‑update‑data` without root privilege,
+# then the update will be only available to you. Otherwise, `sudo` is required,
+# and the update will be installed system-wide, i.e., available to all users.
+# (default: false)
+# use_sudo = false
+
+[julia]
+# If disabled, Topgrade invokes julia with the --startup-file=no CLI option.
+#
+# This may be desirable to avoid loading outdated packages with "using" directives
+# in the startup file, which might cause the update run to fail.
+# (default: true)
+# startup_file = true
+
+[zigup]
+# Version strings passed to zigup.
+# These may be pinned versions such as "0.13.0" or branches such as "master".
+# Each one will be updated in its own zigup invocation.
+# (default: ["master"])
+# target_versions = ["master", "0.13.0"]
+
+# Specifies the directory that the zig files will be installed to.
+# If defined, passed with the --install-dir command line flag.
+# If not defined, zigup will use its default behaviour.
+# (default: not defined)
+# install_dir = "~/.zig"
+
+# Specifies the path of the symlink which will be set to point at the default compiler version.
+# If defined, passed with the --path-link command line flag.
+# If not defined, zigup will use its default behaviour.
+# This is not meaningful if set_default is not enabled.
+# (default: not defined)
+# path_link = "~/.bin/zig"
+
+# If enabled, run `zigup clean` after updating all versions.
+# If enabled, each updated version above will be marked with `zigup keep`.
+# (default: false)
+# cleanup = false
+
+[vscode]
+# If this is set and is a non-empty string, it specifies the profile the
+# extensions should be updated for.
+# (default: this won't be set by default)
+# profile = ""
+
+[pixi]
+# Show the release notes of the latest pixi release
+# during the pixi step
+# (default: false)
+# include_release_notes = false
diff --git a/apps/.config/wezterm/wezterm.lua b/apps/.config/wezterm/wezterm.lua
new file mode 100644
index 0000000..ff8b827
--- /dev/null
+++ b/apps/.config/wezterm/wezterm.lua
@@ -0,0 +1,138 @@
+local wezterm = require("wezterm")
+local config = wezterm.config_builder()
+
+-- Font
+config.font = wezterm.font("MapleMono NF", { weight = "Regular" })
+config.font_size = 13.0
+config.line_height = 1.15
+
+-- Enable ligatures (Maple Mono supports them natively)
+config.harfbuzz_features = { "calt=1", "liga=1", "clig=1" }
+
+-- Dark navy palette
+local bg = "#0b0d1a"
+local surface = "#0f1120"
+local surface2 = "#141628"
+local overlay = "#1a1d35"
+local purple = "#c792ea"
+local cyan = "#4ec9b0"
+local green = "#99c794"
+local pink = "#ec5f89"
+local yellow = "#fac863"
+local red = "#f97b58"
+local text = "#cdd6f4"
+local subtext = "#7f849c"
+
+config.colors = {
+ foreground = text,
+ background = bg,
+ cursor_bg = purple,
+ cursor_fg = bg,
+ cursor_border = purple,
+ selection_fg = bg,
+ selection_bg = purple,
+ scrollbar_thumb = overlay,
+ split = overlay,
+
+ ansi = {
+ "#1a1b2e", -- black (surface)
+ red, -- red
+ green, -- green
+ yellow, -- yellow
+ "#82aaff", -- blue
+ purple, -- magenta
+ cyan, -- cyan
+ text, -- white
+ },
+ brights = {
+ subtext, -- bright black
+ "#ff6e6e", -- bright red
+ "#c3e88d", -- bright green
+ "#ffcb6b", -- bright yellow
+ "#9cc4ff", -- bright blue
+ "#d9a0ff", -- bright magenta
+ "#89ddff", -- bright cyan
+ "#ffffff", -- bright white
+ },
+
+ tab_bar = {
+ background = surface,
+ active_tab = {
+ bg_color = overlay,
+ fg_color = purple,
+ intensity = "Bold",
+ },
+ inactive_tab = {
+ bg_color = surface,
+ fg_color = subtext,
+ },
+ inactive_tab_hover = {
+ bg_color = surface2,
+ fg_color = text,
+ },
+ new_tab = {
+ bg_color = surface,
+ fg_color = subtext,
+ },
+ new_tab_hover = {
+ bg_color = surface2,
+ fg_color = text,
+ },
+ },
+}
+
+-- Window appearance
+config.window_background_opacity = 1.0
+config.text_background_opacity = 1.0
+
+config.window_padding = {
+ left = 14, right = 14, top = 10, bottom = 10,
+}
+
+config.window_decorations = "NONE"
+config.window_close_confirmation = "NeverPrompt"
+
+-- Tab bar (minimal, top)
+config.enable_tab_bar = true
+config.use_fancy_tab_bar = false
+config.tab_bar_at_bottom = false
+config.show_tab_index_in_tab_bar = false
+config.hide_tab_bar_if_only_one_tab = true
+
+config.tab_max_width = 32
+
+-- Scrollback
+config.scrollback_lines = 5000
+
+-- Cursor
+config.default_cursor_style = "BlinkingBar"
+config.cursor_blink_rate = 500
+
+-- Performance
+config.max_fps = 120
+config.animation_fps = 1
+config.cursor_blink_ease_in = "Constant"
+config.cursor_blink_ease_out = "Constant"
+
+-- Misc
+config.audible_bell = "Disabled"
+config.check_for_updates = false
+
+-- Key bindings (keep minimal, add a few useful ones)
+config.keys = {
+ -- Split panes
+ { key = "e", mods = "CTRL|SHIFT", action = wezterm.action.SplitHorizontal { domain = "CurrentPaneDomain" } },
+ { key = "o", mods = "CTRL|SHIFT", action = wezterm.action.SplitVertical { domain = "CurrentPaneDomain" } },
+ -- Navigate panes
+ { key = "h", mods = "CTRL|SHIFT", action = wezterm.action.ActivatePaneDirection("Left") },
+ { key = "l", mods = "CTRL|SHIFT", action = wezterm.action.ActivatePaneDirection("Right") },
+ { key = "k", mods = "CTRL|SHIFT", action = wezterm.action.ActivatePaneDirection("Up") },
+ { key = "j", mods = "CTRL|SHIFT", action = wezterm.action.ActivatePaneDirection("Down") },
+ -- New tab
+ { key = "t", mods = "CTRL|SHIFT", action = wezterm.action.SpawnTab("CurrentPaneDomain") },
+ -- Copy/paste
+ { key = "c", mods = "CTRL|SHIFT", action = wezterm.action.CopyTo("Clipboard") },
+ { key = "v", mods = "CTRL|SHIFT", action = wezterm.action.PasteFrom("Clipboard") },
+}
+
+return config
diff --git a/apps/.config/xdg-desktop-portal-wlr/config b/apps/.config/xdg-desktop-portal-wlr/config
new file mode 100644
index 0000000..fb2143c
--- /dev/null
+++ b/apps/.config/xdg-desktop-portal-wlr/config
@@ -0,0 +1,4 @@
+[screencast]
+output_name=eDP-1
+max_fps=30
+chooser_type=none
diff --git a/apps/.config/xdg-desktop-portal/portals.conf b/apps/.config/xdg-desktop-portal/portals.conf
new file mode 100644
index 0000000..1008901
--- /dev/null
+++ b/apps/.config/xdg-desktop-portal/portals.conf
@@ -0,0 +1,6 @@
+[preferred]
+default=wlr;gtk
+org.freedesktop.impl.portal.ScreenCast=wlr
+org.freedesktop.impl.portal.Screenshot=wlr
+org.freedesktop.impl.portal.Wallpaper=wlr
+org.freedesktop.impl.portal.Settings=wlr
diff --git a/apps/.config/zed/keymap.json b/apps/.config/zed/keymap.json
new file mode 100755
index 0000000..532a159
--- /dev/null
+++ b/apps/.config/zed/keymap.json
@@ -0,0 +1,11 @@
+[
+ {
+ "context": "Terminal",
+ "bindings": {
+ "shift-enter": [
+ "terminal::SendText",
+ "\u001b\r"
+ ]
+ }
+ }
+]
diff --git a/apps/.config/zed/keymap.json.f87fa7a7.bak b/apps/.config/zed/keymap.json.f87fa7a7.bak
new file mode 100755
index 0000000..3a8d7f3
--- /dev/null
+++ b/apps/.config/zed/keymap.json.f87fa7a7.bak
@@ -0,0 +1,21 @@
+// Zed keymap
+//
+// For information on binding keys, see the Zed
+// documentation: https://zed.dev/docs/key-bindings
+//
+// To see the default key bindings run `zed: open default keymap`
+// from the command palette.
+[
+ {
+ "context": "Workspace",
+ "bindings": {
+ // "shift shift": "file_finder::Toggle"
+ },
+ },
+ {
+ "context": "Editor && vim_mode == insert",
+ "bindings": {
+ // "j k": "vim::NormalBefore"
+ },
+ },
+]
diff --git a/apps/.config/zed/settings.json b/apps/.config/zed/settings.json
new file mode 100644
index 0000000..18420d5
--- /dev/null
+++ b/apps/.config/zed/settings.json
@@ -0,0 +1,105 @@
+// Zed settings
+//
+// For information on how to configure Zed, see the Zed
+// documentation: https://zed.dev/docs/configuring-zed
+//
+// To see all of Zed's default settings without changing your
+// custom settings, run `zed: open default settings` from the
+// command palette (cmd-shift-p / ctrl-shift-p)
+{
+ "project_panel": {
+ "dock": "left"
+ },
+ "outline_panel": {
+ "dock": "left"
+ },
+ "collaboration_panel": {
+ "dock": "left"
+ },
+ "git_panel": {
+ "dock": "left"
+ },
+ "agent": {
+ "dock": "right",
+ "favorite_models": [
+ {
+ "provider": "copilot_chat",
+ "model": "claude-sonnet-4.6",
+ "enable_thinking": false
+ },
+ {
+ "provider": "copilot_chat",
+ "model": "gpt-5-mini",
+ "enable_thinking": false
+ },
+ {
+ "provider": "copilot_chat",
+ "model": "claude-opus-4.6",
+ "enable_thinking": false
+ },
+ {
+ "provider": "copilot_chat",
+ "model": "claude-opus-4.5",
+ "enable_thinking": false
+ },
+ {
+ "provider": "copilot_chat",
+ "model": "claude-sonnet-4.5",
+ "enable_thinking": false
+ }
+ ],
+ "tool_permissions": {
+ "tools": {
+ "fetch": {
+ "always_allow": [
+ {
+ "pattern": "^https?://www\\.better\\-auth\\.com"
+ }
+ ]
+ },
+ "terminal": {
+ "always_allow": [
+ {
+ "pattern": "^git\\s+show(\\s|$)"
+ },
+ {
+ "pattern": "^which\\s+psql(\\s|$)"
+ },
+ {
+ "pattern": "^ls\\b"
+ },
+ {
+ "pattern": "^which\\s+pg_ctl(\\s|$)"
+ },
+ {
+ "pattern": "^cat\\b"
+ },
+ {
+ "pattern": "^diff\\b"
+ }
+ ]
+ }
+ }
+ },
+ "default_profile": "write",
+ "default_model": {
+ "effort": "high",
+ "enable_thinking": false,
+ "provider": "copilot_chat",
+ "model": "gpt-5-mini"
+ },
+ "model_parameters": []
+ },
+ "autosave": "on_focus_change",
+ "base_keymap": "VSCode",
+ "ui_font_size": 16,
+ "buffer_font_size": 16,
+ "theme": {
+ "mode": "dark",
+ "light": "One Light",
+ "dark": "Kleur Dark"
+ },
+ "auto_install_extensions": {
+ "wakatime": true
+ }
+}
diff --git a/apps/.config/zed/settings_backup.json b/apps/.config/zed/settings_backup.json
new file mode 100755
index 0000000..6c33f3d
--- /dev/null
+++ b/apps/.config/zed/settings_backup.json
@@ -0,0 +1,74 @@
+// Zed settings
+//
+// For information on how to configure Zed, see the Zed
+// documentation: https://zed.dev/docs/configuring-zed
+//
+// To see all of Zed's default settings without changing your
+// custom settings, run `zed: open default settings` from the
+// command palette (cmd-shift-p / ctrl-shift-p)
+{
+ "icon_theme": "JetBrains New UI Icons (Dark)",
+ "edit_predictions": {
+ "mode": "subtle",
+ "copilot": {
+ "enable_next_edit_suggestions": true
+ },
+ "provider": "copilot",
+ "disabled_globs": [],
+ },
+ "agent": {
+ "favorite_models": [
+ {
+ "provider": "copilot_chat",
+ "model": "claude-opus-4.6"
+ },
+ {
+ "provider": "copilot_chat",
+ "model": "gpt-5-mini"
+ },
+ {
+ "provider": "copilot_chat",
+ "model": "gpt-5.2"
+ },
+ {
+ "provider": "copilot_chat",
+ "model": "gpt-5.3-codex"
+ }
+ ],
+ "always_allow_tool_actions": true,
+ "default_profile": "ask",
+ "default_model": {
+ "provider": "copilot_chat",
+ "model": "gpt-5-mini",
+ },
+ "model_parameters": [],
+ },
+ "autosave": "on_focus_change",
+ "base_keymap": "VSCode",
+ "ui_font_size": 16,
+ "buffer_font_size": 16,
+ "theme": {
+ "mode": "dark",
+ "light": "One Light",
+ "dark": "Kleur Dark",
+ },
+ "calls": {
+ "mute_on_join": true
+
+ },
+ "languages": {
+ "Ruby": {
+ "formatter": {
+ "external": {
+ "command": "rubocop",
+ "arguments": ["--fix", "--stdin", "ignored", "--stderr"]
+ }
+ },
+ "format_on_save": "on"
+ }
+ }
+ }
+
+ "format_on_save": "on",
+ "formatter": "prettier",
+}
diff --git a/apps/.config/zed/themes/zed.json b/apps/.config/zed/themes/zed.json
new file mode 100644
index 0000000..8c97b39
--- /dev/null
+++ b/apps/.config/zed/themes/zed.json
@@ -0,0 +1,847 @@
+{
+ "$schema": "https://zed.dev/schema/themes/v0.2.0.json",
+ "name": "Kleur",
+ "author": "Kleur Contributors",
+ "themes": [
+ {
+ "name": "Kleur Dark",
+ "appearance": "dark",
+ "style": {
+ "background.appearance": "opaque",
+ "accents": [
+ "#bcb0ff",
+ "#27c7ff",
+ "#00cec5",
+ "#06d46e",
+ "#f8aa14",
+ "#ffa192"
+ ],
+ "border": "#00000000",
+ "border.variant": "#00000000",
+ "border.focused": "#bcb0ff",
+ "border.selected": "#00000000",
+ "border.transparent": "#00000000",
+ "border.disabled": "#00000000",
+ "elevated_surface.background": "#14112d",
+ "surface.background": "#0c0823",
+ "background": "#080715",
+ "element.background": "#827ace",
+ "element.active": "#bcb0ff40",
+ "element.hover": "#827ace60",
+ "element.selected": "#5e5895",
+ "element.disabled": "#a2a1a8",
+ "drop_target.background": "#a2a1a866",
+ "ghost_element.background": "#00000000",
+ "ghost_element.hover": "#827ace40",
+ "ghost_element.active": "#bcb0ff40",
+ "ghost_element.selected": "#bcb0ff60",
+ "ghost_element.disabled": "#14112d",
+ "text": "#ebebed",
+ "text.accent": "#bcb0ff",
+ "text.muted": "#cfced2",
+ "text.placeholder": "#bab9be",
+ "text.disabled": "#bab9be",
+ "icon": "#ebebed",
+ "icon.accent": "#bcb0ff",
+ "icon.muted": "#cfced2",
+ "icon.disabled": "#bab9be",
+ "icon.placeholder": "#cfced2",
+ "status_bar.background": "#0c0823",
+ "title_bar.background": "#0c0823",
+ "title_bar.inactive_background": "#080715",
+ "toolbar.background": "#0c0823",
+ "tab_bar.background": "#0c0823",
+ "tab.inactive_background": "#080715",
+ "tab.active_background": "#14112d",
+ "search.match_background": "#bcb0ff66",
+ "panel.background": "#0c0823",
+ "panel.focused_border": null,
+ "pane.focused_border": null,
+ "scrollbar.thumb.background": "#14112d33",
+ "scrollbar.thumb.hover_background": "#14112d77",
+ "scrollbar.thumb.border": "#14112d33",
+ "scrollbar.track.background": "#0c0823",
+ "scrollbar.track.border": "#00000000",
+ "editor.foreground": "#ebebed",
+ "editor.background": "#080715",
+ "editor.gutter.background": "#080715",
+ "editor.subheader.background": "#0c0823",
+ "editor.active_line.background": "#0c0823",
+ "editor.highlighted_line.background": "#0c0823",
+ "editor.line_number": "#cfced2",
+ "editor.active_line_number": "#ebebed",
+ "editor.hover_line_number": "#dfdee1",
+ "editor.invisible": "#bab9be",
+ "editor.wrap_guide": "#00000000",
+ "editor.active_wrap_guide": "#00000000",
+ "editor.document_highlight.read_background": "#bcb0ff1a",
+ "editor.document_highlight.write_background": "#cfced266",
+ "terminal.background": "#080715",
+ "terminal.foreground": "#ebebed",
+ "terminal.bright_foreground": "#ebebed",
+ "terminal.dim_foreground": "#080715",
+ "terminal.ansi.black": "#080715",
+ "terminal.ansi.dim_black": "#ebebed",
+ "terminal.ansi.bright_black": "#0c0823",
+ "terminal.ansi.red": "#ffa192",
+ "terminal.ansi.dim_red": "#e94740",
+ "terminal.ansi.bright_red": "#ffbfb3",
+ "terminal.ansi.green": "#06d46e",
+ "terminal.ansi.dim_green": "#009749",
+ "terminal.ansi.bright_green": "#4be986",
+ "terminal.ansi.yellow": "#f8aa14",
+ "terminal.ansi.dim_yellow": "#b47700",
+ "terminal.ansi.bright_yellow": "#ffc554",
+ "terminal.ansi.blue": "#27c7ff",
+ "terminal.ansi.dim_blue": "#008cbf",
+ "terminal.ansi.bright_blue": "#70dcff",
+ "terminal.ansi.magenta": "#bcb0ff",
+ "terminal.ansi.dim_magenta": "#827ace",
+ "terminal.ansi.bright_magenta": "#d3c7ff",
+ "terminal.ansi.cyan": "#00cec5",
+ "terminal.ansi.dim_cyan": "#00928b",
+ "terminal.ansi.bright_cyan": "#30e4da",
+ "terminal.ansi.white": "#ebebed",
+ "terminal.ansi.dim_white": "#cfced2",
+ "terminal.ansi.bright_white": "#bcb0ff",
+ "link_text.hover": "#00cec5",
+ "version_control.added": "#06d46e",
+ "version_control.modified": "#f8aa14",
+ "version_control.deleted": "#ffa192",
+ "version_control.word_added": "#06d46e59",
+ "version_control.word_deleted": "#ffa192cc",
+ "version_control.conflict_marker.ours": "#06d46e1a",
+ "version_control.conflict_marker.theirs": "#27c7ff1a",
+ "conflict": "#f8aa14",
+ "conflict.background": "#f8aa141a",
+ "conflict.border": "#b47700",
+ "created": "#06d46e",
+ "created.background": "#06d46e1a",
+ "created.border": "#009749",
+ "deleted": "#ffa192",
+ "deleted.background": "#ffa1921a",
+ "deleted.border": "#e94740",
+ "error": "#ffa192",
+ "error.background": "#ffa1921a",
+ "error.border": "#e94740",
+ "hidden": "#cfced2",
+ "hidden.background": "#cfced21a",
+ "hidden.border": "#bab9be",
+ "hint": "#cfced2",
+ "hint.background": "#14112d",
+ "hint.border": "#5e5895",
+ "ignored": "#cfced2",
+ "ignored.background": "#cfced21a",
+ "ignored.border": "#bab9be",
+ "info": "#27c7ff",
+ "info.background": "#27c7ff1a",
+ "info.border": "#008cbf",
+ "modified": "#f8aa14",
+ "modified.background": "#f8aa141a",
+ "modified.border": "#b47700",
+ "predictive": "#dfdee1",
+ "predictive.background": "#dfdee11a",
+ "predictive.border": "#cfced2",
+ "renamed": "#27c7ff",
+ "renamed.background": "#27c7ff1a",
+ "renamed.border": "#008cbf",
+ "success": "#06d46e",
+ "success.background": "#06d46e1a",
+ "success.border": "#009749",
+ "unreachable": "#cfced2",
+ "unreachable.background": "#cfced21a",
+ "unreachable.border": "#bab9be",
+ "warning": "#f8aa14",
+ "warning.background": "#f8aa141a",
+ "warning.border": "#b47700",
+ "players": [
+ {
+ "cursor": "#bcb0ffff",
+ "background": "#bcb0ffff",
+ "selection": "#bcb0ff3d"
+ },
+ {
+ "cursor": "#27c7ffff",
+ "background": "#27c7ffff",
+ "selection": "#27c7ff3d"
+ },
+ {
+ "cursor": "#06d46eff",
+ "background": "#06d46eff",
+ "selection": "#06d46e3d"
+ },
+ {
+ "cursor": "#bcb0ffff",
+ "background": "#bcb0ffff",
+ "selection": "#bcb0ff3d"
+ },
+ {
+ "cursor": "#f8aa14ff",
+ "background": "#f8aa14ff",
+ "selection": "#f8aa143d"
+ },
+ {
+ "cursor": "#00cec5ff",
+ "background": "#00cec5ff",
+ "selection": "#00cec53d"
+ },
+ {
+ "cursor": "#ffa192ff",
+ "background": "#ffa192ff",
+ "selection": "#ffa1923d"
+ },
+ {
+ "cursor": "#27c7ffff",
+ "background": "#27c7ffff",
+ "selection": "#27c7ff3d"
+ }
+ ],
+ "syntax": {
+ "namespace": {
+ "color": "#06d46e"
+ },
+ "class": {
+ "color": "#27c7ff"
+ },
+ "class.abstract": {
+ "color": "#f8aa14"
+ },
+ "enum": {
+ "color": "#06d46e"
+ },
+ "interface": {
+ "color": "#f8aa14"
+ },
+ "struct": {
+ "color": "#27c7ff"
+ },
+ "typeParameter": {
+ "color": "#06d46e"
+ },
+ "type": {
+ "color": "#27c7ff"
+ },
+ "parameter": {
+ "color": "#bcb0ff"
+ },
+ "variable": {
+ "color": "#bcb0ff"
+ },
+ "variable.builtin": {
+ "color": "#06d46e"
+ },
+ "property": {
+ "color": "#bcb0ff"
+ },
+ "enumMember": {
+ "color": "#06d46e"
+ },
+ "decorator": {
+ "color": "#27c7ff"
+ },
+ "event": {
+ "color": "#27c7ff"
+ },
+ "punct": {
+ "color": "#ffa192"
+ },
+ "punctuation": {
+ "color": "#ffa192"
+ },
+ "punctuation.bracket": {
+ "color": "#bcb0ff"
+ },
+ "punctuation.delimiter": {
+ "color": "#bcb0ff"
+ },
+ "punctuation.list-marker": {
+ "color": "#bcb0ff"
+ },
+ "punctuation.markup": {
+ "color": "#bcb0ff"
+ },
+ "punctuation.special": {
+ "color": "#27c7ff"
+ },
+ "escapeSequence": {
+ "color": "#ffa192"
+ },
+ "function": {
+ "color": "#27c7ff",
+ "font_style": "italic"
+ },
+ "method": {
+ "color": "#27c7ff",
+ "font_style": "italic"
+ },
+ "macro": {
+ "color": "#27c7ff"
+ },
+ "label": {
+ "color": "#dfdee1"
+ },
+ "comment": {
+ "color": "#a2a1a8",
+ "font_style": "italic"
+ },
+ "comment.doc": {
+ "color": "#bab9be",
+ "font_style": "italic"
+ },
+ "constructor": {
+ "color": "#27c7ff"
+ },
+ "embedded": {
+ "color": "#ebebed"
+ },
+ "string": { "color": "#06d46e" },
+ "string.escape": {
+ "color": "#cfced2"
+ },
+ "string.special": {
+ "color": "#f8aa14"
+ },
+ "string.special.symbol": {
+ "color": "#f8aa14"
+ },
+ "keyword": {
+ "color": "#bcb0ff",
+ "font_style": "italic"
+ },
+ "keyword.control": {
+ "color": "#bcb0ff",
+ "font_style": "italic"
+ },
+ "number": {
+ "color": "#f8aa14"
+ },
+ "string.regex": {
+ "color": "#f8aa14"
+ },
+ "boolean": {
+ "color": "#f8aa14"
+ },
+ "bool": {
+ "color": "#f8aa14"
+ },
+ "const": {
+ "color": "#f8aa14"
+ },
+ "constant": {
+ "color": "#f8aa14"
+ },
+ "operator": {
+ "color": "#bcb0ff"
+ },
+ "tag": {
+ "color": "#bcb0ff"
+ },
+ "attribute": {
+ "color": "#27c7ff"
+ },
+ "link_uri": {
+ "color": "#00cec5"
+ },
+ "preproc": {
+ "color": "#ebebed"
+ },
+ "primary": {
+ "color": "#ebebed"
+ },
+ "predictive": {
+ "color": "#dfdee1",
+ "font_style": "italic"
+ },
+ "selector": {
+ "color": "#06d46e"
+ },
+ "selector.pseudo": {
+ "color": "#27c7ff"
+ },
+ "text.literal": {
+ "color": "#06d46e"
+ },
+ "title": {
+ "color": "#ffa192",
+ "font_weight": 400
+ },
+ "variable.special": {
+ "color": "#f8aa14"
+ },
+ "variant": {
+ "color": "#27c7ff"
+ },
+ "function.declaration": {
+ "color": "#bcb0ff",
+ "font_weight": 700
+ },
+ "enum.declaration": {
+ "color": "#06d46e",
+ "font_weight": 700
+ },
+ "class.declaration": {
+ "color": "#27c7ff",
+ "font_weight": 700
+ },
+ "method.declaration": {
+ "color": "#27c7ff",
+ "font_weight": 700
+ },
+ "trait.declaration": {
+ "color": "#f8aa14",
+ "font_weight": 700
+ },
+ "struct.declaration": {
+ "color": "#27c7ff",
+ "font_weight": 700
+ },
+ "function.async": {
+ "color": "#f8aa14"
+ },
+ "unresolvedReference": {
+ "color": "#ffa192"
+ },
+ "namespace.defaultLibrary": {
+ "color": "#06d46e"
+ },
+ "variable.defaultLibrary": {
+ "color": "#06d46e"
+ },
+ "namespace.builtin": {
+ "color": "#06d46e"
+ },
+ "emphasis": {
+ "color": "#bcb0ff",
+ "font_style": "italic"
+ },
+ "emphasis.strong": {
+ "color": "#bcb0ff",
+ "font_style": "italic",
+ "font_weight": 700
+ }
+ }
+ }
+}
+,
+{
+ "name": "Kleur Light",
+ "appearance": "light",
+ "style": {
+ "background.appearance": "opaque",
+ "accents": [
+ "#433e68",
+ "#0f4860",
+ "#104b47",
+ "#0f4d28",
+ "#5c3d06",
+ "#7b1e1b"
+ ],
+ "border": "#00000000",
+ "border.variant": "#00000000",
+ "border.focused": "#433e68",
+ "border.selected": "#00000000",
+ "border.transparent": "#00000000",
+ "border.disabled": "#00000000",
+ "elevated_surface.background": "#ecedfc",
+ "surface.background": "#f0f0ff",
+ "background": "#f0f0ff",
+ "element.background": "#b1a5ff",
+ "element.active": "#433e6840",
+ "element.hover": "#b1a5ff60",
+ "element.selected": "#d3c7ff",
+ "element.disabled": "#93939b",
+ "drop_target.background": "#93939b66",
+ "ghost_element.background": "#00000000",
+ "ghost_element.hover": "#b1a5ff40",
+ "ghost_element.active": "#433e6840",
+ "ghost_element.selected": "#433e6860",
+ "ghost_element.disabled": "#ecedfc",
+ "text": "#2c2c2e",
+ "text.accent": "#433e68",
+ "text.muted": "#5c5c61",
+ "text.placeholder": "#77777d",
+ "text.disabled": "#77777d",
+ "icon": "#2c2c2e",
+ "icon.accent": "#433e68",
+ "icon.muted": "#5c5c61",
+ "icon.disabled": "#77777d",
+ "icon.placeholder": "#5c5c61",
+ "status_bar.background": "#f0f0ff",
+ "title_bar.background": "#f0f0ff",
+ "title_bar.inactive_background": "#f0f0ff",
+ "toolbar.background": "#f0f0ff",
+ "tab_bar.background": "#f0f0ff",
+ "tab.inactive_background": "#f0f0ff",
+ "tab.active_background": "#ecedfc",
+ "search.match_background": "#433e6866",
+ "panel.background": "#f0f0ff",
+ "panel.focused_border": null,
+ "pane.focused_border": null,
+ "scrollbar.thumb.background": "#ecedfc33",
+ "scrollbar.thumb.hover_background": "#ecedfc77",
+ "scrollbar.thumb.border": "#ecedfc33",
+ "scrollbar.track.background": "#f0f0ff",
+ "scrollbar.track.border": "#00000000",
+ "editor.foreground": "#2c2c2e",
+ "editor.background": "#f0f0ff",
+ "editor.gutter.background": "#f0f0ff",
+ "editor.subheader.background": "#f0f0ff",
+ "editor.active_line.background": "#f0f0ff",
+ "editor.highlighted_line.background": "#f0f0ff",
+ "editor.line_number": "#5c5c61",
+ "editor.active_line_number": "#2c2c2e",
+ "editor.hover_line_number": "#434346",
+ "editor.invisible": "#77777d",
+ "editor.wrap_guide": "#00000000",
+ "editor.active_wrap_guide": "#00000000",
+ "editor.document_highlight.read_background": "#433e681a",
+ "editor.document_highlight.write_background": "#5c5c6166",
+ "terminal.background": "#f0f0ff",
+ "terminal.foreground": "#2c2c2e",
+ "terminal.bright_foreground": "#2c2c2e",
+ "terminal.dim_foreground": "#f0f0ff",
+ "terminal.ansi.black": "#f0f0ff",
+ "terminal.ansi.dim_black": "#2c2c2e",
+ "terminal.ansi.bright_black": "#f0f0ff",
+ "terminal.ansi.red": "#7b1e1b",
+ "terminal.ansi.dim_red": "#ff9181",
+ "terminal.ansi.bright_red": "#a92624",
+ "terminal.ansi.green": "#0f4d28",
+ "terminal.ansi.dim_green": "#00c965",
+ "terminal.ansi.bright_green": "#046934",
+ "terminal.ansi.yellow": "#5c3d06",
+ "terminal.ansi.dim_yellow": "#eda000",
+ "terminal.ansi.bright_yellow": "#7e5300",
+ "terminal.ansi.blue": "#0f4860",
+ "terminal.ansi.dim_blue": "#00bcfb",
+ "terminal.ansi.bright_blue": "#006285",
+ "terminal.ansi.magenta": "#433e68",
+ "terminal.ansi.dim_magenta": "#b1a5ff",
+ "terminal.ansi.bright_magenta": "#5c5590",
+ "terminal.ansi.cyan": "#104b47",
+ "terminal.ansi.dim_cyan": "#00c3ba",
+ "terminal.ansi.bright_cyan": "#036661",
+ "terminal.ansi.white": "#2c2c2e",
+ "terminal.ansi.dim_white": "#5c5c61",
+ "terminal.ansi.bright_white": "#433e68",
+ "link_text.hover": "#104b47",
+ "version_control.added": "#0f4d28",
+ "version_control.modified": "#5c3d06",
+ "version_control.deleted": "#7b1e1b",
+ "version_control.word_added": "#0f4d2859",
+ "version_control.word_deleted": "#7b1e1bcc",
+ "version_control.conflict_marker.ours": "#0f4d281a",
+ "version_control.conflict_marker.theirs": "#0f48601a",
+ "conflict": "#5c3d06",
+ "conflict.background": "#5c3d061a",
+ "conflict.border": "#eda000",
+ "created": "#0f4d28",
+ "created.background": "#0f4d281a",
+ "created.border": "#00c965",
+ "deleted": "#7b1e1b",
+ "deleted.background": "#7b1e1b1a",
+ "deleted.border": "#ff9181",
+ "error": "#7b1e1b",
+ "error.background": "#7b1e1b1a",
+ "error.border": "#ff9181",
+ "hidden": "#5c5c61",
+ "hidden.background": "#5c5c611a",
+ "hidden.border": "#77777d",
+ "hint": "#5c5c61",
+ "hint.background": "#ecedfc",
+ "hint.border": "#d3c7ff",
+ "ignored": "#5c5c61",
+ "ignored.background": "#5c5c611a",
+ "ignored.border": "#77777d",
+ "info": "#0f4860",
+ "info.background": "#0f48601a",
+ "info.border": "#00bcfb",
+ "modified": "#5c3d06",
+ "modified.background": "#5c3d061a",
+ "modified.border": "#eda000",
+ "predictive": "#434346",
+ "predictive.background": "#4343461a",
+ "predictive.border": "#5c5c61",
+ "renamed": "#0f4860",
+ "renamed.background": "#0f48601a",
+ "renamed.border": "#00bcfb",
+ "success": "#0f4d28",
+ "success.background": "#0f4d281a",
+ "success.border": "#00c965",
+ "unreachable": "#5c5c61",
+ "unreachable.background": "#5c5c611a",
+ "unreachable.border": "#77777d",
+ "warning": "#5c3d06",
+ "warning.background": "#5c3d061a",
+ "warning.border": "#eda000",
+ "players": [
+ {
+ "cursor": "#433e68ff",
+ "background": "#433e68ff",
+ "selection": "#433e683d"
+ },
+ {
+ "cursor": "#0f4860ff",
+ "background": "#0f4860ff",
+ "selection": "#0f48603d"
+ },
+ {
+ "cursor": "#0f4d28ff",
+ "background": "#0f4d28ff",
+ "selection": "#0f4d283d"
+ },
+ {
+ "cursor": "#433e68ff",
+ "background": "#433e68ff",
+ "selection": "#433e683d"
+ },
+ {
+ "cursor": "#5c3d06ff",
+ "background": "#5c3d06ff",
+ "selection": "#5c3d063d"
+ },
+ {
+ "cursor": "#104b47ff",
+ "background": "#104b47ff",
+ "selection": "#104b473d"
+ },
+ {
+ "cursor": "#7b1e1bff",
+ "background": "#7b1e1bff",
+ "selection": "#7b1e1b3d"
+ },
+ {
+ "cursor": "#0f4860ff",
+ "background": "#0f4860ff",
+ "selection": "#0f48603d"
+ }
+ ],
+ "syntax": {
+ "namespace": {
+ "color": "#0f4d28"
+ },
+ "class": {
+ "color": "#0f4860"
+ },
+ "class.abstract": {
+ "color": "#5c3d06"
+ },
+ "enum": {
+ "color": "#0f4d28"
+ },
+ "interface": {
+ "color": "#5c3d06"
+ },
+ "struct": {
+ "color": "#0f4860"
+ },
+ "typeParameter": {
+ "color": "#0f4d28"
+ },
+ "type": {
+ "color": "#0f4860"
+ },
+ "parameter": {
+ "color": "#433e68"
+ },
+ "variable": {
+ "color": "#433e68"
+ },
+ "variable.builtin": {
+ "color": "#0f4d28"
+ },
+ "property": {
+ "color": "#433e68"
+ },
+ "enumMember": {
+ "color": "#0f4d28"
+ },
+ "decorator": {
+ "color": "#0f4860"
+ },
+ "event": {
+ "color": "#0f4860"
+ },
+ "punct": {
+ "color": "#7b1e1b"
+ },
+ "punctuation": {
+ "color": "#7b1e1b"
+ },
+ "punctuation.bracket": {
+ "color": "#433e68"
+ },
+ "punctuation.delimiter": {
+ "color": "#433e68"
+ },
+ "punctuation.list-marker": {
+ "color": "#433e68"
+ },
+ "punctuation.markup": {
+ "color": "#433e68"
+ },
+ "punctuation.special": {
+ "color": "#0f4860"
+ },
+ "escapeSequence": {
+ "color": "#7b1e1b"
+ },
+ "function": {
+ "color": "#0f4860",
+ "font_style": "italic"
+ },
+ "method": {
+ "color": "#0f4860",
+ "font_style": "italic"
+ },
+ "macro": {
+ "color": "#0f4860"
+ },
+ "label": {
+ "color": "#434346"
+ },
+ "comment": {
+ "color": "#93939b",
+ "font_style": "italic"
+ },
+ "comment.doc": {
+ "color": "#77777d",
+ "font_style": "italic"
+ },
+ "constructor": {
+ "color": "#0f4860"
+ },
+ "embedded": {
+ "color": "#2c2c2e"
+ },
+ "string": { "color": "#0f4d28" },
+ "string.escape": {
+ "color": "#5c5c61"
+ },
+ "string.special": {
+ "color": "#5c3d06"
+ },
+ "string.special.symbol": {
+ "color": "#5c3d06"
+ },
+ "keyword": {
+ "color": "#433e68",
+ "font_style": "italic"
+ },
+ "keyword.control": {
+ "color": "#433e68",
+ "font_style": "italic"
+ },
+ "number": {
+ "color": "#5c3d06"
+ },
+ "string.regex": {
+ "color": "#5c3d06"
+ },
+ "boolean": {
+ "color": "#5c3d06"
+ },
+ "bool": {
+ "color": "#5c3d06"
+ },
+ "const": {
+ "color": "#5c3d06"
+ },
+ "constant": {
+ "color": "#5c3d06"
+ },
+ "operator": {
+ "color": "#433e68"
+ },
+ "tag": {
+ "color": "#433e68"
+ },
+ "attribute": {
+ "color": "#0f4860"
+ },
+ "link_uri": {
+ "color": "#104b47"
+ },
+ "preproc": {
+ "color": "#2c2c2e"
+ },
+ "primary": {
+ "color": "#2c2c2e"
+ },
+ "predictive": {
+ "color": "#434346",
+ "font_style": "italic"
+ },
+ "selector": {
+ "color": "#0f4d28"
+ },
+ "selector.pseudo": {
+ "color": "#0f4860"
+ },
+ "text.literal": {
+ "color": "#0f4d28"
+ },
+ "title": {
+ "color": "#7b1e1b",
+ "font_weight": 400
+ },
+ "variable.special": {
+ "color": "#5c3d06"
+ },
+ "variant": {
+ "color": "#0f4860"
+ },
+ "function.declaration": {
+ "color": "#433e68",
+ "font_weight": 700
+ },
+ "enum.declaration": {
+ "color": "#0f4d28",
+ "font_weight": 700
+ },
+ "class.declaration": {
+ "color": "#0f4860",
+ "font_weight": 700
+ },
+ "method.declaration": {
+ "color": "#0f4860",
+ "font_weight": 700
+ },
+ "trait.declaration": {
+ "color": "#5c3d06",
+ "font_weight": 700
+ },
+ "struct.declaration": {
+ "color": "#0f4860",
+ "font_weight": 700
+ },
+ "function.async": {
+ "color": "#5c3d06"
+ },
+ "unresolvedReference": {
+ "color": "#7b1e1b"
+ },
+ "namespace.defaultLibrary": {
+ "color": "#0f4d28"
+ },
+ "variable.defaultLibrary": {
+ "color": "#0f4d28"
+ },
+ "namespace.builtin": {
+ "color": "#0f4d28"
+ },
+ "emphasis": {
+ "color": "#433e68",
+ "font_style": "italic"
+ },
+ "emphasis.strong": {
+ "color": "#433e68",
+ "font_style": "italic",
+ "font_weight": 700
+ }
+ }
+ }
+}
+
+ ]
+}
diff --git a/apps/.local/bin/wallpaper b/apps/.local/bin/wallpaper
new file mode 100755
index 0000000..e9f2f45
--- /dev/null
+++ b/apps/.local/bin/wallpaper
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+# Usage: wallpaper ~/Pictures/wall.jpg
+# wallpaper "#16161e" (solid color)
+set -e
+
+TARGET="${1:-}"
+
+if [[ -z "$TARGET" ]]; then
+ echo "Usage: wallpaper "
+ exit 1
+fi
+
+STATE="$HOME/.config/wallpaper"
+
+# Save for next login
+echo "$TARGET" > "$STATE"
+
+# Kill existing swaybg
+pkill -x swaybg 2>/dev/null || true
+sleep 0.1
+
+# Apply
+if [[ "$TARGET" == \#* ]]; then
+ swaybg -c "$TARGET" &
+else
+ swaybg -i "$TARGET" -m fill &
+fi
+
+disown
diff --git a/apps/.local/bin/wallpaper-init b/apps/.local/bin/wallpaper-init
new file mode 100755
index 0000000..623d7ad
--- /dev/null
+++ b/apps/.local/bin/wallpaper-init
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+STATE="$HOME/.config/wallpaper"
+if [[ -f "$STATE" ]]; then
+ TARGET="$(cat "$STATE")"
+ if [[ "$TARGET" == \#* ]]; then
+ swaybg -c "$TARGET" &
+ else
+ swaybg -i "$TARGET" -m fill &
+ fi
+else
+ swaybg -c "#16161e" &
+fi
+disown
diff --git a/apps/.local/share/icons/hicolor/256x256/apps/tailscale.png b/apps/.local/share/icons/hicolor/256x256/apps/tailscale.png
new file mode 100644
index 0000000..6c38d70
Binary files /dev/null and b/apps/.local/share/icons/hicolor/256x256/apps/tailscale.png differ
diff --git a/fish/.config/fish/conf.d/colors.fish b/fish/.config/fish/conf.d/colors.fish
new file mode 100644
index 0000000..d7f602c
--- /dev/null
+++ b/fish/.config/fish/conf.d/colors.fish
@@ -0,0 +1,27 @@
+# Fish syntax highlighting — Mariana×Purple palette
+# Explicit hex values so terminal ANSI remapping doesn't break them
+
+set -g fish_color_command 89DDFF # cyan — commands
+set -g fish_color_builtin C3A6FF # purple — builtins
+set -g fish_color_keyword C3A6FF # purple — keywords (if, for, etc.)
+set -g fish_color_param D4D4D4 # text — args
+set -g fish_color_option A6ACCD # subtext — flags (--foo)
+set -g fish_color_quote BAE67E # green — strings
+set -g fish_color_redirection FFD580 # yellow — > >> | etc.
+set -g fish_color_end FFD580 # yellow — ; &
+set -g fish_color_error F28779 # pink — errors / bad commands
+set -g fish_color_comment 626880 # muted — # comments
+set -g fish_color_operator C3A6FF # purple — operators
+set -g fish_color_escape FFD580 # yellow — \n \t etc.
+set -g fish_color_autosuggestion 4A4F6A # dim — ghost text
+set -g fish_color_selection --background=3A3F5C # visual selection bg
+set -g fish_color_search_match --background=3A3F5C
+set -g fish_color_valid_path --underline
+set -g fish_color_cancel F28779
+
+# Pager (tab completion menu)
+set -g fish_pager_color_prefix C3A6FF --bold --underline
+set -g fish_pager_color_completion D4D4D4
+set -g fish_pager_color_description A6ACCD
+set -g fish_pager_color_progress A6ACCD --background=1E2030
+set -g fish_pager_color_selected_background --background=3A3F5C
diff --git a/fish/.config/fish/config.fish b/fish/.config/fish/config.fish
new file mode 100755
index 0000000..65ee5ae
--- /dev/null
+++ b/fish/.config/fish/config.fish
@@ -0,0 +1,27 @@
+if status is-interactive
+ # Commands to run in interactive sessions can go here
+ starship init fish | source
+end
+
+fish_add_path /home/end/.spicetify
+
+# pnpm
+set -gx PNPM_HOME "/home/end/.local/share/pnpm"
+if not string match -q -- $PNPM_HOME $PATH
+ set -gx PATH "$PNPM_HOME" $PATH
+end
+# pnpm end
+
+# terminal-wakatime setup
+set -gx PATH "$HOME/.wakatime" $PATH
+terminal-wakatime init fish | source
+
+status --is-interactive; and . (fnm env --use-on-cd | psub)
+
+# opencode
+fish_add_path /home/end/.opencode/bin
+
+status --is-interactive; and rbenv init - fish | source
+~/.local/bin/mise activate fish | source
+
+alias packettracer="QT_QPA_PLATFORM=xcb /usr/lib/packettracer/packettracer.AppImage"
diff --git a/fish/.config/fish/fish_variables b/fish/.config/fish/fish_variables
new file mode 100755
index 0000000..0e1d901
--- /dev/null
+++ b/fish/.config/fish/fish_variables
@@ -0,0 +1,7 @@
+# This file contains fish universal variable definitions.
+# VERSION: 3.0
+SETUVAR __fish_initialized:4300
+SETUVAR _fisher_jorgebucaran_2F_fisher_files:\x7e/\x2econfig/fish/functions/fisher\x2efish\x1e\x7e/\x2econfig/fish/completions/fisher\x2efish
+SETUVAR _fisher_plugins:jorgebucaran/fisher
+SETUVAR _fisher_upgraded_to_4_4:\x1d
+SETUVAR fish_user_paths:/home/end/\x2elocal/bin\x1e/home/end/\x2eopencode/bin\x1e/home/end/\x2espicetify
diff --git a/mullvad-tailscale.service b/mullvad-tailscale.service
new file mode 100644
index 0000000..dc7838f
--- /dev/null
+++ b/mullvad-tailscale.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=Mullvad + Tailscale coexistence rules
+After=tailscaled.service
+Wants=tailscaled.service
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/sbin/nft -f /home/end/Github/dotfiles/mullvad_tailscale.conf
+ExecStart=/usr/sbin/ip route add 100.64.0.0/10 dev tailscale0 table main
+ExecStop=/usr/sbin/nft delete table inet mullvad_tailscale
+ExecStop=/usr/sbin/ip route del 100.64.0.0/10 dev tailscale0 table main
+
+[Install]
+WantedBy=multi-user.target
diff --git a/mullvad_tailscale.conf b/mullvad_tailscale.conf
old mode 100644
new mode 100755
index 1748939..adb9195
--- a/mullvad_tailscale.conf
+++ b/mullvad_tailscale.conf
@@ -1,9 +1,15 @@
+# Mullvad + Tailscale coexistence
+# Apply with:
+# sudo nft -f /home/end/Github/dotfiles/mullvad_tailscale.conf
+# sudo ip route add 100.64.0.0/10 dev tailscale0 table main
+# sudo systemctl restart tailscaled
+
table inet mullvad_tailscale {
chain output {
type route hook output priority 0; policy accept;
ip daddr 100.64.0.0/10 ct mark set 0x00000f41 meta mark set 0x6d6f6c65;
}
-chain input {
+ chain input {
type filter hook input priority -100; policy accept;
ip saddr 100.64.0.0/10 ct mark set 0x00000f41 meta mark set 0x6d6f6c65;
}
diff --git a/nftables.conf b/nftables.conf
deleted file mode 120000
index 40db8d0..0000000
--- a/nftables.conf
+++ /dev/null
@@ -1 +0,0 @@
-/etc/nftables.conf
\ No newline at end of file
diff --git a/plasma/.config/QtProject.conf b/plasma/.config/QtProject.conf
new file mode 100755
index 0000000..b6c2962
--- /dev/null
+++ b/plasma/.config/QtProject.conf
@@ -0,0 +1,8 @@
+[FileDialog]
+history=file:///home/end/Downloads, file:///home/end, file:///home/end/Pictures/Screenshots
+lastVisited=file:///home/end/Pictures/Screenshots
+qtVersion=5.15.18
+shortcuts=file:, file:///home/end
+sidebarWidth=102
+treeViewHeader=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x3\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x2\x45\0\0\0\x4\x1\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0}\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x4\0\0\x1\x32\0\0\0\x1\0\0\0\0\0\0\0G\0\0\0\x1\0\0\0\0\0\0\0L\0\0\0\x1\0\0\0\0\0\0\0\x80\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\xff\xff\xff\xff)
+viewMode=Detail
diff --git a/plasma/.config/Trolltech.conf b/plasma/.config/Trolltech.conf
new file mode 100755
index 0000000..1e0b9f8
--- /dev/null
+++ b/plasma/.config/Trolltech.conf
@@ -0,0 +1,17 @@
+[qt]
+GUIEffects=none
+KDE\contrast=7
+KWinPalette\activeBackground=#272c31
+KWinPalette\activeBlend=#fcfcfc
+KWinPalette\activeForeground=#fcfcfc
+KWinPalette\activeTitleBtnBg=#202326
+KWinPalette\frame=#202326
+KWinPalette\inactiveBackground=#202428
+KWinPalette\inactiveBlend=#a1a9b1
+KWinPalette\inactiveForeground=#a1a9b1
+KWinPalette\inactiveFrame=#202326
+KWinPalette\inactiveTitleBtnBg=#202326
+Palette\active=#fcfcfc, #292c30, #40464c, #33383c, #101112, #1c1e21, #fcfcfc, #ffffff, #fcfcfc, #141618, #202326, #0b0c0d, #6c53a6, #ffffff, #926ee4, #9b59b6, #1d1f22, #000000, #292c30, #fcfcfc, #a1a9b1, #6c53a6
+Palette\disabled=#686a6c, #272a2e, #3f454b, #32363b, #0f1012, #1a1d1f, #606263, #ffffff, #6d6f72, #131517, #1f2124, #0b0c0d, #1f2124, #686a6c, #3d325b, #402b4c, #1c1e20, #000000, #292c30, #fcfcfc, #42464a, #1f2124
+Palette\inactive=#fcfcfc, #292c30, #40464c, #33383c, #101112, #1c1e21, #fcfcfc, #ffffff, #fcfcfc, #141618, #202326, #0b0c0d, #362c50, #fcfcfc, #926ee4, #9b59b6, #1d1f22, #000000, #292c30, #fcfcfc, #a1a9b1, #362c50
+font="Noto Sans,10,-1,0,400,0,0,0,0,0,0,0,0,0,0,1"
diff --git a/plasma/.config/gtk-3.0/assets/close-active.svg b/plasma/.config/gtk-3.0/assets/close-active.svg
new file mode 100755
index 0000000..b7e30d5
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/close-active.svg
@@ -0,0 +1,28 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/close-backdrop-active.svg b/plasma/.config/gtk-3.0/assets/close-backdrop-active.svg
new file mode 100755
index 0000000..047055b
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/close-backdrop-active.svg
@@ -0,0 +1,28 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/close-backdrop-hover.svg b/plasma/.config/gtk-3.0/assets/close-backdrop-hover.svg
new file mode 100755
index 0000000..73d2aec
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/close-backdrop-hover.svg
@@ -0,0 +1,28 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/close-backdrop-normal.svg b/plasma/.config/gtk-3.0/assets/close-backdrop-normal.svg
new file mode 100755
index 0000000..211fa64
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/close-backdrop-normal.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/close-hover.svg b/plasma/.config/gtk-3.0/assets/close-hover.svg
new file mode 100755
index 0000000..4f7e473
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/close-hover.svg
@@ -0,0 +1,28 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/close-normal.svg b/plasma/.config/gtk-3.0/assets/close-normal.svg
new file mode 100755
index 0000000..020e1cc
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/close-normal.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/maximize-active.svg b/plasma/.config/gtk-3.0/assets/maximize-active.svg
new file mode 100755
index 0000000..c471aca
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/maximize-active.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/maximize-backdrop-active.svg b/plasma/.config/gtk-3.0/assets/maximize-backdrop-active.svg
new file mode 100755
index 0000000..512e010
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/maximize-backdrop-active.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/maximize-backdrop-hover.svg b/plasma/.config/gtk-3.0/assets/maximize-backdrop-hover.svg
new file mode 100755
index 0000000..178ca88
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/maximize-backdrop-hover.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/maximize-backdrop-normal.svg b/plasma/.config/gtk-3.0/assets/maximize-backdrop-normal.svg
new file mode 100755
index 0000000..d90a986
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/maximize-backdrop-normal.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/maximize-hover.svg b/plasma/.config/gtk-3.0/assets/maximize-hover.svg
new file mode 100755
index 0000000..60b166c
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/maximize-hover.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/maximize-normal.svg b/plasma/.config/gtk-3.0/assets/maximize-normal.svg
new file mode 100755
index 0000000..257cc45
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/maximize-normal.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/maximized-active.svg b/plasma/.config/gtk-3.0/assets/maximized-active.svg
new file mode 100755
index 0000000..331e148
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/maximized-active.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/maximized-backdrop-active.svg b/plasma/.config/gtk-3.0/assets/maximized-backdrop-active.svg
new file mode 100755
index 0000000..8406d91
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/maximized-backdrop-active.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/maximized-backdrop-hover.svg b/plasma/.config/gtk-3.0/assets/maximized-backdrop-hover.svg
new file mode 100755
index 0000000..94527a7
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/maximized-backdrop-hover.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/maximized-backdrop-normal.svg b/plasma/.config/gtk-3.0/assets/maximized-backdrop-normal.svg
new file mode 100755
index 0000000..d83c822
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/maximized-backdrop-normal.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/maximized-hover.svg b/plasma/.config/gtk-3.0/assets/maximized-hover.svg
new file mode 100755
index 0000000..e777c43
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/maximized-hover.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/maximized-normal.svg b/plasma/.config/gtk-3.0/assets/maximized-normal.svg
new file mode 100755
index 0000000..c466d87
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/maximized-normal.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/minimize-active.svg b/plasma/.config/gtk-3.0/assets/minimize-active.svg
new file mode 100755
index 0000000..d69bbc0
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/minimize-active.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/minimize-backdrop-active.svg b/plasma/.config/gtk-3.0/assets/minimize-backdrop-active.svg
new file mode 100755
index 0000000..5ba6c5f
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/minimize-backdrop-active.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/minimize-backdrop-hover.svg b/plasma/.config/gtk-3.0/assets/minimize-backdrop-hover.svg
new file mode 100755
index 0000000..145c223
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/minimize-backdrop-hover.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/minimize-backdrop-normal.svg b/plasma/.config/gtk-3.0/assets/minimize-backdrop-normal.svg
new file mode 100755
index 0000000..e73dea6
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/minimize-backdrop-normal.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/minimize-hover.svg b/plasma/.config/gtk-3.0/assets/minimize-hover.svg
new file mode 100755
index 0000000..500fe2f
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/minimize-hover.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/plasma/.config/gtk-3.0/assets/minimize-normal.svg b/plasma/.config/gtk-3.0/assets/minimize-normal.svg
new file mode 100755
index 0000000..24529ed
--- /dev/null
+++ b/plasma/.config/gtk-3.0/assets/minimize-normal.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/plasma/.config/gtk-3.0/colors.css b/plasma/.config/gtk-3.0/colors.css
new file mode 100755
index 0000000..f48bcec
--- /dev/null
+++ b/plasma/.config/gtk-3.0/colors.css
@@ -0,0 +1,84 @@
+@define-color borders_breeze #57595c;
+@define-color content_view_bg_breeze #141618;
+@define-color error_color_backdrop_breeze #da4453;
+@define-color error_color_breeze #da4453;
+@define-color error_color_insensitive_backdrop_breeze #55242b;
+@define-color error_color_insensitive_breeze #55242b;
+@define-color insensitive_base_color_breeze #131517;
+@define-color insensitive_base_fg_color_breeze #606263;
+@define-color insensitive_bg_color_breeze #1f2124;
+@define-color insensitive_borders_breeze #313336;
+@define-color insensitive_fg_color_breeze #686a6c;
+@define-color insensitive_selected_bg_color_breeze #1f2124;
+@define-color insensitive_selected_fg_color_breeze #686a6c;
+@define-color insensitive_unfocused_bg_color_breeze #1f2124;
+@define-color insensitive_unfocused_fg_color_breeze #686a6c;
+@define-color insensitive_unfocused_selected_bg_color_breeze #1f2124;
+@define-color insensitive_unfocused_selected_fg_color_breeze #686a6c;
+@define-color link_color_breeze #926ee4;
+@define-color link_visited_color_breeze #9b59b6;
+@define-color success_color_backdrop_breeze #27ae60;
+@define-color success_color_breeze #27ae60;
+@define-color success_color_insensitive_backdrop_breeze #19482f;
+@define-color success_color_insensitive_breeze #19482f;
+@define-color theme_base_color_breeze #141618;
+@define-color theme_bg_color_breeze #202326;
+@define-color theme_button_background_backdrop_breeze #292c30;
+@define-color theme_button_background_backdrop_insensitive_breeze #272a2e;
+@define-color theme_button_background_insensitive_breeze #272a2e;
+@define-color theme_button_background_normal_breeze #292c30;
+@define-color theme_button_decoration_focus_backdrop_breeze #926ee4;
+@define-color theme_button_decoration_focus_backdrop_insensitive_breeze #4a406a;
+@define-color theme_button_decoration_focus_breeze #926ee4;
+@define-color theme_button_decoration_focus_insensitive_breeze #4a406a;
+@define-color theme_button_decoration_hover_backdrop_breeze #926ee4;
+@define-color theme_button_decoration_hover_backdrop_insensitive_breeze #4a406a;
+@define-color theme_button_decoration_hover_breeze #926ee4;
+@define-color theme_button_decoration_hover_insensitive_breeze #4a406a;
+@define-color theme_button_foreground_active_backdrop_breeze #fcfcfc;
+@define-color theme_button_foreground_active_backdrop_insensitive_breeze #686a6c;
+@define-color theme_button_foreground_active_breeze #ffffff;
+@define-color theme_button_foreground_active_insensitive_breeze #686a6c;
+@define-color theme_button_foreground_backdrop_breeze #fcfcfc;
+@define-color theme_button_foreground_backdrop_insensitive_breeze #6d6f72;
+@define-color theme_button_foreground_insensitive_breeze #6d6f72;
+@define-color theme_button_foreground_normal_breeze #fcfcfc;
+@define-color theme_fg_color_breeze #fcfcfc;
+@define-color theme_header_background_backdrop_breeze #202326;
+@define-color theme_header_background_breeze #292c30;
+@define-color theme_header_background_light_breeze #202326;
+@define-color theme_header_foreground_backdrop_breeze #fcfcfc;
+@define-color theme_header_foreground_breeze #fcfcfc;
+@define-color theme_header_foreground_insensitive_backdrop_breeze #fcfcfc;
+@define-color theme_header_foreground_insensitive_breeze #fcfcfc;
+@define-color theme_hovering_selected_bg_color_breeze #926ee4;
+@define-color theme_selected_bg_color_breeze #6c53a6;
+@define-color theme_selected_fg_color_breeze #ffffff;
+@define-color theme_text_color_breeze #fcfcfc;
+@define-color theme_titlebar_background_backdrop_breeze #202326;
+@define-color theme_titlebar_background_breeze #292c30;
+@define-color theme_titlebar_background_light_breeze #202326;
+@define-color theme_titlebar_foreground_backdrop_breeze #fcfcfc;
+@define-color theme_titlebar_foreground_breeze #fcfcfc;
+@define-color theme_titlebar_foreground_insensitive_backdrop_breeze #fcfcfc;
+@define-color theme_titlebar_foreground_insensitive_breeze #fcfcfc;
+@define-color theme_unfocused_base_color_breeze #141618;
+@define-color theme_unfocused_bg_color_breeze #202326;
+@define-color theme_unfocused_fg_color_breeze #fcfcfc;
+@define-color theme_unfocused_selected_bg_color_alt_breeze #362c50;
+@define-color theme_unfocused_selected_bg_color_breeze #362c50;
+@define-color theme_unfocused_selected_fg_color_breeze #fcfcfc;
+@define-color theme_unfocused_text_color_breeze #fcfcfc;
+@define-color theme_unfocused_view_bg_color_breeze #131517;
+@define-color theme_unfocused_view_text_color_breeze #606263;
+@define-color theme_view_active_decoration_color_breeze #926ee4;
+@define-color theme_view_hover_decoration_color_breeze #926ee4;
+@define-color tooltip_background_breeze #292c30;
+@define-color tooltip_border_breeze #5e6063;
+@define-color tooltip_text_breeze #fcfcfc;
+@define-color unfocused_borders_breeze #57595c;
+@define-color unfocused_insensitive_borders_breeze #313336;
+@define-color warning_color_backdrop_breeze #f67400;
+@define-color warning_color_breeze #f67400;
+@define-color warning_color_insensitive_backdrop_breeze #5e340f;
+@define-color warning_color_insensitive_breeze #5e340f;
diff --git a/plasma/.config/gtk-3.0/gtk.css b/plasma/.config/gtk-3.0/gtk.css
new file mode 100755
index 0000000..c9763f7
--- /dev/null
+++ b/plasma/.config/gtk-3.0/gtk.css
@@ -0,0 +1 @@
+@import 'colors.css';
\ No newline at end of file
diff --git a/plasma/.config/gtk-3.0/settings.ini b/plasma/.config/gtk-3.0/settings.ini
new file mode 100755
index 0000000..65e501c
--- /dev/null
+++ b/plasma/.config/gtk-3.0/settings.ini
@@ -0,0 +1,18 @@
+[Settings]
+gtk-application-prefer-dark-theme=true
+gtk-button-images=true
+gtk-cursor-blink=true
+gtk-cursor-blink-time=1000
+gtk-cursor-theme-name=breeze_cursors
+gtk-cursor-theme-size=24
+gtk-decoration-layout=icon:minimize,maximize,close
+gtk-enable-animations=true
+gtk-font-name=Noto Sans, 10
+gtk-icon-theme-name=breeze-dark
+gtk-menu-images=true
+gtk-modules=colorreload-gtk-module:window-decorations-gtk-module
+gtk-primary-button-warps-slider=true
+gtk-sound-theme-name=ocean
+gtk-theme-name=Breeze
+gtk-toolbar-style=3
+gtk-xft-dpi=98304
diff --git a/plasma/.config/gtk-3.0/window_decorations.css b/plasma/.config/gtk-3.0/window_decorations.css
new file mode 100755
index 0000000..ca70a8a
--- /dev/null
+++ b/plasma/.config/gtk-3.0/window_decorations.css
@@ -0,0 +1,71 @@
+headerbar button.titlebutton.close, .titlebar button.titlebutton.close {
+ background-image: url("assets/close-normal.svg"); }
+
+headerbar button.titlebutton.close:hover, .titlebar button.titlebutton.close:hover {
+ background-image: url("assets/close-hover.svg"); }
+
+headerbar button.titlebutton.close:active, .titlebar button.titlebutton.close:active {
+ background-image: url("assets/close-active.svg"); }
+
+headerbar button.titlebutton.close:backdrop, .titlebar button.titlebutton.close:backdrop {
+ background-image: url("assets/close-backdrop-normal.svg"); }
+
+headerbar button.titlebutton.close:backdrop:hover, .titlebar button.titlebutton.close:backdrop:hover {
+ background-image: url("assets/close-backdrop-hover.svg"); }
+
+headerbar button.titlebutton.close:backdrop:active, .titlebar button.titlebutton.close:backdrop:active {
+ background-image: url("assets/close-backdrop-active.svg"); }
+
+headerbar button.titlebutton.maximize, .titlebar button.titlebutton.maximize {
+ background-image: url("assets/maximize-normal.svg"); }
+
+headerbar button.titlebutton.maximize:hover, .titlebar button.titlebutton.maximize:hover {
+ background-image: url("assets/maximize-hover.svg"); }
+
+headerbar button.titlebutton.maximize:active, .titlebar button.titlebutton.maximize:active {
+ background-image: url("assets/maximize-active.svg"); }
+
+headerbar button.titlebutton.maximize:backdrop, .titlebar button.titlebutton.maximize:backdrop {
+ background-image: url("assets/maximize-backdrop-normal.svg"); }
+
+headerbar button.titlebutton.maximize:backdrop:hover, .titlebar button.titlebutton.maximize:backdrop:hover {
+ background-image: url("assets/maximize-backdrop-hover.svg"); }
+
+headerbar button.titlebutton.maximize:backdrop:active, .titlebar button.titlebutton.maximize:backdrop:active {
+ background-image: url("assets/maximize-backdrop-active.svg"); }
+
+headerbar button.titlebutton.minimize, .titlebar button.titlebutton.minimize {
+ background-image: url("assets/minimize-normal.svg"); }
+
+headerbar button.titlebutton.minimize:hover, .titlebar button.titlebutton.minimize:hover {
+ background-image: url("assets/minimize-hover.svg"); }
+
+headerbar button.titlebutton.minimize:active, .titlebar button.titlebutton.minimize:active {
+ background-image: url("assets/minimize-active.svg"); }
+
+headerbar button.titlebutton.minimize:backdrop, .titlebar button.titlebutton.minimize:backdrop {
+ background-image: url("assets/minimize-backdrop-normal.svg"); }
+
+headerbar button.titlebutton.minimize:backdrop:hover, .titlebar button.titlebutton.minimize:backdrop:hover {
+ background-image: url("assets/minimize-backdrop-hover.svg"); }
+
+headerbar button.titlebutton.minimize:backdrop:active, .titlebar button.titlebutton.minimize:backdrop:active {
+ background-image: url("assets/minimize-backdrop-active.svg"); }
+
+.maximized headerbar button.titlebutton.maximize, .maximized .titlebar button.titlebutton.maximize {
+ background-image: url("assets/maximized-normal.svg"); }
+
+.maximized headerbar button.titlebutton.maximize:hover, .maximized .titlebar button.titlebutton.maximize:hover {
+ background-image: url("assets/maximized-hover.svg"); }
+
+.maximized headerbar button.titlebutton.maximize:active, .maximized .titlebar button.titlebutton.maximize:active {
+ background-image: url("assets/maximized-active.svg"); }
+
+.maximized headerbar button.titlebutton.maximize:backdrop, .maximized .titlebar button.titlebutton.maximize:backdrop {
+ background-image: url("assets/maximized-backdrop-normal.svg"); }
+
+.maximized headerbar button.titlebutton.maximize:backdrop:hover, .maximized .titlebar button.titlebutton.maximize:backdrop:hover {
+ background-image: url("assets/maximized-backdrop-hover.svg"); }
+
+.maximized headerbar button.titlebutton.maximize:backdrop:active, .maximized .titlebar button.titlebutton.maximize:backdrop:active {
+ background-image: url("assets/maximized-backdrop-active.svg"); }
diff --git a/plasma/.config/gtk-4.0/colors.css b/plasma/.config/gtk-4.0/colors.css
new file mode 100755
index 0000000..f48bcec
--- /dev/null
+++ b/plasma/.config/gtk-4.0/colors.css
@@ -0,0 +1,84 @@
+@define-color borders_breeze #57595c;
+@define-color content_view_bg_breeze #141618;
+@define-color error_color_backdrop_breeze #da4453;
+@define-color error_color_breeze #da4453;
+@define-color error_color_insensitive_backdrop_breeze #55242b;
+@define-color error_color_insensitive_breeze #55242b;
+@define-color insensitive_base_color_breeze #131517;
+@define-color insensitive_base_fg_color_breeze #606263;
+@define-color insensitive_bg_color_breeze #1f2124;
+@define-color insensitive_borders_breeze #313336;
+@define-color insensitive_fg_color_breeze #686a6c;
+@define-color insensitive_selected_bg_color_breeze #1f2124;
+@define-color insensitive_selected_fg_color_breeze #686a6c;
+@define-color insensitive_unfocused_bg_color_breeze #1f2124;
+@define-color insensitive_unfocused_fg_color_breeze #686a6c;
+@define-color insensitive_unfocused_selected_bg_color_breeze #1f2124;
+@define-color insensitive_unfocused_selected_fg_color_breeze #686a6c;
+@define-color link_color_breeze #926ee4;
+@define-color link_visited_color_breeze #9b59b6;
+@define-color success_color_backdrop_breeze #27ae60;
+@define-color success_color_breeze #27ae60;
+@define-color success_color_insensitive_backdrop_breeze #19482f;
+@define-color success_color_insensitive_breeze #19482f;
+@define-color theme_base_color_breeze #141618;
+@define-color theme_bg_color_breeze #202326;
+@define-color theme_button_background_backdrop_breeze #292c30;
+@define-color theme_button_background_backdrop_insensitive_breeze #272a2e;
+@define-color theme_button_background_insensitive_breeze #272a2e;
+@define-color theme_button_background_normal_breeze #292c30;
+@define-color theme_button_decoration_focus_backdrop_breeze #926ee4;
+@define-color theme_button_decoration_focus_backdrop_insensitive_breeze #4a406a;
+@define-color theme_button_decoration_focus_breeze #926ee4;
+@define-color theme_button_decoration_focus_insensitive_breeze #4a406a;
+@define-color theme_button_decoration_hover_backdrop_breeze #926ee4;
+@define-color theme_button_decoration_hover_backdrop_insensitive_breeze #4a406a;
+@define-color theme_button_decoration_hover_breeze #926ee4;
+@define-color theme_button_decoration_hover_insensitive_breeze #4a406a;
+@define-color theme_button_foreground_active_backdrop_breeze #fcfcfc;
+@define-color theme_button_foreground_active_backdrop_insensitive_breeze #686a6c;
+@define-color theme_button_foreground_active_breeze #ffffff;
+@define-color theme_button_foreground_active_insensitive_breeze #686a6c;
+@define-color theme_button_foreground_backdrop_breeze #fcfcfc;
+@define-color theme_button_foreground_backdrop_insensitive_breeze #6d6f72;
+@define-color theme_button_foreground_insensitive_breeze #6d6f72;
+@define-color theme_button_foreground_normal_breeze #fcfcfc;
+@define-color theme_fg_color_breeze #fcfcfc;
+@define-color theme_header_background_backdrop_breeze #202326;
+@define-color theme_header_background_breeze #292c30;
+@define-color theme_header_background_light_breeze #202326;
+@define-color theme_header_foreground_backdrop_breeze #fcfcfc;
+@define-color theme_header_foreground_breeze #fcfcfc;
+@define-color theme_header_foreground_insensitive_backdrop_breeze #fcfcfc;
+@define-color theme_header_foreground_insensitive_breeze #fcfcfc;
+@define-color theme_hovering_selected_bg_color_breeze #926ee4;
+@define-color theme_selected_bg_color_breeze #6c53a6;
+@define-color theme_selected_fg_color_breeze #ffffff;
+@define-color theme_text_color_breeze #fcfcfc;
+@define-color theme_titlebar_background_backdrop_breeze #202326;
+@define-color theme_titlebar_background_breeze #292c30;
+@define-color theme_titlebar_background_light_breeze #202326;
+@define-color theme_titlebar_foreground_backdrop_breeze #fcfcfc;
+@define-color theme_titlebar_foreground_breeze #fcfcfc;
+@define-color theme_titlebar_foreground_insensitive_backdrop_breeze #fcfcfc;
+@define-color theme_titlebar_foreground_insensitive_breeze #fcfcfc;
+@define-color theme_unfocused_base_color_breeze #141618;
+@define-color theme_unfocused_bg_color_breeze #202326;
+@define-color theme_unfocused_fg_color_breeze #fcfcfc;
+@define-color theme_unfocused_selected_bg_color_alt_breeze #362c50;
+@define-color theme_unfocused_selected_bg_color_breeze #362c50;
+@define-color theme_unfocused_selected_fg_color_breeze #fcfcfc;
+@define-color theme_unfocused_text_color_breeze #fcfcfc;
+@define-color theme_unfocused_view_bg_color_breeze #131517;
+@define-color theme_unfocused_view_text_color_breeze #606263;
+@define-color theme_view_active_decoration_color_breeze #926ee4;
+@define-color theme_view_hover_decoration_color_breeze #926ee4;
+@define-color tooltip_background_breeze #292c30;
+@define-color tooltip_border_breeze #5e6063;
+@define-color tooltip_text_breeze #fcfcfc;
+@define-color unfocused_borders_breeze #57595c;
+@define-color unfocused_insensitive_borders_breeze #313336;
+@define-color warning_color_backdrop_breeze #f67400;
+@define-color warning_color_breeze #f67400;
+@define-color warning_color_insensitive_backdrop_breeze #5e340f;
+@define-color warning_color_insensitive_breeze #5e340f;
diff --git a/plasma/.config/gtk-4.0/gtk.css b/plasma/.config/gtk-4.0/gtk.css
new file mode 100755
index 0000000..6f1f4f5
--- /dev/null
+++ b/plasma/.config/gtk-4.0/gtk.css
@@ -0,0 +1,2 @@
+
+@import 'colors.css';
\ No newline at end of file
diff --git a/plasma/.config/gtk-4.0/settings.ini b/plasma/.config/gtk-4.0/settings.ini
new file mode 100755
index 0000000..0b74d62
--- /dev/null
+++ b/plasma/.config/gtk-4.0/settings.ini
@@ -0,0 +1,13 @@
+[Settings]
+gtk-application-prefer-dark-theme=true
+gtk-cursor-blink=true
+gtk-cursor-blink-time=1000
+gtk-cursor-theme-name=breeze_cursors
+gtk-cursor-theme-size=24
+gtk-decoration-layout=icon:minimize,maximize,close
+gtk-enable-animations=true
+gtk-font-name=Noto Sans, 10
+gtk-icon-theme-name=breeze-dark
+gtk-primary-button-warps-slider=true
+gtk-sound-theme-name=ocean
+gtk-xft-dpi=98304
diff --git a/plasma/.config/gtk-4.0/window_decorations.css b/plasma/.config/gtk-4.0/window_decorations.css
new file mode 100755
index 0000000..ca70a8a
--- /dev/null
+++ b/plasma/.config/gtk-4.0/window_decorations.css
@@ -0,0 +1,71 @@
+headerbar button.titlebutton.close, .titlebar button.titlebutton.close {
+ background-image: url("assets/close-normal.svg"); }
+
+headerbar button.titlebutton.close:hover, .titlebar button.titlebutton.close:hover {
+ background-image: url("assets/close-hover.svg"); }
+
+headerbar button.titlebutton.close:active, .titlebar button.titlebutton.close:active {
+ background-image: url("assets/close-active.svg"); }
+
+headerbar button.titlebutton.close:backdrop, .titlebar button.titlebutton.close:backdrop {
+ background-image: url("assets/close-backdrop-normal.svg"); }
+
+headerbar button.titlebutton.close:backdrop:hover, .titlebar button.titlebutton.close:backdrop:hover {
+ background-image: url("assets/close-backdrop-hover.svg"); }
+
+headerbar button.titlebutton.close:backdrop:active, .titlebar button.titlebutton.close:backdrop:active {
+ background-image: url("assets/close-backdrop-active.svg"); }
+
+headerbar button.titlebutton.maximize, .titlebar button.titlebutton.maximize {
+ background-image: url("assets/maximize-normal.svg"); }
+
+headerbar button.titlebutton.maximize:hover, .titlebar button.titlebutton.maximize:hover {
+ background-image: url("assets/maximize-hover.svg"); }
+
+headerbar button.titlebutton.maximize:active, .titlebar button.titlebutton.maximize:active {
+ background-image: url("assets/maximize-active.svg"); }
+
+headerbar button.titlebutton.maximize:backdrop, .titlebar button.titlebutton.maximize:backdrop {
+ background-image: url("assets/maximize-backdrop-normal.svg"); }
+
+headerbar button.titlebutton.maximize:backdrop:hover, .titlebar button.titlebutton.maximize:backdrop:hover {
+ background-image: url("assets/maximize-backdrop-hover.svg"); }
+
+headerbar button.titlebutton.maximize:backdrop:active, .titlebar button.titlebutton.maximize:backdrop:active {
+ background-image: url("assets/maximize-backdrop-active.svg"); }
+
+headerbar button.titlebutton.minimize, .titlebar button.titlebutton.minimize {
+ background-image: url("assets/minimize-normal.svg"); }
+
+headerbar button.titlebutton.minimize:hover, .titlebar button.titlebutton.minimize:hover {
+ background-image: url("assets/minimize-hover.svg"); }
+
+headerbar button.titlebutton.minimize:active, .titlebar button.titlebutton.minimize:active {
+ background-image: url("assets/minimize-active.svg"); }
+
+headerbar button.titlebutton.minimize:backdrop, .titlebar button.titlebutton.minimize:backdrop {
+ background-image: url("assets/minimize-backdrop-normal.svg"); }
+
+headerbar button.titlebutton.minimize:backdrop:hover, .titlebar button.titlebutton.minimize:backdrop:hover {
+ background-image: url("assets/minimize-backdrop-hover.svg"); }
+
+headerbar button.titlebutton.minimize:backdrop:active, .titlebar button.titlebutton.minimize:backdrop:active {
+ background-image: url("assets/minimize-backdrop-active.svg"); }
+
+.maximized headerbar button.titlebutton.maximize, .maximized .titlebar button.titlebutton.maximize {
+ background-image: url("assets/maximized-normal.svg"); }
+
+.maximized headerbar button.titlebutton.maximize:hover, .maximized .titlebar button.titlebutton.maximize:hover {
+ background-image: url("assets/maximized-hover.svg"); }
+
+.maximized headerbar button.titlebutton.maximize:active, .maximized .titlebar button.titlebutton.maximize:active {
+ background-image: url("assets/maximized-active.svg"); }
+
+.maximized headerbar button.titlebutton.maximize:backdrop, .maximized .titlebar button.titlebutton.maximize:backdrop {
+ background-image: url("assets/maximized-backdrop-normal.svg"); }
+
+.maximized headerbar button.titlebutton.maximize:backdrop:hover, .maximized .titlebar button.titlebutton.maximize:backdrop:hover {
+ background-image: url("assets/maximized-backdrop-hover.svg"); }
+
+.maximized headerbar button.titlebutton.maximize:backdrop:active, .maximized .titlebar button.titlebutton.maximize:backdrop:active {
+ background-image: url("assets/maximized-backdrop-active.svg"); }
diff --git a/plasma/.config/gtkrc b/plasma/.config/gtkrc
new file mode 100755
index 0000000..86b9d33
--- /dev/null
+++ b/plasma/.config/gtkrc
@@ -0,0 +1,2 @@
+# created by KDE Plasma, Wed Feb 4 22:16:45 2026
+#
diff --git a/plasma/.config/gtkrc-2.0 b/plasma/.config/gtkrc-2.0
new file mode 100755
index 0000000..17104ce
--- /dev/null
+++ b/plasma/.config/gtkrc-2.0
@@ -0,0 +1,5 @@
+# created by KDE Plasma, Wed Feb 4 22:16:45 2026
+#
+
+gtk-alternative-button-order = 1
+
diff --git a/plasma/.config/kconf_updaterc b/plasma/.config/kconf_updaterc
new file mode 100755
index 0000000..356442c
--- /dev/null
+++ b/plasma/.config/kconf_updaterc
@@ -0,0 +1,86 @@
+updateInfoAdded=true
+
+[dolphin_detailsmodesettings.upd]
+ctime=1770326744
+done=rename-leading-padding,rename-side-padding,move-content-display
+mtime=1770139556
+
+[dolphin_replace_view_mode_with_view_settings_in_toolbar.upd]
+ctime=1770326744
+done=move-content-display,replace-view-mode-with-view-settings-in-toolbar
+mtime=1770139556
+
+[dolphin_statusandlocationbarssettings.upd]
+ctime=1770326744
+done=replace-view-mode-with-view-settings-in-toolbar,25.04-convert-bool-showstatusbar-to-enum-showstatusbar
+mtime=1770139556
+
+[gtkconfig.upd]
+ctime=1769692356
+done=25.04-convert-bool-showstatusbar-to-enum-showstatusbar,gtk_theme,dont_use_gtk_css_for_window_decorations,remove_deprecated_gtk4_option_v2
+mtime=1768334489
+
+[kcalcrc.upd]
+ctime=1770326747
+done=remove_deprecated_gtk4_option_v2
+mtime=1770149900
+
+[kwin-x11.upd]
+ctime=1769887677
+done=remove_deprecated_gtk4_option_v2,kwin-6.0-reset-active-mouse-screen-x11,kwin-6.0-delete-desktop-switching-shortcuts-x11,kwin-6.0-remove-breeze-tabbox-default-x11,kwin-6.1-remove-gridview-expose-shortcuts-x11,kwin-6.5-showpaint-changes-x11
+mtime=1769684280
+
+[kwin.upd]
+ctime=1769887677
+done=kwin-6.5-showpaint-changes-x11,kwin-6.0-reset-active-mouse-screen,kwin-6.0-delete-desktop-switching-shortcuts,kwin-6.0-remove-breeze-tabbox-default,kwin-6.1-remove-gridview-expose-shortcuts,kwin-6.5-showpaint-changes
+mtime=1769683918
+
+[migrate-calendar-to-plugin-id.upd]
+ctime=1769692355
+done=kwin-6.5-showpaint-changes,migrate-calendar-plugins
+mtime=1768333784
+
+[plasma-systemmonitor.upd]
+ctime=1769692356
+done=migrate-calendar-plugins,memory-column
+mtime=1768335525
+
+[plasma6.0-remove-dpi-settings.upd]
+ctime=1769692355
+done=memory-column,plasma6.0-remove-dpi-settings
+mtime=1768333784
+
+[plasma6.0-remove-old-shortcuts.upd]
+ctime=1769692355
+done=plasma6.0-remove-dpi-settings,plasma6.0-remove-old-shortcuts
+mtime=1768333784
+
+[plasma6.3-update-clipboard-database-2-to-3.upd]
+ctime=1769692355
+done=plasma6.0-remove-old-shortcuts,plasma6.3-update-clipboard-database-2-to-3
+mtime=1768333784
+
+[plasma6.4-migrate-fullscreen-notifications-to-dnd.upd]
+ctime=1769692355
+done=plasma6.3-update-clipboard-database-2-to-3,plasma6.4-migrate-fullscreen-notifications-to-dnd
+mtime=1768333784
+
+[plasmashell-6.0-keep-custom-position-of-panels.upd]
+ctime=1769692355
+done=plasma6.4-migrate-fullscreen-notifications-to-dnd,plasmashell-6.0-keep-custom-position-of-panels
+mtime=1768333784
+
+[plasmashell-6.0-keep-default-floating-setting-for-plasma-5-panels.upd]
+ctime=1769692355
+done=plasmashell-6.0-keep-custom-position-of-panels,plasmashell-6.0-keep-default-floating-setting-for-plasma-5-panels
+mtime=1768333784
+
+[plasmashell-6.5-remove-stop-activity-shortcut.upd]
+ctime=1769692355
+done=plasmashell-6.0-keep-default-floating-setting-for-plasma-5-panels,plasmashell-6.5-remove-stop-activity-shortcut
+mtime=1768333784
+
+[spectacle.upd]
+ctime=1769692357
+done=plasmashell-6.5-remove-stop-activity-shortcut,24.02.0-video_format,24.02.0-keep_old_save_location,24.02.0-rename_settings,24.02.0-keep_old_filename_templates,24.05.2-change_placeholder_format
+mtime=1768335930
diff --git a/plasma/.config/kdeconnect/.gitignore b/plasma/.config/kdeconnect/.gitignore
new file mode 100644
index 0000000..ba56ebc
--- /dev/null
+++ b/plasma/.config/kdeconnect/.gitignore
@@ -0,0 +1,3 @@
+*.pem
+privateKey.pem
+certificate.pem
diff --git a/plasma/.config/kdeconnect/config b/plasma/.config/kdeconnect/config
new file mode 100755
index 0000000..ac4affd
--- /dev/null
+++ b/plasma/.config/kdeconnect/config
@@ -0,0 +1,3 @@
+[General]
+keyAlgorithm=EC
+name=endtop
diff --git a/plasma/.config/kded5rc b/plasma/.config/kded5rc
new file mode 100755
index 0000000..a005860
--- /dev/null
+++ b/plasma/.config/kded5rc
@@ -0,0 +1,2 @@
+[Module-device_automounter]
+autoload=false
diff --git a/plasma/.config/kdedefaults/kcminputrc b/plasma/.config/kdedefaults/kcminputrc
new file mode 100755
index 0000000..779b957
--- /dev/null
+++ b/plasma/.config/kdedefaults/kcminputrc
@@ -0,0 +1,2 @@
+[Mouse]
+cursorTheme=breeze_cursors
diff --git a/plasma/.config/kdedefaults/kdeglobals b/plasma/.config/kdedefaults/kdeglobals
new file mode 100755
index 0000000..5bdede9
--- /dev/null
+++ b/plasma/.config/kdedefaults/kdeglobals
@@ -0,0 +1,8 @@
+[General]
+ColorScheme=BreezeDark
+
+[Icons]
+Theme=breeze-dark
+
+[KDE]
+widgetStyle=Breeze
diff --git a/plasma/.config/kdedefaults/ksplashrc b/plasma/.config/kdedefaults/ksplashrc
new file mode 100755
index 0000000..07024a3
--- /dev/null
+++ b/plasma/.config/kdedefaults/ksplashrc
@@ -0,0 +1,3 @@
+[KSplash]
+Engine=KSplashQML
+Theme=com.endeavouros.breezedarkeos.desktop
diff --git a/plasma/.config/kdedefaults/kwinrc b/plasma/.config/kdedefaults/kwinrc
new file mode 100755
index 0000000..5288667
--- /dev/null
+++ b/plasma/.config/kdedefaults/kwinrc
@@ -0,0 +1,4 @@
+[org.kde.kdecoration2]
+NoPlugin=false
+library=org.kde.breeze
+theme=Breeze
diff --git a/plasma/.config/kdedefaults/package b/plasma/.config/kdedefaults/package
new file mode 100755
index 0000000..89b4b02
--- /dev/null
+++ b/plasma/.config/kdedefaults/package
@@ -0,0 +1 @@
+com.endeavouros.breezedarkeos.desktop
\ No newline at end of file
diff --git a/plasma/.config/kdedefaults/plasmarc b/plasma/.config/kdedefaults/plasmarc
new file mode 100755
index 0000000..8b58863
--- /dev/null
+++ b/plasma/.config/kdedefaults/plasmarc
@@ -0,0 +1,2 @@
+[Theme]
+name=default
diff --git a/plasma/.config/kdeglobals b/plasma/.config/kdeglobals
new file mode 100755
index 0000000..c4b62a2
--- /dev/null
+++ b/plasma/.config/kdeglobals
@@ -0,0 +1,144 @@
+[ColorEffects:Disabled]
+ChangeSelectionColor=
+Color=56,56,56
+ColorAmount=0
+ColorEffect=0
+ContrastAmount=0.65
+ContrastEffect=1
+Enable=
+IntensityAmount=0.1
+IntensityEffect=2
+
+[ColorEffects:Inactive]
+ChangeSelectionColor=true
+Color=112,111,110
+ColorAmount=0.025
+ColorEffect=2
+ContrastAmount=0.1
+ContrastEffect=2
+Enable=false
+IntensityAmount=0
+IntensityEffect=0
+
+[Colors:Button]
+BackgroundAlternate=114,90,174
+BackgroundNormal=41,44,48
+DecorationFocus=146,110,228
+DecorationHover=146,110,228
+ForegroundActive=146,110,228
+ForegroundInactive=161,169,177
+ForegroundLink=209,199,242
+ForegroundNegative=218,68,83
+ForegroundNeutral=246,116,0
+ForegroundNormal=252,252,252
+ForegroundPositive=39,174,96
+ForegroundVisited=155,89,182
+
+[Colors:Complementary]
+BackgroundAlternate=30,87,116
+BackgroundNormal=32,35,38
+DecorationFocus=146,110,228
+DecorationHover=146,110,228
+ForegroundActive=146,110,228
+ForegroundInactive=161,169,177
+ForegroundLink=209,199,242
+ForegroundNegative=218,68,83
+ForegroundNeutral=246,116,0
+ForegroundNormal=252,252,252
+ForegroundPositive=39,174,96
+ForegroundVisited=155,89,182
+
+[Colors:Header]
+BackgroundAlternate=32,35,38
+BackgroundNormal=41,44,48
+DecorationFocus=146,110,228
+DecorationHover=146,110,228
+ForegroundActive=146,110,228
+ForegroundInactive=161,169,177
+ForegroundLink=209,199,242
+ForegroundNegative=218,68,83
+ForegroundNeutral=246,116,0
+ForegroundNormal=252,252,252
+ForegroundPositive=39,174,96
+ForegroundVisited=155,89,182
+
+[Colors:Header][Inactive]
+BackgroundAlternate=41,44,48
+BackgroundNormal=32,35,38
+DecorationFocus=61,174,233
+DecorationHover=61,174,233
+ForegroundActive=61,174,233
+ForegroundInactive=161,169,177
+ForegroundLink=29,153,243
+ForegroundNegative=218,68,83
+ForegroundNeutral=246,116,0
+ForegroundNormal=252,252,252
+ForegroundPositive=39,174,96
+ForegroundVisited=155,89,182
+
+[Colors:Selection]
+BackgroundAlternate=108,83,166
+BackgroundNormal=108,83,166
+DecorationFocus=146,110,228
+DecorationHover=146,110,228
+ForegroundActive=146,110,228
+ForegroundInactive=255,255,255
+ForegroundLink=118,54,221
+ForegroundNegative=176,55,69
+ForegroundNeutral=198,92,0
+ForegroundNormal=255,255,255
+ForegroundPositive=23,104,57
+ForegroundVisited=155,89,182
+
+[Colors:Tooltip]
+BackgroundAlternate=32,35,38
+BackgroundNormal=41,44,48
+DecorationFocus=146,110,228
+DecorationHover=146,110,228
+ForegroundActive=146,110,228
+ForegroundInactive=161,169,177
+ForegroundLink=209,199,242
+ForegroundNegative=218,68,83
+ForegroundNeutral=246,116,0
+ForegroundNormal=252,252,252
+ForegroundPositive=39,174,96
+ForegroundVisited=155,89,182
+
+[Colors:View]
+BackgroundAlternate=29,31,34
+BackgroundNormal=20,22,24
+DecorationFocus=146,110,228
+DecorationHover=146,110,228
+ForegroundActive=146,110,228
+ForegroundInactive=161,169,177
+ForegroundLink=146,110,228
+ForegroundNegative=218,68,83
+ForegroundNeutral=246,116,0
+ForegroundNormal=252,252,252
+ForegroundPositive=39,174,96
+ForegroundVisited=155,89,182
+
+[Colors:Window]
+BackgroundAlternate=41,44,48
+BackgroundNormal=32,35,38
+DecorationFocus=146,110,228
+DecorationHover=146,110,228
+ForegroundActive=146,110,228
+ForegroundInactive=161,169,177
+ForegroundLink=209,199,242
+ForegroundNegative=218,68,83
+ForegroundNeutral=246,116,0
+ForegroundNormal=252,252,252
+ForegroundPositive=39,174,96
+ForegroundVisited=155,89,182
+
+[General]
+ColorSchemeHash=2c3f86428c11011a7c64ee1e7f47c274d498ff10
+
+[WM]
+activeBackground=39,44,49
+activeBlend=252,252,252
+activeForeground=252,252,252
+inactiveBackground=32,36,40
+inactiveBlend=161,169,177
+inactiveForeground=161,169,177
diff --git a/plasma/.config/kglobalshortcutsrc b/plasma/.config/kglobalshortcutsrc
new file mode 100755
index 0000000..67ecaec
--- /dev/null
+++ b/plasma/.config/kglobalshortcutsrc
@@ -0,0 +1,246 @@
+[ActivityManager]
+_k_friendly_name=Activity Manager
+switch-to-activity-45534f55-818e-477d-8f54-4ac2e05ebffb=none,none,Switch to activity "Default"
+
+[KDE Keyboard Layout Switcher]
+Switch to Last-Used Keyboard Layout=Meta+Alt+L,Meta+Alt+L,
+Switch to Next Keyboard Layout=Meta+Alt+K,Meta+Alt+K,
+_k_friendly_name=Keyboard Layout Switcher
+
+[kaccess]
+Toggle Screen Reader On and Off=Meta+Alt+S,Meta+Alt+S,Toggle Screen Reader On and Off
+_k_friendly_name=Accessibility
+
+[kmix]
+_k_friendly_name=Audio Volume
+decrease_microphone_volume=Microphone Volume Down,Microphone Volume Down,Decrease Microphone Volume
+decrease_volume=Volume Down,Volume Down,Decrease Volume
+decrease_volume_small=Shift+Volume Down,Shift+Volume Down,Decrease Volume by 1%
+increase_microphone_volume=Microphone Volume Up,Microphone Volume Up,Increase Microphone Volume
+increase_volume=Volume Up,Volume Up,Increase Volume
+increase_volume_small=Shift+Volume Up,Shift+Volume Up,Increase Volume by 1%
+mic_mute=Microphone Mute\tMeta+Volume Mute,Microphone Mute\tMeta+Volume Mute,Mute Microphone
+mute=Volume Mute,Volume Mute,Mute
+
+[ksmserver]
+Halt Without Confirmation=,,Shut Down Without Confirmation
+Lock Session=Meta+L\tScreensaver,Meta+L\tScreensaver,Lock Session
+Log Out=Ctrl+Alt+Del,Ctrl+Alt+Del,Show Logout Screen
+Log Out Without Confirmation=,,Log Out Without Confirmation
+LogOut=,,Log Out
+Reboot=,,Reboot
+Reboot Without Confirmation=,,Reboot Without Confirmation
+Shut Down=,,Shut Down
+_k_friendly_name=Session Management
+
+[kwin]
+Activate Window Demanding Attention=Meta+Ctrl+A,Meta+Ctrl+A,Activate Window Demanding Attention
+Cycle Overview=none,none,Cycle through Overview and Grid View
+Cycle Overview Opposite=none,none,Cycle through Grid View and Overview
+Decrease Opacity=,,Decrease Opacity of Active Window by 5%
+Edit Tiles=Meta+T,Meta+T,Toggle Tiles Editor
+Grid View=Meta+G,Meta+G,Toggle Grid View
+Increase Opacity=,,Increase Opacity of Active Window by 5%
+Kill Window=Meta+Ctrl+Esc,Meta+Ctrl+Esc,Kill Window
+Move Tablet to Next Output=none,none,Move the tablet to the next output
+MoveMouseToCenter=Meta+F6,Meta+F6,Move Mouse to Center
+MoveMouseToFocus=Meta+F5,Meta+F5,Move Mouse to Focus
+MoveZoomDown=none,none,Move Zoomed Area Downwards
+MoveZoomLeft=none,none,Move Zoomed Area to Left
+MoveZoomRight=none,none,Move Zoomed Area to Right
+MoveZoomUp=none,none,Move Zoomed Area Upwards
+Overview=Meta+W,Meta+W,Toggle Overview
+Setup Window Shortcut=,,Setup Window Shortcut
+Show Desktop=Meta+D,Meta+D,Peek at Desktop
+Switch One Desktop Down=Meta+Ctrl+Down,Meta+Ctrl+Down,Switch One Desktop Down
+Switch One Desktop Up=Meta+Ctrl+Up,Meta+Ctrl+Up,Switch One Desktop Up
+Switch One Desktop to the Left=Meta+Ctrl+Left,Meta+Ctrl+Left,Switch One Desktop to the Left
+Switch One Desktop to the Right=Meta+Ctrl+Right,Meta+Ctrl+Right,Switch One Desktop to the Right
+Switch Window Down=Meta+Alt+Down,Meta+Alt+Down,Switch to Window Below
+Switch Window Left=Meta+Alt+Left,Meta+Alt+Left,Switch to Window to the Left
+Switch Window Right=Meta+Alt+Right,Meta+Alt+Right,Switch to Window to the Right
+Switch Window Up=Meta+Alt+Up,Meta+Alt+Up,Switch to Window Above
+Switch to Desktop 1=Ctrl+F1,Ctrl+F1,Switch to Desktop 1
+Switch to Desktop 10=,,Switch to Desktop 10
+Switch to Desktop 11=,,Switch to Desktop 11
+Switch to Desktop 12=,,Switch to Desktop 12
+Switch to Desktop 13=,,Switch to Desktop 13
+Switch to Desktop 14=,,Switch to Desktop 14
+Switch to Desktop 15=,,Switch to Desktop 15
+Switch to Desktop 16=,,Switch to Desktop 16
+Switch to Desktop 17=,,Switch to Desktop 17
+Switch to Desktop 18=,,Switch to Desktop 18
+Switch to Desktop 19=,,Switch to Desktop 19
+Switch to Desktop 2=Ctrl+F2,Ctrl+F2,Switch to Desktop 2
+Switch to Desktop 20=,,Switch to Desktop 20
+Switch to Desktop 3=Ctrl+F3,Ctrl+F3,Switch to Desktop 3
+Switch to Desktop 4=Ctrl+F4,Ctrl+F4,Switch to Desktop 4
+Switch to Desktop 5=,,Switch to Desktop 5
+Switch to Desktop 6=,,Switch to Desktop 6
+Switch to Desktop 7=,,Switch to Desktop 7
+Switch to Desktop 8=,,Switch to Desktop 8
+Switch to Desktop 9=,,Switch to Desktop 9
+Switch to Next Desktop=,,Switch to Next Desktop
+Switch to Next Screen=,,Switch to Next Screen
+Switch to Previous Desktop=,,Switch to Previous Desktop
+Switch to Previous Screen=,,Switch to Previous Screen
+Switch to Screen 0=,,Switch to Screen 0
+Switch to Screen 1=,,Switch to Screen 1
+Switch to Screen 2=,,Switch to Screen 2
+Switch to Screen 3=,,Switch to Screen 3
+Switch to Screen 4=,,Switch to Screen 4
+Switch to Screen 5=,,Switch to Screen 5
+Switch to Screen 6=,,Switch to Screen 6
+Switch to Screen 7=,,Switch to Screen 7
+Switch to Screen Above=,,Switch to Screen Above
+Switch to Screen Below=,,Switch to Screen Below
+Switch to Screen to the Left=,,Switch to Screen to the Left
+Switch to Screen to the Right=,,Switch to Screen to the Right
+Toggle Night Color=none,none,Suspend/Resume Night Light
+Toggle Window Raise/Lower=,,Toggle Window Raise/Lower
+Walk Through Windows=Meta+Tab\tAlt+Tab,Meta+Tab\tAlt+Tab,Walk Through Windows
+Walk Through Windows (Reverse)=Meta+Shift+Tab\tAlt+Shift+Tab,Meta+Shift+Tab\tAlt+Shift+Tab,Walk Through Windows (Reverse)
+Walk Through Windows Alternative=none,none,Walk Through Windows Alternative
+Walk Through Windows Alternative (Reverse)=none,none,Walk Through Windows Alternative (Reverse)
+Walk Through Windows of Current Application=Meta+`\tAlt+`,Meta+`\tAlt+`,Walk Through Windows of Current Application
+Walk Through Windows of Current Application (Reverse)=Meta+~\tAlt+~,Meta+~\tAlt+~,Walk Through Windows of Current Application (Reverse)
+Walk Through Windows of Current Application Alternative=none,none,Walk Through Windows of Current Application Alternative
+Walk Through Windows of Current Application Alternative (Reverse)=none,none,Walk Through Windows of Current Application Alternative (Reverse)
+Window Above Other Windows=,,Keep Window Above Others
+Window Below Other Windows=,,Keep Window Below Others
+Window Close=Alt+F4,Alt+F4,Close Window
+Window Custom Quick Tile Bottom=,,Custom Quick Tile Window to the Bottom
+Window Custom Quick Tile Left=,,Custom Quick Tile Window to the Left
+Window Custom Quick Tile Right=,,Custom Quick Tile Window to the Right
+Window Custom Quick Tile Top=,,Custom Quick Tile Window to the Top
+Window Fullscreen=,,Make Window Fullscreen
+Window Grow Horizontal=,,Expand Window Horizontally
+Window Grow Vertical=,,Expand Window Vertically
+Window Lower=,,Lower Window
+Window Maximize=Meta+PgUp,Meta+PgUp,Maximize Window
+Window Maximize Horizontal=,,Maximize Window Horizontally
+Window Maximize Vertical=,,Maximize Window Vertically
+Window Minimize=Meta+PgDown,Meta+PgDown,Minimize Window
+Window Move=,,Move Window
+Window Move Center=,,Move Window to the Center
+Window No Border=,,Toggle Window Titlebar and Frame
+Window On All Desktops=,,Keep Window on All Desktops
+Window One Desktop Down=Meta+Ctrl+Shift+Down,Meta+Ctrl+Shift+Down,Window One Desktop Down
+Window One Desktop Up=Meta+Ctrl+Shift+Up,Meta+Ctrl+Shift+Up,Window One Desktop Up
+Window One Desktop to the Left=Meta+Ctrl+Shift+Left,Meta+Ctrl+Shift+Left,Window One Desktop to the Left
+Window One Desktop to the Right=Meta+Ctrl+Shift+Right,Meta+Ctrl+Shift+Right,Window One Desktop to the Right
+Window One Screen Down=,,Move Window One Screen Down
+Window One Screen Up=,,Move Window One Screen Up
+Window One Screen to the Left=,,Move Window One Screen to the Left
+Window One Screen to the Right=,,Move Window One Screen to the Right
+Window Operations Menu=Alt+F3,Alt+F3,Window Menu
+Window Pack Down=,,Move Window Down
+Window Pack Left=,,Move Window Left
+Window Pack Right=,,Move Window Right
+Window Pack Up=,,Move Window Up
+Window Quick Tile Bottom=Meta+Down,Meta+Down,Quick Tile Window to the Bottom
+Window Quick Tile Bottom Left=,,Quick Tile Window to the Bottom Left
+Window Quick Tile Bottom Right=,,Quick Tile Window to the Bottom Right
+Window Quick Tile Left=Meta+Left,Meta+Left,Quick Tile Window to the Left
+Window Quick Tile Right=Meta+Right,Meta+Right,Quick Tile Window to the Right
+Window Quick Tile Top=Meta+Up,Meta+Up,Quick Tile Window to the Top
+Window Quick Tile Top Left=,,Quick Tile Window to the Top Left
+Window Quick Tile Top Right=,,Quick Tile Window to the Top Right
+Window Raise=,,Raise Window
+Window Resize=,,Resize Window
+Window Shrink Horizontal=,,Shrink Window Horizontally
+Window Shrink Vertical=,,Shrink Window Vertically
+Window to Desktop 1=,,Window to Desktop 1
+Window to Desktop 10=,,Window to Desktop 10
+Window to Desktop 11=,,Window to Desktop 11
+Window to Desktop 12=,,Window to Desktop 12
+Window to Desktop 13=,,Window to Desktop 13
+Window to Desktop 14=,,Window to Desktop 14
+Window to Desktop 15=,,Window to Desktop 15
+Window to Desktop 16=,,Window to Desktop 16
+Window to Desktop 17=,,Window to Desktop 17
+Window to Desktop 18=,,Window to Desktop 18
+Window to Desktop 19=,,Window to Desktop 19
+Window to Desktop 2=,,Window to Desktop 2
+Window to Desktop 20=,,Window to Desktop 20
+Window to Desktop 3=,,Window to Desktop 3
+Window to Desktop 4=,,Window to Desktop 4
+Window to Desktop 5=,,Window to Desktop 5
+Window to Desktop 6=,,Window to Desktop 6
+Window to Desktop 7=,,Window to Desktop 7
+Window to Desktop 8=,,Window to Desktop 8
+Window to Desktop 9=,,Window to Desktop 9
+Window to Next Desktop=,,Window to Next Desktop
+Window to Next Screen=Meta+Shift+Right,Meta+Shift+Right,Move Window to Next Screen
+Window to Previous Desktop=,,Window to Previous Desktop
+Window to Previous Screen=Meta+Shift+Left,Meta+Shift+Left,Move Window to Previous Screen
+Window to Screen 0=,,Move Window to Screen 0
+Window to Screen 1=,,Move Window to Screen 1
+Window to Screen 2=,,Move Window to Screen 2
+Window to Screen 3=,,Move Window to Screen 3
+Window to Screen 4=,,Move Window to Screen 4
+Window to Screen 5=,,Move Window to Screen 5
+Window to Screen 6=,,Move Window to Screen 6
+Window to Screen 7=,,Move Window to Screen 7
+_k_friendly_name=KWin
+disableInputCapture=Meta+Shift+Esc,Meta+Shift+Esc,Disable Active Input Capture
+view_actual_size=Meta+0,Meta+0,Zoom to Actual Size
+view_zoom_in=Meta++\tMeta+=,Meta++\tMeta+=,Zoom In
+view_zoom_out=Meta+-,Meta+-,Zoom Out
+
+[mediacontrol]
+_k_friendly_name=Media Controller
+mediavolumedown=,,Media volume down
+mediavolumeup=,,Media volume up
+nextmedia=Media Next,Media Next,Media playback next
+pausemedia=Media Pause,Media Pause,Pause media playback
+playmedia=,,Play media playback
+playpausemedia=Media Play,Media Play,Play/Pause media playback
+previousmedia=Media Previous,Media Previous,Media playback previous
+stopmedia=Media Stop,Media Stop,Stop media playback
+
+[org_kde_powerdevil]
+Decrease Keyboard Brightness=Keyboard Brightness Down,Keyboard Brightness Down,Decrease Keyboard Brightness
+Decrease Screen Brightness=Monitor Brightness Down,Monitor Brightness Down,Decrease Screen Brightness
+Decrease Screen Brightness Small=Shift+Monitor Brightness Down,Shift+Monitor Brightness Down,Decrease Screen Brightness by 1%
+Hibernate=Hibernate,Hibernate,Hibernate
+Increase Keyboard Brightness=Keyboard Brightness Up,Keyboard Brightness Up,Increase Keyboard Brightness
+Increase Screen Brightness=Monitor Brightness Up,Monitor Brightness Up,Increase Screen Brightness
+Increase Screen Brightness Small=Shift+Monitor Brightness Up,Shift+Monitor Brightness Up,Increase Screen Brightness by 1%
+PowerDown=Power Down,Power Down,Power Down
+PowerOff=Power Off,Power Off,Power Off
+Sleep=Sleep,Sleep,Suspend
+Toggle Keyboard Backlight=Keyboard Light On/Off,Keyboard Light On/Off,Toggle Keyboard Backlight
+Turn Off Screen=none,none,Turn Off Screen
+_k_friendly_name=Power Management
+powerProfile=Battery\tMeta+B,Battery\tMeta+B,Switch Power Profile
+
+[plasmashell]
+Slideshow Wallpaper Next Image=,,Next Wallpaper Image
+_k_friendly_name=plasmashell
+activate application launcher=Meta\tAlt+F1,Meta\tAlt+F1,Activate Application Launcher
+activate task manager entry 1=Meta+1,Meta+1,Activate Task Manager Entry 1
+activate task manager entry 10=,,Activate Task Manager Entry 10
+activate task manager entry 2=Meta+2,Meta+2,Activate Task Manager Entry 2
+activate task manager entry 3=Meta+3,Meta+3,Activate Task Manager Entry 3
+activate task manager entry 4=Meta+4,Meta+4,Activate Task Manager Entry 4
+activate task manager entry 5=Meta+5,Meta+5,Activate Task Manager Entry 5
+activate task manager entry 6=Meta+6,Meta+6,Activate Task Manager Entry 6
+activate task manager entry 7=Meta+7,Meta+7,Activate Task Manager Entry 7
+activate task manager entry 8=Meta+8,Meta+8,Activate Task Manager Entry 8
+activate task manager entry 9=Meta+9,Meta+9,Activate Task Manager Entry 9
+activate widget 3=,none,Activate Application Launcher Widget
+clear-history=,,Clear Clipboard History
+clipboard_action=Meta+Ctrl+X,Meta+Ctrl+X,Automatic Action Popup Menu
+cycle-panels=Meta+Alt+P,Meta+Alt+P,Move keyboard focus between panels
+cycleNextAction=,,Next History Item
+cyclePrevAction=,,Previous History Item
+edit_clipboard=,,Edit Contents…
+manage activities=Meta+Q,Meta+Q,Show Activity Switcher
+repeat_action=,,Manually Invoke Action on Current Clipboard
+show dashboard=Ctrl+F12,Ctrl+F12,Show Desktop
+show-barcode=,,Show Barcode…
+show-on-mouse-pos=Meta+V,Meta+V,Show Clipboard Items at Mouse Position
+switch to next activity=,,Switch to Next Activity
+switch to previous activity=,,Switch to Previous Activity
+toggle do not disturb=,,Toggle do not disturb
diff --git a/plasma/.config/konsolerc b/plasma/.config/konsolerc
new file mode 100755
index 0000000..ad9bfb8
--- /dev/null
+++ b/plasma/.config/konsolerc
@@ -0,0 +1,5 @@
+[General]
+ConfigVersion=1
+
+[UiSettings]
+ColorScheme=
diff --git a/plasma/.config/kwinoutputconfig.json b/plasma/.config/kwinoutputconfig.json
new file mode 100755
index 0000000..6e9651c
--- /dev/null
+++ b/plasma/.config/kwinoutputconfig.json
@@ -0,0 +1,57 @@
+[
+ {
+ "data": [
+ {
+ "allowDdcCi": true,
+ "allowSdrSoftwareBrightness": false,
+ "autoRotation": "InTabletMode",
+ "brightness": 0,
+ "colorPowerTradeoff": "PreferEfficiency",
+ "colorProfileSource": "sRGB",
+ "connectorName": "eDP-1",
+ "detectedDdcCi": false,
+ "edidHash": "18c103367066841003157fea9bd064b2",
+ "edidIdentifier": "CMN 5143 0 0 2020 0",
+ "edrPolicy": "always",
+ "highDynamicRange": false,
+ "iccProfilePath": "",
+ "maxBitsPerColor": 0,
+ "mode": {
+ "height": 1200,
+ "refreshRate": 60003,
+ "width": 1920
+ },
+ "overscan": 0,
+ "rgbRange": "Automatic",
+ "scale": 1,
+ "sdrBrightness": 200,
+ "sdrGamutWideness": 0,
+ "transform": "Normal",
+ "uuid": "b71161ba-4aa3-4611-bc1f-67d4fac4f6e7",
+ "vrrPolicy": "Never",
+ "wideColorGamut": false
+ }
+ ],
+ "name": "outputs"
+ },
+ {
+ "data": [
+ {
+ "lidClosed": false,
+ "outputs": [
+ {
+ "enabled": true,
+ "outputIndex": 0,
+ "position": {
+ "x": 0,
+ "y": 0
+ },
+ "priority": 0,
+ "replicationSource": ""
+ }
+ ]
+ }
+ ],
+ "name": "setups"
+ }
+]
diff --git a/plasma/.config/kwinrc b/plasma/.config/kwinrc
new file mode 100755
index 0000000..f0280fd
--- /dev/null
+++ b/plasma/.config/kwinrc
@@ -0,0 +1,13 @@
+[Desktops]
+Id_1=905b7327-e7b5-4f1f-84ea-d3ba2f174ce8
+Number=1
+Rows=1
+
+[Tiling]
+padding=4
+
+[Tiling][905b7327-e7b5-4f1f-84ea-d3ba2f174ce8][b71161ba-4aa3-4611-bc1f-67d4fac4f6e7]
+tiles={"layoutDirection":"horizontal","tiles":[{"width":0.25},{"width":0.5},{"width":0.25}]}
+
+[Xwayland]
+Scale=1
diff --git a/plasma/.config/plasma-org.kde.plasma.desktop-appletsrc b/plasma/.config/plasma-org.kde.plasma.desktop-appletsrc
new file mode 100755
index 0000000..b4b5244
--- /dev/null
+++ b/plasma/.config/plasma-org.kde.plasma.desktop-appletsrc
@@ -0,0 +1,163 @@
+[ActionPlugins][0]
+RightButton;NoModifier=org.kde.contextmenu
+
+[ActionPlugins][1]
+RightButton;NoModifier=org.kde.contextmenu
+
+[Containments][1]
+ItemGeometries-1536x960=
+ItemGeometries-1920x1200=
+ItemGeometriesHorizontal=
+activityId=45534f55-818e-477d-8f54-4ac2e05ebffb
+formfactor=0
+immutability=1
+lastScreen=0
+location=0
+plugin=org.kde.plasma.folder
+wallpaperplugin=org.kde.image
+
+[Containments][2]
+activityId=
+formfactor=2
+immutability=1
+lastScreen=0
+location=4
+plugin=org.kde.panel
+wallpaperplugin=org.kde.image
+
+[Containments][2][Applets][21]
+immutability=1
+plugin=org.kde.plasma.digitalclock
+
+[Containments][2][Applets][21][Configuration]
+PreloadWeight=55
+popupHeight=451
+popupWidth=560
+
+[Containments][2][Applets][21][Configuration][Appearance]
+fontWeight=400
+
+[Containments][2][Applets][22]
+immutability=1
+plugin=org.kde.plasma.showdesktop
+
+[Containments][2][Applets][3]
+immutability=1
+plugin=org.kde.plasma.kickoff
+
+[Containments][2][Applets][3][Configuration]
+PreloadWeight=100
+popupHeight=846
+popupWidth=736
+
+[Containments][2][Applets][3][Configuration][General]
+favoritesPortedToKAstats=true
+
+[Containments][2][Applets][3][Configuration][Shortcuts]
+global=Alt+F1
+
+[Containments][2][Applets][4]
+immutability=1
+plugin=org.kde.plasma.pager
+
+[Containments][2][Applets][5]
+immutability=1
+plugin=org.kde.plasma.icontasks
+
+[Containments][2][Applets][5][Configuration][General]
+launchers=preferred://filemanager,applications:org.kde.konsole.desktop,preferred://browser
+
+[Containments][2][Applets][6]
+immutability=1
+plugin=org.kde.plasma.marginsseparator
+
+[Containments][2][Applets][7]
+activityId=
+formfactor=0
+immutability=1
+lastScreen=-1
+location=0
+plugin=org.kde.plasma.systemtray
+popupHeight=432
+popupWidth=432
+wallpaperplugin=org.kde.image
+
+[Containments][2][Applets][7][Applets][10]
+immutability=1
+plugin=org.kde.plasma.manage-inputmethod
+
+[Containments][2][Applets][7][Applets][11]
+immutability=1
+plugin=org.kde.kdeconnect
+
+[Containments][2][Applets][7][Applets][12]
+immutability=1
+plugin=org.kde.plasma.keyboardlayout
+
+[Containments][2][Applets][7][Applets][13]
+immutability=1
+plugin=org.kde.plasma.devicenotifier
+
+[Containments][2][Applets][7][Applets][14]
+immutability=1
+plugin=org.kde.plasma.notifications
+
+[Containments][2][Applets][7][Applets][15]
+immutability=1
+plugin=org.kde.plasma.keyboardindicator
+
+[Containments][2][Applets][7][Applets][16]
+immutability=1
+plugin=org.kde.plasma.weather
+
+[Containments][2][Applets][7][Applets][17]
+immutability=1
+plugin=org.kde.kscreen
+
+[Containments][2][Applets][7][Applets][18]
+immutability=1
+plugin=org.kde.plasma.networkmanagement
+
+[Containments][2][Applets][7][Applets][19]
+immutability=1
+plugin=org.kde.plasma.volume
+
+[Containments][2][Applets][7][Applets][19][Configuration][General]
+migrated=true
+
+[Containments][2][Applets][7][Applets][20]
+immutability=1
+plugin=org.kde.plasma.printmanager
+
+[Containments][2][Applets][7][Applets][23]
+immutability=1
+plugin=org.kde.plasma.mediacontroller
+
+[Containments][2][Applets][7][Applets][23][Configuration]
+PreloadWeight=47
+
+[Containments][2][Applets][7][Applets][24]
+immutability=1
+plugin=org.kde.plasma.battery
+
+[Containments][2][Applets][7][Applets][24][Configuration]
+PreloadWeight=42
+
+[Containments][2][Applets][7][Applets][8]
+immutability=1
+plugin=org.kde.plasma.cameraindicator
+
+[Containments][2][Applets][7][Applets][9]
+immutability=1
+plugin=org.kde.plasma.clipboard
+
+[Containments][2][Applets][7][General]
+extraItems=org.kde.plasma.bluetooth,org.kde.plasma.cameraindicator,org.kde.plasma.clipboard,org.kde.plasma.manage-inputmethod,org.kde.kdeconnect,org.kde.plasma.keyboardlayout,org.kde.plasma.devicenotifier,org.kde.plasma.mediacontroller,org.kde.plasma.notifications,org.kde.plasma.keyboardindicator,org.kde.plasma.weather,org.kde.kscreen,org.kde.plasma.battery,org.kde.plasma.brightness,org.kde.plasma.networkmanagement,org.kde.plasma.volume,org.kde.plasma.printmanager
+knownItems=org.kde.plasma.bluetooth,org.kde.plasma.cameraindicator,org.kde.plasma.clipboard,org.kde.plasma.manage-inputmethod,org.kde.kdeconnect,org.kde.plasma.keyboardlayout,org.kde.plasma.devicenotifier,org.kde.plasma.mediacontroller,org.kde.plasma.notifications,org.kde.plasma.keyboardindicator,org.kde.plasma.weather,org.kde.kscreen,org.kde.plasma.battery,org.kde.plasma.brightness,org.kde.plasma.networkmanagement,org.kde.plasma.volume,org.kde.plasma.printmanager
+
+[Containments][2][General]
+AppletOrder=3;4;5;6;7;21;22
+
+[ScreenMapping]
+itemsOnDisabledScreens=
+screenMapping=desktop:/steam.desktop,0,45534f55-818e-477d-8f54-4ac2e05ebffb
diff --git a/plasma/.config/plasmashellrc b/plasma/.config/plasmashellrc
new file mode 100755
index 0000000..2c08843
--- /dev/null
+++ b/plasma/.config/plasmashellrc
@@ -0,0 +1,8 @@
+[PlasmaViews][Panel 2]
+floating=1
+
+[PlasmaViews][Panel 2][Defaults]
+thickness=44
+
+[Updates]
+performed=/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/containmentactions_middlebutton.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/digitalclock_migrate_font_settings.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/digitalclock_migrate_showseconds_setting.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/digitalclock_rename_timezonedisplay_key.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/folderview_fix_recursive_screenmapping.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/keyboardlayout_migrateiconsetting.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/keyboardlayout_remove_shortcut.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/klipper_clear_config.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/maintain_existing_desktop_icon_sizes.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/mediaframe_migrate_useBackground_setting.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/migrate_font_weights.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/move_desktop_layout_config.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/no_middle_click_paste_on_panels.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/systemloadviewer_systemmonitor.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/taskmanager_configUpdate_wheelEnabled.js,/usr/share/plasma/shells/org.kde.plasma.desktop/contents/updates/unlock_widgets.js
diff --git a/plasma/.config/powermanagementprofilesrc b/plasma/.config/powermanagementprofilesrc
new file mode 100755
index 0000000..0f36073
--- /dev/null
+++ b/plasma/.config/powermanagementprofilesrc
@@ -0,0 +1,2 @@
+[Migration]
+MigratedProfilesToPlasma6=powerdevilrc