Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,7 @@ node_modules/

# Task files
tasks.json

# Superpowers local state
.superpowers/
docs/superpowers/
2 changes: 2 additions & 0 deletions group_vars/all.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ default_roles:
- aldente
- asciiquarium
- awesomewm
- vicinae
- bash
- bat
- borders
Expand Down Expand Up @@ -45,6 +46,7 @@ default_roles:
- raycast
# - ruby
# - rust
- signal
- slides
- spotify
- superwhisper
Expand Down
3 changes: 3 additions & 0 deletions group_vars/all.yml.example
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,9 @@ default_roles:
# - aldente # Battery charge limiter for macOS

# === Linux Specific ===
# - awesomewm # X11 window manager and keyboard-driven desktop
# - vicinae # Raycast-style launcher for Linux/AwesomeWM
# - fabric # AwesomeWM top command deck UI
# - flatpak # Universal Linux package manager
# - nala # Better apt frontend for Ubuntu/Debian

Expand Down
4 changes: 3 additions & 1 deletion roles/1password/tasks/Ubuntu.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,9 @@

- name: "1Password | Install 1Password"
ansible.builtin.apt:
name: 1password-cli
name:
- 1password
- 1password-cli
state: present
update_cache: true
become: true
9 changes: 9 additions & 0 deletions roles/1password/tests/test_1password_role.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/usr/bin/env bash
set -euo pipefail

repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)"
ubuntu_tasks="$repo_root/roles/1password/tasks/Ubuntu.yml"

grep -q "name:" "$ubuntu_tasks"
grep -q "1password-cli" "$ubuntu_tasks"
grep -q -- "- 1password$" "$ubuntu_tasks"
37 changes: 12 additions & 25 deletions roles/awesomewm/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ This role provides a fully-configured AwesomeWM desktop environment with:
- **Intelligent app positioning** with multi-resolution support
- **Catppuccin Mocha theme** across all UI components
- **Standalone settings tools** (no GNOME dependencies)
- **Complete desktop utilities** (launcher, clipboard, screenshots, notifications)
- **Complete desktop utilities** (Vicinae launcher hooks, screenshots, notifications)

Perfect for developers migrating from macOS Hammerspoon or seeking advanced tiling functionality on Ubuntu.

Expand Down Expand Up @@ -50,7 +50,7 @@ graph TD
- Pre-configured layouts for different workflows
- Assign apps to specific cells
- Optional auto-launch on layout activation
- Interactive layout picker (Hyper+p)
- Keyboard-native layout picker (Hyper+p)

### Modal Application Summoning

Expand Down Expand Up @@ -92,14 +92,14 @@ graph LR
A --> C[Status Bar]
A --> D[Notifications]

E[Utilities] --> F[Rofi Launcher]
E --> G[CopyQ Clipboard]
E[Utilities] --> F[Vicinae Launcher Signals]
E --> G[Vicinae Clipboard/Emoji]
E --> H[Flameshot Screenshots]
E --> I[Settings Tools]

J[Theme] --> K[Catppuccin Mocha]
K --> L[GTK Apps]
K --> M[Rofi]
K --> M[Fabric]
K --> N[Status Bar]

style A fill:#89b4fa
Expand All @@ -114,16 +114,14 @@ graph LR
**Window Management:**
- `awesome` - AwesomeWM window manager
- `xdotool` - Window manipulation tool
- `rofi` - Application launcher and layout picker
- `i3lock` - Screen locker

**Desktop Utilities:**
- `flameshot` - Screenshot tool
- `copyq` - Clipboard manager
- `thunar` - Lightweight file manager
- `ristretto` - Image viewer
- `rofimoji` - Emoji picker (via pipx)
- Flare launcher (AppImage)
- Vicinae launcher hooks for command search, clipboard, app search, emoji, and
settings support when the separate `vicinae` role is installed

**Media & System:**
- `playerctl` - Media key controls
Expand Down Expand Up @@ -179,10 +177,6 @@ graph LR
├── awesome-wm-widgets/ # Cloned from GitHub
└── cyclefocus/ # Cloned from GitHub

~/.config/rofi/
├── config.rasi # Rofi configuration
└── catppuccin-mocha.rasi # Catppuccin theme

~/.config/gtk-3.0/
└── settings.ini # GTK3 dark theme

Expand All @@ -194,24 +188,16 @@ graph LR
~/.config/flameshot/
└── flameshot.ini # Screenshot tool config

~/.config/copyq/
├── copyq.conf # Clipboard manager config
└── copyq-commands.ini # Custom commands

~/.themes/
└── catppuccin-mocha-blue-standard+default/ # GTK theme

