bitzdots is designed for low-end hardware. This guide explains the optimizations and shows how to push further.
| Metric | Value |
|---|---|
| Idle RAM (full stack) | ~250-300MB |
| Waybar CPU | ~3.5% idle |
| Hyprland RAM | ~170MB |
| swaync RAM | ~85MB |
| waybar RAM | ~60MB |
All intervals are tuned to balance responsiveness and CPU usage:
| Module | Current Interval | CPU Impact |
|---|---|---|
| Workspaces | 3s | Low (uses hyprctl workspaces -j, not clients) |
| Recording | 10s | Negligible |
| Network | 10s | Low |
| Clock | 30s | Negligible |
| CPU | 5s | Low (reads /proc/stat) |
| Memory | 10s | Negligible |
| Power Profiles | 30s | Negligible (D-Bus, no hanging) |
| Brightness | 5s | Low (timeout 2s on brightnessctl) |
| Notification | 10s | Negligible |
| Media | on-event | Only updates on player change |
To reduce CPU further, increase intervals in waybar/config.jsonc:
The media script kills stale playerctl metadata --follow processes on startup to prevent the well-known CPU leak where multiple instances accumulate.
If you don't use media controls, remove custom/media from modules-left in waybar config.
Uses busctl directly on the UPower D-Bus interface instead of powerprofilesctl. The latter is known to randomly hang at 100% CPU when querying profiles. The D-Bus approach is instant and has zero CPU overhead.
Configurable in hypr/appearance.lua:
blur = {
enabled = true, -- set false to save ~20-40MB GPU memory
size = 5, -- lower = less memory
passes = 1, -- lower = less GPU work
}For maximum performance:
blur = { enabled = false }
shadow = { enabled = false }Notification center RAM usage is ~85MB, largely from album art caching in the MPRIS widget.
Optimization available in swaync/config.json:
"mpris": {
"show-album-art": "notification", // "always" shows art in control center
"image-size": 48 // lower = less memory (default 64)
}The custom/runcat module uses a Python script with pyjson5 dependency (~23MB RSS for the Python process).
To disable: Remove custom/runcat from modules-left in waybar config.
For systems with <2GB RAM or single-core CPUs:
-
Disable blur in
hypr/appearance.lua:blur = { enabled = false }
-
Remove runcat from waybar modules
-
Increase all polling intervals in waybar config by 2-3x
-
Remove album art from swaync:
"show-album-art": "never"
-
Disable shadows in Hyprland:
shadow = { enabled = false }
-
Use a lighter terminal than kitty (e.g., foot or wezterm) — kitty uses ~200MB per window
-
Disable animations in
hypr/animations.lua:hl.config({ animations = { enabled = false } })
- Wallpaper cache daemon runs at Nice=19 (lowest priority), IO scheduling class=idle
- All waybar scripts are shell-based (no heavy interpreters except runcat's Python)
playerctl metadata --followleak prevention via pkill on media.sh startupworkspaces.shuseshyprctl workspaces -jinstead of the heavierhyprctl clients -j
# Check current CPU usage by component
ps aux --sort=-%cpu | head -10
# Find and kill stale playerctl processes
ps aux | grep playerctl
# Check if powerprofilesctl is hanging
pgrep -a powerprofilesctl# Check current RAM usage
free -h
# Per-process memory
ps aux --sort=-%mem | head -15
# SwayNC memory breakdown
pmap $(pgrep -x swaync) | tail -5On low-RAM systems (<2GB):
# Increase swap for safety
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# Make permanent
echo '/swapfile none swap defaults 0 0' | sudo tee -a /etc/fstab# Measure full stack idle memory
free -h
# Measure per-component memory
for p in Hyprland swaync waybar kitty; do
ps -o rss,comm -C "$p" | tail -1
done
# Measure CPU over 30 seconds
top -b -n 30 -d 1 | grep -E 'Hyprland|waybar|swaync'