16 Commits

Author SHA1 Message Date
alex 5c7663802c changes and fixes 2026-09-17 11:52:56 +02:00
alex c7750a3285 fix(hyprland): match desktop app window classes
Obsidian and Thunderbird now publish reverse-DNS classes, so the old exact rules never routed their autostart windows. Preserve legacy class variants while matching current clients.
2026-09-07 15:15:50 +02:00
alex 3e12379694 feat(hyprland): route apps through special workspaces 2026-09-07 14:27:58 +02:00
alex 1f69906bc5 docs(agents): document knowledge vault workflow 2026-09-07 14:27:58 +02:00
alex cb39b659d5 feat(pi): enable ponytail coding guidance 2026-09-07 14:27:58 +02:00
alex bcf729f39c feat(pi): discover LocalAI models dynamically 2026-08-27 16:26:41 +02:00
alex bc47d828a3 chore(scripts): remove legacy updating.sh 2026-08-27 15:50:31 +02:00
alex 15b44304c1 config(user): desktop session and pi-status-bridge tweaks 2026-08-27 15:50:31 +02:00
alex cd9b50feae feat(decman): manage npm packages and deploy sddm theme assets 2026-08-27 15:50:31 +02:00
alex b6ae6887a3 feat(pi): add localai provider and desktop workflow packages 2026-08-27 15:50:30 +02:00
alex 10c214fc36 docs: align agent and repo docs with desktop Decman profile 2026-08-27 15:50:30 +02:00
alex 00781a3607 chore(git): retain local Pi runtime ignores 2026-08-25 00:06:24 +02:00
alex 4a20edba5c chore(dotfiles): streamline workstation configuration workflows 2026-08-25 00:05:52 +02:00
alex a81bbf5115 feat: restore Rofi launcher 2026-08-25 00:04:58 +02:00
alex 7f98c013a8 chore: remove Waybar from desktop profile 2026-08-25 00:04:58 +02:00
alex f6f6bc6507 chore: remove superseded configuration 2026-08-25 00:03:46 +02:00
107 changed files with 1394 additions and 3406 deletions
-27
View File
@@ -1,27 +0,0 @@
[General]
backlight_ac_disable_if_higher=false
backlight_ac_enable=false
backlight_battery_disable_if_lower=false
backlight_battery_enable=false
backlight_battery_value=120000
backlight_mouse_wheel=true
critical_battery_action=0
critical_battery_timeout=20
dialog_geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x3\xcf\0\0\0\x30\0\0\v0\0\0\t/\0\0\x3\xcf\0\0\0\x30\0\0\v0\0\0\t/\0\0\0\0\0\0\0\0\xf\0\0\0\x3\xcf\0\0\0\x30\0\0\v0\0\0\t/)
disable_lid_action_external_monitor=false
freedesktop_pm=true
freedesktop_ss=true
icon_theme=Adwaita
lid_ac_action=1
lid_battery_action=2
lock_screen_on_resume=false
lock_screen_on_suspend=true
notify_on_ac=true
notify_on_battery=true
show_tray=true
suspend_ac_action=0
suspend_battery_action=1
suspend_battery_timeout=15
tray_notify=true
warn_on_low_battery=true
warn_on_verylow_battery=true
-124
View File
@@ -1,124 +0,0 @@
{
"colors": {
"black": 16,
"white": 231,
"green": 2,
"darkestgreen": 22,
"darkgreen": 28,
"mediumgreen": 70,
"brightgreen": 148,
"darkestcyan": 23,
"darkcyan": 74,
"mediumcyan": 117,
"brightcyan": 159,
"darkestblue": 24,
"darkblue": 31,
"red": 1,
"darkestred": 52,
"darkred": 88,
"mediumred": 124,
"brightred": 160,
"brightestred": 196,
"darkestpurple": 55,
"mediumpurple": 98,
"brightpurple": 189,
"darkorange": 94,
"mediumorange": 166,
"brightorange": 208,
"brightestorange": 214,
"yellow": 11,
"brightyellow": 220,
"gray0": 233,
"gray1": 235,
"gray2": 236,
"gray3": 239,
"gray4": 240,
"gray5": 241,
"gray6": 244,
"gray7": 245,
"gray8": 247,
"gray9": 250,
"gray10": 252,
"gray11": 234,
"gray90": 254,
"gray70": [249, "b3b3b3"],
"lightyellowgreen": 106,
"gold3": 178,
"orangered": 202,
"steelblue": 67,
"darkorange3": 166,
"skyblue1": 117,
"khaki1": 228,
"solarized:base03": [8, "002b36"],
"solarized:base02": [0, "073642"],
"solarized:base01": [10, "586e75"],
"solarized:base00": [11, "657b83"],
"solarized:base0": [12, "839496"],
"solarized:base1": [14, "93a1a1"],
"solarized:base2": [7, "eee8d5"],
"solarized:base3": [15, "fdf6e3"],
"solarized:yellow": [3, "b58900"],
"solarized:orange": [9, "cb4b16"],
"solarized:red": [1, "dc322f"],
"solarized:magenta": [5, "d33682"],
"solarized:violet": [13, "6c71c4"],
"solarized:blue": [4, "268bd2"],
"solarized:cyan": [6, "2aa198"],
"solarized:green": [2, "859900"]
},
"gradients": {
"dark_GREEN_Orange_red": [
[22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 94, 94, 94, 94, 94, 94, 94, 88, 52],
["006000", "006000", "006000", "006000", "006000", "006000", "006000", "006000", "006000", "036000", "076000", "0a6000", "0d6000", "106000", "126000", "146000", "166000", "186000", "1a6000", "1b6000", "1d6000", "1e6000", "206000", "216000", "236000", "246000", "256000", "266000", "286000", "296000", "2a6000", "2b6000", "2c6100", "2d6100", "2f6100", "306100", "316100", "326100", "336100", "346100", "356100", "366100", "376100", "386100", "386100", "396100", "3a6100", "3b6100", "3c6100", "3d6100", "3e6100", "3f6100", "406100", "406100", "416100", "426000", "436000", "446000", "456000", "456000", "466000", "476000", "486000", "496000", "496000", "4a6000", "4b6000", "4c6000", "4d6000", "4d6000", "4e6000", "4f6000", "506000", "506000", "516000", "526000", "536000", "536000", "546000", "556000", "566000", "566000", "576000", "586000", "596000", "596000", "5a6000", "5d6000", "616000", "646000", "686000", "6b6000", "6f6000", "726000", "766000", "796000", "7d6000", "806000", "7e5500", "6f3105", "5d0001"]
],
"GREEN_Orange_red": [
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1],
["005f00", "015f00", "025f00", "035f00", "045f00", "055f00", "065f00", "075f00", "085f00", "095f00", "0b5f00", "0c5f00", "0d5f00", "0e5f00", "0f5f00", "105f00", "115f00", "125f00", "135f00", "145f00", "165f00", "175f00", "185f00", "195f00", "1a5f00", "1b5f00", "1c5f00", "1d5f00", "1e5f00", "1f5f00", "215f00", "225f00", "235f00", "245f00", "255f00", "265f00", "275f00", "285f00", "295f00", "2a5f00", "2c5f00", "2d5f00", "2e5f00", "2f5f00", "305f00", "315f00", "325f00", "335f00", "345f00", "355f00", "375f00", "385f00", "395f00", "3a5f00", "3b5f00", "3c5f00", "3d5f00", "3e5f00", "3f5f00", "415f00", "425f00", "435f00", "445f00", "455f00", "465f00", "475f00", "485f00", "495f00", "4a5f00", "4c5f00", "4d5f00", "4e5f00", "4f5f00", "505f00", "515f00", "525f00", "535f00", "545f00", "555f00", "575f00", "585f00", "595f00", "5a5f00", "5b5f00", "5c5f00", "5d5f00", "5e5f00", "615f00", "655f00", "685f00", "6c5f00", "6f5f00", "735f00", "765f00", "7a5f00", "7d5f00", "815f00", "845f00", "815200", "702900"]
],
"green_yellow_red": [
[190, 184, 178, 172, 166, 160],
["8ae71c", "8ce71c", "8fe71c", "92e71c", "95e71d", "98e71d", "9ae71d", "9de71d", "a0e71e", "a3e71e", "a6e71e", "a8e71e", "abe71f", "aee71f", "b1e71f", "b4e71f", "b6e720", "b9e720", "bce720", "bfe720", "c2e821", "c3e721", "c5e621", "c7e521", "c9e522", "cbe422", "cde322", "cfe222", "d1e223", "d3e123", "d5e023", "d7df23", "d9df24", "dbde24", "dddd24", "dfdc24", "e1dc25", "e3db25", "e5da25", "e7d925", "e9d926", "e9d626", "e9d426", "e9d126", "e9cf27", "e9cc27", "e9ca27", "e9c727", "e9c528", "e9c228", "e9c028", "e9bd28", "e9bb29", "e9b829", "e9b629", "e9b329", "e9b12a", "e9ae2a", "e9ac2a", "e9a92a", "eaa72b", "eaa42b", "eaa22b", "ea9f2b", "ea9d2c", "ea9b2c", "ea982c", "ea962c", "ea942d", "ea912d", "ea8f2d", "ea8d2d", "ea8a2e", "ea882e", "ea862e", "ea832e", "ea812f", "ea7f2f", "ea7c2f", "ea7a2f", "eb7830", "eb7530", "eb7330", "eb7130", "eb6f31", "eb6c31", "eb6a31", "eb6831", "eb6632", "eb6332", "eb6132", "eb5f32", "eb5d33", "eb5a33", "eb5833", "eb5633", "eb5434", "eb5134", "eb4f34", "eb4d34", "ec4b35"]
],
"green_yellow_orange_red": [
[2, 3, 9, 1],
["719e07", "739d06", "759c06", "779c06", "799b06", "7b9a05", "7d9a05", "7f9905", "819805", "839805", "859704", "879704", "899604", "8b9504", "8d9504", "8f9403", "919303", "949303", "969203", "989102", "9a9102", "9c9002", "9e9002", "a08f02", "a28e01", "a48e01", "a68d01", "a88c01", "aa8c01", "ac8b00", "ae8a00", "b08a00", "b28900", "b58900", "b58700", "b68501", "b78302", "b78102", "b87f03", "b97d04", "b97b04", "ba7905", "bb7806", "bb7606", "bc7407", "bd7208", "bd7008", "be6e09", "bf6c0a", "bf6a0a", "c0690b", "c1670c", "c1650c", "c2630d", "c3610e", "c35f0e", "c45d0f", "c55b10", "c55a10", "c65811", "c75612", "c75412", "c85213", "c95014", "c94e14", "ca4c15", "cb4b16", "cb4a16", "cc4917", "cc4818", "cd4719", "cd4719", "ce461a", "ce451b", "cf441c", "cf441c", "d0431d", "d0421e", "d1411f", "d1411f", "d24020", "d23f21", "d33e22", "d33e22", "d43d23", "d43c24", "d53b25", "d53b25", "d63a26", "d63927", "d73828", "d73828", "d83729", "d8362a", "d9352b", "d9352b", "da342c", "da332d", "db322e", "dc322f"]
],
"yellow_red": [
[220, 178, 172, 166, 160],
["ffd700", "fdd500", "fbd300", "fad200", "f8d000", "f7cf00", "f5cd00", "f3cb00", "f2ca00", "f0c800", "efc700", "edc500", "ebc300", "eac200", "e8c000", "e7bf00", "e5bd00", "e3bb00", "e2ba00", "e0b800", "dfb700", "ddb500", "dbb300", "dab200", "d8b000", "d7af00", "d7ad00", "d7ab00", "d7aa00", "d7a800", "d7a700", "d7a500", "d7a300", "d7a200", "d7a000", "d79f00", "d79d00", "d79b00", "d79a00", "d79800", "d79700", "d79500", "d79300", "d79200", "d79000", "d78f00", "d78d00", "d78b00", "d78a00", "d78800", "d78700", "d78500", "d78300", "d78200", "d78000", "d77f00", "d77d00", "d77b00", "d77a00", "d77800", "d77700", "d77500", "d77300", "d77200", "d77000", "d76f00", "d76d00", "d76b00", "d76a00", "d76800", "d76700", "d76500", "d76300", "d76200", "d76000", "d75f00", "d75b00", "d75700", "d75300", "d74f00", "d74c00", "d74800", "d74400", "d74000", "d73c00", "d73900", "d73500", "d73100", "d72d00", "d72900", "d72600", "d72200", "d71e00", "d71a00", "d71600", "d71300", "d70f00", "d70b00", "d70700"]
],
"yellow_orange_red": [
[3, 9, 1],
["b58900", "b58700", "b58600", "b68501", "b68401", "b78202", "b78102", "b88003", "b87f03", "b87d03", "b97c04", "b97b04", "ba7a05", "ba7805", "bb7706", "bb7606", "bc7507", "bc7307", "bc7207", "bd7108", "bd7008", "be6e09", "be6d09", "bf6c0a", "bf6b0a", "c06a0b", "c0680b", "c0670b", "c1660c", "c1650c", "c2630d", "c2620d", "c3610e", "c3600e", "c35e0e", "c45d0f", "c45c0f", "c55b10", "c55910", "c65811", "c65711", "c75612", "c75412", "c75312", "c85213", "c85113", "c94f14", "c94e14", "ca4d15", "ca4c15", "cb4b16", "cb4a16", "cb4a17", "cc4917", "cc4918", "cc4818", "cd4819", "cd4719", "cd471a", "ce461a", "ce461b", "ce451b", "cf451c", "cf441c", "cf441d", "d0431d", "d0431e", "d0421e", "d1421f", "d1411f", "d14120", "d24020", "d24021", "d23f21", "d33f22", "d33e22", "d33e23", "d43d23", "d43d24", "d43c24", "d53c25", "d53b25", "d53b26", "d63a26", "d63a27", "d63927", "d73928", "d73828", "d73829", "d83729", "d8372a", "d8362a", "d9362b", "d9352b", "d9352c", "da342c", "da342d", "da332d", "db332e"]
],
"blue_red": [
[39, 74, 68, 67, 103, 97, 96, 132, 131, 167, 203, 197],
["19b4fe", "1bb2fc", "1db1fa", "1faff8", "22aef6", "24adf4", "26abf2", "29aaf0", "2ba9ee", "2da7ec", "30a6ea", "32a5e8", "34a3e6", "36a2e4", "39a0e2", "3b9fe1", "3d9edf", "409cdd", "429bdb", "449ad9", "4798d7", "4997d5", "4b96d3", "4d94d1", "5093cf", "5292cd", "5490cb", "578fc9", "598dc7", "5b8cc6", "5e8bc4", "6089c2", "6288c0", "6487be", "6785bc", "6984ba", "6b83b8", "6e81b6", "7080b4", "727eb2", "757db0", "777cae", "797aac", "7b79ab", "7e78a9", "8076a7", "8275a5", "8574a3", "8772a1", "89719f", "8c709d", "8e6e9b", "906d99", "926b97", "956a95", "976993", "996791", "9c668f", "9e658e", "a0638c", "a3628a", "a56188", "a75f86", "a95e84", "ac5c82", "ae5b80", "b05a7e", "b3587c", "b5577a", "b75678", "ba5476", "bc5374", "be5273", "c05071", "c34f6f", "c54e6d", "c74c6b", "ca4b69", "cc4967", "ce4865", "d14763", "d34561", "d5445f", "d7435d", "da415b", "dc4059", "de3f58", "e13d56", "e33c54", "e53a52", "e83950", "ea384e", "ec364c", "ee354a", "f13448", "f33246", "f53144", "f83042", "fa2e40"]
],
"white_red": [
[231, 255, 223, 216, 209, 202, 196],
["ffffff", "fefefe", "fdfdfd", "fdfdfd", "fcfcfc", "fbfbfb", "fafafa", "fafafa", "f9f9f9", "f8f8f8", "f7f7f7", "f7f7f7", "f6f6f6", "f5f5f5", "f4f4f4", "f4f3f4", "f3f3f3", "f2f2f2", "f1f1f1", "f0f0f0", "f0f0f0", "efefef", "eeeeee", "efecea", "f1eae4", "f2e8de", "f3e6d8", "f5e4d3", "f6e2cd", "f7e0c7", "f8dec2", "f9dcbc", "fadab6", "fad8b1", "fbd5ac", "fbd2a9", "fbcea5", "fbcaa1", "fbc79e", "fbc39a", "fbc097", "fbbc93", "fbb88f", "fbb58c", "fab188", "faad85", "faaa81", "fba67e", "fba37a", "fb9f76", "fb9c73", "fb986f", "fb946c", "fb9168", "fa8d65", "fa8961", "fa865c", "fa8256", "fb7f4f", "fb7b48", "fb7841", "fb743a", "fb7133", "fb6d2c", "fa6a23", "fa661a", "fa620e", "fa5f03", "fa5d03", "fa5b03", "fa5a03", "fa5803", "fa5703", "fa5503", "fa5303", "fa5103", "fa4f03", "fa4e03", "fa4c03", "fa4a04", "fa4804", "fa4604", "fa4404", "fa4204", "fa3f04", "fa3d04", "fa3b04", "fa3805", "fa3605", "fa3305", "fb3105", "fb2e05", "fb2a05", "fb2705", "fb2306", "fb1f06", "fb1b06", "fb1506", "fb0e06", "fa0506", "fa0007"]
],
"dark_green_gray": [
[70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247],
["51b000", "52b000", "54b000", "55b002", "56b007", "57b00d", "58b011", "59af15", "5aaf18", "5caf1b", "5daf1e", "5eaf21", "5faf23", "60ae25", "61ae27", "62ae2a", "63ae2c", "64ae2e", "65ae30", "66ae31", "67ad33", "68ad35", "69ad37", "69ad38", "6aad3a", "6bad3c", "6cac3d", "6dac3f", "6eac40", "6fac42", "70ac44", "70ac45", "71ab47", "72ab48", "73ab49", "74ab4b", "75ab4c", "75ab4e", "76aa4f", "77aa51", "78aa52", "79aa53", "79aa55", "7aaa56", "7ba957", "7ca959", "7ca95a", "7da95b", "7ea95d", "7fa95e", "7fa85f", "80a861", "81a862", "81a863", "82a865", "83a766", "83a767", "84a768", "85a76a", "85a76b", "86a66c", "87a66d", "87a66f", "88a670", "89a671", "89a672", "8aa574", "8ba575", "8ba576", "8ca577", "8da579", "8da47a", "8ea47b", "8ea47c", "8fa47d", "90a47f", "90a380", "91a381", "91a382", "92a384", "93a385", "93a286", "94a287", "94a288", "95a28a", "95a18b", "96a18c", "97a18d", "97a18e", "98a190", "98a091", "99a092", "99a093", "9aa094", "9aa096", "9b9f97", "9b9f98", "9c9f99", "9c9f9a", "9d9e9c", "9d9e9d"]
],
"light_green_gray": [
[148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 187, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250],
["a3d900", "a4d800", "a4d800", "a5d805", "a5d80d", "a6d714", "a6d719", "a6d71d", "a7d621", "a7d625", "a8d628", "a8d62b", "a8d52e", "a9d531", "a9d533", "aad536", "aad438", "aad43a", "abd43d", "abd33f", "abd341", "acd343", "acd345", "acd247", "add249", "add24b", "add14d", "aed14f", "aed151", "aed152", "afd054", "afd056", "afd058", "b0d059", "b0cf5b", "b0cf5d", "b1cf5e", "b1ce60", "b1ce62", "b1ce63", "b2ce65", "b2cd67", "b2cd68", "b3cd6a", "b3cc6b", "b3cc6d", "b3cc6e", "b4cc70", "b4cb71", "b4cb73", "b4cb75", "b5ca76", "b5ca78", "b5ca79", "b5ca7a", "b6c97c", "b6c97d", "b6c97f", "b6c880", "b6c882", "b7c883", "b7c885", "b7c786", "b7c788", "b7c789", "b8c68a", "b8c68c", "b8c68d", "b8c68f", "b8c590", "b9c591", "b9c593", "b9c494", "b9c496", "b9c497", "b9c498", "bac39a", "bac39b", "bac39d", "bac29e", "bac29f", "bac2a1", "bac2a2", "bac1a4", "bbc1a5", "bbc1a6", "bbc0a8", "bbc0a9", "bbc0aa", "bbc0ac", "bbbfad", "bbbfae", "bbbfb0", "bbbeb1", "bcbeb3", "bcbeb4", "bcbdb5", "bcbdb7", "bcbdb8", "bcbdb9", "bcbcbb"]
]
}
}
@@ -1,56 +0,0 @@
{
"name": "Default",
"groups": {
"information:additional": { "fg": "gray9", "bg": "gray4", "attrs": [] },
"information:regular": { "fg": "gray10", "bg": "gray4", "attrs": ["bold"] },
"information:highlighted": { "fg": "white", "bg": "gray4", "attrs": [] },
"information:priority": { "fg": "brightyellow", "bg": "mediumorange", "attrs": [] },
"warning:regular": { "fg": "white", "bg": "brightred", "attrs": ["bold"] },
"critical:failure": { "fg": "white", "bg": "darkestred", "attrs": [] },
"critical:success": { "fg": "white", "bg": "darkestgreen", "attrs": [] },
"background": { "fg": "white", "bg": "gray0", "attrs": [] },
"background:divider": { "fg": "gray5", "bg": "gray0", "attrs": [] },
"session": { "fg": "black", "bg": "gray10", "attrs": ["bold"] },
"date": { "fg": "gray8", "bg": "gray2", "attrs": [] },
"time": { "fg": "gray10", "bg": "gray2", "attrs": ["bold"] },
"time:divider": { "fg": "gray5", "bg": "gray2", "attrs": [] },
"email_alert": "warning:regular",
"email_alert_gradient": { "fg": "white", "bg": "yellow_orange_red", "attrs": ["bold"] },
"hostname": { "fg": "black", "bg": "gray10", "attrs": ["bold"] },
"weather": { "fg": "gray8", "bg": "gray0", "attrs": [] },
"weather_temp_gradient": { "fg": "blue_red", "bg": "gray0", "attrs": [] },
"weather_condition_hot": { "fg": "khaki1", "bg": "gray0", "attrs": [] },
"weather_condition_snowy": { "fg": "skyblue1", "bg": "gray0", "attrs": [] },
"weather_condition_rainy": { "fg": "skyblue1", "bg": "gray0", "attrs": [] },
"uptime": { "fg": "gray8", "bg": "gray0", "attrs": [] },
"external_ip": { "fg": "gray8", "bg": "gray0", "attrs": [] },
"internal_ip": { "fg": "gray8", "bg": "gray0", "attrs": [] },
"network_load": { "fg": "gray8", "bg": "gray0", "attrs": [] },
"network_load_gradient": { "fg": "green_yellow_orange_red", "bg": "gray0", "attrs": [] },
"network_load_sent_gradient": "network_load_gradient",
"network_load_recv_gradient": "network_load_gradient",
"network_load:divider": "background:divider",
"system_load": { "fg": "gray8", "bg": "gray0", "attrs": [] },
"system_load_gradient": { "fg": "green_yellow_orange_red", "bg": "gray0", "attrs": [] },
"environment": { "fg": "gray8", "bg": "gray0", "attrs": [] },
"cpu_load_percent": { "fg": "gray8", "bg": "gray0", "attrs": [] },
"cpu_load_percent_gradient": { "fg": "green_yellow_orange_red", "bg": "gray0", "attrs": [] },
"battery": { "fg": "gray8", "bg": "gray0", "attrs": [] },
"battery_gradient": { "fg": "white_red", "bg": "gray0", "attrs": [] },
"battery_full": { "fg": "red", "bg": "gray0", "attrs": [] },
"battery_empty": { "fg": "white", "bg": "gray0", "attrs": [] },
"player": { "fg": "gray10", "bg": "black", "attrs": [] },
"user": { "fg": "white", "bg": "darkblue", "attrs": ["bold"] },
"branch": { "fg": "gray9", "bg": "gray2", "attrs": [] },
"branch_dirty": { "fg": "brightyellow", "bg": "gray2", "attrs": [] },
"branch_clean": { "fg": "gray9", "bg": "gray2", "attrs": [] },
"branch:divider": { "fg": "gray7", "bg": "gray2", "attrs": [] },
"stash": "branch_dirty",
"stash:divider": "branch:divider",
"cwd": "information:additional",
"cwd:current_folder": "information:regular",
"cwd:divider": { "fg": "gray7", "bg": "gray4", "attrs": [] },
"virtualenv": { "fg": "white", "bg": "darkcyan", "attrs": [] },
"attached_clients": { "fg": "gray8", "bg": "gray0", "attrs": [] }
}
}
@@ -1,6 +0,0 @@
{
"groups": {
"prompt": "information:additional",
"prompt_count": "information:highlighted"
}
}
@@ -1,8 +0,0 @@
{
"groups": {
"current_code_name": "information:additional",
"current_context": "current_code_name",
"current_line": "information:regular",
"current_file": "information:regular"
}
}
@@ -1,5 +0,0 @@
{
"groups": {
"stack_depth": { "fg": "gray1", "bg": "gray10", "attrs": ["bold"] }
}
}
@@ -1,5 +0,0 @@
{
"groups": {
"stack_depth": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": ["bold"] }
}
}
@@ -1,10 +0,0 @@
{
"groups": {
"continuation": "cwd",
"continuation:current": "cwd:current_folder",
"exit_fail": "critical:failure",
"exit_success": "critical:success",
"jobnum": "information:priority",
"superuser": "warning:regular"
}
}
@@ -1,16 +0,0 @@
{
"name": "Default color scheme for shell prompts",
"groups": {
"hostname": { "fg": "brightyellow", "bg": "mediumorange", "attrs": [] },
"environment": { "fg": "white", "bg": "darkestgreen", "attrs": [] },
"mode": { "fg": "darkestgreen", "bg": "brightgreen", "attrs": ["bold"] },
"attached_clients": { "fg": "white", "bg": "darkestgreen", "attrs": [] }
},
"mode_translations": {
"vicmd": {
"groups": {
"mode": {"fg": "darkestcyan", "bg": "white", "attrs": ["bold"]}
}
}
}
}
@@ -1,13 +0,0 @@
{
"name": "Solarized dark for shell",
"groups": {
"mode": { "fg": "solarized:base3", "bg": "solarized:green", "attrs": ["bold"] }
},
"mode_translations": {
"vicmd": {
"groups": {
"mode": { "fg": "solarized:base3", "bg": "solarized:blue", "attrs": ["bold"] }
}
}
}
}
@@ -1,40 +0,0 @@
{
"name": "Solarized dark",
"groups": {
"information:additional": { "fg": "solarized:base2", "bg": "solarized:base01", "attrs": [] },
"information:regular": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": ["bold"] },
"information:highlighted": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": ["bold"]},
"information:priority": { "fg": "solarized:base3", "bg": "solarized:yellow", "attrs": [] },
"warning:regular": { "fg": "solarized:base3", "bg": "solarized:red", "attrs": [] },
"critical:failure": { "fg": "solarized:base3", "bg": "solarized:red", "attrs": [] },
"critical:success": { "fg": "solarized:base3", "bg": "solarized:green", "attrs": [] },
"background": { "fg": "solarized:base3", "bg": "solarized:base02", "attrs": [] },
"background:divider": { "fg": "solarized:base1", "bg": "solarized:base03", "attrs": [] },
"user": { "fg": "solarized:base3", "bg": "solarized:blue", "attrs": ["bold"] },
"virtualenv": { "fg": "solarized:base3", "bg": "solarized:green", "attrs": [] },
"branch": { "fg": "solarized:base1", "bg": "solarized:base02", "attrs": [] },
"branch_dirty": { "fg": "solarized:yellow", "bg": "solarized:base02", "attrs": [] },
"branch_clean": { "fg": "solarized:base1", "bg": "solarized:base02", "attrs": [] },
"stash": "branch_dirty",
"email_alert_gradient": { "fg": "solarized:base3", "bg": "yellow_orange_red", "attrs": [] },
"email_alert": "warning:regular",
"cwd": "information:additional",
"cwd:current_folder": "information:regular",
"cwd:divider": { "fg": "solarized:base1", "bg": "solarized:base01", "attrs": [] },
"network_load": { "fg": "solarized:base1", "bg": "solarized:base03", "attrs": [] },
"network_load:divider": "network_load",
"network_load_gradient": { "fg": "green_yellow_orange_red", "bg": "solarized:base03", "attrs": [] },
"network_load_sent_gradient": "network_load_gradient",
"network_load_recv_gradient": "network_load_gradient",
"hostname": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": [] },
"environment": { "fg": "solarized:base3", "bg": "solarized:green", "attrs": [] },
"attached_clients": { "fg": "solarized:base3", "bg": "solarized:green", "attrs": [] },
"date": { "fg": "solarized:base1", "bg": "solarized:base02", "attrs": [] },
"time": { "fg": "solarized:base1", "bg": "solarized:base02", "attrs": ["bold"] },
"time:divider": { "fg": "solarized:base1", "bg": "solarized:base02", "attrs": [] },
"system_load": { "fg": "solarized:base1", "bg": "solarized:base03", "attrs": [] },
"weather_temp_gradient": { "fg": "blue_red", "bg": "solarized:base03", "attrs": [] },
"weather": { "fg": "solarized:base1", "bg": "solarized:base03", "attrs": [] },
"uptime": { "fg": "solarized:base1", "bg": "solarized:base03", "attrs": [] }
}
}
@@ -1,14 +0,0 @@
{
"groups": {
"active_window_status": {"fg": "darkblue", "bg": "gray0", "attrs": []},
"window_status": {"fg": "gray70", "bg": "gray0", "attrs": []},
"activity_status": {"fg": "yellow", "bg": "gray0", "attrs": []},
"bell_status": {"fg": "red", "bg": "gray0", "attrs": []},
"window": {"fg": "gray6", "bg": "gray0", "attrs": []},
"window:divider": {"fg": "gray4", "bg": "gray0", "attrs": []},
"window:current": {"fg": "mediumcyan", "bg": "darkblue", "attrs": []},
"window_name": {"fg": "white", "bg": "darkblue", "attrs": ["bold"]},
"session": {"fg": "black", "bg": "gray90", "attrs": ["bold"]},
"session:prefix": {"fg": "gray90", "bg": "darkblue", "attrs": ["bold"]}
}
}
@@ -1,14 +0,0 @@
{
"groups": {
"active_window_status": { "fg": "solarized:blue", "bg": "solarized:base02", "attrs": [] },
"window_status": { "fg": "solarized:base1", "bg": "solarized:base02", "attrs": [] },
"activity_status": { "fg": "solarized:yellow", "bg": "solarized:base02", "attrs": [] },
"bell_status": { "fg": "solarized:red", "bg": "solarized:base02", "attrs": [] },
"window": { "fg": "solarized:base1", "bg": "solarized:base02", "attrs": [] },
"window:divider": { "fg": "solarized:base01", "bg": "solarized:base02", "attrs": [] },
"window:current": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": [] },
"window_name": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": ["bold"] },
"session": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": [] },
"session:prefix": { "fg": "solarized:base01", "bg": "solarized:base3", "attrs": [] }
}
}
@@ -1,51 +0,0 @@
{
"groups": {
"branch_clean": "branch",
"environment": "information:unimportant",
"file_size": "information:unimportant",
"file_format": "information:unimportant",
"file_encoding": "file_format",
"file_bom": "file_format",
"file_type": "file_format",
"branch": "information:additional",
"file_scheme": "file_name",
"file_directory": "information:additional",
"file_name_empty": "file_directory",
"line_percent": "information:additional",
"line_count": "line_current",
"position": "information:additional",
"single_tab": "line_current",
"many_tabs": "line_current",
"bufnr": "file_directory",
"winnr": "information:unimportant",
"tabnr": "file_directory",
"capslock_indicator": "paste_indicator",
"csv:column_number": "line_current",
"csv:column_name": "line_current_symbol",
"tab:background": "background",
"tab:divider": "background:divider",
"tab_nc:modified_indicator": "modified_indicator",
"tab_nc:file_directory": "information:unimportant",
"tab_nc:file_name": "tab_nc:file_directory",
"tab_nc:tabnr": "tab_nc:file_directory",
"buf_nc:file_directory": "tab_nc:file_directory",
"buf_nc:file_name": "buf_nc:file_directory",
"buf_nc:bufnr": "buf_nc:file_directory",
"buf_nc:modified_indicator": "tab_nc:modified_indicator",
"buf_nc_mod:file_directory": "tab_nc:file_directory",
"buf_nc_mod:file_name": "buf_nc_mod:file_directory",
"buf_nc_mod:bufnr": "buf_nc_mod:file_directory",
"buf_nc_mod:modified_indicator": "tab_nc:modified_indicator",
"commandt:label": "file_name",
"commandt:background": "background",
"commandt:finder": "file_name",
"commandt:path": "file_directory"
}
}
@@ -1,154 +0,0 @@
{
"name": "Default color scheme",
"groups": {
"information:unimportant": { "fg": "gray8", "bg": "gray2", "attrs": [] },
"information:additional": { "fg": "gray9", "bg": "gray4", "attrs": [] },
"background": { "fg": "white", "bg": "gray2", "attrs": [] },
"background:divider": { "fg": "gray6", "bg": "gray2", "attrs": [] },
"mode": { "fg": "darkestgreen", "bg": "brightgreen", "attrs": ["bold"] },
"visual_range": { "fg": "brightestorange", "bg": "darkorange", "attrs": ["bold"] },
"modified_indicator": { "fg": "brightyellow", "bg": "gray4", "attrs": ["bold"] },
"paste_indicator": { "fg": "white", "bg": "mediumorange", "attrs": ["bold"] },
"readonly_indicator": { "fg": "brightestred", "bg": "gray4", "attrs": [] },
"branch_dirty": { "fg": "brightyellow", "bg": "gray4", "attrs": [] },
"branch:divider": { "fg": "gray7", "bg": "gray4", "attrs": [] },
"file_name": { "fg": "white", "bg": "gray4", "attrs": ["bold"] },
"window_title": { "fg": "white", "bg": "gray4", "attrs": [] },
"file_name_no_file": { "fg": "gray9", "bg": "gray4", "attrs": ["bold"] },
"file_vcs_status": { "fg": "brightestred", "bg": "gray4", "attrs": [] },
"file_vcs_status_M": { "fg": "brightyellow", "bg": "gray4", "attrs": [] },
"file_vcs_status_A": { "fg": "brightgreen", "bg": "gray4", "attrs": [] },
"line_percent": { "fg": "gray9", "bg": "gray4", "attrs": [] },
"line_percent_gradient": { "fg": "dark_green_gray", "bg": "gray4", "attrs": [] },
"position": { "fg": "gray9", "bg": "gray4", "attrs": [] },
"position_gradient": { "fg": "green_yellow_red", "bg": "gray4", "attrs": [] },
"line_current": { "fg": "gray1", "bg": "gray10", "attrs": ["bold"] },
"line_current_symbol": { "fg": "gray1", "bg": "gray10", "attrs": [] },
"virtcol_current_gradient": { "fg": "dark_GREEN_Orange_red", "bg": "gray10", "attrs": [] },
"col_current": { "fg": "gray6", "bg": "gray10", "attrs": [] },
"modified_buffers": { "fg": "brightyellow", "bg": "gray2", "attrs": [] },
"attached_clients": { "fg": "gray8", "bg": "gray2", "attrs": [] },
"error": { "fg": "brightestred", "bg": "darkred", "attrs": ["bold"] },
"warning": { "fg": "brightyellow", "bg": "darkorange", "attrs": ["bold"] },
"current_tag": { "fg": "gray9", "bg": "gray2", "attrs": [] },
"tab_nc:modified_indicator": { "fg": "brightyellow", "bg": "gray2", "attrs": ["bold"] }
},
"mode_translations": {
"nc": {
"colors": {
"brightyellow": "darkorange",
"brightestred": "darkred",
"gray0": "gray0",
"gray1": "gray0",
"gray2": "gray0",
"gray3": "gray1",
"gray4": "gray1",
"gray5": "gray1",
"gray6": "gray1",
"gray7": "gray4",
"gray8": "gray4",
"gray9": "gray4",
"gray10": "gray5",
"white": "gray6",
"dark_green_gray": "gray5"
}
},
"i": {
"colors": {
"gray0": "darkestblue",
"gray1": "darkestblue",
"gray2": "darkestblue",
"gray3": "darkblue",
"gray4": "darkblue",
"gray5": "darkestcyan",
"gray6": "darkestcyan",
"gray7": "darkestcyan",
"gray8": "mediumcyan",
"gray9": "mediumcyan",
"gray10": "mediumcyan",
"green_yellow_red": "gray5",
"dark_green_gray": "light_green_gray"
},
"groups": {
"mode": { "fg": "darkestcyan", "bg": "white", "attrs": ["bold"] },
"background:divider": { "fg": "darkcyan", "bg": "darkestblue", "attrs": [] },
"branch:divider": { "fg": "darkcyan", "bg": "darkblue", "attrs": [] }
}
},
"ic": {
"colors": {
"gray0": "darkestblue",
"gray1": "darkestblue",
"gray2": "darkestblue",
"gray3": "darkblue",
"gray4": "darkblue",
"gray5": "darkestcyan",
"gray6": "darkestcyan",
"gray7": "darkestcyan",
"gray8": "mediumcyan",
"gray9": "mediumcyan",
"gray10": "mediumcyan",
"green_yellow_red": "gray5",
"dark_green_gray": "light_green_gray"
},
"groups": {
"mode": { "fg": "darkestcyan", "bg": "white", "attrs": ["bold"] },
"background:divider": { "fg": "darkcyan", "bg": "darkestblue", "attrs": [] },
"branch:divider": { "fg": "darkcyan", "bg": "darkblue", "attrs": [] }
}
},
"ix": {
"colors": {
"gray0": "darkestblue",
"gray1": "darkestblue",
"gray2": "darkestblue",
"gray3": "darkblue",
"gray4": "darkblue",
"gray5": "darkestcyan",
"gray6": "darkestcyan",
"gray7": "darkestcyan",
"gray8": "mediumcyan",
"gray9": "mediumcyan",
"gray10": "mediumcyan",
"green_yellow_red": "gray5",
"dark_green_gray": "light_green_gray"
},
"groups": {
"mode": { "fg": "darkestcyan", "bg": "white", "attrs": ["bold"] },
"background:divider": { "fg": "darkcyan", "bg": "darkestblue", "attrs": [] },
"branch:divider": { "fg": "darkcyan", "bg": "darkblue", "attrs": [] }
}
},
"v": {
"groups": {
"mode": { "fg": "darkorange", "bg": "brightestorange", "attrs": ["bold"] }
}
},
"V": {
"groups": {
"mode": { "fg": "darkorange", "bg": "brightestorange", "attrs": ["bold"] }
}
},
"^V": {
"groups": {
"mode": { "fg": "darkorange", "bg": "brightestorange", "attrs": ["bold"] }
}
},
"R": {
"groups": {
"mode": { "fg": "white", "bg": "brightred", "attrs": ["bold"] }
}
},
"Rc": {
"groups": {
"mode": { "fg": "white", "bg": "brightred", "attrs": ["bold"] }
}
},
"Rx": {
"groups": {
"mode": { "fg": "white", "bg": "brightred", "attrs": ["bold"] }
}
}
}
}
@@ -1,121 +0,0 @@
{
"name": "Solarized dark for vim",
"groups": {
"information:additional": { "fg": "solarized:base2", "bg": "solarized:base01", "attrs": [] },
"information:unimportant": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": [] },
"background": { "fg": "solarized:base3", "bg": "solarized:base02", "attrs": [] },
"background:divider": { "fg": "solarized:base00", "bg": "solarized:base02", "attrs": [] },
"mode": { "fg": "solarized:base3", "bg": "solarized:green", "attrs": ["bold"] },
"visual_range": { "fg": "solarized:green", "bg": "solarized:base3", "attrs": ["bold"] },
"modified_indicator": { "fg": "solarized:yellow", "bg": "solarized:base01", "attrs": ["bold"] },
"paste_indicator": { "fg": "solarized:base3", "bg": "solarized:orange", "attrs": ["bold"] },
"readonly_indicator": { "fg": "solarized:red", "bg": "solarized:base01", "attrs": [] },
"branch_dirty": { "fg": "solarized:yellow", "bg": "solarized:base01", "attrs": [] },
"branch:divider": { "fg": "solarized:base1", "bg": "solarized:base01", "attrs": [] },
"stash:divider": "branch:divider",
"file_name": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": ["bold"] },
"window_title": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": [] },
"file_name_no_file": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": ["bold"] },
"file_format": { "fg": "solarized:base1", "bg": "solarized:base02", "attrs": [] },
"file_vcs_status": { "fg": "solarized:red", "bg": "solarized:base01", "attrs": [] },
"file_vcs_status_M": { "fg": "solarized:yellow", "bg": "solarized:base01", "attrs": [] },
"file_vcs_status_A": { "fg": "solarized:green", "bg": "solarized:base01", "attrs": [] },
"line_percent": { "fg": "solarized:base3", "bg": "solarized:base00", "attrs": [] },
"line_percent_gradient": { "fg": "green_yellow_orange_red", "bg": "solarized:base00", "attrs": [] },
"position": { "fg": "solarized:base3", "bg": "solarized:base00", "attrs": [] },
"position_gradient": { "fg": "green_yellow_orange_red", "bg": "solarized:base00", "attrs": [] },
"line_current": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": ["bold"] },
"line_current_symbol": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": [] },
"virtcol_current_gradient": { "fg": "GREEN_Orange_red", "bg": "solarized:base2", "attrs": [] },
"col_current": { "fg": "solarized:base0", "bg": "solarized:base2", "attrs": [] },
"environment": { "fg": "solarized:base1", "bg": "solarized:base02", "attrs": [] },
"attached_clients": { "fg": "solarized:base1", "bg": "solarized:base02", "attrs": [] },
"error": { "fg": "solarized:base3", "bg": "solarized:red", "attrs": ["bold"] },
"warning": { "fg": "solarized:base3", "bg": "solarized:orange", "attrs": ["bold"] },
"current_tag": { "fg": "solarized:base3", "bg": "solarized:base02", "attrs": ["bold"] }
},
"mode_translations": {
"nc": {
"colors": {
"solarized:base01": "solarized:base02",
"solarized:base00": "solarized:base02",
"solarized:base0": "solarized:base01",
"solarized:base1": "solarized:base00",
"solarized:base2": "solarized:base0",
"solarized:base3": "solarized:base1"
}
},
"i": {
"groups": {
"background": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": [] },
"background:divider": { "fg": "solarized:base2", "bg": "solarized:base01", "attrs": [] },
"mode": { "fg": "solarized:base3", "bg": "solarized:blue", "attrs": ["bold"] },
"modified_indicator": { "fg": "solarized:yellow", "bg": "solarized:base2", "attrs": ["bold"] },
"paste_indicator": { "fg": "solarized:base3", "bg": "solarized:orange", "attrs": ["bold"] },
"readonly_indicator": { "fg": "solarized:red", "bg": "solarized:base2", "attrs": [] },
"branch": { "fg": "solarized:base01", "bg": "solarized:base2", "attrs": [] },
"branch:divider": { "fg": "solarized:base00", "bg": "solarized:base2", "attrs": [] },
"file_directory": { "fg": "solarized:base01", "bg": "solarized:base2", "attrs": [] },
"file_name": { "fg": "solarized:base02", "bg": "solarized:base2", "attrs": ["bold"] },
"file_size": { "fg": "solarized:base02", "bg": "solarized:base2", "attrs": [] },
"file_name_no_file": { "fg": "solarized:base02", "bg": "solarized:base2", "attrs": ["bold"] },
"file_name_empty": { "fg": "solarized:base02", "bg": "solarized:base2", "attrs": [] },
"file_format": { "fg": "solarized:base2", "bg": "solarized:base01", "attrs": [] },
"file_vcs_status": { "fg": "solarized:red", "bg": "solarized:base2", "attrs": [] },
"file_vcs_status_M": { "fg": "solarized:yellow", "bg": "solarized:base2", "attrs": [] },
"file_vcs_status_A": { "fg": "solarized:green", "bg": "solarized:base2", "attrs": [] },
"line_percent": { "fg": "solarized:base3", "bg": "solarized:base1", "attrs": [] },
"line_percent_gradient": { "fg": "solarized:base3", "bg": "solarized:base1", "attrs": [] },
"position": { "fg": "solarized:base3", "bg": "solarized:base1", "attrs": [] },
"position_gradient": { "fg": "solarized:base3", "bg": "solarized:base1", "attrs": [] },
"line_current": { "fg": "solarized:base03", "bg": "solarized:base3", "attrs": ["bold"] },
"line_current_symbol": { "fg": "solarized:base03", "bg": "solarized:base3", "attrs": [] },
"col_current": { "fg": "solarized:base0", "bg": "solarized:base3", "attrs": [] }
}
},
"ic": {
"groups": {
"background": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": [] },
"background:divider": { "fg": "solarized:base2", "bg": "solarized:base01", "attrs": [] },
"mode": { "fg": "solarized:base3", "bg": "solarized:blue", "attrs": ["bold"] }
}
},
"ix": {
"groups": {
"background": { "fg": "solarized:base3", "bg": "solarized:base01", "attrs": [] },
"background:divider": { "fg": "solarized:base2", "bg": "solarized:base01", "attrs": [] },
"mode": { "fg": "solarized:base3", "bg": "solarized:blue", "attrs": ["bold"] }
}
},
"v": {
"groups": {
"mode": { "fg": "solarized:base3", "bg": "solarized:orange", "attrs": ["bold"] }
}
},
"V": {
"groups": {
"mode": { "fg": "solarized:base3", "bg": "solarized:orange", "attrs": ["bold"] }
}
},
"^V": {
"groups": {
"mode": { "fg": "solarized:base3", "bg": "solarized:orange", "attrs": ["bold"] }
}
},
"R": {
"groups": {
"mode": { "fg": "solarized:base3", "bg": "solarized:red", "attrs": ["bold"] }
}
},
"Rc": {
"groups": {
"mode": { "fg": "solarized:base3", "bg": "solarized:red", "attrs": ["bold"] }
}
},
"Rx": {
"groups": {
"mode": { "fg": "solarized:base3", "bg": "solarized:red", "attrs": ["bold"] }
}
}
}
}
@@ -1,122 +0,0 @@
{
"name": "Solarized light for vim",
"groups": {
"information:additional": { "fg": "solarized:base02", "bg": "solarized:base2", "attrs": [] },
"information:unimportant": { "fg": "solarized:base1", "bg": "solarized:base01", "attrs": [] },
"background": { "fg": "solarized:base03", "bg": "solarized:base01", "attrs": [] },
"background:divider": { "fg": "solarized:base0", "bg": "solarized:base01", "attrs": [] },
"mode": { "fg": "solarized:base3", "bg": "solarized:green", "attrs": ["bold"] },
"visual_range": { "fg": "solarized:green", "bg": "solarized:base3", "attrs": ["bold"] },
"modified_indicator": { "fg": "solarized:yellow", "bg": "solarized:base2", "attrs": ["bold"] },
"paste_indicator": { "fg": "solarized:red", "bg": "solarized:base2", "attrs": ["bold"] },
"readonly_indicator": { "fg": "solarized:red", "bg": "solarized:base2", "attrs": [] },
"branch_dirty": { "fg": "solarized:yellow", "bg": "solarized:base2", "attrs": [] },
"branch:divider": { "fg": "solarized:base1", "bg": "solarized:base2", "attrs": [] },
"stash": "branch_dirty",
"stash:divider": "branch:divider",
"file_name": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": ["bold"] },
"window_title": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": [] },
"file_size": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": [] },
"file_name_no_file": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": ["bold"] },
"file_name_empty": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": [] },
"file_vcs_status": { "fg": "solarized:red", "bg": "solarized:base2", "attrs": [] },
"file_vcs_status_M": { "fg": "solarized:yellow", "bg": "solarized:base2", "attrs": [] },
"file_vcs_status_A": { "fg": "solarized:green", "bg": "solarized:base2", "attrs": [] },
"line_percent": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": [] },
"line_percent_gradient": { "fg": "green_yellow_orange_red", "bg": "solarized:base2", "attrs": [] },
"position": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": [] },
"position_gradient": { "fg": "green_yellow_orange_red", "bg": "solarized:base2", "attrs": [] },
"line_current": { "fg": "solarized:base3", "bg": "solarized:base02", "attrs": ["bold"] },
"line_current_symbol": { "fg": "solarized:base3", "bg": "solarized:base02", "attrs": [] },
"virtcol_current_gradient": { "fg": "yellow_orange_red", "bg": "solarized:base02", "attrs": [] },
"col_current": { "fg": "solarized:base00", "bg": "solarized:base02", "attrs": [] },
"error": { "fg": "solarized:base03", "bg": "solarized:red", "attrs": ["bold"] },
"warning": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": ["bold"] },
"current_tag": { "fg": "solarized:base03", "bg": "solarized:base01", "attrs": ["bold"] }
},
"mode_translations": {
"nc": {
"colors": {
"solarized:base2": "solarized:base01",
"solarized:base0": "solarized:base01",
"solarized:base00": "solarized:base2",
"solarized:base1": "solarized:base0",
"solarized:base02": "solarized:base00",
"solarized:base03": "solarized:base1"
}
},
"i": {
"groups": {
"background": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": [] },
"background:divider": { "fg": "solarized:base02", "bg": "solarized:base2", "attrs": [] },
"mode": { "fg": "solarized:base3", "bg": "solarized:blue", "attrs": ["bold"] },
"modified_indicator": { "fg": "solarized:yellow", "bg": "solarized:base02", "attrs": ["bold"] },
"paste_indicator": { "fg": "solarized:base3", "bg": "solarized:orange", "attrs": ["bold"] },
"readonly_indicator": { "fg": "solarized:red", "bg": "solarized:base02", "attrs": [] },
"branch": { "fg": "solarized:base2", "bg": "solarized:base02", "attrs": [] },
"branch:divider": { "fg": "solarized:base0", "bg": "solarized:base02", "attrs": [] },
"file_directory": { "fg": "solarized:base2", "bg": "solarized:base02", "attrs": [] },
"file_name": { "fg": "solarized:base01", "bg": "solarized:base02", "attrs": ["bold"] },
"file_size": { "fg": "solarized:base01", "bg": "solarized:base02", "attrs": [] },
"file_name_no_file": { "fg": "solarized:base01", "bg": "solarized:base02", "attrs": ["bold"] },
"file_name_empty": { "fg": "solarized:base01", "bg": "solarized:base02", "attrs": [] },
"file_format": { "fg": "solarized:base02", "bg": "solarized:base2", "attrs": [] },
"file_vcs_status": { "fg": "solarized:red", "bg": "solarized:base02", "attrs": [] },
"file_vcs_status_M": { "fg": "solarized:yellow", "bg": "solarized:base02", "attrs": [] },
"file_vcs_status_A": { "fg": "solarized:green", "bg": "solarized:base02", "attrs": [] },
"line_percent": { "fg": "solarized:base03", "bg": "solarized:base1", "attrs": [] },
"line_percent_gradient": { "fg": "solarized:base03", "bg": "solarized:base1", "attrs": [] },
"position": { "fg": "solarized:base03", "bg": "solarized:base1", "attrs": [] },
"position_gradient": { "fg": "solarized:base03", "bg": "solarized:base1", "attrs": [] },
"line_current": { "fg": "solarized:base3", "bg": "solarized:base03", "attrs": ["bold"] },
"line_current_symbol": { "fg": "solarized:base3", "bg": "solarized:base03", "attrs": [] },
"virtcol_current_gradient": { "fg": "yellow_orange_red", "bg": "solarized:base03", "attrs": [] },
"col_current": { "fg": "solarized:base00", "bg": "solarized:base03", "attrs": [] }
}
},
"ic": {
"groups": {
"background": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": [] },
"background:divider": { "fg": "solarized:base02", "bg": "solarized:base2", "attrs": [] },
"mode": { "fg": "solarized:base3", "bg": "solarized:blue", "attrs": ["bold"] }
}
},
"ix": {
"groups": {
"background": { "fg": "solarized:base03", "bg": "solarized:base2", "attrs": [] },
"background:divider": { "fg": "solarized:base02", "bg": "solarized:base2", "attrs": [] },
"mode": { "fg": "solarized:base3", "bg": "solarized:blue", "attrs": ["bold"] }
}
},
"v": {
"groups": {
"mode": { "fg": "solarized:base3", "bg": "solarized:orange", "attrs": ["bold"] }
}
},
"V": {
"groups": {
"mode": { "fg": "solarized:base3", "bg": "solarized:orange", "attrs": ["bold"] }
}
},
"^V": {
"groups": {
"mode": { "fg": "solarized:base3", "bg": "solarized:orange", "attrs": ["bold"] }
}
},
"R": {
"groups": {
"mode": { "fg": "solarized:base3", "bg": "solarized:red", "attrs": ["bold"] }
}
},
"Rc": {
"groups": {
"mode": { "fg": "solarized:base3", "bg": "solarized:red", "attrs": ["bold"] }
}
},
"Rx": {
"groups": {
"mode": { "fg": "solarized:base3", "bg": "solarized:red", "attrs": ["bold"] }
}
}
}
}
-53
View File
@@ -1,53 +0,0 @@
{
"common": {
"term_truecolor": false
},
"ext": {
"ipython": {
"colorscheme": "default",
"theme": "in",
"local_themes": {
"rewrite": "rewrite",
"out": "out",
"in2": "in2"
}
},
"pdb": {
"colorscheme": "default",
"theme": "default"
},
"shell": {
"colorscheme": "default",
"theme": "default",
"local_themes": {
"continuation": "continuation",
"select": "select"
}
},
"tmux": {
"colorscheme": "default",
"theme": "default"
},
"vim": {
"colorscheme": "default",
"theme": "default",
"local_themes": {
"__tabline__": "tabline",
"cmdwin": "cmdwin",
"help": "help",
"quickfix": "quickfix",
"powerline.matchers.vim.plugin.nerdtree.nerdtree": "plugin_nerdtree",
"powerline.matchers.vim.plugin.commandt.commandt": "plugin_commandt",
"powerline.matchers.vim.plugin.gundo.gundo": "plugin_gundo",
"powerline.matchers.vim.plugin.gundo.gundo_preview": "plugin_gundo-preview"
}
},
"wm": {
"colorscheme": "default",
"theme": "default",
"update_interval": 2
}
}
}
-153
View File
@@ -1,153 +0,0 @@
{
"use_non_breaking_spaces": false,
"dividers": {
"left": {
"hard": " ",
"soft": "| "
},
"right": {
"hard": " ",
"soft": " |"
}
},
"spaces": 1,
"segment_data": {
"branch": {
"before": "BR "
},
"stash": {
"before": "ST "
},
"cwd": {
"args": {
"ellipsis": "..."
}
},
"player": {
"args": {
"state_symbols": {
"fallback": "",
"play": ">",
"pause": "~",
"stop": "X"
}
}
},
"line_current_symbol": {
"contents": "LN "
},
"time": {
"before": ""
},
"powerline.segments.common.net.network_load": {
"args": {
"recv_format": "DL {value:>8}",
"sent_format": "UL {value:>8}"
}
},
"powerline.segments.common.net.hostname": {
"before": "H "
},
"powerline.segments.common.bat.battery": {
"args": {
"full_heart": "O",
"empty_heart": "O",
"online": "C",
"offline": " "
}
},
"powerline.segments.common.sys.uptime": {
"before": "UP "
},
"powerline.segments.common.mail.email_imap_alert": {
"before": "MAIL "
},
"powerline.segments.common.env.virtualenv": {
"before": "(e) "
},
"powerline.segments.common.wthr.weather": {
"args": {
"icons": {
"day": "DAY",
"blustery": "WIND",
"rainy": "RAIN",
"cloudy": "CLOUDS",
"snowy": "SNOW",
"stormy": "STORM",
"foggy": "FOG",
"sunny": "SUN",
"night": "NIGHT",
"windy": "WINDY",
"not_available": "NA",
"unknown": "UKN"
},
"temp_format": "{temp:.0f} C"
}
},
"powerline.segments.common.time.fuzzy_time": {
"args": {
"unicode_text": false
}
},
"powerline.segments.vim.mode": {
"args": {
"override": {
"n": "NORMAL",
"no": "N-OPER",
"v": "VISUAL",
"V": "V-LINE",
"^V": "V-BLCK",
"s": "SELECT",
"S": "S-LINE",
"^S": "S-BLCK",
"i": "INSERT",
"ic": "I-COMP",
"ix": "I-C_X ",
"R": "RPLACE",
"Rv": "V-RPLC",
"Rc": "R-COMP",
"Rx": "R-C_X ",
"c": "COMMND",
"cv": "VIM-EX",
"ce": "NRM-EX",
"r": "PROMPT",
"rm": "-MORE-",
"r?": "CNFIRM",
"!": "!SHELL",
"t": "TERM "
}
}
},
"powerline.segments.vim.visual_range": {
"args": {
"CTRL_V_text": "{rows} x {vcols}",
"v_text_oneline": "C:{vcols}",
"v_text_multiline": "L:{rows}",
"V_text": "L:{rows}"
}
},
"powerline.segments.vim.readonly_indicator": {
"args": {
"text": "RO"
}
},
"powerline.segments.vim.modified_indicator": {
"args": {
"text": "+"
}
},
"powerline.segments.i3wm.scratchpad": {
"args": {
"icons": {
"fresh": "O",
"changed": "X"
}
}
}
}
}
-25
View File
@@ -1,25 +0,0 @@
{
"segments": {
"left": [
{
"function": "powerline.segments.common.env.virtualenv",
"priority": 10
},
{
"type": "string",
"contents": "In [",
"draw_soft_divider": false,
"highlight_groups": ["prompt"]
},
{
"function": "powerline.segments.ipython.prompt_count",
"draw_soft_divider": false
},
{
"type": "string",
"contents": "]",
"highlight_groups": ["prompt"]
}
]
}
}
-12
View File
@@ -1,12 +0,0 @@
{
"segments": {
"left": [
{
"type": "string",
"contents": "",
"width": "auto",
"highlight_groups": ["prompt"]
}
]
}
}
-24
View File
@@ -1,24 +0,0 @@
{
"default_module": "powerline.segments.ipython",
"segments": {
"left": [
{
"type": "string",
"contents": "Out[",
"draw_soft_divider": false,
"width": "auto",
"align": "r",
"highlight_groups": ["prompt"]
},
{
"function": "prompt_count",
"draw_soft_divider": false
},
{
"type": "string",
"contents": "]",
"highlight_groups": ["prompt"]
}
]
}
}
@@ -1,23 +0,0 @@
{
"default_module": "powerline.segments.ipython",
"segments": {
"left": [
{
"type": "string",
"contents": "",
"draw_soft_divider": false,
"width": "auto",
"highlight_groups": ["prompt"]
},
{
"function": "prompt_count",
"draw_soft_divider": false
},
{
"type": "string",
"contents": ">",
"highlight_groups": ["prompt"]
}
]
}
}
-27
View File
@@ -1,27 +0,0 @@
{
"default_module": "powerline.segments.pdb",
"segments": {
"left": [
{
"function": "stack_depth"
},
{
"type": "segment_list",
"function": "powerline.listers.pdb.frame_lister",
"segments": [
{
"function": "current_file",
"after": ":"
},
{
"function": "current_line",
"after": " "
},
{
"function": "current_code_name"
}
]
}
]
}
}
-151
View File
@@ -1,151 +0,0 @@
{
"dividers": {
"left": {
"hard": " ",
"soft": " "
},
"right": {
"hard": " ",
"soft": " "
}
},
"spaces": 1,
"segment_data": {
"branch": {
"before": " "
},
"stash": {
"before": "⌆ "
},
"cwd": {
"args": {
"ellipsis": "⋯"
}
},
"line_current_symbol": {
"contents": " "
},
"player": {
"args": {
"state_symbols": {
"fallback": "♫",
"play": "▶",
"pause": "▮▮",
"stop": "■"
}
}
},
"time": {
"before": "⌚ "
},
"powerline.segments.common.net.network_load": {
"args": {
"recv_format": "⬇ {value:>8}",
"sent_format": "⬆ {value:>8}"
}
},
"powerline.segments.common.net.hostname": {
"before": " "
},
"powerline.segments.common.bat.battery": {
"args": {
"full_heart": "♥",
"empty_heart": "♥",
"online": "⚡︎",
"offline": " "
}
},
"powerline.segments.common.sys.uptime": {
"before": "⇑ "
},
"powerline.segments.common.mail.email_imap_alert": {
"before": "✉ "
},
"powerline.segments.common.env.virtualenv": {
"before": "ⓔ "
},
"powerline.segments.common.wthr.weather": {
"args": {
"icons": {
"day": "〇",
"blustery": "⚑",
"rainy": "☔",
"cloudy": "☁",
"snowy": "❅",
"stormy": "☈",
"foggy": "≡",
"sunny": "☼",
"night": "☾",
"windy": "☴",
"not_available": "�",
"unknown": "⚠"
}
}
},
"powerline.segments.common.time.fuzzy_time": {
"args": {
"unicode_text": true
}
},
"powerline.segments.vim.mode": {
"args": {
"override": {
"n": "NORMAL",
"no": "N·OPER",
"v": "VISUAL",
"V": "V·LINE",
"^V": "V·BLCK",
"s": "SELECT",
"S": "S·LINE",
"^S": "S·BLCK",
"i": "INSERT",
"ic": "I·COMP",
"ix": "I·C-X ",
"R": "RPLACE",
"Rv": "V·RPLC",
"Rc": "R·COMP",
"Rx": "R·C-X ",
"c": "COMMND",
"cv": "VIM·EX",
"ce": "NRM·EX",
"r": "PROMPT",
"rm": "-MORE-",
"r?": "CNFIRM",
"!": "!SHELL",
"t": "TERM "
}
}
},
"powerline.segments.vim.visual_range": {
"args": {
"CTRL_V_text": "↕{rows} ↔{vcols}",
"v_text_oneline": "↔{vcols}",
"v_text_multiline": "↕{rows}",
"V_text": "⇕{rows}"
}
},
"powerline.segments.vim.readonly_indicator": {
"args": {
"text": ""
}
},
"powerline.segments.vim.modified_indicator": {
"args": {
"text": "+"
}
},
"powerline.segments.i3wm.scratchpad": {
"args": {
"icons": {
"fresh": "●",
"changed": "○"
}
}
}
}
}
@@ -1,151 +0,0 @@
{
"dividers": {
"left": {
"hard": " ",
"soft": " "
},
"right": {
"hard": " ",
"soft": " "
}
},
"spaces": 1,
"segment_data": {
"branch": {
"before": " "
},
"stash": {
"before": "ST "
},
"cwd": {
"args": {
"ellipsis": "…"
}
},
"line_current_symbol": {
"contents": " "
},
"player": {
"args": {
"state_symbols": {
"fallback": "♫",
"play": "▶",
"pause": "▮▮",
"stop": "■"
}
}
},
"time": {
"before": ""
},
"powerline.segments.common.net.network_load": {
"args": {
"recv_format": "⇓ {value:>8}",
"sent_format": "⇑ {value:>8}"
}
},
"powerline.segments.common.net.hostname": {
"before": " "
},
"powerline.segments.common.bat.battery": {
"args": {
"full_heart": "♥",
"empty_heart": "♥",
"online": "⚡︎",
"offline": " "
}
},
"powerline.segments.common.sys.uptime": {
"before": "↑ "
},
"powerline.segments.common.mail.email_imap_alert": {
"before": "MAIL "
},
"powerline.segments.common.env.virtualenv": {
"before": "(e) "
},
"powerline.segments.common.wthr.weather": {
"args": {
"icons": {
"day": "DAY",
"blustery": "WIND",
"rainy": "RAIN",
"cloudy": "CLOUDS",
"snowy": "SNOW",
"stormy": "STORM",
"foggy": "FOG",
"sunny": "SUN",
"night": "NIGHT",
"windy": "WINDY",
"not_available": "NA",
"unknown": "UKN"
}
}
},
"powerline.segments.common.time.fuzzy_time": {
"args": {
"unicode_text": true
}
},
"powerline.segments.vim.mode": {
"args": {
"override": {
"n": "NORMAL",
"no": "N·OPER",
"v": "VISUAL",
"V": "V·LINE",
"^V": "V·BLCK",
"s": "SELECT",
"S": "S·LINE",
"^S": "S·BLCK",
"i": "INSERT",
"ic": "I·COMP",
"ix": "I·C-X ",
"R": "RPLACE",
"Rv": "V·RPLC",
"Rc": "R·COMP",
"Rx": "R·C-X ",
"c": "COMMND",
"cv": "VIM·EX",
"ce": "NRM·EX",
"r": "PROMPT",
"rm": "-MORE-",
"r?": "CNFIRM",
"!": "!SHELL",
"t": "TERM "
}
}
},
"powerline.segments.vim.visual_range": {
"args": {
"CTRL_V_text": "↕{rows} ↔{vcols}",
"v_text_oneline": "↔{vcols}",
"v_text_multiline": "↕{rows}",
"V_text": "⇕{rows}"
}
},
"powerline.segments.vim.readonly_indicator": {
"args": {
"text": ""
}
},
"powerline.segments.vim.modified_indicator": {
"args": {
"text": "+"
}
},
"powerline.segments.i3wm.scratchpad": {
"args": {
"icons": {
"fresh": "●",
"changed": "○"
}
}
}
}
}
@@ -1,165 +0,0 @@
{
"dividers": {
"left": {
"hard": " ",
"soft": " "
},
"right": {
"hard": " ",
"soft": " "
}
},
"spaces": 1,
"segment_data": {
"branch": {
"before": "🔀 "
},
"stash": {
"before": "📝"
},
"cwd": {
"args": {
"ellipsis": "⋯"
}
},
"line_current_symbol": {
"contents": " "
},
"player": {
"args": {
"state_symbols": {
"fallback": "♫",
"play": "⏵",
"pause": "⏸",
"stop": "⏹"
}
}
},
"time": {
"before": "🕐 "
},
"powerline.segments.common.net.network_load": {
"args": {
"recv_format": "⬇ {value:>8}",
"sent_format": "⬆ {value:>8}"
}
},
"powerline.segments.common.net.hostname": {
"before": "🏠 "
},
"powerline.segments.common.bat.battery": {
"args": {
"full_heart": "💙",
"empty_heart": "💛",
"online": "⚡️",
"offline": " "
}
},
"powerline.segments.common.sys.uptime": {
"before": "⇑ "
},
"powerline.segments.common.mail.email_imap_alert": {
"before": "✉ "
},
"powerline.segments.common.env.virtualenv": {
"before": "🐍 "
},
"powerline.segments.common.wthr.weather": {
"args": {
"icons": {
"tornado": "🌪",
"hurricane": "🌀",
"showers": "☔",
"scattered_showers": "☔",
"thunderstorms": "🌩",
"isolated_thunderstorms": "🌩",
"scattered_thunderstorms": "🌩",
"dust": "🌫",
"fog": "🌫",
"cold": "❄",
"partly_cloudy_day": "🌤",
"mostly_cloudy_day": "🌥",
"sun": "🌣",
"hot": "♨",
"day": "☀",
"blustery": "⚑",
"rainy": "☂",
"cloudy": "☁",
"snowy": "☃",
"stormy": "☈",
"foggy": "🌁",
"sunny": "🌣",
"night": "☾",
"windy": "☴",
"not_available": "�",
"unknown": "⚠"
}
}
},
"powerline.segments.common.time.fuzzy_time": {
"args": {
"unicode_text": true
}
},
"powerline.segments.vim.mode": {
"args": {
"override": {
"n": "NORMAL",
"no": "N·OPER",
"v": "VISUAL",
"V": "V·LINE",
"^V": "V·BLCK",
"s": "SELECT",
"S": "S·LINE",
"^S": "S·BLCK",
"i": "INSERT",
"ic": "I·COMP",
"ix": "I·C-X ",
"R": "RPLACE",
"Rv": "V·RPLC",
"Rc": "R·COMP",
"Rx": "R·C-X ",
"c": "COMMND",
"cv": "VIM·EX",
"ce": "NRM·EX",
"r": "PROMPT",
"rm": "-MORE-",
"r?": "CNFIRM",
"!": "!SHELL",
"t": "TERM "
}
}
},
"powerline.segments.vim.visual_range": {
"args": {
"CTRL_V_text": "↕{rows} ↔{vcols}",
"v_text_oneline": "↔{vcols}",
"v_text_multiline": "↕{rows}",
"V_text": "⇕{rows}"
}
},
"powerline.segments.vim.readonly_indicator": {
"args": {
"text": "🔏"
}
},
"powerline.segments.vim.modified_indicator": {
"args": {
"text": "🖫⃥"
}
},
"powerline.segments.i3wm.scratchpad": {
"args": {
"icons": {
"fresh": "●",
"changed": "○"
}
}
}
}
}
@@ -1,14 +0,0 @@
{
"segment_data": {
"hostname": {
"args": {
"only_if_ssh": true
}
},
"cwd": {
"args": {
"dir_limit_depth": 3
}
}
}
}
@@ -1,12 +0,0 @@
{
"default_module": "powerline.segments.shell",
"segments": {
"left": [
{
"function": "continuation"
}
],
"right": [
]
}
}
@@ -1,43 +0,0 @@
{
"segments": {
"left": [
{
"function": "powerline.segments.shell.mode"
},
{
"function": "powerline.segments.common.net.hostname",
"priority": 10
},
{
"function": "powerline.segments.common.env.user",
"priority": 30
},
{
"function": "powerline.segments.common.env.virtualenv",
"priority": 50
},
{
"function": "powerline.segments.shell.cwd",
"priority": 10
},
{
"function": "powerline.segments.shell.jobnum",
"priority": 20
}
],
"right": [
{
"function": "powerline.segments.shell.last_pipe_status",
"priority": 10
},
{
"function": "powerline.segments.common.vcs.stash",
"priority": 50
},
{
"function": "powerline.segments.common.vcs.branch",
"priority": 40
}
]
}
}
@@ -1,34 +0,0 @@
{
"segments": {
"left": [
{
"function": "powerline.segments.common.net.hostname",
"priority": 10
},
{
"function": "powerline.segments.common.env.user",
"priority": 30
},
{
"function": "powerline.segments.common.env.virtualenv",
"priority": 50
},
{
"function": "powerline.segments.common.vcs.branch",
"priority": 40
},
{
"function": "powerline.segments.shell.cwd",
"priority": 10
},
{
"function": "powerline.segments.shell.jobnum",
"priority": 20
},
{
"function": "powerline.segments.shell.last_pipe_status",
"priority": 10
}
]
}
}
@@ -1,13 +0,0 @@
{
"segments": {
"left": [
{
"type": "string",
"contents": "Select variant",
"width": "auto",
"align": "r",
"highlight_groups": ["continuation:current"]
}
]
}
}
@@ -1,36 +0,0 @@
{
"segments": {
"right": [
{
"function": "powerline.segments.common.sys.uptime",
"priority": 50
},
{
"function": "powerline.segments.common.sys.system_load",
"priority": 50
},
{
"function": "powerline.segments.common.time.date",
"name": "date",
"args": {
"format": "%d.%m.%Y"
}
},
{
"function": "powerline.segments.common.bat.battery",
"name": "battery"
},
{
"function": "powerline.segments.common.time.date",
"name": "time",
"args": {
"format": "%H:%M",
"istime": true
}
},
{
"function": "powerline.segments.common.net.hostname"
}
]
}
}
-151
View File
@@ -1,151 +0,0 @@
{
"dividers": {
"left": {
"hard": "▌ ",
"soft": "│ "
},
"right": {
"hard": " ▐",
"soft": " │"
}
},
"spaces": 1,
"segment_data": {
"branch": {
"before": "⎇ "
},
"stash": {
"before": "⌆"
},
"cwd": {
"args": {
"ellipsis": "⋯"
}
},
"player": {
"args": {
"state_symbols": {
"fallback": "♫",
"play": "▶",
"pause": "▮▮",
"stop": "■"
}
}
},
"line_current_symbol": {
"contents": "␤ "
},
"time": {
"before": "⌚ "
},
"powerline.segments.common.net.network_load": {
"args": {
"recv_format": "⬇ {value:>8}",
"sent_format": "⬆ {value:>8}"
}
},
"powerline.segments.common.net.hostname": {
"before": "⌂ "
},
"powerline.segments.common.bat.battery": {
"args": {
"full_heart": "♥",
"empty_heart": "♥",
"online": "⚡︎",
"offline": " "
}
},
"powerline.segments.common.sys.uptime": {
"before": "⇑ "
},
"powerline.segments.common.mail.email_imap_alert": {
"before": "✉ "
},
"powerline.segments.common.env.virtualenv": {
"before": "ⓔ "
},
"powerline.segments.common.wthr.weather": {
"args": {
"icons": {
"day": "〇",
"blustery": "⚑",
"rainy": "☔",
"cloudy": "☁",
"snowy": "❅",
"stormy": "☈",
"foggy": "≡",
"sunny": "☼",
"night": "☾",
"windy": "☴",
"not_available": "�",
"unknown": "⚠"
}
}
},
"powerline.segments.common.time.fuzzy_time": {
"args": {
"unicode_text": true
}
},
"powerline.segments.vim.mode": {
"args": {
"override": {
"n": "NORMAL",
"no": "N·OPER",
"v": "VISUAL",
"V": "V·LINE",
"^V": "V·BLCK",
"s": "SELECT",
"S": "S·LINE",
"^S": "S·BLCK",
"i": "INSERT",
"ic": "I·COMP",
"ix": "I·C-X ",
"R": "RPLACE",
"Rv": "V·RPLC",
"Rc": "R·COMP",
"Rx": "R·C-X ",
"c": "COMMND",
"cv": "VIM·EX",
"ce": "NRM·EX",
"r": "PROMPT",
"rm": "-MORE-",
"r?": "CNFIRM",
"!": "!SHELL",
"t": "TERM "
}
}
},
"powerline.segments.vim.visual_range": {
"args": {
"CTRL_V_text": "↕{rows} ↔{vcols}",
"v_text_oneline": "↔{vcols}",
"v_text_multiline": "↕{rows}",
"V_text": "⇕{rows}"
}
},
"powerline.segments.vim.readonly_indicator": {
"args": {
"text": "⊗"
}
},
"powerline.segments.vim.modified_indicator": {
"args": {
"text": "+"
}
},
"powerline.segments.i3wm.scratchpad": {
"args": {
"icons": {
"fresh": "●",
"changed": "○"
}
}
}
}
}
@@ -1,151 +0,0 @@
{
"dividers": {
"left": {
"hard": "▌ ",
"soft": "│ "
},
"right": {
"hard": " ▐",
"soft": " │"
}
},
"spaces": 1,
"segment_data": {
"branch": {
"before": "BR "
},
"stash": {
"before": "ST "
},
"cwd": {
"args": {
"ellipsis": "…"
}
},
"line_current_symbol": {
"contents": "␤ "
},
"player": {
"args": {
"state_symbols": {
"fallback": "♫",
"play": "▶",
"pause": "▮▮",
"stop": "■"
}
}
},
"time": {
"before": ""
},
"powerline.segments.common.net.network_load": {
"args": {
"recv_format": "⇓ {value:>8}",
"sent_format": "⇑ {value:>8}"
}
},
"powerline.segments.common.net.hostname": {
"before": "⌂ "
},
"powerline.segments.common.bat.battery": {
"args": {
"full_heart": "♥",
"empty_heart": "♥",
"online": "⚡︎",
"offline": " "
}
},
"powerline.segments.common.sys.uptime": {
"before": "↑ "
},
"powerline.segments.common.mail.email_imap_alert": {
"before": "MAIL "
},
"powerline.segments.common.env.virtualenv": {
"before": "(e) "
},
"powerline.segments.common.wthr.weather": {
"args": {
"icons": {
"day": "DAY",
"blustery": "WIND",
"rainy": "RAIN",
"cloudy": "CLOUDS",
"snowy": "SNOW",
"stormy": "STORM",
"foggy": "FOG",
"sunny": "SUN",
"night": "NIGHT",
"windy": "WINDY",
"not_available": "NA",
"unknown": "UKN"
}
}
},
"powerline.segments.common.time.fuzzy_time": {
"args": {
"unicode_text": true
}
},
"powerline.segments.vim.mode": {
"args": {
"override": {
"n": "NORMAL",
"no": "N·OPER",
"v": "VISUAL",
"V": "V·LINE",
"^V": "V·BLCK",
"s": "SELECT",
"S": "S·LINE",
"^S": "S·BLCK",
"i": "INSERT",
"ic": "I·COMP",
"ix": "I·C-X ",
"R": "RPLACE",
"Rv": "V·RPLC",
"Rc": "R·COMP",
"Rx": "R·C-X ",
"c": "COMMND",
"cv": "VIM·EX",
"ce": "NRM·EX",
"r": "PROMPT",
"rm": "-MORE-",
"r?": "CNFIRM",
"!": "!SHELL",
"t": "TERM "
}
}
},
"powerline.segments.vim.visual_range": {
"args": {
"CTRL_V_text": "{rows} × {vcols}",
"v_text_oneline": "C:{vcols}",
"v_text_multiline": "L:{rows}",
"V_text": "L:{rows}"
}
},
"powerline.segments.vim.readonly_indicator": {
"args": {
"text": "RO"
}
},
"powerline.segments.vim.modified_indicator": {
"args": {
"text": "+"
}
},
"powerline.segments.i3wm.scratchpad": {
"args": {
"icons": {
"fresh": "●",
"changed": "○"
}
}
}
}
}
@@ -1,151 +0,0 @@
{
"dividers": {
"left": {
"hard": "▌",
"soft": "│"
},
"right": {
"hard": "▐",
"soft": "│"
}
},
"spaces": 0,
"segment_data": {
"branch": {
"before": "B "
},
"stash": {
"before": "S "
},
"cwd": {
"args": {
"use_path_separator": true,
"ellipsis": "…"
}
},
"line_current_symbol": {
"contents": "␤"
},
"player": {
"args": {
"state_symbols": {
"fallback": "♫",
"play": "▶",
"pause": "▮▮",
"stop": "■"
}
}
},
"time": {
"before": ""
},
"powerline.segments.common.net.network_load": {
"args": {
"recv_format": "⇓{value:>8}",
"sent_format": "⇑{value:>8}"
}
},
"powerline.segments.common.net.hostname": {
"before": "⌂"
},
"powerline.segments.common.bat.battery": {
"args": {
"full_heart": "♥",
"empty_heart": "♥",
"online": "⚡︎",
"offline": " "
}
},
"powerline.segments.common.sys.uptime": {
"before": "↑"
},
"powerline.segments.common.mail.email_imap_alert": {
"before": "M "
},
"powerline.segments.common.env.virtualenv": {
"before": "E "
},
"powerline.segments.common.wthr.weather": {
"args": {
"icons": {
"day": "D",
"blustery": "W",
"rainy": "R",
"cloudy": "c",
"snowy": "*",
"stormy": "S",
"foggy": "f",
"sunny": "s",
"night": "N",
"windy": "w",
"not_available": "-",
"unknown": "!"
}
}
},
"powerline.segments.common.time.fuzzy_time": {
"args": {
"unicode_text": true
}
},
"powerline.segments.vim.mode": {
"args": {
"override": {
"n": "NML",
"no": "NOP",
"v": "VIS",
"V": "VLN",
"^V": "VBL",
"s": "SEL",
"S": "SLN",
"^S": "SBL",
"i": "INS",
"ic": "I-C",
"ix": "I^X",
"R": "REP",
"Rv": "VRP",
"Rc": "R-C",
"Rx": "R^X",
"c": "CMD",
"cv": "VEX",
"ce": " EX",
"r": "PRT",
"rm": "MOR",
"r?": "CON",
"!": " SH"
}
}
},
"powerline.segments.vim.visual_range": {
"args": {
"CTRL_V_text": "{rows}×{vcols}",
"v_text_oneline": "↔{vcols}",
"v_text_multiline": "↕{rows}",
"V_text": "⇕{rows}"
}
},
"powerline.segments.vim.readonly_indicator": {
"args": {
"text": "RO"
}
},
"powerline.segments.vim.modified_indicator": {
"args": {
"text": "+"
}
},
"powerline.segments.i3wm.scratchpad": {
"args": {
"icons": {
"fresh": "●",
"changed": "○"
}
}
}
}
}
@@ -1,10 +0,0 @@
{
"segment_data": {
"line_percent": {
"args": {
"gradient": true
},
"after": "%"
}
}
}
-18
View File
@@ -1,18 +0,0 @@
{
"segments": {
"left": [
{
"type": "string",
"contents": "Command Line",
"highlight_groups": ["file_name"]
},
{
"type": "string",
"highlight_groups": ["background"],
"draw_soft_divider": false,
"draw_hard_divider": false,
"width": "auto"
}
]
}
}
-128
View File
@@ -1,128 +0,0 @@
{
"segments": {
"left": [
{
"function": "mode",
"exclude_modes": ["nc"]
},
{
"function": "visual_range",
"include_modes": ["v", "V", "^V", "s", "S", "^S"],
"priority": 10
},
{
"function": "paste_indicator",
"exclude_modes": ["nc"],
"priority": 10
},
{
"function": "powerline.segments.vim.plugin.capslock.capslock_indicator",
"include_modes": ["i", "R", "Rv"],
"priority": 10
},
{
"function": "branch",
"exclude_modes": ["nc"],
"priority": 30
},
{
"function": "readonly_indicator",
"draw_soft_divider": false,
"after": " "
},
{
"function": "file_scheme",
"priority": 20
},
{
"function": "file_directory",
"priority": 40,
"draw_soft_divider": false
},
{
"function": "file_name",
"draw_soft_divider": false
},
{
"function": "file_vcs_status",
"before": " ",
"draw_soft_divider": false
},
{
"function": "modified_indicator",
"before": " "
},
{
"exclude_modes": ["i", "R", "Rv"],
"function": "trailing_whitespace",
"display": false,
"priority": 60
},
{
"exclude_modes": ["nc"],
"function": "powerline.segments.vim.plugin.syntastic.syntastic",
"priority": 50
},
{
"exclude_modes": ["nc"],
"function": "powerline.segments.vim.plugin.tagbar.current_tag",
"draw_soft_divider": false,
"priority": 50
},
{
"type": "string",
"highlight_groups": ["background"],
"draw_soft_divider": false,
"draw_hard_divider": false,
"width": "auto"
}
],
"right": [
{
"function": "file_format",
"draw_soft_divider": false,
"exclude_modes": ["nc"],
"priority": 60
},
{
"function": "file_encoding",
"exclude_modes": ["nc"],
"priority": 60
},
{
"function": "file_type",
"exclude_modes": ["nc"],
"priority": 60
},
{
"function": "line_percent",
"priority": 50,
"width": 4,
"align": "r"
},
{
"function": "csv_col_current",
"priority": 30
},
{
"type": "string",
"name": "line_current_symbol",
"highlight_groups": ["line_current_symbol", "line_current"]
},
{
"function": "line_current",
"draw_soft_divider": false,
"width": 3,
"align": "r"
},
{
"function": "virtcol_current",
"draw_soft_divider": false,
"priority": 20,
"before": ":",
"width": 3,
"align": "l"
}
]
}
}
-36
View File
@@ -1,36 +0,0 @@
{
"segments": {
"left": [
{
"function": "file_name",
"draw_soft_divider": false
},
{
"type": "string",
"highlight_groups": ["background"],
"draw_soft_divider": false,
"draw_hard_divider": false,
"width": "auto"
}
],
"right": [
{
"function": "line_percent",
"priority": 30,
"width": 4,
"align": "r"
},
{
"type": "string",
"name": "line_current_symbol",
"highlight_groups": ["line_current_symbol", "line_current"]
},
{
"function": "line_current",
"draw_soft_divider": false,
"width": 3,
"align": "r"
}
]
}
}
@@ -1,26 +0,0 @@
{
"segments": {
"left": [
{
"type": "string",
"contents": "Command-T",
"highlight_groups": ["commandt:label"]
},
{
"function": "powerline.segments.vim.plugin.commandt.finder"
},
{
"function": "powerline.segments.vim.plugin.commandt.path"
},
{
"type": "string",
"highlight_groups": ["commandt:background"],
"draw_soft_divider": false,
"draw_hard_divider": false,
"width": "auto"
}
],
"right": [
]
}
}
@@ -1,18 +0,0 @@
{
"segments": {
"left": [
{
"type": "string",
"highlight_groups": ["gundo:name", "file_name"],
"contents": "Undo diff"
},
{
"type": "string",
"highlight_groups": ["gundo:background", "background"],
"draw_soft_divider": false,
"draw_hard_divider": false,
"width": "auto"
}
]
}
}
@@ -1,18 +0,0 @@
{
"segments": {
"left": [
{
"type": "string",
"highlight_groups": ["gundo:name", "file_name"],
"contents": "Undo tree"
},
{
"type": "string",
"highlight_groups": ["gundo:background", "background"],
"draw_soft_divider": false,
"draw_hard_divider": false,
"width": "auto"
}
]
}
}
@@ -1,17 +0,0 @@
{
"default_module": "powerline.segments.vim.plugin.nerdtree",
"segments": {
"left": [
{
"function": "nerdtree"
},
{
"type": "string",
"highlight_groups": ["background"],
"draw_soft_divider": false,
"draw_hard_divider": false,
"width": "auto"
}
]
}
}
@@ -1,40 +0,0 @@
{
"segment_data": {
"buffer_name": {
"contents": "Location List"
}
},
"segments": {
"left": [
{
"type": "string",
"name": "buffer_name",
"highlight_groups": ["file_name"]
},
{
"function": "window_title",
"draw_soft_divider": false
},
{
"type": "string",
"highlight_groups": ["background"],
"draw_soft_divider": false,
"draw_hard_divider": false,
"width": "auto"
}
],
"right": [
{
"type": "string",
"name": "line_current_symbol",
"highlight_groups": ["line_current_symbol", "line_current"]
},
{
"function": "line_current",
"draw_soft_divider": false,
"width": 3,
"align": "r"
}
]
}
}
-93
View File
@@ -1,93 +0,0 @@
{
"default_module": "powerline.segments.vim",
"segments": {
"left": [
{
"type": "segment_list",
"function": "powerline.listers.vim.tablister",
"exclude_function": "single_tab",
"segments": [
{
"function": "tab"
},
{
"function": "tabnr",
"after": " ",
"priority": 5
},
{
"function": "file_directory",
"priority": 40
},
{
"function": "file_name",
"args": {
"display_no_file": true
},
"priority": 10
},
{
"function": "tab_modified_indicator",
"priority": 5
}
]
},
{
"function": "tab",
"args": {
"end": true
}
},
{
"type": "segment_list",
"function": "powerline.listers.vim.bufferlister",
"include_function": "single_tab",
"segments": [
{
"function": "bufnr",
"after": " ",
"priority": 5
},
{
"function": "file_directory",
"priority": 40
},
{
"function": "file_name",
"args": {
"display_no_file": true
},
"priority": 10
},
{
"function": "modified_indicator",
"priority": 5
}
]
},
{
"type": "string",
"highlight_groups": ["tab:background"],
"draw_soft_divider": false,
"draw_hard_divider": false,
"width": "auto"
}
],
"right": [
{
"type": "string",
"contents": "Bufs",
"name": "single_tab",
"highlight_groups": ["single_tab"],
"include_function": "single_tab"
},
{
"type": "string",
"contents": "Tabs",
"name": "many_tabs",
"highlight_groups": ["many_tabs"],
"exclude_function": "single_tab"
}
]
}
}
-29
View File
@@ -1,29 +0,0 @@
{
"segments": {
"right": [
{
"function": "powerline.segments.common.wthr.weather",
"priority": 50
},
{
"function": "powerline.segments.common.time.date"
},
{
"function": "powerline.segments.common.time.date",
"name": "time",
"args": {
"format": "%H:%M",
"istime": true
}
},
{
"function": "powerline.segments.common.mail.email_imap_alert",
"priority": 10,
"args": {
"username": "",
"password": ""
}
}
]
}
}
-8
View File
@@ -252,14 +252,6 @@ mime ^ranger/x-terminal-emulator, has konsole = konsole -e "$@"
mime ^ranger/x-terminal-emulator, has gnome-terminal = gnome-terminal -- "$@"
mime ^ranger/x-terminal-emulator, has xterm = xterm -e "$@"
#-------------------------------------------
# Misc
#-------------------------------------------
label wallpaper, number 11, mime ^image, has feh, X = feh --bg-scale "$1"
label wallpaper, number 12, mime ^image, has feh, X = feh --bg-tile "$1"
label wallpaper, number 13, mime ^image, has feh, X = feh --bg-center "$1"
label wallpaper, number 14, mime ^image, has feh, X = feh --bg-fill "$1"
#-------------------------------------------
# Generic file openers
#-------------------------------------------
-187
View File
@@ -1,187 +0,0 @@
{
"command": "waybar",
"layer": "top",
"position": "bottom",
"ipc": true,
"modules-left": [
"tray",
// "custom/cpu_linux",
"cpu",
"temperature",
"memory",
"disk",
"custom/nvidia"
],
"modules-center": [
"sway/window"
],
"modules-right": [
"group/blight",
"custom/colorpicker",
"idle_inhibitor",
"bluetooth",
"group/audio",
"group/networking",
"battery",
"clock"
],
"spacing": 15,
"reload_style_on_change": true,
"clock": {
"format": "{:%a %d.%m.%y | Week: %U | %T}",
"interval": 1,
"tooltip-format": "\n<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>",
"calendar-weeks-pos": "right",
"today-format": "<span color='#ff8800'><b><u>{}</u></b></span>",
"format-calendar": "<span color='#f4c7a1'><b>{}</b></span>",
"format-calendar-weeks": "<span color='#f4c7a1'><b>W{:%V}</b></span>",
"format-calendar-weekdays": "<span color='#f4c7a1'><b>{}</b></span>"
},
"disk": {
"interval": 30,
"format": " {percentage_used}% {free:2} free",
"path": "/"
},
"memory": {
"format": " {percentage}% {used:.1f}/{total:.1f} S: {swapUsed:.1f}/{swapTotal:.1f}"
},
"cpu": {
"interval": 1,
"format": "{usage}% "
},
"custom/cpu_linux": {
"exec": "~/bin/cpu_linux.sh",
"return-type": "json",
"interval": 2,
"format": ": {text}%"
},
"custom/nvidia": {
"exec": "nvidia-smi --query-gpu=utilization.gpu,temperature.gpu --format=csv,nounits,noheader | sed 's/\\([0-9]\\+\\), \\([0-9]\\+\\)/\\1% @ \\2°C/g'",
"format": " {}",
"interval": 4
},
"temperature": {
"format": " {temperatureC}°C",
"hwmon-path": "/sys/devices/platform/coretemp.0/hwmon/hwmon7/temp1_input",
"format-critical": " {temperatureC}°C",
"interval": 1,
"critical-threshold": 80,
"on-click": "psensor"
},
"tray": {
"icon-size": 14,
"spacing": 5
},
"idle_inhibitor": {
"format": "<span font='12'>{icon}</span>",
"format-icons": {
"activated": "󰾪 Presentation mode on",
"deactivated": "󰅶"
}
},
"bluetooth": {
"format-on": "󰂰",
"format-off": "",
"format-disabled": "󰂲",
"format-connected": "󰂴",
"format-connected-battery": "{device_battery_percentage}% 󰂴",
"tooltip-format": "{controller_alias}\t{controller_address}\n\n{num_connections} connected",
"tooltip-format-connected": "{controller_alias}\t{controller_address}\n\n{num_connections} connected\n\n{device_enumerate}",
"tooltip-format-enumerate-connected": "{device_alias}\t{device_address}",
"tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\t{device_battery_percentage}%",
"on-click": "rofi-bluetooth"
},
"pulseaudio": {
"format": "{volume}% {icon}",
"format-bluetooth": "󰂰",
"format-muted": "",
"tooltip-format": "{volume}% {icon}",
"format-icons": {
"headphones": "",
"bluetooth": "󰥰",
"handsfree": "",
"headset": "󱡬",
"phone": "",
"portable": "",
"car": "",
"default": [""]
},
"scroll-step": 5,
"justify": "center",
"on-click": "pamixer -t",
"on-click-right": "pavucontrol",
"on-scroll-up": "pactl set-sink-volume @DEFAULT_SINK@ +5%",
"on-scroll-down": "pactl set-sink-volume @DEFAULT_SINK@ -5%"
},
"pulseaudio#mic": {
"format": "{format_source}",
"format-source": "",
"format-source-muted": "",
"tooltip-format": "{volume}% {format_source} ",
"on-click": "pactl set-source-mute 1 toggle",
"on-scroll-down": "pactl set-source-volume 1 -1%",
"on-scroll-up": "pactl set-source-volume 1 +1%"
},
"group/audio": {
"orientation": "horizontal",
"modules": ["pulseaudio", "pulseaudio#mic"]
},
"group/networking": {
"orientation": "horizontal",
"modules": ["network", "network#speed"]
},
"network": {
"format-wifi": " {essid}",
"format-ethernet": "󰈀",
"format-disconnected": "󱐅",
"tooltip-format": "{ipaddr}",
"tooltip-format-wifi": "{essid} ({signalStrength}%)  \n{ipaddr} | {frequency} MHz{icon}",
"tooltip-format-ethernet": "{ifname} 󰈀 \n{ipaddr} | {frequency} MHz{icon} ",
"tooltip-format-disconnected": "Not Connected",
"on-click": "networkmanager_dmenu"
},
"network#speed": {
"format": "󰁅 {bandwidthDownBits:20} 󰁝 {bandwidthUpBits:20}",
"interval": 1,
"tooltip": true,
"tooltip-format": "{ipaddr}",
"tooltip-format-wifi": "{essid} ({signalStrength}%)  \n{ipaddr} | {frequency} MHz{icon} ",
"tooltip-format-ethernet": "{ifname} 󰈀 \n{ipaddr} | {frequency} MHz{icon} ",
"tooltip-format-disconnected": "Not Connected",
"on-click": "networkmanager_dmenu"
},
"battery": {
"interval": 4,
"states": {
"good": 95,
"warning": 30,
"critical": 20
},
"format": "{capacity}% <span font='16px'>{icon}</span> {power:.2f}W {time}",
"format-time": "{H}h {M}min",
"tooltip": "{time}",
"format-charging": "{capacity}% Full at {timeTo}%",
"format-plugged": "{capacity}% 󰠠",
"format-icons": [
"󰪞", "󰪟", "󰪠", "󰪡",
"󰪢", "󰪣", "󰪤", "󰪥"
]
}
}
-4
View File
@@ -1,4 +0,0 @@
#!/usr/bin/env bash
# Toggle the default PulseAudio sink's mute state.
amixer -D pulse sset Master toggle >/dev/null
-3
View File
@@ -1,3 +0,0 @@
#!/bin/bash
-60
View File
@@ -1,60 +0,0 @@
#!/usr/bin/env bash
check() {
command -v "$1" 1>/dev/null
}
notify() {
check notify-send && {
notify-send -a "Color Picker" "$@"
return
}
echo "$@"
}
loc="$HOME/.cache/colorpicker"
[ -d "$loc" ] || mkdir -p "$loc"
[ -f "$loc/colors" ] || touch "$loc/colors"
limit=10
[[ $# -eq 1 && $1 = "-l" ]] && {
cat "$loc/colors"
exit
}
[[ $# -eq 1 && $1 = "-j" ]] && {
text="$(head -n 1 "$loc/colors")"
mapfile -t allcolors < <(tail -n +2 "$loc/colors")
# allcolors=($(tail -n +2 "$loc/colors"))
tooltip="<b> COLORS</b>\n\n"
tooltip+="-> <b>$text</b> <span color='$text'></span> \n"
for i in "${allcolors[@]}"; do
tooltip+=" <b>$i</b> <span color='$i'></span> \n"
done
cat <<EOF
{ "text":"<span color='$text'></span>", "tooltip":"$tooltip"}
EOF
exit
}
check hyprpicker || {
notify "hyprpicker is not installed"
exit
}
killall -q hyprpicker
color=$(hyprpicker)
check wl-copy && {
echo "$color" | sed -z 's/\n//g' | wl-copy
}
prevColors=$(head -n $((limit - 1)) "$loc/colors")
echo "$color" >"$loc/colors"
echo "$prevColors" >>"$loc/colors"
sed -i '/^$/d' "$loc/colors"
pkill -RTMIN+1 waybar
-54
View File
@@ -1,54 +0,0 @@
#!/bin/bash
# Temp file to store previous readings
tmpfile="/tmp/cpu_prev_all"
# Get all per-core lines
mapfile -t cpu_lines < <(grep '^cpu[0-9]' /proc/stat)
# On first run, save and exit
if [[ ! -f $tmpfile ]]; then
printf "%s\n" "${cpu_lines[@]}" > "$tmpfile"
echo "..." # No previous data
exit 0
fi
# Load previous readings
mapfile -t prev_lines < "$tmpfile"
# Sanity check
if (( ${#cpu_lines[@]} != ${#prev_lines[@]} )); then
echo "..." # Core count mismatch (e.g., suspend/resume)
printf "%s\n" "${cpu_lines[@]}" > "$tmpfile"
exit 0
fi
total_usage=0
for i in "${!cpu_lines[@]}"; do
# Current
read -r cpu user nice system idle iowait irq softirq steal _ _ <<< "${cpu_lines[$i]}"
total_now=$((user + nice + system + idle + iowait + irq + softirq + steal))
idle_now=$((idle + iowait))
# Previous
read -r _ pu pn ps pi piw pir psf pst _ _ <<< "${prev_lines[$i]}"
total_prev=$((pu + pn + ps + pi + piw + pir + psf + pst))
idle_prev=$((pi + piw))
# Deltas
diff_total=$((total_now - total_prev))
diff_idle=$((idle_now - idle_prev))
if ((diff_total > 0)); then
usage=$((100 * (diff_total - diff_idle) / diff_total))
total_usage=$((total_usage + usage))
fi
done
# Output total usage (per-core sum)
#echo '{"usage": ${total_usage}%}'}
printf "{ \"text\": %6.0f, \"tooltip\": \"%s\" }" "$total_usage" "test"
# Save current readings
printf "%s\n" "${cpu_lines[@]}" > "$tmpfile"
-24
View File
@@ -1,24 +0,0 @@
#!/bin/bash
format() {
if [ "$1" -eq 0 ]; then
echo '-'
else
echo "$1"
fi
}
if ! updates_arch="$(checkupdates | wc -l)"; then
updates_arch=0
fi
if ! updates_aur="$(yay -Qum 2>/dev/null | wc -l)"; then
updates_aur=0
fi
updates="$((updates_arch + updates_aur))"
if [ "$updates" -gt 0 ]; then
echo " ($(format $updates_arch)/$(format $updates_aur))"
else
echo
fi
-22
View File
@@ -1,22 +0,0 @@
#!/bin/bash
pkgmgr="pacman"
hash paru 2>/dev/null && pkgmgr="paru"
hash yay 2>/dev/null && pkgmgr="yay"
IFS=$'\n'$'\r'
updatesli=($($pkgmgr -Qu))
text=${#updatesli[@]}
icon=""
[ $text -eq 0 ] && icon="" || icon="📦"
for i in ${updatesli[@]}
do
tooltip+="$i\n"
done
cat << EOF
{ "text":"$icon", "tooltip":"UPDATES: $text"}
EOF
-10
View File
@@ -1,10 +0,0 @@
#!/bin/bash
if [ -f /sys/class/power_supply/BAT*/current_now ]; then
powerDraw="󰠰 $(($(cat /sys/class/power_supply/BAT*/current_now)/1000000))w"
fi
cat << EOF
{ "text":"$powerDraw", "tooltip":"power Draw $powerDraw"}
EOF
-24
View File
@@ -1,24 +0,0 @@
#!/bin/sh
BSSIDS="$(nmcli device wifi list |
awk 'NR>1 {if ($1 != "*") {print $1}}' |
tr -d ":" |
tr "\n" ",")"
LOC=""
REQUEST_GEO="$(wget -qO - http://openwifi.su/api/v1/bssids/"$BSSIDS")"
if [[ "$(jq ".count_results" <<< "$REQUEST_GEO")" -gt 0 ]] ; then
LAT="$(jq ".lat" <<< "$REQUEST_GEO")"
LON="$(jq ".lon" <<< "$REQUEST_GEO")"
LOC="$LAT,$LON"
fi
text="$(curl -s "https://wttr.in/$LOC?format=1" | sed 's/ //g')"
tooltip="$(curl -s "https://wttr.in/$LOC?0QT" |
sed 's/\\/\\\\/g' |
sed ':a;N;$!ba;s/\n/\\n/g' |
sed 's/"/\\"/g')"
if ! grep -q "Unknown location" <<< "$text"; then
echo "{\"text\": \"$text\", \"tooltip\": \"<tt>$tooltip</tt>\", \"class\": \"weather\"}"
fi
-88
View File
@@ -1,88 +0,0 @@
/* Noctalia Ember OLED: near-black surfaces, warm amber focus. */
* {
font-family: "JetBrainsMono Nerd Font,JetBrainsMono NF";
color: #fff1e6;
}
window#waybar,
.modules-right,
.modules-center,
.modules-left {
background: #050403;
}
#battery,
#custom-clipboard,
#custom-colorpicker,
#custom-powerDraw,
#bluetooth,
#pulseaudio,
#network,
#disk,
#memory,
#backlight,
#cpu,
#temperature,
#custom-weather,
#idle_inhibitor,
#jack,
#tray,
#window,
#workspaces,
#clock {
min-width: 1ex;
padding-right: 5px;
}
#tray menu * {
color: #050403;
}
#cpu {
/* "100% " fits in this box; fixed width prevents sibling modules shifting. */
min-width: 7ch;
max-width: 7ch;
text-align: right;
}
#temperature.critical,
#pulseaudio {
min-width: 5ex;
}
#pulseaudio.muted,
#pulseaudio.mic:not(.source-muted) {
color: #ff6b4a;
}
#pulseaudio.mic.muted {
color: #6e4a31;
}
#clock {
color: #ff8800;
}
#battery.charging {
color: #1a0d00;
background-color: #c98a45;
}
#battery.warning:not(.charging) {
background-color: #ffb05c;
color: #2b1600;
}
#battery.critical:not(.charging) {
background-color: #ff6b4a;
color: #2b0700;
animation-name: blink;
animation-duration: 0.5s;
animation-timing-function: linear;
animation-iteration-count: infinite;
animation-direction: alternate;
}
#network.speed {
min-width: 30ex;
}
+3
View File
@@ -17,3 +17,6 @@
.local/share/noctalia/plugins/knowledge-lookup/
.local/share/noctalia/plugins/pi-status-bridge/
.local/share/noctalia/plugins/system-status/
# Local Pi runtime state
.atl/
@@ -0,0 +1,367 @@
import assert from "node:assert/strict";
import { spawn } from "node:child_process";
import { mkdtemp, mkdir, readFile, rm, writeFile } from "node:fs/promises";
import { createServer } from "node:http";
import { tmpdir } from "node:os";
import { dirname, join } from "node:path";
import { fileURLToPath } from "node:url";
import test from "node:test";
import {
createLocalAiModelsExtension,
discoverLocalAiModels,
mapLocalAiModels,
resolveConfigValue,
} from "./index.ts";
function response(data: unknown, status = 200) {
return new Response(JSON.stringify(data), {
status,
headers: { "content-type": "application/json" },
});
}
async function configFile() {
const root = await mkdtemp(join(tmpdir(), "localai-models-"));
const path = join(root, "models.json");
await writeFile(path, JSON.stringify({
providers: {
localai: {
baseUrl: "http://local.invalid/v1",
apiKey: "local-test",
compat: {
supportsDeveloperRole: false,
supportsReasoningEffort: false,
maxTokensField: "max_tokens",
},
},
},
}));
return { root, path };
}
function abortAwareFetch(): typeof fetch {
return async (_url, init) => new Promise<Response>((_resolve, reject) => {
const signal = init?.signal;
const abort = () => reject(signal?.reason ?? new DOMException("Aborted", "AbortError"));
if (signal?.aborted) abort();
else signal?.addEventListener("abort", abort, { once: true });
});
}
async function runPiCatalog(agentDir: string) {
const sessionDir = join(agentDir, "sessions");
await mkdir(sessionDir, { recursive: true });
const child = spawn("pi", ["--mode", "rpc", "--session-dir", sessionDir], {
cwd: agentDir,
detached: true,
env: { ...process.env, PI_CODING_AGENT_DIR: agentDir },
stdio: ["pipe", "pipe", "pipe"],
});
try {
return await new Promise<any[]>((resolve, reject) => {
let buffer = "";
const timeout = setTimeout(() => reject(new Error("Pi RPC catalog probe timed out")), 15_000);
child.stdout.setEncoding("utf8");
child.stdout.on("data", (chunk: string) => {
buffer += chunk;
while (buffer.includes("\n")) {
const newline = buffer.indexOf("\n");
const line = buffer.slice(0, newline);
buffer = buffer.slice(newline + 1);
if (!line.trim()) continue;
const frame = JSON.parse(line);
if (frame.type === "response" && frame.id === "catalog-test") {
clearTimeout(timeout);
if (!frame.success) reject(new Error(frame.error ?? "Pi RPC catalog probe failed"));
else resolve(frame.data?.models ?? []);
}
}
});
child.once("error", reject);
child.once("exit", (code) => reject(new Error(`Pi exited before catalog response (${code})`)));
child.stdin.write(`${JSON.stringify({ type: "get_available_models", id: "catalog-test" })}\n`);
});
} finally {
if (child.pid) {
try { process.kill(-child.pid, "SIGTERM"); } catch {}
}
}
}
test("maps unique chat models, stamps compatibility, and filters obvious non-chat families", () => {
const compat = { supportsDeveloperRole: false, maxTokensField: "max_tokens" };
const models = mapLocalAiModels([
{ id: "qwen3.8-27b-q4" },
{ id: "qwen3.8-27b-heretic-abliterated-uncensored" },
{ id: "qwen3.8-27b-q4" },
{ id: "qwen3-asr-1.7b" },
{ id: "whisper-large-v3" },
{ id: "bge-m3" },
{ id: "nomic-embed-text" },
{ id: "flux.2-klein-9b" },
{ id: "sd-3.5-large-ggml" },
], compat);
assert.deepEqual(models.map((model) => model.id), [
"qwen3.8-27b-heretic-abliterated-uncensored",
"qwen3.8-27b-q4",
]);
assert.deepEqual(models[0].compat, compat);
});
test("resolves literal, interpolated, escaped, and command-backed config values", async () => {
const previous = process.env.LOCALAI_TEST_KEY;
const previousEmpty = process.env.LOCALAI_EMPTY_KEY;
process.env.LOCALAI_TEST_KEY = "environment-key";
process.env.LOCALAI_EMPTY_KEY = "";
try {
assert.equal(await resolveConfigValue("literal-key"), "literal-key");
assert.equal(await resolveConfigValue("$LOCALAI_TEST_KEY"), "environment-key");
assert.equal(await resolveConfigValue("prefix-${LOCALAI_TEST_KEY}"), "prefix-environment-key");
assert.equal(await resolveConfigValue("$$money-$!bang"), "$money-!bang");
assert.equal(await resolveConfigValue("!printf command-key"), "command-key");
assert.equal(await resolveConfigValue("$MISSING_LOCALAI_KEY"), undefined);
assert.equal(await resolveConfigValue("$LOCALAI_EMPTY_KEY"), undefined);
assert.equal(await resolveConfigValue("prefix-${LOCALAI_EMPTY_KEY}"), undefined);
} finally {
if (previous === undefined) delete process.env.LOCALAI_TEST_KEY;
else process.env.LOCALAI_TEST_KEY = previous;
if (previousEmpty === undefined) delete process.env.LOCALAI_EMPTY_KEY;
else process.env.LOCALAI_EMPTY_KEY = previousEmpty;
}
});
test("aborts command-backed auth resolution with the caller signal", async () => {
const root = await mkdtemp(join(tmpdir(), "localai-command-abort-"));
const pidFile = join(root, "child.pid");
const controller = new AbortController();
const startedAt = Date.now();
try {
const resolving = resolveConfigValue(
`!sleep 30 & child=$!; printf '%s' "$child" > '${pidFile}'; wait`,
20_000,
controller.signal,
);
let childPid = 0;
for (let attempt = 0; attempt < 100 && !childPid; attempt += 1) {
try {
childPid = Number((await readFile(pidFile, "utf8")).trim());
} catch {}
if (!childPid) await new Promise((resolve) => setTimeout(resolve, 5));
}
assert.ok(childPid > 0, "descendant pid was recorded");
controller.abort(new DOMException("Cancelled", "AbortError"));
await assert.rejects(resolving, /abort|cancel/i);
for (let attempt = 0; attempt < 100; attempt += 1) {
try {
process.kill(childPid, 0);
} catch {
childPid = 0;
break;
}
await new Promise((resolve) => setTimeout(resolve, 5));
}
assert.equal(childPid, 0, "descendant process was terminated");
assert.ok(Date.now() - startedAt < 1_500, "abort settled promptly");
} finally {
await rm(root, { recursive: true, force: true });
}
});
test("discovers changing payload variants without caching and sends auth only when resolved", async () => {
let call = 0;
const seenHeaders: Array<HeadersInit | undefined> = [];
const fetchImpl: typeof fetch = async (_url, init) => {
call += 1;
seenHeaders.push(init?.headers);
return call === 1
? response({ data: [{ id: "qwen3.8-27b-q4" }] })
: response({ models: [{ id: "new-chat-model" }] });
};
const first = await discoverLocalAiModels(
{ baseUrl: "http://local.invalid/v1", apiKey: "local" },
{ fetch: fetchImpl },
);
const second = await discoverLocalAiModels(
{ baseUrl: "http://local.invalid/v1" },
{ fetch: fetchImpl },
);
assert.deepEqual(first.map((model) => model.id), ["qwen3.8-27b-q4"]);
assert.deepEqual(second.map((model) => model.id), ["new-chat-model"]);
assert.deepEqual(seenHeaders[0], { Authorization: "Bearer local" });
assert.equal(seenHeaders[1], undefined);
});
test("rejects malformed, failed, timed-out, and externally aborted discovery", async () => {
const settings = { baseUrl: "http://local.invalid/v1" };
await assert.rejects(
discoverLocalAiModels(settings, { fetch: async () => response({ object: "list" }) }),
/malformed payload/,
);
await assert.rejects(
discoverLocalAiModels(settings, { fetch: async () => response({}, 503) }),
/HTTP 503/,
);
await assert.rejects(
discoverLocalAiModels(settings, { fetch: abortAwareFetch(), timeoutMs: 5 }),
/timeout|abort/i,
);
const controller = new AbortController();
controller.abort(new DOMException("Cancelled", "AbortError"));
await assert.rejects(
discoverLocalAiModels(settings, { fetch: abortAwareFetch(), signal: controller.signal }),
/cancel|abort/i,
);
});
test("registers startup models with compatibility and refresh replaces them", async () => {
const { root, path } = await configFile();
try {
let call = 0;
const fetchImpl: typeof fetch = async () => {
call += 1;
return response({ data: [{ id: call === 1 ? "qwen3.8-27b-q4" : "next-chat-model" }] });
};
let registered: any;
const pi = {
registerProvider(_id: string, config: unknown) {
registered = config;
},
on() {},
};
await createLocalAiModelsExtension({ configPath: path, fetch: fetchImpl })(pi as any);
assert.deepEqual(registered.models.map((model: any) => model.id), ["qwen3.8-27b-q4"]);
assert.deepEqual(registered.models[0].compat, {
supportsDeveloperRole: false,
supportsReasoningEffort: false,
maxTokensField: "max_tokens",
});
const refreshed = await registered.refreshModels({ signal: new AbortController().signal });
assert.deepEqual(refreshed.map((model: any) => model.id), ["next-chat-model"]);
assert.deepEqual(refreshed[0].compat, registered.models[0].compat);
} finally {
await rm(root, { recursive: true, force: true });
}
});
test("Pi startup composes discovered models with configured overrides", async () => {
const root = await mkdtemp(join(tmpdir(), "localai-pi-integration-"));
const server = createServer((request, responseStream) => {
if (request.url === "/v1/models") {
responseStream.writeHead(200, { "content-type": "application/json" });
responseStream.end(JSON.stringify({
data: [
{ id: "qwen3.8-27b-heretic-abliterated-uncensored" },
{ id: "qwen3.8-27b-q4" },
],
}));
return;
}
responseStream.writeHead(404).end();
});
await new Promise<void>((resolve) => server.listen(0, "127.0.0.1", resolve));
try {
const address = server.address() as { port: number };
const extensionPath = join(dirname(fileURLToPath(import.meta.url)), "index.ts");
await writeFile(join(root, "settings.json"), JSON.stringify({ extensions: [extensionPath] }));
await writeFile(join(root, "models.json"), JSON.stringify({
providers: {
localai: {
baseUrl: `http://127.0.0.1:${address.port}/v1`,
api: "openai-completions",
apiKey: "local-test",
compat: {
supportsDeveloperRole: false,
supportsReasoningEffort: false,
maxTokensField: "max_tokens",
},
modelOverrides: {
"qwen3.8-27b-heretic-abliterated-uncensored": {
name: "Overridden Heretic Name",
input: ["text", "image"],
},
},
},
},
}));
const models = (await runPiCatalog(root)).filter((model) => model.provider === "localai");
assert.deepEqual(models.map((model) => model.id).sort(), [
"qwen3.8-27b-heretic-abliterated-uncensored",
"qwen3.8-27b-q4",
]);
const overridden = models.find((model) => model.id.includes("heretic"));
assert.equal(overridden.name, "Overridden Heretic Name");
assert.deepEqual(overridden.input, ["text", "image"]);
assert.deepEqual(overridden.compat, {
supportsDeveloperRole: false,
supportsReasoningEffort: false,
maxTokensField: "max_tokens",
});
} finally {
await new Promise<void>((resolve) => server.close(() => resolve()));
await rm(root, { recursive: true, force: true });
}
});
test("successful startup followed by outage returns an empty refreshed catalog", async () => {
const { root, path } = await configFile();
const originalWarn = console.warn;
console.warn = () => {};
try {
let call = 0;
let registered: any;
const pi = {
registerProvider(_id: string, config: unknown) {
registered = config;
},
on() {},
};
await createLocalAiModelsExtension({
configPath: path,
fetch: async () => {
call += 1;
if (call === 1) return response({ data: [{ id: "qwen3.8-27b-q4" }] });
throw new Error("offline");
},
})(pi as any);
assert.deepEqual(registered.models.map((model: any) => model.id), ["qwen3.8-27b-q4"]);
assert.deepEqual(await registered.refreshModels({ signal: new AbortController().signal }), []);
} finally {
console.warn = originalWarn;
await rm(root, { recursive: true, force: true });
}
});
test("continues with an empty catalog and warning when LocalAI is unavailable", async () => {
const { root, path } = await configFile();
const originalWarn = console.warn;
const warnings: string[] = [];
console.warn = (message?: unknown) => warnings.push(String(message));
try {
let registered: any;
let sessionStart: ((event: unknown, ctx: any) => void) | undefined;
const pi = {
registerProvider(_id: string, config: unknown) {
registered = config;
},
on(event: string, handler: (event: unknown, ctx: any) => void) {
if (event === "session_start") sessionStart = handler;
},
};
await createLocalAiModelsExtension({
configPath: path,
fetch: async () => { throw new Error("offline"); },
})(pi as any);
assert.deepEqual(registered.models, []);
assert.deepEqual(await registered.refreshModels({ signal: new AbortController().signal }), []);
const notices: unknown[] = [];
sessionStart?.({}, {
hasUI: true,
ui: { notify: (...args: unknown[]) => notices.push(args) },
});
assert.equal(notices.length, 1);
assert.ok(warnings.length >= 1);
} finally {
console.warn = originalWarn;
await rm(root, { recursive: true, force: true });
}
});
@@ -0,0 +1,252 @@
import { spawn } from "node:child_process";
import { readFile } from "node:fs/promises";
import { homedir } from "node:os";
import { join } from "node:path";
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
const PROVIDER_ID = "localai";
const DEFAULT_TIMEOUT_MS = 5_000;
const NON_CHAT_MODEL = /(?:^|[-_.])(?:asr|stt|tts|whisper|speech|embed|embedding|embeddings|rerank|bge|e5|flux|sd)(?:$|[-_.])|nomic[-_.]?embed|stable[-_.]?diffusion/i;
type FetchLike = typeof fetch;
type ProviderSettings = {
baseUrl: string;
apiKey?: string;
compat?: Record<string, unknown>;
};
type ModelsFile = {
providers?: Record<string, {
baseUrl?: unknown;
apiKey?: unknown;
compat?: unknown;
}>;
};
type RemoteModel = { id?: unknown; name?: unknown } | string;
export type LocalAiModel = {
id: string;
name: string;
reasoning: false;
input: ["text"];
cost: { input: 0; output: 0; cacheRead: 0; cacheWrite: 0 };
contextWindow: 128_000;
maxTokens: 16_384;
compat?: Record<string, unknown>;
};
function agentDirectory() {
return process.env.PI_CODING_AGENT_DIR ?? join(homedir(), ".pi", "agent");
}
function runShellCommand(command: string, timeoutMs: number, signal?: AbortSignal) {
return new Promise<string>((resolve, reject) => {
const child = spawn("/bin/sh", ["-lc", command], {
detached: true,
stdio: ["ignore", "pipe", "pipe"],
});
let stdout = "";
let settled = false;
let forceKill: ReturnType<typeof setTimeout> | undefined;
const killGroup = (signalName: NodeJS.Signals) => {
if (!child.pid) return;
try {
process.kill(-child.pid, signalName);
} catch {}
};
const cleanup = () => {
clearTimeout(timeout);
signal?.removeEventListener("abort", onAbort);
};
const finish = (error?: Error, value?: string) => {
if (settled) return;
settled = true;
cleanup();
child.stdout.destroy();
child.stderr.destroy();
child.unref();
if (error) reject(error);
else resolve(value ?? "");
};
const terminate = (error: Error) => {
killGroup("SIGTERM");
forceKill = setTimeout(() => killGroup("SIGKILL"), 250);
forceKill.unref();
finish(error);
};
const onAbort = () => terminate(
signal?.reason instanceof Error
? signal.reason
: new DOMException("Cancelled", "AbortError"),
);
const timeout = setTimeout(
() => terminate(new DOMException("Command timed out", "TimeoutError")),
timeoutMs,
);
timeout.unref();
if (signal?.aborted) {
onAbort();
return;
}
signal?.addEventListener("abort", onAbort, { once: true });
child.stdout.setEncoding("utf8");
child.stdout.on("data", (chunk: string) => {
stdout += chunk;
if (stdout.length > 64 * 1024) {
terminate(new Error("Command output exceeded 64KB"));
}
});
child.on("error", (error) => finish(error));
child.on("close", (code) => {
if (code === 0) finish(undefined, stdout.trim());
else finish(new Error(`Command exited with status ${code ?? "unknown"}`));
});
});
}
export async function resolveConfigValue(
value: string | undefined,
timeoutMs = DEFAULT_TIMEOUT_MS,
signal?: AbortSignal,
) {
if (!value) return undefined;
if (value.startsWith("!")) {
const command = value.slice(1).trim();
if (!command) return undefined;
return (await runShellCommand(command, timeoutMs, signal)) || undefined;
}
const dollar = "\u0000LOCALAI_DOLLAR\u0000";
const bang = "\u0000LOCALAI_BANG\u0000";
let resolved = value.replace(/\$\$/g, dollar).replace(/\$!/g, bang);
let missing = false;
resolved = resolved.replace(
/\$\{([A-Za-z_][A-Za-z0-9_]*)\}|\$([A-Za-z_][A-Za-z0-9_]*)/g,
(_match, braced: string | undefined, plain: string | undefined) => {
const environmentValue = process.env[braced ?? plain ?? ""];
if (!environmentValue) missing = true;
return environmentValue ?? "";
},
);
if (missing) return undefined;
return resolved.replaceAll(dollar, "$").replaceAll(bang, "!");
}
export function modelsEndpoint(baseUrl: string) {
return `${baseUrl.replace(/\/+$/, "")}/models`;
}
export function mapLocalAiModels(
entries: RemoteModel[],
compat?: Record<string, unknown>,
): LocalAiModel[] {
const seen = new Set<string>();
const models: LocalAiModel[] = [];
for (const entry of entries) {
const id = (typeof entry === "string" ? entry : entry?.id)?.toString().trim();
if (!id || seen.has(id) || NON_CHAT_MODEL.test(id)) continue;
seen.add(id);
const remoteName = typeof entry === "object" && typeof entry.name === "string" ? entry.name.trim() : "";
models.push({
id,
name: remoteName || `${id} (LocalAI)`,
reasoning: false,
input: ["text"],
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
contextWindow: 128_000,
maxTokens: 16_384,
...(compat ? { compat: { ...compat } } : {}),
});
}
return models.sort((left, right) => left.name.localeCompare(right.name));
}
export async function discoverLocalAiModels(
settings: ProviderSettings,
options: { fetch?: FetchLike; signal?: AbortSignal; timeoutMs?: number } = {},
) {
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
const fetchImpl = options.fetch ?? fetch;
const timeout = AbortSignal.timeout(timeoutMs);
const signal = options.signal ? AbortSignal.any([options.signal, timeout]) : timeout;
const apiKey = await resolveConfigValue(settings.apiKey, timeoutMs, signal);
const response = await fetchImpl(modelsEndpoint(settings.baseUrl), {
headers: apiKey ? { Authorization: `Bearer ${apiKey}` } : undefined,
signal,
});
if (!response.ok) throw new Error(`LocalAI model discovery failed with HTTP ${response.status}`);
const payload = await response.json() as { data?: unknown; models?: unknown };
const entries = Array.isArray(payload.data) ? payload.data : Array.isArray(payload.models) ? payload.models : undefined;
if (!entries) throw new Error("LocalAI model discovery returned a malformed payload");
return mapLocalAiModels(entries as RemoteModel[], settings.compat);
}
export function createLocalAiModelsExtension(options: {
configPath?: string;
fetch?: FetchLike;
timeoutMs?: number;
} = {}) {
return async function localAiModelsExtension(pi: ExtensionAPI) {
const configPath = options.configPath ?? join(agentDirectory(), "models.json");
let settings: ProviderSettings;
try {
const config = JSON.parse(await readFile(configPath, "utf8")) as ModelsFile;
const provider = config.providers?.[PROVIDER_ID];
if (!provider || typeof provider.baseUrl !== "string" || !provider.baseUrl.trim()) {
console.warn("LocalAI provider configuration is missing; continuing without LocalAI models.");
return;
}
settings = {
baseUrl: provider.baseUrl,
apiKey: typeof provider.apiKey === "string" ? provider.apiKey : undefined,
compat: provider.compat && typeof provider.compat === "object"
? { ...(provider.compat as Record<string, unknown>) }
: undefined,
};
} catch {
console.warn("LocalAI provider configuration could not be read; continuing without LocalAI models.");
return;
}
let startupFailed = false;
let initialModels: LocalAiModel[] = [];
try {
initialModels = await discoverLocalAiModels(settings, {
fetch: options.fetch,
timeoutMs: options.timeoutMs,
});
} catch {
startupFailed = true;
console.warn("LocalAI model discovery unavailable; continuing without LocalAI models.");
}
pi.registerProvider(PROVIDER_ID, {
name: "LocalAI",
baseUrl: settings.baseUrl,
apiKey: settings.apiKey,
api: "openai-completions",
models: initialModels,
async refreshModels({ signal }: { signal: AbortSignal }) {
try {
return await discoverLocalAiModels(settings, {
fetch: options.fetch,
signal,
timeoutMs: options.timeoutMs,
});
} catch {
console.warn("LocalAI model refresh unavailable; continuing without LocalAI models.");
return [];
}
},
});
if (startupFailed) {
pi.on("session_start", (_event, ctx) => {
if (ctx.hasUI) ctx.ui.notify("LocalAI unavailable; continuing without LocalAI models.", "warning");
});
}
};
}
export default createLocalAiModelsExtension();
@@ -86,6 +86,7 @@
"command -v *": "allow",
"find *": "allow",
"hypa *": "allow",
"hypa_find *": "allow",
"git status": "allow",
"git status *": "allow",
+23 -1
View File
@@ -10,7 +10,10 @@
},
"gpt-5.6-luna": {
"contextWindow": 1050000
}
},
"gpt-6-astra": {
"contextWindow": 1050000
}
}
},
"openai-codex": {
@@ -25,6 +28,25 @@
"contextWindow": 1050000
}
}
},
"localai": {
"baseUrl": "http://127.0.0.1:8080/v1",
"api": "openai-completions",
"apiKey": "localai",
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": false,
"maxTokensField": "max_tokens"
},
"modelOverrides": {
"qwen3.8-27b-heretic-abliterated-uncensored": {
"name": "Qwen 3.8 27B Heretic (LocalAI)",
"input": [
"text",
"image"
]
}
}
}
}
}
+15 -6
View File
@@ -1,8 +1,8 @@
{
"quietStartup": true,
"lastChangelogVersion": "0.80.10",
"lastChangelogVersion": "0.85.1",
"defaultProvider": "openai-codex",
"defaultModel": "gpt-5.6-terra",
"defaultModel": "gpt-5.6-sol",
"defaultThinkingLevel": "high",
"packages": [
"npm:pi-subagents",
@@ -14,15 +14,22 @@
"npm:@juicesharp/rpiv-btw",
"npm:pi-powerline-footer",
"npm:pi-studio",
"npm:pi-ui-design",
"npm:pi-frontend-check",
"npm:@senad-d/drawme",
"npm:pi-powerpoint",
"npm:@joemccann/pi-pdf",
"npm:pi-universal-view",
"npm:@hypabolic/pi-hypa",
"npm:bigpowers",
"npm:@gotgenes/pi-permission-system",
"npm:pi-intercom",
"npm:gentle-engram@0.1.8",
"npm:pi-lens",
"npm:@juicesharp/rpiv-todo",
"npm:@majorgilles/pi-grill-me",
"npm:pi-mcp-adapter"
"npm:pi-mcp-adapter",
"npm:pi-caveman",
"npm:@dietrichgebert/ponytail"
],
"powerline": "full",
"hideThinkingBlock": false,
@@ -30,5 +37,7 @@
"prompts/english-default.md",
"prompts/todo-hygiene.md"
],
"theme": "dark"
}
"theme": "dark",
"transport": "auto",
"tuiMode": "fullscreen"
}
-19
View File
@@ -1,19 +0,0 @@
# script for updating all packages but excluding a list of packages
# set path to list of packages to exclude
exclude_list_file=~/.setup/packages/exclude_from_updating.list
# load list of packages to exclude
exclude_list=$(cat $exclude_list_file)
# define function that calls yay update and excludes packages from exclude_list
function update_system {
yay -Syu --noconfirm --needed --noprovides --ignore $exclude_list
}
# also define function that only updates packages from pacman
function update_pacman_packages {
sudo pacman -Syu --noconfirm --needed --noprovides --ignore $exclude_list
}
@@ -1,39 +0,0 @@
#!/bin/bash
set -e
service_directory="/etc/dinit.d"
logfile_directory="/var/log/dinit"
logfile_extenstion="log"
overwrite=false
while getopts ":o" opt; do
case $opt in
o)
overwrite=true
echo "Overwriting existing logfile specifications..."
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
esac
done
for file in "$service_directory"/* ; do
if [[ -f "$file" ]]; then
service_name=$(basename "$file")
if $overwrite; then
echo "Removing logfile specification for $service_name"
sudo sed -i '/^logfile/d' "$file"
fi
if ! grep -q "^logfile = \w+$" "$file"; then
logfile_path="$logfile_directory/$service_name.$logfile_extenstion"
echo "logfile = $logfile_path" | sudo tee -a "$file"
echo "Added logfile $logfile_Path to service $service_name"
else
echo "Service $service_name already has logfile specified"
fi
fi
done
-40
View File
@@ -1,40 +0,0 @@
# read list of packages to exclude from update
exclude_list_file=~/.setup/packages/exclude_from_updating.list
exclude_list=$(cat $exclude_list_file)
pacman_config_file=/etc/pacman.conf
# get current IngorePkg line from pacman.conf
# line may have # at the beginning
old_ignore_line=$(grep -P "^#?IgnorePkg" $pacman_config_file)
echo old_ignore_line: $old_ignore_line
# split line at = and take second part
old_packages_line=$(echo $old_ignore_line | cut -d= -f2)
echo old_packages_line: $old_packages_line
# extract list of packages from line, separated by spaces
old_ignore_packages=$(echo $old_packages_line| tr -s ' ' '\n')
echo old_packages: $old_packages
# add packages to ignore line, if not already there
new_ignore_packages=$old_ignore_packages
for package in $exclude_list; do
if [[ ! $old_ignore_packages =~ $package ]]; then
new_ignore_packages="$new_ignore_packages $package"
fi
done
# join packages with spaces
new_ignore_packages_line=$(echo $new_ignore_packages | tr '\n' ' ')
echo new_ignore_packages_line: $new_ignore_packages_line
# add IgnorePkg= to beginning of line
new_ignore_line="IgnorePkg = $new_ignore_packages_line"
echo new_ignore_line: $new_ignore_line
# replace old IgnorePkg line with new one
echo "updating pacman.conf"
sudo sed -i "s/$old_ignore_line/$new_ignore_line/" $pacman_config_file
echo "done"
-9
View File
@@ -1,9 +0,0 @@
Section "InputClass"
Identifier "touchpad"
Driver "libinput"
MatchIsTouchpad "on"
Option "Tapping" "on"
Option "TappingButtonMap" "lrm"
Option "NaturalScrolling" "true"
Option "ClickMethod" "clickfinger"
EndSection
-1
View File
@@ -1 +0,0 @@
xdg-mime default firefox.desktop x-scheme-handler/https x-scheme-handler/http &
-22
View File
@@ -1,22 +0,0 @@
#!/bin/bash
config_file_name="30-touchpad.conf"
config_folder="/etc/X11/xorg.conf.d/"
resources_folder="$(dirname "$0")/resources"
if [ ! -f "$config_folder/$config_file_name" ]; then
if [ -f "$resources_folder/$config_file_name" ]; then
cp "$resources_folder/$config_file_name" "$config_folder/$config_file_name"
if [ -f "$config_folder/$config_file_name" ]; then
echo "File copied successfully."
else
echo "Error copying file"
fi
else
echo "Error: Resource file not found."
fi
else
echo "File already exists."
fi
-25
View File
@@ -1,25 +0,0 @@
os-prober
openssh
ntfs-3g
jdk-openjdk
bluez
bluez-utils
autorandr
wireless_tools
playerctl
pulseaudio
picom
psensor
powertop
htop
unzip
hunspell-de
gnome-keyring
xclip
xorg-xwininfo
gvfs-smb
avahi
python-pip
man-db
fcron
linux-headers
-41
View File
@@ -1,41 +0,0 @@
zsh
tmux
sddm
zsh-theme-powerlevel10k
tff-meslo-nerd-font-powerlevel10k
powerline
i3-wm
termite
alacritty
rofi
ranger
polybar
blueman
simplescreenrecorder
redshift
flameshot
network-manager-applet
mullvad-vpn-beta-bin
ueberzug
pcmanfm
pavucontrol
lxrandr
ttf-icomoon-feather
nextcloud-client
brave-bin
firefox
thunderbird
signal-desktop
smplayer
qbittorrent
qalculate-gtk
evince
okular
pamixer
xbindkeys
xorg-xmodmap
dunst
ksysguard
xorg-xsetroot
xorg-xrdb
vlc
-17
View File
@@ -1,17 +0,0 @@
docker
docker-compose
podman
vagrant
postman-bin
beekeeper-studio-bin
code-insiders
pycharm-professional
mongodb-compass
yarn
npm
texlive-most
texlive-latexindent-meta
biber
-12
View File
@@ -1,12 +0,0 @@
backlight-dinit
bluez-dinit
dbus-dinit
dhcpcd-dinit
dinit
dinit-base
dinit-rc
elogind-dinit
mullvad-vpn-dinit
networkmanager-dinit
sddm-dinit
tlp-dinit
@@ -1,2 +0,0 @@
cuda
cudnn
-5
View File
@@ -1,5 +0,0 @@
wine
lutris
lib32-libpulse
winetricks
steam
-6
View File
@@ -1,6 +0,0 @@
backlight
bluez
dhcpcd
mullvad-vpn
networkmanager
sddm
-2
View File
@@ -147,8 +147,6 @@ bindkey '5D' backward-word
bindkey '5C' forward-word
bindkey '^[[3~' delete-char
powerline-config tmux setup
alias vim=nvim
alias sudo='sudo '
+99
View File
@@ -0,0 +1,99 @@
# Agent Guide: Alex's Dotfiles
## Repository and safety model
This directory (`/home/alex`) is the **yadm worktree** for personal, Arch-oriented dotfiles. Use `yadm` (rather than assuming a conventional clone) for status, diff, and tracked-file operations.
- This is machine-specific configuration, **not** a bootstrap installer. There is no authoritative root install, link, overwrite, backup, or rollback command.
- Preserve `##class.*` filename variants; they are yadm alternatives for machine classes.
- Do not expose, copy, or add private hostnames, IP addresses, account names, tokens, or credentials. Keep machine-specific secrets in local/private configuration.
- Scope changes narrowly. Do not reformat unrelated dotfiles or overwrite existing user changes.
- Treat scripts that use `sudo`, modify `/etc`, install packages, rebuild boot artifacts, or alter services as potentially disruptive. Inspect them first; do not run them merely to validate an edit.
Start with the root `README.md` for the dotfile-specific constraints and manual-validation guidance.
## Shell
- Treat Fish (`fish`) as the default interactive shell. Write user-facing shell commands using Fish-compatible syntax unless another shell is explicitly requested or required.
## Knowledge base
- The knowledge base is an Obsidian vault at `~/cloud/knowledge`.
- Search the vault when a task depends on specific existing knowledge.
- Add new knowledge to the vault when it is durable and noteworthy; skip routine or transient details.
## Ownership map
| Path | Owns |
| --- | --- |
| Root dotfiles (`.zshrc`, `.config/`, `.scripts/`, etc.) | Ordinary yadm-managed user configuration and helpers |
| `system-config/` | Declarative Decman configuration for this Arch desktop |
| `system-config/config/system/` | Files deployed into system locations; do **not** edit deployed `/etc` targets |
| `system-config/config/user/` | Selected user dotfiles deployed by Decman; do **not** edit deployed copies |
| `system-config/packages/` | Native and AUR package lists organized by concern |
| `system-config/manifests/` | Enabled system and user unit manifests |
| `system-config/modules/` | Thin Decman deployment/loading adapters only |
`system-config/` belongs to this yadm worktree; it is not a nested Git repository.
## Decman architecture
`system-config/source.py` is the Decman entrypoint. It currently selects the `desktop()` profile from `hosts.py` and applies modules in this order:
1. `files`
2. `pacman`
3. `aur`
4. `systemd`
`hosts.py` composes host profiles from package concerns:
- Shared concerns: `common/core`, `common/hardware`, `common/wayland`, `common/fonts`, `common/development`, `common/productivity`, `common/media`, `common/research`, `common/network`, and `common/services`.
- Host-specific concerns: `laptop/hardware` and `desktop/local`.
- The active desktop profile combines the shared concerns, `desktop/local`, and desktop system/user configuration.
Keep policy in the declared data directories, not in Python glue:
- Add a package to the narrowest explanatory `packages/<scope>/<concern>-repo.txt` or `-aur.txt` file. A package must be owned exactly once.
- Put shared versus host-specific system policy in `config/system/common/` or the applicable host directory.
- Put selected user configuration in `config/user/{common,laptop,desktop}/`.
- Put service enablement in matching `manifests/{common,laptop,desktop}/` concern files.
- Keep `modules/` reusable and thin; it adapts package lists, file trees, and manifests to Decman.
The ignored dependency lists are adoption guards that prevent Decman orphan cleanup from removing dependencies. Do not delete or regenerate them casually.
## Change and validation workflow
For any change, first identify the owning layer above. For Decman changes:
1. Edit the source in `system-config/`, never the generated/deployed target.
2. Run the read-only consistency check from that directory:
```bash
./scripts/verify.py
```
3. After an intentional package-list change, regenerate and review the derived lists before applying:
```bash
./scripts/split_packages.py
./scripts/refresh_orphan_guards.py
./scripts/verify.py
yadm diff -- system-config
```
4. Require explicit human approval before applying system state. The review-first commands are:
```bash
sudo decman --source source.py --dry-run --no-hooks
sudo decman --source source.py --no-hooks
```
The second command mutates system files, packages, and services; do not run it as routine validation.
For ordinary dotfiles, use the smallest relevant validation: shell syntax/source checks for shell files, application/session testing for desktop configuration, or an explicit manual review. Preserve a rollback path when changing active configuration.
## Before finishing
- Review with `yadm diff --check` and `yadm diff`.
- Confirm that unrelated working-tree changes were not modified.
- State which validation was run and which system-changing operations were intentionally not run.
+10 -24
View File
@@ -6,7 +6,7 @@ Personal, Arch-oriented user dotfiles and support scripts for shells, window man
There is no authoritative root installation, linking, backup, overwrite, or rollback script. Do not infer one: review and apply only the individual files appropriate to a machine. Some filenames use `##class.arch_*` suffixes to distinguish machine classes. The repository also includes a nested README for the custom/vendored `st` terminal under `.config/st/`; it documents that component, not installation of this repository.
Several scripts assume paths below `~/.setup`, Arch tooling, and root access. Some repository scripts contain machine-specific connection details; do not publish, copy, or document such values. Use local, private configuration for hosts, addresses, accounts, and credentials.
Several scripts assume Arch tooling and root access. Some repository scripts contain machine-specific connection details; do not publish, copy, or document such values. Use local, private configuration for hosts, addresses, accounts, and credentials.
## Prerequisites
@@ -15,43 +15,29 @@ Several scripts assume paths below `~/.setup`, Arch tooling, and root access. So
- Desktop/session tools matching the chosen configuration (for example X11/XMonad-related files where applicable).
- Root access only for the system-changing scripts described below.
Package lists in `.setup/packages/` are inputs for a user-managed installation; no repository command defines how to install an entire list. Inspect package names and select lists for the intended machine before installing anything.
Package and service policy lives under `system-config/` and is applied through Decman. Review `system-config/README.md`, the active host profile, and a dry run before changing system state.
## Safe review and user-level configuration
Start by reviewing the intended files and any machine-class variants. Typical areas are:
- `.zshrc`, `.bashrc`, `.terminal_aliases`, `.tmux.conf`, and `.p10k.zsh` — shell and terminal setup.
- `.xmonad/`, `.Xresources##class.*`, `.xprofile##class.*`, and `.config/` — desktop/window-manager and application configuration.
- `.config/` — desktop and application configuration.
- `.scripts/` — optional shell, network, virtual-environment, and update helpers.
- `.setup/packages/` — package lists grouped by purpose.
- `system-config/` — Decman-managed packages, system files, selected user configuration, and service manifests.
Back up existing configuration before manually placing or linking a file. No test suite is provided; validate a change in the relevant shell/session or application and keep a rollback copy of the previous configuration.
## Package updates
## System-changing configuration
`.scripts/updating.sh` defines, but does not invoke, two functions. It expects `~/.setup/packages/exclude_from_updating.list`:
`system-config/` is the source of truth for managed packages, system files, selected user configuration, and enabled services. Use its review-first wrapper:
```sh
source .scripts/updating.sh
update_system
# or
update_pacman_packages
```fish
./system-config/decman verify
./system-config/decman dry-run
```
> **Warning: system-wide, potentially disruptive operation.** `update_system` runs `yay -Syu` and `update_pacman_packages` runs `sudo pacman -Syu`, both non-interactively and with the exclusion list. Review the exclusion list and pending package changes first. These functions update the running system; they are not tests.
## System-changing scripts
The following scripts mutate files outside this repository and must be inspected before use:
- `.setup/config/setup_touchpad.sh` copies an X11 configuration into `/etc/X11/xorg.conf.d/` when absent.
- `.setup/config/exclude_from_update.sh` edits `/etc/pacman.conf` with `sudo` based on `~/.setup/packages/exclude_from_updating.list`.
- `.setup/config/dinit_add_logs_to_all_services.sh` edits files in `/etc/dinit.d` and writes log specifications under `/var/log/dinit`; its `-o` option removes existing logfile lines before adding them.
> **Warning: destructive/system-wide operations.** These scripts can alter system package policy, service definitions, or input configuration. They have no repository-provided dry run or rollback. Run only on a machine you control after backups and after checking paths, permissions, and the script contents.
`.setup/config/set_default_programs.sh` sets the default HTTP/HTTPS handler through `xdg-mime`; review the desktop entry before using it.
> **Warning: system-wide, potentially disruptive operation.** `./system-config/decman apply` changes packages, system files, boot artifacts, and services. Run it only after reviewing a dry run. No root-level bootstrap or rollback command exists.
## Custom `st` terminal
+4 -3
View File
@@ -1,6 +1,6 @@
# Desktop Package Audit
Generated from `pacman -Qen` (official repository, explicitly installed) and `pacman -Qem` (AUR/foreign, explicitly installed). Package versions are included so this is an exact inventory.
Originally generated from `pacman -Qen` and `pacman -Qem` during desktop adoption. Versions record that snapshot; the package lists under `packages/` are authoritative for current policy.
## Decision key
@@ -119,7 +119,7 @@ Generated from `pacman -Qen` (official repository, explicitly installed) and `pa
| `vulkan-mesa-layers` | `1:26.1.5-1` | REVIEW — provisional desktop/local retention candidate |
| `vulkan-radeon` | `1:26.1.5-1` | REVIEW — provisional desktop/local retention candidate |
| `vulkan-tools` | `1.4.350.1-1` | KEEP — declared common desktop concern |
| `waybar` | `0.15.0-2` | KEEP — declared common desktop concern |
| `waybar` | `0.15.0-2` | RETIRE — replaced by Noctalia and no longer declared |
| `wdisplays` | `1.1.3-2` | REVIEW — provisional desktop/local retention candidate |
| `wget` | `1.25.0-6` | REVIEW — provisional desktop/local retention candidate |
| `wine` | `11.14-2` | REVIEW — provisional desktop/local retention candidate |
@@ -150,7 +150,7 @@ Generated from `pacman -Qen` (official repository, explicitly installed) and `pa
| `lutris-git` | `0.5.22.r394.g1b0f116-1` | REVIEW — provisional desktop/local retention candidate |
| `mongodb-compass-bin` | `1.49.11-2` | KEEP — declared common desktop concern |
| `mullvad-vpn-beta-bin` | `2026.3.stable-1` | KEEP — declared common desktop concern |
| `noctalia` | `5.0.0_beta.3-2` | REVIEW — provisional desktop/local retention candidate |
| `noctalia-git` | `5.0.0.r5317.ga4324409f-1` | KEEP — declared common Wayland concern |
| `nomacs-git` | `3.23.2.r0.gccb6ff42-1` | REVIEW — provisional desktop/local retention candidate |
| `pycharm-professional` | `2025.2.2-1` | REVIEW — provisional desktop/local retention candidate |
| `rustrover` | `2026.1.3-1` | REVIEW — provisional desktop/local retention candidate |
@@ -197,6 +197,7 @@ rustrover
ueberzug
vkd3d
vulkan-mesa-layers
waybar
wine
winetricks
xclicker
+34 -10
View File
@@ -5,7 +5,8 @@ A small, declarative Arch configuration managed by Decman.
## Design
- **Concerns live in `packages/`**: each concern has a native (`*-repo.txt`)
and AUR (`*-aur.txt`) list.
and AUR (`*-aur.txt`) list, plus an optional global npm (`*-npm.txt`) list
for command packages unavailable through Arch packaging.
- **Hosts live in `hosts.py`**: a host composes package concerns and explicit
system state. `desktop()` owns this desktop's boot, storage, NVIDIA, input,
SDDM, network-policy, and user-session configuration.
@@ -55,28 +56,51 @@ remove those explicitly in a separate reviewed package change.
| Desktop | shared concerns, `common/hardware`, and a reviewable `desktop/local` set; host state is in `config/system/desktop/` |
Every package must have a named purpose. Add a new concern when an existing one
does not explain a package. System and user units use the same naming:
does not explain a package. Missing packages from `*-npm.txt` are installed
globally after the pacman and AUR steps; unrelated global npm packages are not
removed. System and user units use the same naming:
`manifests/common/<concern>-{system,user}.txt` or
`manifests/laptop/<concern>-system.txt`.
## Commands
From the repository root, run common workflows through the
`./system-config/decman` wrapper, which uses fixed Decman arguments:
```bash
./system-config/decman verify
./system-config/decman dry-run
./system-config/decman apply
```
`dry-run` and `apply` first run `verify`. They invoke Decman with `--no-hooks`,
matching the deliberately review-first direct commands below. `apply` changes
system state; use it only after reviewing the dry run.
The wrapper locates its configuration relative to itself, so its commands run
from the `system-config` directory. Command output and errors stream directly
to the terminal. If a child command fails, the wrapper prints the failed command
and returns its exit status. A missing executable returns `127`, another
execution error (including a permission error) returns `126`, and an
interrupted workflow returns `130`.
```bash
cd ~/system-config
./scripts/verify.py
sudo decman --source source.py --dry-run --no-hooks
sudo decman --source source.py --no-hooks
```
`verify.py` proves that every currently explicit package appears exactly once
in the active laptop profile. The ignored dependency lists prevent Decman's
orphan cleanup from removing dependencies during adoption.
in the active desktop profile, including global npm command packages. The
ignored dependency lists prevent Decman's orphan cleanup from removing
dependencies during adoption.
After intentional package changes, regenerate and review concern lists:
```bash
./scripts/split_packages.py
./scripts/refresh_orphan_guards.py
./scripts/verify.py
git diff
./system-config/decman refresh-package-state
yadm diff -- system-config
```
`refresh-package-state` runs `split-packages`, `refresh-orphan-guards`, and
`verify` in that order. Those individual file-changing commands are also
available through the dispatcher when only one is needed.
@@ -1,6 +1,6 @@
[Theme]
ThemeDir=/usr/share/sddm/themes
Current=maya
Current=noctalia
EnableAvatars=false
[Users]
@@ -1,3 +1,5 @@
# Used by the Noctalia Pi Status Bridge adapter and the Hyprland launcher.
PI_STATUS_BRIDGE_CLIENT=/home/alex/.local/bin/pi-status-bridge-client
PI_STATUS_UI_BINARY=/home/alex/.local/bin/pi-status-ui
# Ctrl+Super+Space starts a fresh Pi session in this worktree. Change as needed.
PI_STATUS_DEFAULT_WORKTREE=/home/alex/projects/pi-gui
@@ -5,6 +5,12 @@
-- stacking/tabbed, and resize-mode behavior is intentionally deferred.
local machine = dofile(os.getenv("HOME") .. "/.config/hypr/machine.lua")
-- Machine-specific session environment must be set before Hyprland initializes
-- its graphics backend. The laptop profile selects only the Intel iGPU here.
for name, value in pairs(machine.environment or {}) do
hl.env(name, value)
end
for _, monitor in ipairs(machine.monitors or {}) do
hl.monitor(monitor)
end
@@ -63,14 +69,17 @@ hl.workspace_rule({
-- Application and session bindings.
local noctalia_ipc = "noctalia msg "
local pi_status_ui_toggle = 'ui="${PI_STATUS_UI_BINARY:-$HOME/.local/bin/pi-status-ui}"; if test -x "$ui"; then setsid -f env TMPDIR=/tmp "$ui" --toggle >/tmp/pi-status-ui.log 2>&1; fi'
local pi_status_ui_new_session = 'ui="${PI_STATUS_UI_BINARY:-$HOME/.local/bin/pi-status-ui}"; if test -x "$ui"; then setsid -f env TMPDIR=/tmp "$ui" --new >/tmp/pi-status-ui.log 2>&1; fi'
local pi_status_ui_quick = 'ui="${PI_STATUS_UI_BINARY:-$HOME/.local/bin/pi-status-ui}"; if test -x "$ui"; then setsid -f env TMPDIR=/tmp "$ui" --quick >/tmp/pi-status-ui.log 2>&1; fi'
-- Tap and release Super on its own to open Noctalia's control-center home.
hl.bind(main_mod .. " + SUPER_L", hl.dsp.exec_cmd(noctalia_ipc .. "panel-toggle control-center"), { release = true })
hl.bind(main_mod .. " + RETURN", hl.dsp.exec_cmd(terminal))
hl.bind(main_mod .. " + CTRL + RETURN", hl.dsp.exec_cmd(terminal .. " -e zellij"))
hl.bind(main_mod .. " + SHIFT + RETURN", hl.dsp.exec_cmd("rofi -show combi"))
hl.bind(main_mod .. " + SPACE", hl.dsp.exec_cmd(pi_status_ui_toggle))
hl.bind(main_mod .. " + CTRL + SPACE", hl.dsp.exec_cmd(pi_status_ui_new_session))
hl.bind(main_mod .. " + S", hl.dsp.exec_cmd(pi_status_ui_quick))
hl.bind(main_mod .. " + N", hl.dsp.exec_cmd(noctalia_ipc .. "panel-toggle alex/knowledge-lookup:panel"))
hl.bind(main_mod .. " + S", hl.dsp.exec_cmd(noctalia_ipc .. "panel-toggle control-center"))
hl.bind(main_mod .. " + 0", hl.dsp.exec_cmd(noctalia_ipc .. "panel-toggle session"))
hl.bind(main_mod .. " + SHIFT + F", hl.dsp.exec_cmd(noctalia_ipc .. "bar-toggle main"))
hl.bind(main_mod .. " + SHIFT + R", hl.dsp.exec_cmd("hyprctl reload"))
@@ -104,7 +113,8 @@ for _, direction in ipairs({ "left", "down", "up", "right" }) do
hl.bind(main_mod .. " + " .. direction, hl.dsp.focus({ direction = direction }))
end
for key, direction in pairs({ H = "l", J = "d", K = "u", L = "r", LEFT = "l", DOWN = "d", UP = "u", RIGHT = "r" }) do
-- Super+Shift+K is reserved for Obsidian; Super+Shift+Up still moves windows up.
for key, direction in pairs({ H = "l", J = "d", L = "r", LEFT = "l", DOWN = "d", UP = "u", RIGHT = "r" }) do
hl.bind(main_mod .. " + SHIFT + " .. key, hl.dsp.window.move({ direction = direction }))
end
@@ -124,6 +134,9 @@ hl.bind(main_mod .. " + CTRL + LEFT", hl.dsp.focus({ workspace = "-1" }))
-- Hyprland special workspaces are the Wayland analogue of the i3 scratchpad.
hl.bind(main_mod .. " + MINUS", hl.dsp.workspace.toggle_special("scratchpad"))
hl.bind(main_mod .. " + SHIFT + MINUS", hl.dsp.window.move({ workspace = "special:scratchpad" }))
hl.bind(main_mod .. " + SHIFT + S", hl.dsp.workspace.toggle_special("spotify"))
hl.bind(main_mod .. " + SHIFT + M", hl.dsp.workspace.toggle_special("mail"))
hl.bind(main_mod .. " + SHIFT + K", hl.dsp.workspace.toggle_special("obsidian"))
-- Keep the i3 floating and fullscreen shortcuts. Layout-specific binds are deferred.
hl.bind(main_mod .. " + F", hl.dsp.window.fullscreen({ action = "toggle" }))
@@ -141,8 +154,8 @@ local function float_rule(name, match, border_size)
})
end
hl.window_rule({ name = "obsidian-workspace", match = { class = "^obsidian$" }, workspace = "8" })
hl.window_rule({ name = "thunderbird-workspace", match = { class = "^Thunderbird$" }, workspace = "9" })
hl.window_rule({ name = "obsidian-workspace", match = { class = "^(obsidian|md[.]obsidian[.]Obsidian)$" }, workspace = "special:obsidian silent", no_initial_focus = true })
hl.window_rule({ name = "thunderbird-mail", match = { class = "^(Thunderbird|thunderbird|org[.]mozilla[.]Thunderbird)$" }, workspace = "special:mail silent", no_initial_focus = true })
float_rule("pi-status-ui", { class = "^(pi-status-ui|Pi-status-ui)$" }, 1)
float_rule("alsamixer", { title = "^alsamixer$" }, 1)
float_rule("qalculate", { title = "^Qalculate!$" })
@@ -153,8 +166,8 @@ float_rule("volume-control", { title = "^Volume Control$" })
float_rule("virtualbox", { class = ".*VirtualBox.*" })
hl.window_rule({ name = "virtualbox-manager-tiles", match = { class = ".*VirtualBox Manager.*" }, tile = true })
hl.window_rule({ name = "virtualbox-machine-tiles", match = { class = ".*VirtualBox Machine.*" }, tile = true })
-- Send music clients to the existing scratchpad without stealing startup focus.
hl.window_rule({ name = "spotify-music", match = { class = "^Spotify$" }, workspace = "special:scratchpad silent", no_initial_focus = true })
-- Send music clients to hidden workspaces without stealing startup focus.
hl.window_rule({ name = "spotify-music", match = { class = "^Spotify$" }, workspace = "special:spotify silent", no_initial_focus = true })
hl.window_rule({ name = "deezer-music", match = { class = "^Deezer$" }, workspace = "special:scratchpad silent", no_initial_focus = true })
hl.on("hyprland.start", function()
@@ -6,7 +6,24 @@ x-scheme-handler/webcal=userapp-Thunderbird-0DWKA3.desktop
text/calendar=userapp-Thunderbird-0DWKA3.desktop
application/x-extension-ics=userapp-Thunderbird-0DWKA3.desktop
x-scheme-handler/webcals=userapp-Thunderbird-0DWKA3.desktop
image/png=nomacs.desktop
application/pdf=org.gnome.Evince.desktop
image/avif=org.nomacs.ImageLounge.desktop
image/bmp=org.nomacs.ImageLounge.desktop
image/gif=org.nomacs.ImageLounge.desktop
image/heic=org.nomacs.ImageLounge.desktop
image/heif=org.nomacs.ImageLounge.desktop
image/jpeg=org.nomacs.ImageLounge.desktop
image/jxl=org.nomacs.ImageLounge.desktop
image/png=org.nomacs.ImageLounge.desktop
image/tiff=org.nomacs.ImageLounge.desktop
image/webp=org.nomacs.ImageLounge.desktop
image/x-eps=org.nomacs.ImageLounge.desktop
image/x-ico=org.nomacs.ImageLounge.desktop
image/x-portable-bitmap=org.nomacs.ImageLounge.desktop
image/x-portable-graymap=org.nomacs.ImageLounge.desktop
image/x-portable-pixmap=org.nomacs.ImageLounge.desktop
image/x-xbitmap=org.nomacs.ImageLounge.desktop
image/x-xpixmap=org.nomacs.ImageLounge.desktop
[Added Associations]
x-scheme-handler/mailto=userapp-Thunderbird-JBPLA3.desktop;
@@ -0,0 +1,134 @@
/*
* breeze-dark.rasi
* rofi theme inspired by plasma breeze
* MonsieurBedard
*/
* {
/* Base */
default-background: rgba(49, 52, 56, 100%); // <- change this for transparency
default-foreground: rgba(239, 240, 241, 100%);
default-border: rgba(97, 101, 105, 100%);
alternative-background: rgba(35, 38, 41, 100%);
invisible: rgba(0, 0, 0, 0%);
/* Colors */
hard-blue: rgba(42, 139, 218, 100%);
light-blue: rgba(24, 53, 69, 100%);
hard-red: rgba(141, 58, 80, 100%);
light-red: rgba(77, 31, 37, 100%);
hard-green: rgba(39, 161, 69, 100%);
light-green: rgba(19, 55, 35, 100%);
/* Universal */
background-color: @invisible;
border-color: @default-border;
font: "Noto Sans 30";
text-color: @default-foreground;
}
#window {
background-color: @default-background;
border: 1;
border-radius: 3;
border-color: @default-border;
padding: 7;
}
#mainbox {
border: 0;
padding: 0;
}
#message {
border: 1;
border-radius: 3;
padding: 5;
background-color: @alternative-background;
}
#textbox {
background-color: @entry-background;
}
#listview {
fixed-height: 0;
spacing: 2;
scrollbar: false;
padding: 2 0 0;
}
#element {
padding: 5;
border: 1;
border-radius: 3;
border-color: @invisible;
}
#element.normal.normal {
background-color: @invisible;
}
#element.normal.urgent {
background-color: @light-red;
}
#element.normal.active {
background-color: @light-green;
}
#element.selected.normal {
background-color: @light-blue;
border-color: @hard-blue;
}
#element.selected.urgent {
background-color: @light-red;
border-color: @hard-red;
}
#element.selected.active {
background-color: @light-green;
border-color: @hard-green;
}
#mode-switcher {
spacing: 0;
}
#button {
border: 0 0 3 0;
border-color: @invisible;
padding: 3;
}
#button.selected {
border-color: @hard-blue;
}
#inputbar {
spacing: 0;
padding: 1;
}
#case-indicator {
spacing: 0;
padding: 3px;
background-color: @alternative-background;
border: 1 1 1 0;
border-radius: 0 2 2 0;
}
#entry {
background-color: @alternative-background;
padding: 3px;
border: 1 0 1 1;
border-radius: 2 0 0 2;
}
#prompt {
padding: 3 7 3 0;
}
@@ -0,0 +1,7 @@
configuration {
modi: "combi,window,drun,ssh";
font: "hack 30";
combi-modi: "window,drun,ssh";
}
@theme "glue_pro_blue"
@@ -4,6 +4,8 @@ return {
{
output = "HDMI-A-1",
mode = "3840x2160@120",
bitdepth = 10,
cm = "hdr",
position = "0x0",
scale = 1,
},
@@ -18,6 +20,7 @@ return {
"nextcloud",
"spotify",
"brave",
"alacritty -e tmux",
-- Kitty keeps Yazi previews terminal-native; Alacritty needs Überzug++ windows.
"kitty -e tmux",
},
}
@@ -43,7 +43,7 @@ padding = 6.0
enabled = true
fill = "surface_variant"
id = "g2"
members = ["network", "bluetooth"]
members = ["network", "network-download", "network-upload", "bluetooth"]
opacity = 1.0
padding = 6.0
@@ -73,6 +73,18 @@ opacity = 1.0
padding = 6.0
radius = 5.0
[widget.network-download]
type = "sysmon"
stat = "net_rx"
visualization = "none"
show_value = true
[widget.network-upload]
type = "sysmon"
stat = "net_tx"
visualization = "none"
show_value = true
[widget.gpu]
type = "sysmon"
stat = "gpu_usage"
@@ -94,7 +106,26 @@ width = 880
# GPU polling is disabled by Noctalia by default; enable it for the RTX 3090 widgets.
gpu_poll_seconds = 2.0
# The desktop's Hypridle listener provides a five-minute input-dismissable black
# OLED overlay. Keep Noctalia from issuing a competing DPMS screen-off action.
# Hypridle provides the five-minute input-dismissable black OLED overlay.
# On this desktop, Noctalia's only enabled idle action is plain suspend after
# thirty minutes; do not lock or transition into hibernation automatically.
[idle]
behavior_order = ["suspend"]
[idle.behavior.lock]
enabled = false
[idle.behavior.screen-off]
enabled = false
[idle.behavior.suspend-then-hibernate]
enabled = false
[idle.behavior.suspend]
action = "suspend"
enabled = true
timeout = 1800
lock_before_suspend = false
[lockscreen]
lock_before_suspend = false
@@ -2,6 +2,13 @@
-- Noctalia replaces the i3-era Redshift, Polybar, Blueman Applet, and Picom stack.
return {
is_laptop = true,
-- Use the colon-free user-config alias for the stable PCI path rather than
-- cardN, whose numbering can change between boots. AQ_DRM_DEVICES itself
-- uses colons as device separators. This keeps Hyprland off the NVIDIA dGPU
-- so it can enter Runtime D3 when no application is explicitly offloaded.
environment = {
AQ_DRM_DEVICES = os.getenv("HOME") .. "/.config/hypr/intel-drm",
},
input = {
touchpad = {
-- Standard laptop behavior: one/two/three-finger taps map to
+3
View File
@@ -0,0 +1,3 @@
#!/usr/bin/env sh
# Repository-local Decman interface; avoids changing the system `decman` command.
exec "$(dirname "$0")/scripts/decman_cli.py" "$@"
+23
View File
@@ -30,11 +30,13 @@ class UserConfigConcern(decman.Module):
name: str,
files: dict[str, str | tuple[str, int]] | None = None,
directories: dict[str, str] | None = None,
symlinks: dict[str, str] | None = None,
user: str = "alex",
) -> None:
super().__init__(f"user:{name}")
self._files = files or {}
self._directories = directories or {}
self._symlinks = symlinks or {}
self.user = user
def files(self) -> dict[str, decman.File]:
@@ -60,6 +62,12 @@ class UserConfigConcern(decman.Module):
for target, source in self._directories.items()
}
def symlinks(self) -> dict[str, str | decman.Symlink]:
return {
link_name: decman.Symlink(target=target, owner=self.user)
for link_name, target in self._symlinks.items()
}
class SystemConcern(decman.Module):
"""One host/system concern with explicit files and unit manifests."""
@@ -119,6 +127,8 @@ def common_user_config() -> list[UserConfigConcern]:
"/home/alex/.config/kitty/kitty.conf": "config/user/common/kitty/kitty.conf",
"/home/alex/.config/mimeapps.list": "config/user/common/mime/mimeapps.list",
"/home/alex/.config/noctalia/10-base.toml": "config/user/common/noctalia/10-base.toml",
"/home/alex/.config/rofi/breeze-dark.rasi": "config/user/common/rofi/breeze-dark.rasi",
"/home/alex/.config/rofi/config.rasi": "config/user/common/rofi/config.rasi",
"/home/alex/.config/noctalia/palettes/Ember OLED.json": (
"config/user/common/noctalia/palettes/Ember OLED.json"
),
@@ -175,6 +185,11 @@ def laptop_user_config() -> list[UserConfigConcern]:
"config/user/laptop/noctalia/99-extend.toml"
),
},
symlinks={
"/home/alex/.config/hypr/intel-drm": (
"/dev/dri/by-path/pci-0000:00:02.0-card"
),
},
)
]
@@ -240,6 +255,8 @@ def laptop_system() -> list[SystemConcern | UserConfigConcern]:
"/etc/keyd/default.conf": "config/system/common/keyd.conf",
"/etc/NetworkManager/conf.d/wifi-powersave.conf": "config/system/laptop/wifi-powersave.conf",
"/etc/modprobe.d/iwlwifi.conf": "config/system/laptop/iwlwifi.conf",
"/etc/modprobe.d/nvidia-runtime-pm.conf": "config/system/laptop/modprobe.d/nvidia-runtime-pm.conf",
"/etc/udev/rules.d/80-nvidia-runtime-pm.rules": "config/system/laptop/udev/80-nvidia-runtime-pm.rules",
"/etc/X11/xorg.conf.d/30-touchpad.conf": "config/system/laptop/touchpad.conf",
"/etc/tlp.conf": "config/system/laptop/power/tlp.conf",
"/etc/systemd/sleep.conf.d/90-laptop.conf": "config/system/laptop/sleep.conf.d/90-laptop.conf",
@@ -278,6 +295,12 @@ def desktop_system() -> list[SystemConcern | UserConfigConcern]:
"config/system/desktop/network/NetworkManager.conf"
),
"/etc/sddm.conf.d/10-theme.conf": "config/system/desktop/sddm/10-theme.conf",
"/usr/share/sddm/themes/noctalia/Assets/ember-oled-background.svg": (
"config/system/desktop/sddm/ember-oled-background.svg"
),
"/usr/share/sddm/themes/noctalia/theme.conf.user": (
"config/system/desktop/sddm/theme.conf.user"
),
"/etc/udev/rules.d/50-zsa.rules": "config/system/desktop/input/50-zsa.rules",
},
system_manifests=("desktop/hardware-system.txt",),
+103
View File
@@ -0,0 +1,103 @@
"""Declarative global npm command packages for Decman profiles."""
from __future__ import annotations
import json
import shutil
import decman
import decman.core.error as errors
import decman.core.module as module
import decman.core.output as output
import decman.core.store as store_module
from decman import Plugin
from decman.plugins import run_methods_with_attribute
def packages(fn):
"""Annotate a method that returns globally installed npm package names."""
fn.__npm_packages__ = True
return fn
class Npm(Plugin):
"""Install declared global npm packages without pruning unrelated packages."""
NAME = "npm"
def __init__(self) -> None:
self.packages: set[str] = set()
def process_modules(
self, store: store_module.Store, modules: list[module.Module]
) -> None:
store.ensure("npm_packages_for_module", {})
for mod in modules:
store["npm_packages_for_module"].setdefault(mod.name, set())
declared = set().union(
*run_methods_with_attribute(mod, "__npm_packages__")
)
if store["npm_packages_for_module"][mod.name] != declared:
mod._changed = True
output.print_debug(
f"Module '{mod.name}' changed due to modified global npm packages."
)
self.packages |= declared
store["npm_packages_for_module"][mod.name] = declared
def apply(
self,
store: store_module.Store,
dry_run: bool = False,
params: list[str] | None = None,
) -> bool:
if not self.packages:
return True
if shutil.which("npm") is None:
if dry_run:
output.print_list(
"Installing global npm packages after npm becomes available:",
sorted(self.packages),
)
return True
output.print_error("npm is unavailable after the pacman step.")
return False
try:
installed = self._installed_packages()
to_install = self.packages - installed
output.print_list("Installing global npm packages:", sorted(to_install))
if to_install and not dry_run:
decman.prg(
[
"npm",
"install",
"--global",
"--no-audit",
"--no-fund",
*sorted(to_install),
]
)
except (errors.CommandFailedError, ValueError) as error:
output.print_error(f"Managing global npm packages failed: {error}")
return False
return True
@staticmethod
def _installed_packages() -> set[str]:
raw = decman.prg(
["npm", "list", "--global", "--depth=0", "--json"], pty=False
)
try:
result = json.loads(raw)
except json.JSONDecodeError as error:
raise ValueError("npm returned invalid JSON") from error
dependencies = result.get("dependencies", {})
if not isinstance(dependencies, dict):
raise ValueError("npm dependencies must be an object")
return set(dependencies)
+7
View File
@@ -7,6 +7,8 @@ from pathlib import Path
import decman
from decman.plugins import aur, pacman
from modules import npm_packages
ROOT = Path(__file__).resolve().parents[1]
PACKAGES = ROOT / "packages"
@@ -34,6 +36,11 @@ class PackageConcern(decman.Module):
def aur_packages(self) -> set[str]:
return _names(PACKAGES / f"{self.concern}-aur.txt")
@npm_packages.packages
def global_npm_packages(self) -> set[str]:
path = PACKAGES / f"{self.concern}-npm.txt"
return _names(path) if path.exists() else set()
def configure_no_removal_guard() -> None:
"""Keep Decman from pruning current dependency-orphans during adoption."""
+5 -2
View File
@@ -1,6 +1,7 @@
# Package lists
Each concern owns package names exactly once:
Each concern owns package names exactly once. Native, AUR, and global npm
packages use `*-repo.txt`, `*-aur.txt`, and optional `*-npm.txt` files:
- `common/` is portable workstation functionality.
- `laptop/` is hardware and power support for this laptop.
@@ -8,4 +9,6 @@ Each concern owns package names exactly once:
- `ignored/` contains dependency packages Decman must not prune during adoption.
A host composes concerns in `../hosts.py`. Add a package to the narrowest
concern that explains why it exists, then run `../scripts/verify.py`.
concern that explains why it exists, then run `../scripts/verify.py`. The npm
plugin installs missing declared command packages globally after the pacman and
AUR steps; it does not remove unrelated global npm packages.
@@ -30,6 +30,7 @@ refind
ripgrep
rsync
starship
trash-cli
unzip
yadm
zellij
@@ -2,6 +2,7 @@ decman
engram-bin
gti
mongodb-compass-bin
onorca-bin
pi
postman-bin
vagrant
@@ -0,0 +1 @@
@hypabolic/hypa
@@ -1 +1 @@
sddm-theme-noctalia-git

Some files were not shown because too many files have changed in this diff Show More