From e25a00a38ced28ebdbd60a5d884cd69e3c8c854a Mon Sep 17 00:00:00 2001 From: George <91995566+Nm1ss@users.noreply.github.com> Date: Thu, 8 Jan 2026 07:53:11 +0100 Subject: [PATCH 01/12] Update NVIDIA GPU detection for legacy support on professional/workstation cards --- install/config/hardware/nvidia.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/config/hardware/nvidia.sh b/install/config/hardware/nvidia.sh index dba1e6b2..543174e2 100644 --- a/install/config/hardware/nvidia.sh +++ b/install/config/hardware/nvidia.sh @@ -7,8 +7,8 @@ if [ -n "$NVIDIA" ]; then if echo "$NVIDIA" | grep -qE "RTX [2-9][0-9]|GTX 16"; then # Turing (16xx, 20xx), Ampere (30xx), Ada (40xx), and newer recommend the open-source kernel modules PACKAGES=(nvidia-open-dkms nvidia-utils lib32-nvidia-utils libva-nvidia-driver) - elif echo "$NVIDIA" | grep -qE "GTX 9|GTX 10"; then - # Pascal (10xx) and Maxwell (9xx) use legacy branch that can only be installed from AUR + elif echo "$NVIDIA" | grep -qE "GTX 9|GTX 10|Quadro P"; then + # Pascal (10xx or Quadro Pxxx) and Maxwell (9xx) use legacy branch that can only be installed from AUR PACKAGES=(nvidia-580xx-dkms nvidia-580xx-utils lib32-nvidia-580xx-utils) fi # Bail if no supported GPU From 2851687bbbb96f1e033ab47c5c106a9497f716a7 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 8 Jan 2026 09:18:22 +0100 Subject: [PATCH 02/12] Fix use of accent colors --- default/themed/mako.ini.tpl | 2 +- default/themed/swayosd.css.tpl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/default/themed/mako.ini.tpl b/default/themed/mako.ini.tpl index 51e9c66f..5abc7988 100644 --- a/default/themed/mako.ini.tpl +++ b/default/themed/mako.ini.tpl @@ -1,5 +1,5 @@ include=~/.local/share/omarchy/default/mako/core.ini text-color={{ foreground }} -border-color={{ foreground }} +border-color={{ accent }} background-color={{ background }} diff --git a/default/themed/swayosd.css.tpl b/default/themed/swayosd.css.tpl index 3f609e17..e06402c4 100644 --- a/default/themed/swayosd.css.tpl +++ b/default/themed/swayosd.css.tpl @@ -2,4 +2,4 @@ @define-color border-color {{ foreground }}; @define-color label {{ foreground }}; @define-color image {{ foreground }}; -@define-color progress {{ foreground }}; +@define-color progress {{ accent }}; From 8826aa10ca80b6ce19b8ebc7a410df02d596bd7d Mon Sep 17 00:00:00 2001 From: Timo Hubois <46505685+timohubois@users.noreply.github.com> Date: Thu, 8 Jan 2026 09:34:38 +0100 Subject: [PATCH 03/12] fix(migrations-1767138576): split sed commands in scrolltouchpad migration The sed expression for converting scrolltouchpad syntax to Hyprland 0.53 format was broken across two lines, causing the second substitution pattern to fail silently. Split into separate sed commands to ensure both class:(pattern) and class:pattern formats are migrated correctly. --- migrations/1767138576.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/migrations/1767138576.sh b/migrations/1767138576.sh index 2e1d8065..5df9ce2b 100644 --- a/migrations/1767138576.sh +++ b/migrations/1767138576.sh @@ -1,8 +1,8 @@ echo "Update terminal scrolltouchpad setting to Hyprland 0.53 style" if grep -q "scrolltouchpad" ~/.config/hypr/input.conf; then - sed -Ei 's/^windowrule = scrolltouchpad ([^,]+), class:\(([^)]+)\)$/windowrule = match:class (\2), scroll_touchpad \1/; - s/^windowrule = scrolltouchpad ([^,]+), class:([^ ]+)$/windowrule = match:class \2, scroll_touchpad \1/' ~/.config/hypr/input.conf + sed -Ei 's/^windowrule = scrolltouchpad ([^,]+), class:\(([^)]+)\)$/windowrule = match:class (\2), scroll_touchpad \1/' ~/.config/hypr/input.conf + sed -Ei 's/^windowrule = scrolltouchpad ([^,]+), class:([^ ]+)$/windowrule = match:class \2, scroll_touchpad \1/' ~/.config/hypr/input.conf sed -Ei 's/^windowrule = scrolltouchpad ([^,]+), tag:terminal$/windowrule = match:class (Alacritty|kitty), scroll_touchpad 1.5\nwindowrule = match:class com.mitchellh.ghostty, scroll_touchpad 0.2/' ~/.config/hypr/input.conf fi From 5603fb50fdd99b5eecd05c6453dc2735089cdb66 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 8 Jan 2026 10:16:12 +0100 Subject: [PATCH 04/12] Dramatically simplify omarchy-theme-set-obsidian The cost is that only themes with a colors.toml file will get Obsidian themeing. --- bin/omarchy-theme-set-obsidian | 672 +------------------------------- default/themed/obsidian.css.tpl | 99 +++++ 2 files changed, 109 insertions(+), 662 deletions(-) create mode 100644 default/themed/obsidian.css.tpl diff --git a/bin/omarchy-theme-set-obsidian b/bin/omarchy-theme-set-obsidian index 6906b28d..f86cea1d 100755 --- a/bin/omarchy-theme-set-obsidian +++ b/bin/omarchy-theme-set-obsidian @@ -1,52 +1,18 @@ #!/bin/bash -# omarchy-theme-set-obsidian: Bootstrap and update Omarchy theme for Obsidian -# -# - Ensures registry at ~/.local/state/omarchy/obsidian-vaults -# - Populates by extracting vault paths from ~/.config/obsidian/obsidian.json -# - For each valid vault: -# - Ensures .obsidian/themes/Omarchy/{manifest.json, theme.css} -# - Updates theme.css (uses current theme’s obsidian.css if present; otherwise generates -- see below) +# Sync Omarchy theme to all Obsidian vaults -# Theme automagic generation logic: -# -# - Background/foreground: read from ~/.config/omarchy/current/theme/alacritty.toml [colors.primary] -# (background/foreground). Fallbacks: bg=#1a1b26, fg=#a9b1d6. Compute bg brightness for light/dark handling. -# - Palette extraction: collect colors from Alacritty (primary/normal/bright/dim/selection), Waybar (@define-color), -# and Hyprland (col.*_border; rgba->hex). Normalize, dedupe, and count frequencies. -# - Slot ordering: remove bg/fg, sort remaining colors by frequency, then fill 13 slots by cycling. Map slots to: -# h1–h6, links, inline code, marks, interactive accent, blockquote border; muted/faint use border color. -# - Code colors: code background = closest color to bg (Euclidean RGB); if none, make a subtle bg variant (+/− RGB). -# code foreground = closest color to fg; fallback #e0e0e0. -# - Border color: from btop.theme theme[div_line]; else blended mix biased toward bg (≈ (bg+fg)/3). -# - Selection: from Alacritty [colors.selection] (background/text), honoring CellForeground/Background. -# If missing, background = 75% bg + 25% fg; text chosen for contrast vs selection background. -# - Fonts: monospace from Alacritty [font] or fontconfig monospace; UI font from fontconfig sans-serif. - -VAULTS_FILE="$HOME/.local/state/omarchy/obsidian-vaults" CURRENT_THEME_DIR="$HOME/.config/omarchy/current/theme" -ensure_vaults_file() { - mkdir -p "$(dirname "$VAULTS_FILE")" - local tmpfile - tmpfile="$(mktemp)" - # Extract the Obsidian vault location from config file //.obsidian - jq -r '.vaults | values[].path' ~/.config/obsidian/obsidian.json 2>/dev/null >>"$tmpfile" - if [ -s "$tmpfile" ]; then - sort -u "$tmpfile" >"$VAULTS_FILE" - else - : >"$VAULTS_FILE" - fi - rm "$tmpfile" -} +[ -f "$CURRENT_THEME_DIR/obsidian.css" ] || exit 0 -# Ensure theme directory and minimal manifest exist in a vault -ensure_theme_scaffold() { - local vault_path="$1" - local theme_dir="$vault_path/.obsidian/themes/Omarchy" +jq -r '.vaults | values[].path' ~/.config/obsidian/obsidian.json 2>/dev/null | while read -r vault_path; do + [ -d "$vault_path/.obsidian" ] || continue + + theme_dir="$vault_path/.obsidian/themes/Omarchy" mkdir -p "$theme_dir" - if [ ! -f "$theme_dir/manifest.json" ]; then - cat >"$theme_dir/manifest.json" <<'EOF' + + [ -f "$theme_dir/manifest.json" ] || cat >"$theme_dir/manifest.json" <<'EOF' { "name": "Omarchy", "version": "1.0.0", @@ -56,624 +22,6 @@ ensure_theme_scaffold() { "authorUrl": "https://omarchy.org" } EOF - fi - [ -f "$theme_dir/theme.css" ] || : >"$theme_dir/theme.css" -} -# Function to extract hex color from string -extract_hex_color() { - echo "$1" | grep -oE '#[0-9a-fA-F]{6}' | head -1 -} - -# Function to convert RGB/RGBA to hex -rgb_to_hex() { - local rgb_string="$1" - if [[ $rgb_string =~ rgba?\(([0-9]+),\s*([0-9]+),\s*([0-9]+) ]]; then - printf "#%02x%02x%02x\n" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}" - fi -} - -# Convert hex to RGB components -hex_to_rgb() { - local hex="${1#\#}" - printf "%d %d %d\n" "0x${hex:0:2}" "0x${hex:2:2}" "0x${hex:4:2}" -} - -# Calculate perceived brightness (0-255) -calculate_brightness() { - local hex="$1" - read -r r g b <<<"$(hex_to_rgb "$hex")" - # Use perceived brightness formula - echo $(((r * 299 + g * 587 + b * 114) / 1000)) -} - -# Calculate approximate contrast ratio between two colors -# Returns ratio scaled by 100 (e.g., 450 = 4.5:1 ratio) -# (this is due to bash not supporting decimal math) -calculate_contrast_ratio() { - local hex1="$1" hex2="$2" - local br1=$(calculate_brightness "$hex1") # 0-255 range - local br2=$(calculate_brightness "$hex2") # 0-255 range - - # Ensure br1 is the lighter color (higher brightness) - if [ $br1 -lt $br2 ]; then - local temp=$br1 - br1=$br2 - br2=$temp - fi - - # Approximate contrast ratio scaled by 100 - # Add offset to avoid division by zero and approximate WCAG +0.05 behavior - echo $(((br1 + 13) * 100 / (br2 + 13))) -} - -# Check if two colors meet minimum contrast threshold -# Usage: meets_contrast_threshold -# Both ratio and threshold should be scaled by 100 (e.g., 300 = 3:1) -meets_contrast_threshold() { - local ratio="$1" # Ratio scaled by 100 (from calculate_contrast_ratio) - local threshold="$2" # Threshold scaled by 100 (300=3:1, 450=4.5:1, 700=7:1) - [ $ratio -ge $threshold ] -} - -# Calculate color distance (euclidean in RGB space) -color_distance() { - local hex1="$1" - local hex2="$2" - read -r r1 g1 b1 <<<"$(hex_to_rgb "$hex1")" - read -r r2 g2 b2 <<<"$(hex_to_rgb "$hex2")" - echo $(((r1 - r2) * (r1 - r2) + (g1 - g2) * (g1 - g2) + (b1 - b2) * (b1 - b2))) -} - -# Extract all colors with frequency count -extract_all_colors_with_count() { - local -A color_counts - local color - - # Extract from Alacritty config - if [ -f "$CURRENT_THEME_DIR/alacritty.toml" ]; then - # Primary colors - while IFS= read -r color; do - color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency - [ -n "$color" ] && ((color_counts["$color"]++)) - done < <(grep -E "(background|foreground|cursor|text)" "$CURRENT_THEME_DIR/alacritty.toml" | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | grep "^#") - - # Normal colors - while IFS= read -r color; do - color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency - [ -n "$color" ] && ((color_counts["$color"]++)) - done < <(grep -A 20 "\[colors.normal\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep -E "(black|red|green|yellow|blue|magenta|cyan|white)" | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | grep "^#") - - # Bright colors - while IFS= read -r color; do - # Add # if missing - [[ "$color" =~ ^[0-9a-fA-F]{6}$ ]] && color="#$color" - color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency - [[ "$color" =~ ^#[0-9a-f]{6}$ ]] && ((color_counts["$color"]++)) - done < <(grep -A 20 "\[colors.bright\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep -E "(black|red|green|yellow|blue|magenta|cyan|white)" | sed "s/.*[\"']//;s/[\"'].*//") - - # Dim colors if present - while IFS= read -r color; do - # Add # if missing - [[ "$color" =~ ^[0-9a-fA-F]{6}$ ]] && color="#$color" - color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency - [[ "$color" =~ ^#[0-9a-f]{6}$ ]] && ((color_counts["$color"]++)) - done < <(grep -A 20 "\[colors.dim\]" "$CURRENT_THEME_DIR/alacritty.toml" 2>/dev/null | grep -E "(black|red|green|yellow|blue|magenta|cyan|white)" | sed "s/.*[\"']//;s/[\"'].*//") - - # Selection colors - while IFS= read -r color; do - color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency - [ -n "$color" ] && ((color_counts["$color"]++)) - done < <(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" 2>/dev/null | grep -E "(background|text)" | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | grep "^#") - fi - - # Extract from Waybar CSS - if [ -f "$CURRENT_THEME_DIR/waybar.css" ]; then - while IFS= read -r color; do - color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency - [ -n "$color" ] && ((color_counts["$color"]++)) - done < <(grep -oE '@define-color [a-z_-]+ #[0-9a-fA-F]{6}' "$CURRENT_THEME_DIR/waybar.css" | grep -oE '#[0-9a-fA-F]{6}') - fi - - # Extract from Hyprland config - if [ -f "$CURRENT_THEME_DIR/hyprland.conf" ]; then - while IFS= read -r color; do - if [[ $color == rgba* ]] || [[ $color == rgb* ]]; then - color=$(rgb_to_hex "$color") - fi - color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency - [ -n "$color" ] && ((color_counts["$color"]++)) - done < <(grep -E "col\.(active|inactive)_border" "$CURRENT_THEME_DIR/hyprland.conf" | grep -oE 'rgba?\([^)]+\)|#[0-9a-fA-F]{6,8}' | sed 's/ff$//') - fi - - # Output colors with their counts - for color in "${!color_counts[@]}"; do - echo "${color_counts[$color]} $color" - done -} - -# Sort colors by frequency -sort_colors_by_frequency() { - # Input is already "count color" format - sort -rn | cut -d' ' -f2 -} - -# Fill color slots with cycling if needed -fill_color_slots() { - local -a colors=("$@") - local -a slots - local num_colors=${#colors[@]} - - # Need 13 slots total (code colors are handled separately) - local slots_needed=13 - - if [ $num_colors -eq 0 ]; then - # No colors available, use defaults - colors=("#3d3d3d" "#5d5d5d" "#7d7d7d" "#9d9d9d" "#bd93f9" "#50fa7b") - num_colors=6 - fi - - # Fill slots, cycling if necessary - for ((i = 0; i < slots_needed; i++)); do - slots[$i]="${colors[$((i % num_colors))]}" - done - - echo "${slots[@]}" -} - -# Main color extraction and theme generation -extract_theme_data() { - # Get primary colors from Alacritty - local bg_color="#1a1b26" - local fg_color="#a9b1d6" - - if [ -f "$CURRENT_THEME_DIR/alacritty.toml" ]; then - local extracted_bg=$(grep -A 5 "\[colors.primary\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^background = " | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | head -1 | tr '[:upper:]' '[:lower:]') - local extracted_fg=$(grep -A 5 "\[colors.primary\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^foreground = " | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | head -1 | tr '[:upper:]' '[:lower:]') - [ -n "$extracted_bg" ] && bg_color="$extracted_bg" - [ -n "$extracted_fg" ] && fg_color="$extracted_fg" - fi - - # Determine if light or dark theme - local bg_brightness=$(calculate_brightness "$bg_color") - local is_light_theme=false - [ $bg_brightness -gt 127 ] && is_light_theme=true - - # Extract all colors with counts - local color_data=$(extract_all_colors_with_count) - - # Filter out background and foreground colors for the main array - local filtered_data=$(echo "$color_data" | grep -v "$bg_color" | grep -v "$fg_color") - - # Get all unique colors (including bg/fg) for distance calculations - local -a all_unique_colors - readarray -t all_unique_colors < <(echo "$color_data" | cut -d' ' -f2 | sort -u) - - # Find the 3 closest colors to background for background variations - local -a bg_distances - for color in "${all_unique_colors[@]}"; do - if [ "$color" != "$bg_color" ]; then - distance=$(color_distance "$color" "$bg_color") - bg_distances+=("$distance:$color") - fi - done - - # All background variations use the same as primary background - local bg_primary_alt="$bg_color" - local bg_secondary="$bg_color" - local bg_secondary_alt="$bg_color" - - # Generate code background color that will contrast with foreground text - read -r r g b <<<"$(hex_to_rgb "$bg_color")" - if [ $bg_brightness -gt 127 ]; then - r=$((r - 10)) - g=$((g - 10)) - b=$((b - 10)) - else - r=$((r + 15)) - g=$((g + 15)) - b=$((b + 15)) - fi - [ $r -lt 0 ] && r=0 - [ $r -gt 255 ] && r=255 - [ $g -lt 0 ] && g=0 - [ $g -gt 255 ] && g=255 - [ $b -lt 0 ] && b=0 - [ $b -gt 255 ] && b=255 - code_bg=$(printf "#%02x%02x%02x" "$r" "$g" "$b") - - - # Find closest color to foreground for code block text - local code_fg="" - min_distance=999999999 - for color in "${all_unique_colors[@]}"; do - if [ "$color" != "$fg_color" ]; then - distance=$(color_distance "$color" "$fg_color") - if [ $distance -lt $min_distance ]; then - min_distance=$distance - code_fg="$color" - fi - fi - done - [ -z "$code_fg" ] && code_fg="#e0e0e0" # Fallback - - # Extract text selection colors from Alacritty - local selection_bg="" - local selection_fg="" - if [ -f "$CURRENT_THEME_DIR/alacritty.toml" ]; then - selection_bg=$(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^background = " | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | head -1 | tr '[:upper:]' '[:lower:]') - local selection_text=$(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^text = " | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | head -1 | tr '[:upper:]' '[:lower:]') - - # If text is set to CellForeground/CellBackground, use the appropriate color - if [ -z "$selection_text" ] || [[ "$(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^text = ")" == *"CellForeground"* ]]; then - selection_fg="$fg_color" - elif [[ "$(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^text = ")" == *"CellBackground"* ]]; then - selection_fg="$bg_color" - else - selection_fg="$selection_text" - fi - fi - - # Fallback if no selection colors found - if [ -z "$selection_bg" ]; then - read -r r1 g1 b1 <<<"$(hex_to_rgb "$bg_color")" - read -r r2 g2 b2 <<<"$(hex_to_rgb "$fg_color")" - local r=$(((r1 * 3 + r2) / 4)) # 75% background, 25% foreground - local g=$(((g1 * 3 + g2) / 4)) - local b=$(((b1 * 3 + b2) / 4)) - selection_bg=$(printf "#%02x%02x%02x" "$r" "$g" "$b") - fi - - # Use contrasting color for selection text if not defined - if [ -z "$selection_fg" ]; then - # Calculate brightness of selection background - local sel_brightness=$(calculate_brightness "$selection_bg") - if [ $sel_brightness -gt 127 ]; then - selection_fg="$bg_color" # Dark text on light selection - else - selection_fg="$fg_color" # Light text on dark selection - fi - fi - - # Extract border color from btop theme - local border_color="" - if [ -f "$CURRENT_THEME_DIR/btop.theme" ]; then - # Look for theme[div_line] in btop theme - local btop_divline=$(grep 'theme\[div_line\]' "$CURRENT_THEME_DIR/btop.theme" | head -1) - - if [ -n "$btop_divline" ]; then - # Extract the color value after the = sign - local extracted=$(echo "$btop_divline" | sed 's/.*=//' | xargs) - - # Check if it's a hex color and lowercase it - if [[ $extracted =~ ^#[0-9a-fA-F]{6}$ ]]; then - border_color=$(echo "$extracted" | tr '[:upper:]' '[:lower:]') - elif [[ $extracted =~ ^[0-9a-fA-F]{6}$ ]]; then - # Add # if missing and lowercase - border_color=$(echo "#$extracted" | tr '[:upper:]' '[:lower:]') - fi - fi - fi - - # Fallback if no border color found - if [ -z "$border_color" ]; then - # Use a color between bg and fg - read -r r1 g1 b1 <<<"$(hex_to_rgb "$bg_color")" - read -r r2 g2 b2 <<<"$(hex_to_rgb "$fg_color")" - local r=$(((r1 + r2) / 3)) # Closer to background - local g=$(((g1 + g2) / 3)) - local b=$(((b1 + b2) / 3)) - border_color=$(printf "#%02x%02x%02x" "$r" "$g" "$b") - fi - - # Set text colors for muted/faint based on contrast - local text_muted_color="$border_color" - local text_faint_color="$border_color" - - # Validate border color contrast against background - - # Represents a 3:1 WCAG contrast ratio - local ideal_contrast_ratio=300 - - local border_contrast=$(calculate_contrast_ratio "$border_color" "$bg_color") - if ! meets_contrast_threshold "$border_contrast" "$ideal_contrast_ratio"; then - # Override text colors for readability, keep border color for visibility - text_muted_color="$fg_color" - text_faint_color="$fg_color" - fi - - # Get unique colors array (without bg/fg) sorted by frequency - local -a unique_colors - readarray -t unique_colors < <(echo "$filtered_data" | sort_colors_by_frequency) - - # Fill the 13 color slots (code colors handled separately) - local -a color_slots - readarray -t color_slots < <(fill_color_slots "${unique_colors[@]}" | tr ' ' '\n') - - # Extract fonts - local monospace_font="JetBrainsMono Nerd Font" - local ui_font="Liberation Sans" - - if [ -f "$CURRENT_THEME_DIR/alacritty.toml" ]; then - local alacritty_font=$(grep -A 5 "\[font\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep 'family = ' | head -1 | cut -d'"' -f2) - [ -n "$alacritty_font" ] && monospace_font="$alacritty_font" - fi - - if [ -f "$HOME/.config/fontconfig/fonts.conf" ]; then - local fontconfig_mono=$(xmlstarlet sel -t -v '//match[@target="pattern"][test/string="monospace"]/edit[@name="family"]/string' "$HOME/.config/fontconfig/fonts.conf" 2>/dev/null || true) - [ -n "$fontconfig_mono" ] && monospace_font="$fontconfig_mono" - - local fontconfig_sans=$(xmlstarlet sel -t -v '//match[@target="pattern"][test/string="sans-serif"]/edit[@name="family"]/string' "$HOME/.config/fontconfig/fonts.conf" 2>/dev/null || true) - [ -n "$fontconfig_sans" ] && ui_font="$fontconfig_sans" - fi - - # Generate CSS with 14-slot system - cat </dev/null || echo "unknown")") */ -/* Colors sorted by frequency, backgrounds by distance */ - -.theme-dark, .theme-light { - /* Core colors */ - --background-primary: $bg_color; - --text-normal: $fg_color; - - /* Background variations (always distance-based) */ - --background-primary-alt: $bg_primary_alt; - --background-secondary: $bg_secondary; - --background-secondary-alt: $bg_secondary_alt; - - /* Code block colors (always distance-based) */ - --code-background: $code_bg; - --code-foreground: $code_fg; - - /* Border color from btop theme */ - --border-color: $border_color; - - /* Selection colors from Alacritty */ - --text-selection: $selection_bg; - --text-selection-fg: $selection_fg; - - /* 13-slot color system for remaining elements */ - --text-title-h1: ${color_slots[0]}; - --text-title-h2: ${color_slots[1]}; - --text-title-h3: ${color_slots[2]}; - --text-title-h4: ${color_slots[3]}; - --text-title-h5: ${color_slots[4]}; - --text-title-h6: ${color_slots[4]}; /* Same as h5 */ - --text-link: ${color_slots[5]}; - --markup-code: ${color_slots[6]}; - --text-mark: ${color_slots[7]}; - --interactive-accent: ${color_slots[8]}; - --blockquote-border: ${color_slots[9]}; - --text-muted: $text_muted_color; /* Use text-specific color for muted text */ - --text-faint: $text_faint_color; /* Use text-specific color for faint text */ - - /* Additional mappings */ - --text-accent: var(--interactive-accent); - --text-accent-hover: var(--interactive-accent); - --text-error: var(--text-title-h1); - --text-error-hover: var(--text-title-h1); - --text-highlight-bg: $fg_color; /* Use text color as highlight background */ - --text-on-accent: $bg_color; - - --interactive-normal: var(--code-background); - --interactive-hover: var(--interactive-accent); - --interactive-accent-hover: var(--interactive-accent); - --interactive-success: var(--text-title-h2); - - --scrollbar-bg: var(--background-primary); - --scrollbar-thumb-bg: var(--code-background); - --scrollbar-active-thumb-bg: var(--interactive-accent); - - --background-modifier-border: var(--border-color); - --background-modifier-form-field: var(--code-background); - --background-modifier-form-field-highlighted: var(--code-background); - --background-modifier-box-shadow: rgba(0, 0, 0, 0.3); - --background-modifier-success: var(--interactive-success); - --background-modifier-error: var(--text-error); - --background-modifier-error-hover: var(--text-error); - --background-modifier-cover: rgba(0, 0, 0, 0.8); - - --link-color: var(--text-link); - --link-color-hover: var(--text-link); - --link-unresolved-color: var(--text-muted); - --link-unresolved-opacity: 0.7; - - --tag-color: var(--text-title-h3); - --tag-background: var(--code-background); - - --graph-line: var(--text-muted); - --graph-node: var(--interactive-accent); - --graph-node-unresolved: var(--text-muted); - --graph-node-focused: var(--text-link); - --graph-node-tag: var(--text-title-h3); - --graph-node-attachment: var(--text-title-h2); - - /* Fonts */ - --font-interface-theme: "$ui_font"; - --font-text-theme: "$ui_font"; - --font-monospace-theme: "$monospace_font"; -} - -/* Headers */ -.cm-header-1, .markdown-rendered h1 { color: var(--text-title-h1); } -.cm-header-2, .markdown-rendered h2 { color: var(--text-title-h2); } -.cm-header-3, .markdown-rendered h3 { color: var(--text-title-h3); } -.cm-header-4, .markdown-rendered h4 { color: var(--text-title-h4); } -.cm-header-5, .markdown-rendered h5 { color: var(--text-title-h5); } -.cm-header-6, .markdown-rendered h6 { color: var(--text-title-h6); } - -/* Code blocks */ -.markdown-rendered code { - font-family: var(--font-monospace-theme); - background-color: var(--code-background); - color: var(--markup-code); - padding: 2px 4px; - border-radius: 3px; -} - -.markdown-rendered pre { - background-color: var(--code-background); - border: 1px solid var(--background-modifier-border); - border-radius: 5px; -} - -.markdown-rendered pre code { - background-color: transparent; - color: var(--code-foreground); -} - -/* Syntax highlighting */ -.cm-s-obsidian span.cm-keyword { color: var(--text-title-h1); } -.cm-s-obsidian span.cm-string { color: var(--text-title-h2); } -.cm-s-obsidian span.cm-number { color: var(--text-title-h3); } -.cm-s-obsidian span.cm-comment { color: var(--text-muted); } -.cm-s-obsidian span.cm-operator { color: var(--text-link); } -.cm-s-obsidian span.cm-variable { color: var(--text-normal); } -.cm-s-obsidian span.cm-def { color: var(--text-link); } - -/* Highlighted text */ -.markdown-rendered mark, -.cm-s-obsidian span.cm-highlight, -mark { - background-color: var(--text-highlight-bg) !important; - color: var(--code-background) !important; -} - -/* Links */ -.markdown-rendered a { - color: var(--text-link); -} - -/* Blockquotes */ -.markdown-rendered blockquote { - border-left: 4px solid var(--blockquote-border); - padding-left: 1em; -} - -/* Status bar */ -.status-bar { - background-color: var(--code-background); - border-top: 1px solid var(--background-modifier-border); -} - -/* Active file */ -.workspace-leaf.mod-active .workspace-leaf-header-title { - color: var(--interactive-accent); -} - -.nav-file-title.is-active { - background-color: var(--code-background); - color: var(--interactive-accent); -} - -/* Text selection */ -::selection { - background-color: var(--text-selection); - color: var(--text-selection-fg); -} - -/* Search results */ -.search-result-file-title { - color: var(--interactive-accent); -} - -.search-result-file-match { - background-color: var(--code-background); - color: var(--text-normal); - border-left: 3px solid var(--interactive-accent); -} - -.search-result-file-matched-text { - color: var(--code-background); -} - -/* Tables */ -.markdown-rendered table { - border: 1px solid var(--background-modifier-border); -} - -.markdown-rendered th { - background-color: var(--code-background); - color: var(--text-accent); -} - -.markdown-rendered td { - border: 1px solid var(--background-modifier-border); -} - -/* Callouts */ -.callout { - border-left: 4px solid var(--interactive-accent); - background-color: var(--code-background); -} -.callout * { - color: var(--text-normal); -} - -/* Modal dialogs */ -.modal { - background-color: var(--background-primary); - border: 2px solid var(--background-modifier-border); -} - -/* Settings */ -.vertical-tab-header-group-title { - color: var(--interactive-accent); -} - -.vertical-tab-nav-item.is-active { - background-color: var(--code-background); - color: var(--interactive-accent); -} -EOF -} - -# Option handling -if [ "${1:-}" = "--reset" ]; then - echo "♻️ Resetting Omarchy themes and registry..." - if [ -f "$VAULTS_FILE" ] && [ -s "$VAULTS_FILE" ]; then - while IFS= read -r vault_path || [ -n "$vault_path" ]; do - case "$vault_path" in ""|\#*) continue ;; esac - vault_path="${vault_path%/}" - vault_name=$(basename "$vault_path") - theme_dir="$vault_path/.obsidian/themes/Omarchy" - if [ -d "$theme_dir" ]; then - rm -rf "$theme_dir" - echo " ✅ $vault_name (theme removed)" - else - echo " ℹ️ $vault_name (no theme present)" - fi - done <"$VAULTS_FILE" - fi - rm -f "$VAULTS_FILE" - echo "✅ Registry removed" - exit 0 -fi - -# Step 1: ensure registry exists (bootstrap if needed) -ensure_vaults_file - -while IFS= read -r vault_path || [ -n "$vault_path" ]; do - case "$vault_path" in "" | \#*) continue ;; esac - vault_path="${vault_path%/}" - vault_name=$(basename "$vault_path") - - # Step 2: verify path exists; log/skip gracefully if invalid - if [ ! -d "$vault_path" ] || [ ! -d "$vault_path/.obsidian" ]; then - echo " ❌ $vault_name (invalid entry: missing directory or .obsidian)" - continue - fi - - # Ensure theme files exist for this vault - ensure_theme_scaffold "$vault_path" - THEME_DIR="$vault_path/.obsidian/themes/Omarchy" - - # Step 3: update theme.css - if [ -f "$CURRENT_THEME_DIR/obsidian.css" ]; then - cp "$CURRENT_THEME_DIR/obsidian.css" "$THEME_DIR/theme.css" - else - extract_theme_data >"$THEME_DIR/theme.css" - fi -done <"$VAULTS_FILE" + cp "$CURRENT_THEME_DIR/obsidian.css" "$theme_dir/theme.css" +done diff --git a/default/themed/obsidian.css.tpl b/default/themed/obsidian.css.tpl new file mode 100644 index 00000000..90b86244 --- /dev/null +++ b/default/themed/obsidian.css.tpl @@ -0,0 +1,99 @@ +/* Omarchy Theme for Obsidian */ + +.theme-dark, .theme-light { + /* Core colors */ + --background-primary: {{ background }}; + --background-primary-alt: {{ background }}; + --background-secondary: {{ background }}; + --background-secondary-alt: {{ background }}; + --text-normal: {{ foreground }}; + + /* Selection colors */ + --text-selection: {{ selection_background }}; + + /* Border color */ + --background-modifier-border: {{ color8 }}; + + /* Semantic heading colors */ + --text-title-h1: {{ color1 }}; + --text-title-h2: {{ color2 }}; + --text-title-h3: {{ color3 }}; + --text-title-h4: {{ color4 }}; + --text-title-h5: {{ color5 }}; + --text-title-h6: {{ color5 }}; + + /* Links and accents */ + --text-link: {{ color4 }}; + --text-accent: {{ accent }}; + --text-accent-hover: {{ accent }}; + --interactive-accent: {{ accent }}; + --interactive-accent-hover: {{ accent }}; + + /* Muted text */ + --text-muted: {{ color8 }}; + --text-faint: {{ color8 }}; + + /* Code */ + --code-normal: {{ color6 }}; + + /* Errors and success */ + --text-error: {{ color1 }}; + --text-error-hover: {{ color1 }}; + --text-success: {{ color2 }}; + + /* Tags */ + --tag-color: {{ color6 }}; + --tag-background: {{ color8 }}; + + /* Graph */ + --graph-line: {{ color8 }}; + --graph-node: {{ accent }}; + --graph-node-focused: {{ color4 }}; + --graph-node-tag: {{ color6 }}; + --graph-node-attachment: {{ color2 }}; +} + +/* Headers */ +.cm-header-1, .markdown-rendered h1 { color: var(--text-title-h1); } +.cm-header-2, .markdown-rendered h2 { color: var(--text-title-h2); } +.cm-header-3, .markdown-rendered h3 { color: var(--text-title-h3); } +.cm-header-4, .markdown-rendered h4 { color: var(--text-title-h4); } +.cm-header-5, .markdown-rendered h5 { color: var(--text-title-h5); } +.cm-header-6, .markdown-rendered h6 { color: var(--text-title-h6); } + +/* Code blocks */ +.markdown-rendered code { + color: {{ color6 }}; +} + +/* Syntax highlighting */ +.cm-s-obsidian span.cm-keyword { color: {{ color1 }}; } +.cm-s-obsidian span.cm-string { color: {{ color2 }}; } +.cm-s-obsidian span.cm-number { color: {{ color3 }}; } +.cm-s-obsidian span.cm-comment { color: {{ color8 }}; } +.cm-s-obsidian span.cm-operator { color: {{ color4 }}; } +.cm-s-obsidian span.cm-def { color: {{ color4 }}; } + +/* Links */ +.markdown-rendered a { + color: var(--text-link); +} + +/* Blockquotes */ +.markdown-rendered blockquote { + border-left-color: {{ accent }}; +} + +/* Active elements */ +.workspace-leaf.mod-active .workspace-leaf-header-title { + color: var(--interactive-accent); +} + +.nav-file-title.is-active { + color: var(--interactive-accent); +} + +/* Search results */ +.search-result-file-title { + color: var(--interactive-accent); +} From 9fc65dd2defa61de76408aff41251a343f2f3832 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 8 Jan 2026 10:22:10 +0100 Subject: [PATCH 05/12] Simplify the VSCode/derivatives theme setting --- bin/omarchy-theme-set | 2 -- bin/omarchy-theme-set-cursor | 4 --- bin/omarchy-theme-set-vscode | 52 +++++++++++++++------------------- bin/omarchy-theme-set-vscodium | 4 --- 4 files changed, 23 insertions(+), 39 deletions(-) delete mode 100755 bin/omarchy-theme-set-cursor delete mode 100755 bin/omarchy-theme-set-vscodium diff --git a/bin/omarchy-theme-set b/bin/omarchy-theme-set index 4132d3b8..ba34a501 100755 --- a/bin/omarchy-theme-set +++ b/bin/omarchy-theme-set @@ -56,8 +56,6 @@ omarchy-restart-mako omarchy-theme-set-gnome omarchy-theme-set-browser omarchy-theme-set-vscode -omarchy-theme-set-vscodium -omarchy-theme-set-cursor omarchy-theme-set-obsidian # Call hook on theme set diff --git a/bin/omarchy-theme-set-cursor b/bin/omarchy-theme-set-cursor deleted file mode 100755 index 18b962bc..00000000 --- a/bin/omarchy-theme-set-cursor +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -# Call the VSCode theme setter with Cursor-specific parameters -omarchy-theme-set-vscode cursor "$HOME/.config/Cursor/User/settings.json" "$HOME/.local/state/omarchy/toggles/skip-cursor-theme-changes" diff --git a/bin/omarchy-theme-set-vscode b/bin/omarchy-theme-set-vscode index 31f95bf1..bf53013b 100755 --- a/bin/omarchy-theme-set-vscode +++ b/bin/omarchy-theme-set-vscode @@ -1,45 +1,39 @@ #!/bin/bash -# Note: We cannot use `jq` to update settings.json because it’s JSONC (allows comments), -# which jq doesn’t support. +# Sync Omarchy theme to VS Code, VSCodium, and Cursor -# Parameters: EDITOR_CMD SETTINGS_PATH SKIP_FLAG EDITOR_NAME -EDITOR_CMD="${1:-code}" -SETTINGS_PATH="${2:-$HOME/.config/Code/User/settings.json}" -SKIP_FLAG="${3:-$HOME/.local/state/omarchy/toggles/skip-vscode-theme-changes}" VS_CODE_THEME="$HOME/.config/omarchy/current/theme/vscode.json" -if omarchy-cmd-present "$EDITOR_CMD" && [[ ! -f "$SKIP_FLAG" ]]; then +set_theme() { + local editor_cmd="$1" + local settings_path="$2" + local skip_flag="$3" + + omarchy-cmd-present "$editor_cmd" && [[ ! -f "$skip_flag" ]] || return 0 + if [[ -f "$VS_CODE_THEME" ]]; then theme_name=$(jq -r '.name' "$VS_CODE_THEME") extension=$(jq -r '.extension' "$VS_CODE_THEME") - # Install theme extension - if [[ -n "$extension" ]] && ! "$EDITOR_CMD" --list-extensions | grep -Fxq "$extension"; then - "$EDITOR_CMD" --install-extension "$extension" >/dev/null + if [[ -n "$extension" ]] && ! "$editor_cmd" --list-extensions | grep -Fxq "$extension"; then + "$editor_cmd" --install-extension "$extension" >/dev/null fi - # Create config file if there isn't already one - mkdir -p "$(dirname "$SETTINGS_PATH")" - if [[ ! -f "$SETTINGS_PATH" ]]; then - printf '{\n}\n' >"$SETTINGS_PATH" + mkdir -p "$(dirname "$settings_path")" + [[ -f "$settings_path" ]] || printf '{\n}\n' >"$settings_path" + + if ! grep -q '"workbench.colorTheme"' "$settings_path"; then + sed -i --follow-symlinks -E '0,/\{/{s/\{/{\ "workbench.colorTheme": "",/}' "$settings_path" fi - # Create a `workbench.colorTheme` entry in settings. - if ! grep -q '"workbench.colorTheme"' "$SETTINGS_PATH"; then - # Insert `"workbench.colorTheme": "",` immediately after the first `{` - # Use sed's first-match range (0,/{/) to only replace the first `{` - sed -i --follow-symlinks -E '0,/\{/{s/\{/{\ "workbench.colorTheme": "",/}' "$SETTINGS_PATH" - fi - - # Update theme sed -i --follow-symlinks -E \ "s/(\"workbench.colorTheme\"[[:space:]]*:[[:space:]]*\")[^\"]*(\")/\1$theme_name\2/" \ - "$SETTINGS_PATH" - else - # Remove theme from settings.json when the theme doesn't have editor support - if [[ -f "$SETTINGS_PATH" ]]; then - sed -i --follow-symlinks -E 's/\"workbench\.colorTheme\"[[:space:]]*:[^,}]*,?//' "$SETTINGS_PATH" - fi + "$settings_path" + elif [[ -f "$settings_path" ]]; then + sed -i --follow-symlinks -E 's/\"workbench\.colorTheme\"[[:space:]]*:[^,}]*,?//' "$settings_path" fi -fi +} + +set_theme "code" "$HOME/.config/Code/User/settings.json" "$HOME/.local/state/omarchy/toggles/skip-vscode-theme-changes" +set_theme "codium" "$HOME/.config/VSCodium/User/settings.json" "$HOME/.local/state/omarchy/toggles/skip-codium-theme-changes" +set_theme "cursor" "$HOME/.config/Cursor/User/settings.json" "$HOME/.local/state/omarchy/toggles/skip-cursor-theme-changes" diff --git a/bin/omarchy-theme-set-vscodium b/bin/omarchy-theme-set-vscodium deleted file mode 100755 index 3d955c02..00000000 --- a/bin/omarchy-theme-set-vscodium +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -# Call the VSCode theme setter with VSCodium-specific parameters -omarchy-theme-set-vscode codium "$HOME/.config/VSCodium/User/settings.json" "$HOME/.local/state/omarchy/toggles/skip-codium-theme-changes" From e08301dee215d6c9ee6a7eac05a627448698e9b6 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 8 Jan 2026 10:26:07 +0100 Subject: [PATCH 06/12] Remove opencode binding (prefer c alias in terminal) Closes #4124 --- config/hypr/bindings.conf | 1 - 1 file changed, 1 deletion(-) diff --git a/config/hypr/bindings.conf b/config/hypr/bindings.conf index cdb0118c..f7770dd8 100644 --- a/config/hypr/bindings.conf +++ b/config/hypr/bindings.conf @@ -14,7 +14,6 @@ bindd = SUPER SHIFT, SLASH, Passwords, exec, uwsm-app -- 1password # If your web app url contains #, type it as ## to prevent hyprland treating it as a comment bindd = SUPER SHIFT, A, ChatGPT, exec, omarchy-launch-webapp "https://chatgpt.com" bindd = SUPER SHIFT ALT, A, Grok, exec, omarchy-launch-webapp "https://grok.com" -bindd = SUPER SHIFT CTRL, A, opencode, exec, omarchy-launch-opencode bindd = SUPER SHIFT, C, Calendar, exec, omarchy-launch-webapp "https://app.hey.com/calendar/weeks/" bindd = SUPER SHIFT, E, Email, exec, omarchy-launch-webapp "https://app.hey.com" bindd = SUPER SHIFT, Y, YouTube, exec, omarchy-launch-webapp "https://youtube.com/" From 72b3b930c77cd9211e3376133d5091c3e72fd0b3 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 8 Jan 2026 10:32:21 +0100 Subject: [PATCH 07/12] Drop the needless active_border_color/active_tab_background settings in favor of just using accent Closes #4121 --- config/omarchy/themed/alacritty.toml.tpl.sample | 2 -- default/themed/kitty.conf.tpl | 4 ++-- themes/catppuccin-latte/colors.toml | 3 --- themes/catppuccin/colors.toml | 3 --- themes/ethereal/colors.toml | 3 --- themes/everforest/colors.toml | 3 --- themes/flexoki-light/colors.toml | 3 --- themes/gruvbox/colors.toml | 3 --- themes/hackerman/colors.toml | 3 --- themes/kanagawa/colors.toml | 3 --- themes/matte-black/colors.toml | 3 --- themes/nord/colors.toml | 3 --- themes/osaka-jade/colors.toml | 3 --- themes/ristretto/colors.toml | 3 --- themes/rose-pine/colors.toml | 3 --- themes/tokyo-night/colors.toml | 3 --- 16 files changed, 2 insertions(+), 46 deletions(-) diff --git a/config/omarchy/themed/alacritty.toml.tpl.sample b/config/omarchy/themed/alacritty.toml.tpl.sample index 951aba62..b86516e2 100644 --- a/config/omarchy/themed/alacritty.toml.tpl.sample +++ b/config/omarchy/themed/alacritty.toml.tpl.sample @@ -21,8 +21,6 @@ # {{ accent }} - Theme accent color # {{ selection_background }} - Selection highlight background # {{ selection_foreground }} - Selection highlight foreground -# {{ active_border_color }} - Active window/element border -# {{ active_tab_background }} - Active tab background # # {{ color0 }} through {{ color15 }} - Standard 16-color terminal palette # color0-7: Normal colors (black, red, green, yellow, blue, magenta, cyan, white) diff --git a/default/themed/kitty.conf.tpl b/default/themed/kitty.conf.tpl index 88006243..e74a5bbc 100644 --- a/default/themed/kitty.conf.tpl +++ b/default/themed/kitty.conf.tpl @@ -6,8 +6,8 @@ selection_background {{ selection_background }} cursor {{ cursor }} cursor_text_color {{ background }} -active_border_color {{ active_border_color }} -active_tab_background {{ active_tab_background }} +active_border_color {{ accent }} +active_tab_background {{ accent }} color0 {{ color0 }} color1 {{ color1 }} diff --git a/themes/catppuccin-latte/colors.toml b/themes/catppuccin-latte/colors.toml index 93e550d6..87c37d4a 100644 --- a/themes/catppuccin-latte/colors.toml +++ b/themes/catppuccin-latte/colors.toml @@ -1,7 +1,4 @@ accent = "#1e66f5" -active_border_color = "#8839EF" -active_tab_background = "#8839EF" - cursor = "#dc8a78" foreground = "#4c4f69" background = "#eff1f5" diff --git a/themes/catppuccin/colors.toml b/themes/catppuccin/colors.toml index 30eef198..6943ef1f 100644 --- a/themes/catppuccin/colors.toml +++ b/themes/catppuccin/colors.toml @@ -1,7 +1,4 @@ accent = "#89b4fa" -active_border_color = "#CBA6F7" -active_tab_background = "#CBA6F7" - cursor = "#f5e0dc" foreground = "#cdd6f4" background = "#1e1e2e" diff --git a/themes/ethereal/colors.toml b/themes/ethereal/colors.toml index 3cbe19b7..75cedec8 100644 --- a/themes/ethereal/colors.toml +++ b/themes/ethereal/colors.toml @@ -1,7 +1,4 @@ accent = "#7d82d9" -active_border_color = "#7d82d9" -active_tab_background = "#060B1E" - cursor = "#ffcead" foreground = "#ffcead" background = "#060B1E" diff --git a/themes/everforest/colors.toml b/themes/everforest/colors.toml index f2e61588..9aaeeb5a 100644 --- a/themes/everforest/colors.toml +++ b/themes/everforest/colors.toml @@ -1,7 +1,4 @@ accent = "#7fbbb3" -active_border_color = "#7fbbb3" -active_tab_background = "#2d353b" - cursor = "#d3c6aa" foreground = "#d3c6aa" background = "#2d353b" diff --git a/themes/flexoki-light/colors.toml b/themes/flexoki-light/colors.toml index b5e3a622..44af88c4 100644 --- a/themes/flexoki-light/colors.toml +++ b/themes/flexoki-light/colors.toml @@ -1,7 +1,4 @@ accent = "#205EA6" -active_border_color = "#D14D41" -active_tab_background = "#CECDC3" - cursor = "#100F0F" foreground = "#100F0F" background = "#FFFCF0" diff --git a/themes/gruvbox/colors.toml b/themes/gruvbox/colors.toml index b6e7b351..57847f0a 100644 --- a/themes/gruvbox/colors.toml +++ b/themes/gruvbox/colors.toml @@ -1,7 +1,4 @@ accent = "#7daea3" -active_border_color = "#458588" -active_tab_background = "#d65d0e" - cursor = "#bdae93" foreground = "#d4be98" background = "#282828" diff --git a/themes/hackerman/colors.toml b/themes/hackerman/colors.toml index 90792645..52247f68 100644 --- a/themes/hackerman/colors.toml +++ b/themes/hackerman/colors.toml @@ -1,7 +1,4 @@ accent = "#829dd4" -active_border_color = "#829dd4" -active_tab_background = "#0B0C16" - cursor = "#ddf7ff" foreground = "#ddf7ff" background = "#0B0C16" diff --git a/themes/kanagawa/colors.toml b/themes/kanagawa/colors.toml index 4e7b987e..7ca002ee 100644 --- a/themes/kanagawa/colors.toml +++ b/themes/kanagawa/colors.toml @@ -1,7 +1,4 @@ accent = "#7e9cd8" -active_border_color = "#7e9cd8" -active_tab_background = "#1f1f28" - cursor = "#c8c093" foreground = "#dcd7ba" background = "#1f1f28" diff --git a/themes/matte-black/colors.toml b/themes/matte-black/colors.toml index badef1ab..f0f1d3a6 100644 --- a/themes/matte-black/colors.toml +++ b/themes/matte-black/colors.toml @@ -1,7 +1,4 @@ accent = "#e68e0d" -active_border_color = "#595959" -active_tab_background = "#121212" - cursor = "#eaeaea" foreground = "#bebebe" background = "#121212" diff --git a/themes/nord/colors.toml b/themes/nord/colors.toml index 9ff8d33d..79c2ae23 100644 --- a/themes/nord/colors.toml +++ b/themes/nord/colors.toml @@ -1,7 +1,4 @@ accent = "#81a1c1" -active_border_color = "#81A1C1" -active_tab_background = "#2E3440" - cursor = "#d8dee9" foreground = "#d8dee9" background = "#2e3440" diff --git a/themes/osaka-jade/colors.toml b/themes/osaka-jade/colors.toml index a93532dc..76f763e8 100644 --- a/themes/osaka-jade/colors.toml +++ b/themes/osaka-jade/colors.toml @@ -1,7 +1,4 @@ accent = "#509475" -active_border_color = "#509475" -active_tab_background = "#C1C497" - cursor = "#D7C995" foreground = "#C1C497" background = "#111c18" diff --git a/themes/ristretto/colors.toml b/themes/ristretto/colors.toml index 948c4d39..b5ca9ab9 100644 --- a/themes/ristretto/colors.toml +++ b/themes/ristretto/colors.toml @@ -1,7 +1,4 @@ accent = "#f38d70" -active_border_color = "#e6d9db" -active_tab_background = "#f9cc6c" - cursor = "#c3b7b8" foreground = "#e6d9db" background = "#2c2525" diff --git a/themes/rose-pine/colors.toml b/themes/rose-pine/colors.toml index 1321c13d..e757ad03 100644 --- a/themes/rose-pine/colors.toml +++ b/themes/rose-pine/colors.toml @@ -1,7 +1,4 @@ accent = "#56949f" -active_border_color = "#595959" -active_tab_background = "#fffaf3" - cursor = "#cecacd" foreground = "#575279" background = "#faf4ed" diff --git a/themes/tokyo-night/colors.toml b/themes/tokyo-night/colors.toml index 7fb020cf..fe51dd04 100644 --- a/themes/tokyo-night/colors.toml +++ b/themes/tokyo-night/colors.toml @@ -1,7 +1,4 @@ accent = "#7aa2f7" -active_border_color = "#7aa2f7" -active_tab_background = "#7aa2f7" - cursor = "#c0caf5" foreground = "#a9b1d6" background = "#1a1b26" From 70bdbfe5453afdefe3a203f0f64bfe38c1aad476 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 8 Jan 2026 10:49:44 +0100 Subject: [PATCH 08/12] Fix kitty cursor shape to match alacritty + ghostty --- config/kitty/kitty.conf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/kitty/kitty.conf b/config/kitty/kitty.conf index 5a76a146..7d550d78 100644 --- a/config/kitty/kitty.conf +++ b/config/kitty/kitty.conf @@ -19,6 +19,8 @@ allow_remote_control yes # Aesthetics cursor_shape block +cursor_blink_interval 0 +shell_integration no-cursor enable_audio_bell no # Minimal Tab bar styling From 7c0a05cc701dd0a6e5ed6c70eabbca5be1c067a2 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 8 Jan 2026 13:15:16 +0100 Subject: [PATCH 09/12] Remove the SingletonLock that's present for some reason on new ISO installs Closes #4149 --- bin/omarchy-cmd-first-run | 3 +++ migrations/1767865784.sh | 4 ++++ 2 files changed, 7 insertions(+) create mode 100644 migrations/1767865784.sh diff --git a/bin/omarchy-cmd-first-run b/bin/omarchy-cmd-first-run index db3b229b..61119788 100755 --- a/bin/omarchy-cmd-first-run +++ b/bin/omarchy-cmd-first-run @@ -9,6 +9,9 @@ FIRST_RUN_MODE=~/.local/state/omarchy/first-run.mode if [[ -f "$FIRST_RUN_MODE" ]]; then rm -f "$FIRST_RUN_MODE" + # FIXME: Find out why this is here before chromium has even been started! + rm -rf ~/.config/chromium/SingletonLock + bash "$OMARCHY_PATH/install/first-run/battery-monitor.sh" bash "$OMARCHY_PATH/install/first-run/cleanup-reboot-sudoers.sh" bash "$OMARCHY_PATH/install/first-run/firewall.sh" diff --git a/migrations/1767865784.sh b/migrations/1767865784.sh new file mode 100644 index 00000000..891eca35 --- /dev/null +++ b/migrations/1767865784.sh @@ -0,0 +1,4 @@ +echo "Ensure Chromium is able to start on first run after new ISO install" + +# FIXME: Find out why this is here before chromium has even been started! +rm -rf ~/.config/chromium/SingletonLock From ec4cd81e6332a6230ef9c63a1d75aab530244d03 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 8 Jan 2026 13:18:55 +0100 Subject: [PATCH 10/12] Fix the singletonlock issue properly --- bin/omarchy-cmd-first-run | 3 --- install/config/theme.sh | 1 + migrations/1767865784.sh | 3 +-- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/bin/omarchy-cmd-first-run b/bin/omarchy-cmd-first-run index 61119788..db3b229b 100755 --- a/bin/omarchy-cmd-first-run +++ b/bin/omarchy-cmd-first-run @@ -9,9 +9,6 @@ FIRST_RUN_MODE=~/.local/state/omarchy/first-run.mode if [[ -f "$FIRST_RUN_MODE" ]]; then rm -f "$FIRST_RUN_MODE" - # FIXME: Find out why this is here before chromium has even been started! - rm -rf ~/.config/chromium/SingletonLock - bash "$OMARCHY_PATH/install/first-run/battery-monitor.sh" bash "$OMARCHY_PATH/install/first-run/cleanup-reboot-sudoers.sh" bash "$OMARCHY_PATH/install/first-run/firewall.sh" diff --git a/install/config/theme.sh b/install/config/theme.sh index 7820d8f5..8bb3c603 100644 --- a/install/config/theme.sh +++ b/install/config/theme.sh @@ -7,6 +7,7 @@ mkdir -p ~/.config/omarchy/themes # Set initial theme omarchy-theme-set "Tokyo Night" +rm -rf ~/.config/chromium/SingletonLock # otherwise archiso will own the chromium singleton # Set specific app links for current theme mkdir -p ~/.config/btop/themes diff --git a/migrations/1767865784.sh b/migrations/1767865784.sh index 891eca35..ebefa8d2 100644 --- a/migrations/1767865784.sh +++ b/migrations/1767865784.sh @@ -1,4 +1,3 @@ -echo "Ensure Chromium is able to start on first run after new ISO install" +echo "Ensure Chromium is able to start on first run after ISO 3.3.0 install" -# FIXME: Find out why this is here before chromium has even been started! rm -rf ~/.config/chromium/SingletonLock From 067ec2bd71dc5185c02e9ab6b06bf76e37c0eaf3 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 8 Jan 2026 13:41:26 +0100 Subject: [PATCH 11/12] Fix migration for when current theme is a directory, not a symlink Closes #4147 --- migrations/1767306902.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/migrations/1767306902.sh b/migrations/1767306902.sh index 9a0a1bb1..9bd36a60 100644 --- a/migrations/1767306902.sh +++ b/migrations/1767306902.sh @@ -45,10 +45,12 @@ fi THEMES_DIR="$HOME/.config/omarchy/themes" CURRENT_THEME_LINK="$HOME/.config/omarchy/current/theme" -# Get current theme name from symlink before removing anything +# Get current theme name before removing anything CURRENT_THEME_NAME="" if [[ -L $CURRENT_THEME_LINK ]]; then CURRENT_THEME_NAME=$(basename "$(readlink "$CURRENT_THEME_LINK")") +elif [[ -d $CURRENT_THEME_LINK ]]; then + CURRENT_THEME_NAME=$(basename "$CURRENT_THEME_LINK") elif [[ -f "$HOME/.config/omarchy/current/theme.name" ]]; then CURRENT_THEME_NAME=$(cat "$HOME/.config/omarchy/current/theme.name") fi @@ -59,4 +61,7 @@ find "$THEMES_DIR" -mindepth 1 -maxdepth 1 -type l -delete # Re-apply the current theme with the new system if [[ -n $CURRENT_THEME_NAME ]]; then omarchy-theme-set "$CURRENT_THEME_NAME" +else + # Backup to ensure a theme is set if we can't deduce the name + omarchy-theme-set "Tokyo Night" fi From 558cd68810601f4cc5143997dc3ac1d9d693faaa Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 8 Jan 2026 13:44:54 +0100 Subject: [PATCH 12/12] Bump version --- version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version b/version index 15a27998..bea438e9 100644 --- a/version +++ b/version @@ -1 +1 @@ -3.3.0 +3.3.1