Skip to content

Instantly share code, notes, and snippets.

@peteonrails
Created April 15, 2026 23:57
Show Gist options
  • Select an option

  • Save peteonrails/0086eb989f0a87fb430e7bb03a191f7b to your computer and use it in GitHub Desktop.

Select an option

Save peteonrails/0086eb989f0a87fb430e7bb03a191f7b to your computer and use it in GitHub Desktop.
Alpenglow Waybar config + Tempest Weather widget for Omarchy

Alpenglow Waybar config

Waybar configuration for the Alpenglow Omarchy theme, including a Tempest Weather System module.

Files

  • config.jsonc — Waybar layout (left/center/right modules).
  • style.css — Waybar styling. The fenced alpenglow-waybar-scheme block at the bottom is the warm/cool colorization. Only has effect when using Alpenglow or any theme that ships the extended @color1@color8 palette.
  • tempestwx.sh — Weather widget script for the Tempest Weather System. Replace YOUR_STATION_ID and YOUR_API_TOKEN with your own from tempestwx.com.

Install

# Copy to your waybar dir
cp config.jsonc style.css ~/.config/waybar/
mkdir -p ~/.config/waybar/scripts
cp tempestwx.sh ~/.config/waybar/scripts/
chmod +x ~/.config/waybar/scripts/tempestwx.sh

# Edit the script to add your Tempest station ID and API token
$EDITOR ~/.config/waybar/scripts/tempestwx.sh

# Restart waybar
omarchy-restart-waybar

If you're on an Omarchy theme other than Alpenglow, the Alpenglow colorization block at the bottom of style.css is a no-op (the @color* vars are undefined). Safe to leave in place, or remove it by deleting everything between the alpenglow-waybar-scheme:start / :end markers.