~/.local/bin/
├── flare # Application launcher
└── rofimoji # Emoji picker
```

### Theming

**Catppuccin Mocha** applied consistently across:
- AwesomeWM (status bar, window borders, notifications)
- GTK3/GTK4 applications
- Rofi launcher
- Papirus-Dark icon theme

**Theme Colors:**
Expand Down Expand Up @@ -290,7 +276,7 @@ Hyper + l
Signal = {
class = "signal",
summon = "C", -- CapsLock/F13 + Shift+c
exec = "flatpak run org.signal.Signal",
exec = "signal-desktop",
},
```

Expand Down Expand Up @@ -402,12 +388,13 @@ None. This role is self-contained.

**Automatically installed:**
- Flatpak (for Discord, Spotify, Obsidian)
- Python 3 + pipx (for rofimoji)
- Git (for cloning widget repositories)
- Desktop utility packages listed above

**Not installed by this role:**
- Ghostty terminal (install via [ghostty](../ghostty/) role)
- 1Password (install via [1password](../1password/) role)
- Vicinae launcher binary (install via [vicinae](../vicinae/) role)
- Git client, which is required by the widget repository clone tasks

## Troubleshooting

Expand Down Expand Up @@ -491,7 +478,7 @@ M.hyper = { 'Mod4', 'Shift' } -- Super+Shift (easier)

**Complete removal:**
```bash
sudo apt remove awesome xdotool flameshot rofi i3lock copyq
sudo apt remove awesome xdotool flameshot i3lock
rm -rf ~/.config/awesome
rm -rf ~/.themes/catppuccin-mocha-*
```
Expand Down
9 changes: 9 additions & 0 deletions roles/awesomewm/defaults/main.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
---
# AwesomeWM role defaults
role_name: "awesomewm"

awesomewm_remove_legacy_launcher_tools: true
awesomewm_legacy_launcher_packages:
- copyq
awesomewm_legacy_launcher_paths:
- "{{ ansible_facts['user_dir'] }}/.config/copyq"
- "{{ ansible_facts['user_dir'] }}/.local/bin/bemoji"
- "{{ ansible_facts['user_dir'] }}/.local/share/bemoji"
- "{{ ansible_facts['user_dir'] }}/.local/bin/flare"
2 changes: 1 addition & 1 deletion roles/awesomewm/files/config/cell-management/apps.lua
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ return {
Signal = {
class = "signal",
summon = "C",
exec = "flatpak run org.signal.Signal",
exec = "signal-desktop",
},
Spotify = {
class = "Spotify", -- Note: Spotify uses capital S
Expand Down
31 changes: 25 additions & 6 deletions roles/awesomewm/files/config/cell-management/keybindings.lua
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,23 @@ local summon_trigger_keys = {
Caps_Lock = true,
}

local modifier_keys = {
Shift_L = true,
Shift_R = true,
Control_L = true,
Control_R = true,
Alt_L = true,
Alt_R = true,
Super_L = true,
Super_R = true,
Meta_L = true,
Meta_R = true,
Hyper_L = true,
Hyper_R = true,
ISO_Level3_Shift = true,
ISO_Level5_Shift = true,
}

local function has_modifier(modifiers, target)
for _, modifier in ipairs(modifiers or {}) do
if modifier == target then
Expand Down Expand Up @@ -77,6 +94,10 @@ summon_modal = awful.keygrabber {
timeout = 1, -- 1 second timeout for modal auto-close
autostart = false,
keypressed_callback = function(self, mod, key, event)
if modifier_keys[key] then
return
end

local binding_key = binding_key_for_event(mod, key)

-- Treat any recognized summon trigger as a second tap to enter macro mode.
Expand Down Expand Up @@ -123,11 +144,11 @@ macro_modal = awful.keygrabber {
return
end

-- e: Emoji picker with bemoji
-- e: Emoji picker
if key == 'e' then
self:stop()
gears.timer.delayed_call(function()
awful.spawn(os.getenv("HOME") .. "/.local/bin/bemoji -cn --hist-limit 5")
awesome.emit_signal("techdufus::launcher_emoji")
end)
return
end
Expand All @@ -141,13 +162,11 @@ macro_modal = awful.keygrabber {
return
end

-- g: GUI Settings menu (rofi picker)
-- g: GUI Settings command deck
if key == 'g' then
self:stop()
gears.timer.delayed_call(function()
awful.spawn.easy_async_with_shell([[
printf '%s\n' "Audio (pavucontrol)" "Display (arandr)" "GTK Themes (lxappearance)" "Bluetooth (blueman-manager)" "Network (nm-connection-editor)" "Power (xfce4-power-manager-settings)" | rofi -dmenu -i -p "Settings" | sed 's/.*(\(.*\))/\1/' | xargs -I{} sh -c '{}'
]], function() end)
awesome.emit_signal("techdufus::launcher_settings")
end)
return
end
Expand Down
Loading
Loading