{
"reload_style_on_change": true,
"layer": "top",
"position": "top",
"spacing": 0,
"height": 26,
"modules-left": ["custom/omarchy", "hyprland/workspaces"],
"modules-center": ["custom/weather", "clock", "custom/update", "custom/voxtype", "custom/screenrecording-indicator", "custom/idle-indicator", "custom/notification-silencing-indicator"],
"modules-right": [
"group/tray-expander",
"bluetooth",
"network",
"pulseaudio",
"cpu",
"battery"
],
"hyprland/workspaces": {
"on-click": "activate",
"format": "{icon}",
"format-icons": {
"default": "",
"1": "1",
"2": "2",
"3": "3",
"4": "4",
"5": "5",
"6": "6",
"7": "7",
"8": "8",
"9": "9",
"10": "0",
"active": "󱓻"
},
"persistent-workspaces": {
"1": [],
"2": [],
"3": [],
"4": [],
"5": []
}
},
"custom/omarchy": {
"format": "<span font='omarchy'>\ue900</span>",
"on-click": "omarchy-menu",
"on-click-right": "xdg-terminal-exec",
"tooltip-format": "Omarchy Menu\n\nSuper + Alt + Space"
},
"custom/update": {
"format": "",
"exec": "omarchy-update-available",
"on-click": "omarchy-launch-floating-terminal-with-presentation omarchy-update",
"tooltip-format": "Omarchy update available",
"signal": 7,
"interval": 21600
},
"cpu": {
"interval": 5,
"format": "󰍛",
"on-click": "omarchy-launch-or-focus-tui btop",
"on-click-right": "alacritty"
},
"clock": {
"format": "{:L%A %d %B %H:%M:%S}",
"format-alt": "{:L%d %B W%V %Y}",
"interval": 1,
"tooltip": false,
"on-click-right": "omarchy-launch-floating-terminal-with-presentation omarchy-tz-select"
},
"network": {
"format-icons": ["󰤯", "󰤟", "󰤢", "󰤥", "󰤨"],
"format": "{icon}",
"format-wifi": "{icon}",
"format-ethernet": "󰀂",
"format-disconnected": "󰤮",
"tooltip-format-wifi": "{essid} ({frequency} GHz)",
"tooltip-format-ethernet": "Connected",
"tooltip-format-disconnected": "Disconnected",
"interval": 3,
"spacing": 1,
"on-click": "omarchy-launch-wifi"
},
"battery": {
"format": "{capacity}% {icon}",
"format-discharging": "{icon}",
"format-charging": "{icon}",
"format-plugged": "",
"format-icons": {
"charging": ["󰢜", "󰂆", "󰂇", "󰂈", "󰢝", "󰂉", "󰢞", "󰂊", "󰂋", "󰂅"],
"default": ["󰁺", "󰁻", "󰁼", "󰁽", "󰁾", "󰁿", "󰂀", "󰂁", "󰂂", "󰁹"]
},
"format-full": "󰂅",
"tooltip-format-discharging": "{power:>1.0f}W↓ {capacity}%",
"tooltip-format-charging": "{power:>1.0f}W↑ {capacity}%",
"interval": 5,
"on-click": "omarchy-menu power",
"states": {
"warning": 20,
"critical": 10
}
},
"bluetooth": {
"format": "",
"format-off": "󰂲",
"format-disabled": "󰂲",
"format-connected": "󰂱",
"format-no-controller": "",
"tooltip-format": "Devices connected: {num_connections}",
"on-click": "omarchy-launch-bluetooth"
},
"pulseaudio": {
"format": "{icon}",
"on-click": "omarchy-launch-audio",
"on-click-right": "pamixer -t",
"tooltip-format": "Playing at {volume}%",
"scroll-step": 5,
"format-muted": "",
"format-icons": {
"headphone": "",
"headset": "",
"default": ["", "", ""]
}
},
"group/tray-expander": {
"orientation": "inherit",
"drawer": {
"transition-duration": 600,
"children-class": "tray-group-item"
},
"modules": ["custom/expand-icon", "tray"]
},
"custom/expand-icon": {
"format": "",
"tooltip": false,
"on-scroll-up": "",
"on-scroll-down": "",
"on-scroll-left": "",
"on-scroll-right": ""
},
"custom/screenrecording-indicator": {
"on-click": "omarchy-cmd-screenrecord",
"exec": "$OMARCHY_PATH/default/waybar/indicators/screen-recording.sh",
"signal": 8,
"return-type": "json"
},
"custom/idle-indicator": {
"on-click": "omarchy-toggle-idle",
"exec": "$OMARCHY_PATH/default/waybar/indicators/idle.sh",
"signal": 9,
"return-type": "json"
},
"custom/notification-silencing-indicator": {
"on-click": "omarchy-toggle-notification-silencing",
"exec": "$OMARCHY_PATH/default/waybar/indicators/notification-silencing.sh",
"signal": 10,
"return-type": "json"
},
"custom/voxtype": {
"exec": "omarchy-voxtype-status",
"return-type": "json",
"format": "{icon}",
"format-icons": {
"idle": "󰍬",
"recording": "󰍬",
"transcribing": "󰔟"
},
"tooltip": true,
"on-click-right": "omarchy-voxtype-config",
"on-click": "omarchy-voxtype-model"
},
"custom/weather": {
"format": "{}",
"tooltip": true,
"interval": 3600,
"exec": "~/.config/waybar/scripts/tempestwx.sh",
"return-type": "json",
"on-click": "xdg-open \"https://tempestwx.com/station/YOUR_STATION_ID/\""
},
"tray": {
"icon-size": 12,
"spacing": 17
}
}
@import "../omarchy/current/theme/waybar.css";
* {
background-color: @background;
color: @foreground;
border: none;
border-radius: 0;
min-height: 0;
font-family: 'JetBrainsMono Nerd Font';
font-size: 12px;
}
.modules-left {
margin-left: 8px;
}
.modules-right {
margin-right: 8px;
}
#workspaces button {
all: initial;
padding: 0 6px;
margin: 0 1.5px;
min-width: 9px;
}
#workspaces button.empty {
opacity: 0.5;
}
#cpu,
#battery,
#pulseaudio,
#custom-omarchy,
#custom-update {
min-width: 12px;
margin: 0 7.5px;
}
#tray {
margin-right: 16px;
}
#bluetooth {
margin-right: 17px;
}
#network {
margin-right: 13px;
}
#custom-expand-icon {
margin-right: 18px;
}
tooltip {
padding: 2px;
}
#custom-update {
font-size: 10px;
}
#clock {
margin-left: 8.75px;
}
.hidden {
opacity: 0;
}
#custom-screenrecording-indicator,
#custom-idle-indicator,
#custom-notification-silencing-indicator {
min-width: 12px;
margin-left: 5px;
margin-right: 0;
font-size: 10px;
padding-bottom: 1px;
}
#custom-screenrecording-indicator.active {
color: #a55555;
}
#custom-idle-indicator.active,
#custom-notification-silencing-indicator.active {
color: #a55555;
}
#custom-voxtype {
min-width: 12px;
margin: 0 0 0 7.5px;
color: #75a855;
}
#custom-voxtype.recording {
color: #a55555;
}
/* --- alpenglow-waybar-scheme:start --- */
/* Per-module colorization. Only has effect on themes that ship the extended
* @color1..@color8 palette (e.g., Alpenglow). On themes without those vars,
* the rules are no-ops — but to avoid "invisible text" fallbacks, each rule
* defaults to @foreground via color chaining. */
#custom-omarchy { color: @color4; }
#workspaces button.active label,
#workspaces button.focused label { color: @color4; }
#clock { color: @color3; }
#custom-weather { color: @color5; }
#battery { color: @color2; }
#pulseaudio { color: @color6; }
#network, #bluetooth { color: @color4; }
#cpu { color: @color8; }
#custom-update { color: @color1; }
/* --- alpenglow-waybar-scheme:end --- */
#!/bin/bash
# tempestwx.sh - Waybar weather widget for Tempest Weather System
#
# ============================================================================
# CONFIGURATION - Update these values for your Tempest station
# ============================================================================
#
# 1. Get your Station ID:
# - Go to https://tempestwx.com and view your station
# - Your station ID is in the URL: https://tempestwx.com/station/YOUR_ID/
# - Example: https://tempestwx.com/station/12345/
#
# 2. Get your API Token:
# - Go to https://tempestwx.com/settings/tokens
# - Click "Create Token" and copy the generated token
# - Demo token (limited access): 20c70eae-e62f-4d3b-b3a4-8586e90f3ac8
#
# Replace the values below with your own:
STATION_ID="YOUR_STATION_ID"
API_TOKEN="YOUR_API_TOKEN"
# ============================================================================
# End of configuration
# ============================================================================
# Get current conditions from Tempest API
content=$(curl -sS --connect-timeout 4 --max-time 8 "https://swd.weatherflow.com/swd/rest/better_forecast?station_id=$STATION_ID&token=$API_TOKEN" 2>/dev/null || true)
if [ -z "$content" ]; then
jq -nc '{text: "--", tooltip: "Weather unavailable", class: "error"}'
exit 0
fi
# Extract temperature and conditions
TEMP=$(jq -r '.current_conditions.air_temperature // empty' <<<"$content")
CONDITIONS=$(jq -r '.current_conditions.conditions // "unknown"' <<<"$content")
ICON_NAME=$(jq -r '.current_conditions.icon // empty' <<<"$content")
if [ -z "$TEMP" ]; then
jq -nc '{text: "--", tooltip: "Weather unavailable", class: "error"}'
exit 0
fi
# Map icon names to emojis
case "$ICON_NAME" in
"clear-day") ICON="☀️" ;;
"clear-night") ICON="🌙" ;;
"partly-cloudy-day") ICON="⛅" ;;
"partly-cloudy-night") ICON="☁️" ;;
"cloudy") ICON="☁️" ;;
"rainy") ICON="🌧️" ;;
"possibly-rainy-day"|"possibly-rainy-night") ICON="🌦️" ;;
"snow") ICON="❄️" ;;
"possibly-snow-day"|"possibly-snow-night") ICON="🌨️" ;;
"thunderstorm") ICON="⛈️" ;;
"windy") ICON="💨" ;;
"foggy") ICON="🌫️" ;;
*) ICON="🌡️" ;;
esac
# Format temperature in Fahrenheit
TEMP_F=$(awk "BEGIN { printf \"%.0f\", ($TEMP * 9/5) + 32 }")
TEMP_DISPLAY="${TEMP_F}°F"
jq -nc \
--arg text "$ICON $TEMP_DISPLAY" \
--arg tooltip "$ICON $TEMP_DISPLAY\n$CONDITIONS" \
--arg class "$CONDITIONS" \
'{text: $text, tooltip: $tooltip, class: $class}'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment