Compare commits

..

2 Commits

Author SHA1 Message Date
David Heinemeier Hansson
9180b32ad2 Fix typo in plymouth theme update message
Clarified the reason for the plymouth theme update.
2025-09-10 17:04:10 +02:00
Ryan Hughes
880257874c Set fonts for plymouth to solve freetype2 issue 2025-09-10 10:56:00 -04:00
123 changed files with 442 additions and 1071 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -2,7 +2,7 @@
focused_monitor="$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).name')"
sinks=$(pactl -f json list sinks | jq '[.[] | select([.ports[]? | .availability == "available"] | any)]')
sinks=$(pactl -f json list sinks)
sinks_count=$(echo "$sinks" | jq '. | length')
if [ "$sinks_count" -eq 0 ]; then

View File

@@ -6,8 +6,7 @@ FIRST_RUN_MODE=~/.local/state/omarchy/first-run.mode
if [[ -f "$FIRST_RUN_MODE" ]]; then
rm -f "$FIRST_RUN_MODE"
bash "$OMARCHY_PATH/install/first-run/battery-monitor.sh"
bash "$OMARCHY_PATH/install/first-run/firewall.sh"
bash "$OMARCHY_PATH/install/first-run/gnome-theme.sh"
$OMARCHY_PATH/install/first-run/battery-monitor.sh
$OMARCHY_PATH/install/first-run/firewall.sh
sudo rm -f /etc/sudoers.d/first-run
fi

View File

@@ -8,47 +8,31 @@ if [[ ! -d "$OUTPUT_DIR" ]]; then
exit 1
fi
# Selects region or output
SCOPE="$1"
if [[ $2 == "audio" ]]; then
AUDIO="--audio"
else
AUDIO=""
fi
# Selects audio inclusion or not
AUDIO=$([[ $2 == "audio" ]] && echo "--audio")
start_screenrecording() {
screenrecording() {
filename="$OUTPUT_DIR/screenrecording-$(date +'%Y-%m-%d_%H-%M-%S').mp4"
notify-send "Screen recording starting..." -t 1000
sleep 1
if lspci | grep -Eqi 'nvidia|intel.*graphics'; then
wf-recorder $AUDIO -f "$filename" -c libx264 -p crf=23 -p preset=medium -p movflags=+faststart "$@" &
wf-recorder $AUDIO -f "$filename" -c libx264 -p crf=23 -p preset=medium -p movflags=+faststart "$@"
else
wl-screenrec $AUDIO -f "$filename" --ffmpeg-encoder-options="-c:v libx264 -crf 23 -preset medium -movflags +faststart" "$@" &
wl-screenrec $AUDIO -f "$filename" --ffmpeg-encoder-options="-c:v libx264 -crf 23 -preset medium -movflags +faststart" "$@"
fi
toggle_screenrecording_indicator
}
stop_screenrecording() {
if pgrep -x wl-screenrec >/dev/null || pgrep -x wf-recorder >/dev/null; then
pkill -x wl-screenrec
pkill -x wf-recorder
notify-send "Screen recording saved to $OUTPUT_DIR" -t 2000
sleep 0.2 # ensures the process is actually dead before we check
toggle_screenrecording_indicator
}
toggle_screenrecording_indicator() {
pkill -RTMIN+8 waybar
}
screenrecording_active() {
pgrep -x wl-screenrec >/dev/null || pgrep -x wf-recorder >/dev/null
}
if screenrecording_active; then
stop_screenrecording
elif [[ "$SCOPE" == "output" ]]; then
start_screenrecording
elif [[ "$1" == "output" ]]; then
screenrecording
else
region=$(slurp) || exit 1
start_screenrecording -g "$region"
screenrecording -g "$region"
fi

View File

@@ -0,0 +1,7 @@
#!/bin/bash
if pgrep -x wl-screenrec >/dev/null || pgrep -x wf-recorder >/dev/null; then
pkill -x wl-screenrec
pkill -x wf-recorder
notify-send "Screen recording stopped" -t 2000
fi

View File

@@ -1,7 +1,6 @@
#!/bin/bash
function exit_screensaver {
hyprctl keyword cursor:invisible false
pkill -x tte 2>/dev/null
pkill -f "alacritty --class Screensaver" 2>/dev/null
exit 0
@@ -9,8 +8,6 @@ function exit_screensaver {
trap exit_screensaver SIGINT SIGTERM SIGHUP SIGQUIT
hyprctl keyword cursor:invisible true
while true; do
effect=$(tte 2>&1 | grep -oP '{\K[^}]+' | tr ',' ' ' | tr ' ' '\n' | sed -n '/^beams$/,$p' | sort -u | shuf -n1)
tte -i ~/.config/omarchy/branding/screensaver.txt \

View File

@@ -1,5 +1,8 @@
#!/bin/bash
echo "Adding multilib repository for 32-bit compatibility"
sudo sed -i '/^#\s*\[multilib\]/,/^#\s*Include/ s/^#\s*//' /etc/pacman.conf
echo "Now pick dependencies matching your graphics card"
sudo pacman -Syu --noconfirm steam
setsid gtk-launch steam >/dev/null 2>&1 &

View File

@@ -8,7 +8,7 @@ BACK_TO_EXIT=false
back_to() {
local parent_menu="$1"
if [[ "$BACK_TO_EXIT" == "true" ]]; then
if [[ "$DIRECT_ACCESS" == "true" ]]; then
exit 0
elif [[ -n "$parent_menu" ]]; then
"$parent_menu"

View File

@@ -1,10 +1,6 @@
#!/bin/bash
sudo cp ~/.local/share/omarchy/default/plymouth/* /usr/share/plymouth/themes/omarchy/
sudo plymouth-set-default-theme omarchy
if command -v limine-mkinitcpio &>/dev/null; then
sudo limine-mkinitcpio
else
sudo mkinitcpio -P
if [[ "$1" == "-y" ]]; then
sudo cp ~/.local/share/omarchy/default/plymouth/* /usr/share/plymouth/themes/omarchy/
sudo plymouth-set-default-theme -R omarchy
fi

View File

@@ -20,16 +20,13 @@ fi
ICON_DIR="$HOME/.local/share/applications/icons"
DESKTOP_FILE="$HOME/.local/share/applications/$APP_NAME.desktop"
ICON_PATH="$ICON_DIR/$APP_NAME.png"
if [[ ! "$ICON_URL" =~ ^https?:// ]] && [ -f "$ICON_URL" ]; then
ICON_PATH="$ICON_URL"
else
ICON_PATH="$ICON_DIR/$APP_NAME.png"
mkdir -p "$ICON_DIR"
if ! curl -sL -o "$ICON_PATH" "$ICON_URL"; then
echo "Error: Failed to download icon."
exit 1
fi
mkdir -p "$ICON_DIR"
if ! curl -sL -o "$ICON_PATH" "$ICON_URL"; then
echo "Error: Failed to download icon."
return 1
fi
if [[ $WINDOW_STYLE == "float" ]]; then

View File

@@ -7,4 +7,4 @@ omarchy-update-git
omarchy-migrate
omarchy-update-system-pkgs
omarchy-update-restart
omarchy-update-available-reset
omarchy-restart-waybar # removes update-available icon

View File

@@ -1,4 +0,0 @@
#!/bin/bash
# Ensure Waybar icon offering the available update is removed
pkill -RTMIN+7 waybar

View File

@@ -1,6 +1,5 @@
#!/bin/bash
echo -e "\e[32mUpdate Omarchy\e[0m"
git -C $OMARCHY_PATH pull --autostash
git -C $OMARCHY_PATH diff --check || git -C $OMARCHY_PATH reset --merge

View File

@@ -1,126 +0,0 @@
#!/bin/bash
# Upload logs to 0x0.st
LOG_TYPE="${1:-install}"
TEMP_LOG="/tmp/upload-log.txt"
SYSTEM_INFO="/tmp/system-info.txt"
# Get system information if fastfetch is available
if command -v fastfetch >/dev/null 2>&1; then
{
echo "========================================="
echo "SYSTEM INFORMATION"
echo "========================================="
# Use fastfetch with no logo to get clean output
fastfetch --logo none --pipe 2>/dev/null || echo "Failed to get system info"
echo ""
echo "========================================="
echo "LOG CONTENT"
echo "========================================="
echo ""
} >"$SYSTEM_INFO"
else
# Fallback to basic info if fastfetch isn't available
{
echo "========================================="
echo "SYSTEM INFORMATION"
echo "========================================="
echo "Hostname: $(hostname)"
echo "Kernel: $(uname -r)"
echo "Date: $(date)"
echo ""
echo "========================================="
echo "LOG CONTENT"
echo "========================================="
echo ""
} >"$SYSTEM_INFO"
fi
case "$LOG_TYPE" in
install)
ARCHINSTALL_LOG="/var/log/archinstall/install.log"
OMARCHY_LOG="/var/log/omarchy-install.log"
# Combine system info with logs
cat "$SYSTEM_INFO" >"$TEMP_LOG"
cat $ARCHINSTALL_LOG $OMARCHY_LOG >>"$TEMP_LOG" 2>/dev/null
if [ ! -s "$TEMP_LOG" ]; then
echo "Error: No install logs found"
exit 1
fi
echo "Uploading installation log to 0x0.st..."
;;
this-boot)
# Combine system info with boot logs
cat "$SYSTEM_INFO" >"$TEMP_LOG"
journalctl -b 0 >>"$TEMP_LOG" 2>/dev/null
if [ ! -s "$TEMP_LOG" ]; then
echo "Error: No logs found for current boot"
exit 1
fi
echo "Uploading current boot logs to 0x0.st..."
;;
last-boot)
# Combine system info with previous boot logs
cat "$SYSTEM_INFO" >"$TEMP_LOG"
journalctl -b -1 >>"$TEMP_LOG" 2>/dev/null
if [ ! -s "$TEMP_LOG" ]; then
echo "Error: No logs found for previous boot"
exit 1
fi
echo "Uploading previous boot logs to 0x0.st..."
;;
installed)
# System info plus all installed packages
cat "$SYSTEM_INFO" >"$TEMP_LOG"
{
echo ""
echo "========================================="
echo "INSTALLED PACKAGES (pacman -Q)"
echo "========================================="
pacman -Q 2>/dev/null || echo "Failed to get package list"
} >>"$TEMP_LOG"
if [ ! -s "$TEMP_LOG" ]; then
echo "Error: Failed to gather system information"
exit 1
fi
echo "Uploading system information to 0x0.st..."
;;
*)
echo "Usage: $0 [install|this-boot|last-boot|system-info]"
echo " install - Upload installation logs (default)"
echo " this-boot - Upload logs from current boot"
echo " last-boot - Upload logs from previous boot"
echo " installed - Upload system info and installed packages"
exit 1
;;
esac
echo ""
URL=$(curl -sF "file=@$TEMP_LOG" -Fexpires=24 https://0x0.st)
if [ $? -eq 0 ] && [ -n "$URL" ]; then
echo "✓ Log uploaded successfully!"
echo "Share this URL:"
echo ""
echo " $URL"
echo ""
echo "This link will expire in 24 hours."
else
echo "Error: Failed to upload log file"
exit 1
fi

View File

@@ -18,16 +18,13 @@ fi
ICON_DIR="$HOME/.local/share/applications/icons"
DESKTOP_FILE="$HOME/.local/share/applications/$APP_NAME.desktop"
ICON_PATH="$ICON_DIR/$APP_NAME.png"
if [[ ! "$ICON_URL" =~ ^https?:// ]] && [ -f "$ICON_URL" ]; then
ICON_PATH="$ICON_URL"
else
ICON_PATH="$ICON_DIR/$APP_NAME.png"
mkdir -p "$ICON_DIR"
if ! curl -sL -o "$ICON_PATH" "$ICON_URL"; then
echo "Error: Failed to download icon."
exit 1
fi
mkdir -p "$ICON_DIR"
if ! curl -sL -o "$ICON_PATH" "$ICON_URL"; then
echo "Error: Failed to download icon."
return 1
fi
cat >"$DESKTOP_FILE" <<EOF

View File

@@ -1,8 +1,5 @@
#!/bin/bash
# Set install mode to online since boot.sh is used for curl installations
export OMARCHY_INSTALL_MODE="online"
ansi_art=' ▄▄▄
▄█████▄ ▄███████████▄ ▄███████ ▄███████ ▄███████ ▄█ █▄ ▄█ █▄
███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███

View File

@@ -16,5 +16,4 @@ source = ~/.config/hypr/monitors.conf
source = ~/.config/hypr/input.conf
source = ~/.config/hypr/bindings.conf
source = ~/.config/hypr/envs.conf
source = ~/.config/hypr/looknfeel.conf
source = ~/.config/hypr/autostart.conf

View File

@@ -1,6 +1,6 @@
# Makes hyprsunset do nothing to the screen by default
# Without this, the default applies some tint to the monitor
profile {
time = 07:00
time = 00:00
identity = true
}

View File

@@ -29,7 +29,3 @@ input {
# Scroll faster in the terminal
windowrule = scrolltouchpad 1.5, class:Alacritty
# Enable touchpad gestures for changing workspaces
# See https://wiki.hyprland.org/Configuring/Gestures/
# gesture = 3, horizontal, workspace

View File

@@ -1,17 +0,0 @@
# Change the default Omarchy look'n'feel
# https://wiki.hyprland.org/Configuring/Variables/#general
general {
# No gaps between windows
# gaps_in = 0
# gaps_out = 0
# Use master layout instead of dwindle
# layout = master
}
# https://wiki.hyprland.org/Configuring/Variables/#decoration
decoration {
# Use round window corners
# rounding = 8
}

View File

@@ -5,7 +5,7 @@
"spacing": 0,
"height": 26,
"modules-left": ["custom/omarchy", "hyprland/workspaces"],
"modules-center": ["clock", "custom/update", "custom/screenrecording-indicator"],
"modules-center": ["clock", "custom/update"],
"modules-right": [
"group/tray-expander",
"bluetooth",
@@ -48,7 +48,6 @@
"exec": "omarchy-update-available",
"on-click": "omarchy-launch-floating-terminal-with-presentation omarchy-update",
"tooltip-format": "Omarchy update available",
"signal": 7,
"interval": 3600
},
@@ -125,12 +124,6 @@
"format": " ",
"tooltip": false
},
"custom/screenrecording-indicator": {
"on-click": "omarchy-cmd-screenrecord",
"exec": "$OMARCHY_PATH/default/waybar/indicators/screen-recording.sh",
"signal": 8,
"return-type": "json"
},
"tray": {
"icon-size": 12,
"spacing": 12

View File

@@ -37,7 +37,6 @@
#bluetooth,
#pulseaudio,
#custom-omarchy,
#custom-screenrecording-indicator,
#custom-update {
min-width: 12px;
margin: 0 7.5px;
@@ -62,13 +61,3 @@ tooltip {
.hidden {
opacity: 0;
}
#custom-screenrecording-indicator {
min-width: 12px;
margin-left: 8.75px;
font-size: 10px;
}
#custom-screenrecording-indicator.active {
color: #a55555;
}

View File

@@ -10,5 +10,5 @@ if [[ ! -v BASH_COMPLETION_VERSINFO && -f /usr/share/bash-completion/bash_comple
fi
# Set complete path
export PATH="$HOME/.local/bin:$PATH"
export PATH="./bin:$HOME/.local/bin:$PATH"
set +h

View File

@@ -14,3 +14,8 @@ input {
natural_scroll = false
}
}
# https://wiki.hyprland.org/Configuring/Variables/#gestures
gestures {
workspace_swipe = false
}

View File

@@ -22,8 +22,8 @@ Include = /etc/pacman.d/mirrorlist
[extra]
Include = /etc/pacman.d/mirrorlist
[multilib]
Include = /etc/pacman.d/mirrorlist
# [multilib]
# Include = /etc/pacman.d/mirrorlist
[omarchy]
SigLevel = Optional TrustAll

View File

@@ -1,7 +0,0 @@
#!/bin/bash
if pgrep -x wl-screenrec >/dev/null || pgrep -x wf-recorder >/dev/null; then
echo '{"text": "󰻂", "tooltip": "Stop recording", "class": "active"}'
else
echo '{"text": ""}'
fi

66
install.sh Normal file → Executable file
View File

@@ -1,18 +1,60 @@
#!/bin/bash
# Exit immediately if a command exits with a non-zero status
set -eEo pipefail
set -eE
# Define Omarchy locations
export OMARCHY_PATH="$HOME/.local/share/omarchy"
export OMARCHY_INSTALL="$OMARCHY_PATH/install"
export OMARCHY_INSTALL_LOG_FILE="/var/log/omarchy-install.log"
OMARCHY_PATH="$HOME/.local/share/omarchy"
OMARCHY_INSTALL="$OMARCHY_PATH/install"
export PATH="$OMARCHY_PATH/bin:$PATH"
# Install
source "$OMARCHY_INSTALL/helpers/all.sh"
source "$OMARCHY_INSTALL/preflight/all.sh"
source "$OMARCHY_INSTALL/packaging/all.sh"
source "$OMARCHY_INSTALL/config/all.sh"
source "$OMARCHY_INSTALL/login/all.sh"
source "$OMARCHY_INSTALL/post-install/all.sh"
# Preparation
source $OMARCHY_INSTALL/preflight/show-env.sh
source $OMARCHY_INSTALL/preflight/trap-errors.sh
source $OMARCHY_INSTALL/preflight/guard.sh
source $OMARCHY_INSTALL/preflight/chroot.sh
source $OMARCHY_INSTALL/preflight/pacman.sh
source $OMARCHY_INSTALL/preflight/migrations.sh
source $OMARCHY_INSTALL/preflight/first-run-mode.sh
# Packaging
source $OMARCHY_INSTALL/packages.sh
source $OMARCHY_INSTALL/packaging/fonts.sh
source $OMARCHY_INSTALL/packaging/lazyvim.sh
source $OMARCHY_INSTALL/packaging/webapps.sh
source $OMARCHY_INSTALL/packaging/tuis.sh
# Configuration
source $OMARCHY_INSTALL/config/config.sh
source $OMARCHY_INSTALL/config/theme.sh
source $OMARCHY_INSTALL/config/branding.sh
source $OMARCHY_INSTALL/config/git.sh
source $OMARCHY_INSTALL/config/gpg.sh
source $OMARCHY_INSTALL/config/timezones.sh
source $OMARCHY_INSTALL/config/increase-sudo-tries.sh
source $OMARCHY_INSTALL/config/increase-lockout-limit.sh
source $OMARCHY_INSTALL/config/ssh-flakiness.sh
source $OMARCHY_INSTALL/config/detect-keyboard-layout.sh
source $OMARCHY_INSTALL/config/xcompose.sh
source $OMARCHY_INSTALL/config/mise-ruby.sh
source $OMARCHY_INSTALL/config/docker.sh
source $OMARCHY_INSTALL/config/mimetypes.sh
source $OMARCHY_INSTALL/config/localdb.sh
source $OMARCHY_INSTALL/config/sudoless-asdcontrol.sh
source $OMARCHY_INSTALL/config/hardware/network.sh
source $OMARCHY_INSTALL/config/hardware/set-wireless-regdom.sh
source $OMARCHY_INSTALL/config/hardware/fix-fkeys.sh
source $OMARCHY_INSTALL/config/hardware/bluetooth.sh
source $OMARCHY_INSTALL/config/hardware/printer.sh
source $OMARCHY_INSTALL/config/hardware/usb-autosuspend.sh
source $OMARCHY_INSTALL/config/hardware/ignore-power-button.sh
source $OMARCHY_INSTALL/config/hardware/nvidia.sh
source $OMARCHY_INSTALL/config/hardware/intel.sh
source $OMARCHY_INSTALL/config/hardware/fix-f13-amd-audio-input.sh
# Login
source $OMARCHY_INSTALL/login/plymouth.sh
source $OMARCHY_INSTALL/login/limine-snapper.sh
source $OMARCHY_INSTALL/login/alt-bootloaders.sh
# Finishing
source $OMARCHY_INSTALL/reboot.sh

View File

@@ -1,27 +0,0 @@
run_logged $OMARCHY_INSTALL/config/config.sh
run_logged $OMARCHY_INSTALL/config/theme.sh
run_logged $OMARCHY_INSTALL/config/branding.sh
run_logged $OMARCHY_INSTALL/config/git.sh
run_logged $OMARCHY_INSTALL/config/gpg.sh
run_logged $OMARCHY_INSTALL/config/timezones.sh
run_logged $OMARCHY_INSTALL/config/increase-sudo-tries.sh
run_logged $OMARCHY_INSTALL/config/increase-lockout-limit.sh
run_logged $OMARCHY_INSTALL/config/ssh-flakiness.sh
run_logged $OMARCHY_INSTALL/config/detect-keyboard-layout.sh
run_logged $OMARCHY_INSTALL/config/xcompose.sh
run_logged $OMARCHY_INSTALL/config/mise-ruby.sh
run_logged $OMARCHY_INSTALL/config/mise-work.sh
run_logged $OMARCHY_INSTALL/config/docker.sh
run_logged $OMARCHY_INSTALL/config/mimetypes.sh
run_logged $OMARCHY_INSTALL/config/localdb.sh
run_logged $OMARCHY_INSTALL/config/sudoless-asdcontrol.sh
run_logged $OMARCHY_INSTALL/config/hardware/network.sh
run_logged $OMARCHY_INSTALL/config/hardware/set-wireless-regdom.sh
run_logged $OMARCHY_INSTALL/config/hardware/fix-fkeys.sh
run_logged $OMARCHY_INSTALL/config/hardware/bluetooth.sh
run_logged $OMARCHY_INSTALL/config/hardware/printer.sh
run_logged $OMARCHY_INSTALL/config/hardware/usb-autosuspend.sh
run_logged $OMARCHY_INSTALL/config/hardware/ignore-power-button.sh
run_logged $OMARCHY_INSTALL/config/hardware/nvidia.sh
run_logged $OMARCHY_INSTALL/config/hardware/fix-f13-amd-audio-input.sh
run_logged $OMARCHY_INSTALL/config/hardware/fix-apple-bcm4360.sh

2
install/config/branding.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
# Allow the user to change the branding for fastfetch and screensaver
mkdir -p ~/.config/omarchy/branding
cp ~/.local/share/omarchy/icon.txt ~/.config/omarchy/branding/about.txt

2
install/config/config.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
# Copy over Omarchy configs
mkdir -p ~/.config
cp -R ~/.local/share/omarchy/config/* ~/.config/

11
install/config/detect-keyboard-layout.sh Normal file → Executable file
View File

@@ -1,13 +1,16 @@
#!/bin/bash
# Copy over the keyboard layout that's been set in Arch during install to Hyprland
conf="/etc/vconsole.conf"
hyprconf="$HOME/.config/hypr/input.conf"
if grep -q '^XKBLAYOUT=' "$conf"; then
layout=$(grep '^XKBLAYOUT=' "$conf" | cut -d= -f2 | tr -d '"')
layout=$(grep '^XKBLAYOUT=' "$conf" | cut -d= -f2 | tr -d '"')
variant=$(grep '^XKBVARIANT=' "$conf" | cut -d= -f2 | tr -d '"')
if [[ -n "$layout" ]]; then
sed -i "/^[[:space:]]*kb_options *=/i\ kb_layout = $layout" "$hyprconf"
fi
if grep -q '^XKBVARIANT=' "$conf"; then
variant=$(grep '^XKBVARIANT=' "$conf" | cut -d= -f2 | tr -d '"')
if [[ -n "$variant" ]]; then
sed -i "/^[[:space:]]*kb_options *=/i\ kb_variant = $variant" "$hyprconf"
fi

2
install/config/docker.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
# Configure Docker daemon:
# - limit log size to avoid running out of disk
# - use host's DNS resolver

2
install/config/git.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
# Ensure git settings live under ~/.config
mkdir -p ~/.config/git
touch ~/.config/git/config

2
install/config/gpg.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
# Setup GPG configuration with multiple keyservers for better reliability
sudo mkdir -p /etc/gnupg
sudo cp ~/.local/share/omarchy/default/gpg/dirmngr.conf /etc/gnupg/

2
install/config/hardware/bluetooth.sh Normal file → Executable file
View File

@@ -1,2 +1,4 @@
#!/bin/bash
# Turn on bluetooth by default
chrootable_systemctl_enable bluetooth.service

View File

@@ -1,5 +0,0 @@
# Install wifi drivers for 2013-2015 MacBooks using the BCM4360 chip
if lspci -nnv | grep -A2 "14e4:43a0" | grep -q "106b:"; then
echo "Apple BCM4360 detected"
sudo pacman -S --noconfirm --needed broadcom-wl dkms linux-headers
fi

4
install/config/hardware/fix-f13-amd-audio-input.sh Normal file → Executable file
View File

@@ -1,4 +1,6 @@
AMD_AUDIO_CARD=$(pactl list cards 2>/dev/null | grep -B20 "Family 17h/19h" | grep "Name: " | awk '{print $2}' || true)
#!/bin/bash
AMD_AUDIO_CARD=$(pactl list cards | grep -B20 "Family 17h/19h" | grep "Name: " | awk '{print $2}')
if [[ -n $AMD_AUDIO_CARD ]]; then
pactl set-card-profile "$AMD_AUDIO_CARD" "HiFi (Mic1, Mic2, Speaker)" 2>/dev/null || true

2
install/config/hardware/fix-fkeys.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
# Ensure that F-keys on Apple-like keyboards (such as Lofree Flow84) are always F-keys
if [[ ! -f /etc/modprobe.d/hid_apple.conf ]]; then
echo "options hid_apple fnmode=2" | sudo tee /etc/modprobe.d/hid_apple.conf

3
install/config/hardware/ignore-power-button.sh Normal file → Executable file
View File

@@ -1,2 +1,5 @@
#!/bin/bash
# Disable shutting system down on power button to bind it to power menu afterwards
sudo sed -i 's/.*HandlePowerKey=.*/HandlePowerKey=ignore/' /etc/systemd/logind.conf

3
install/config/hardware/intel.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
# This installs hardware video acceleration for Intel GPUs
# Check if we have an Intel GPU at all
if INTEL_GPU=$(lspci | grep -iE 'vga|3d|display' | grep -i 'intel'); then
@@ -9,3 +11,4 @@ if INTEL_GPU=$(lspci | grep -iE 'vga|3d|display' | grep -i 'intel'); then
sudo pacman -S --needed --noconfirm libva-intel-driver
fi
fi

2
install/config/hardware/network.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
# Ensure iwd service will be started
sudo systemctl enable iwd.service

7
install/config/hardware/nvidia.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
# ==============================================================================
# Hyprland NVIDIA Setup Script for Arch Linux
# ==============================================================================
@@ -28,6 +30,11 @@ if [ -n "$(lspci | grep -i 'nvidia')" ]; then
KERNEL_HEADERS="linux-hardened-headers"
fi
# Enable multilib repository for 32-bit libraries
if ! grep -q "^\[multilib\]" /etc/pacman.conf; then
sudo sed -i '/^#\s*\[multilib\]/,/^#\s*Include/ s/^#\s*//' /etc/pacman.conf
fi
# force package database refresh
sudo pacman -Syu --noconfirm

2
install/config/hardware/printer.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
chrootable_systemctl_enable cups.service
# Disable multicast dns in resolved. Avahi will provide this for better network printer discovery

15
install/config/hardware/set-wireless-regdom.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
# First check that wireless-regdb is there
if [ -f "/etc/conf.d/wireless-regdom" ]; then
unset WIRELESS_REGDOM
@@ -10,24 +12,25 @@ if [ ! -n "${WIRELESS_REGDOM}" ]; then
if [ -e "/etc/localtime" ]; then
TIMEZONE=$(readlink -f /etc/localtime)
TIMEZONE=${TIMEZONE#/usr/share/zoneinfo/}
# Some timezones are formatted with the two letter country code at the start
COUNTRY="${TIMEZONE%%/*}"
# If we don't have a two letter country, get it from the timezone table
if [[ ! "$COUNTRY" =~ ^[A-Z]{2}$ ]] && [ -f "/usr/share/zoneinfo/zone.tab" ]; then
COUNTRY=$(awk -v tz="$TIMEZONE" '$3 == tz {print $1; exit}' /usr/share/zoneinfo/zone.tab)
fi
# Check if we have a two letter country code
if [[ "$COUNTRY" =~ ^[A-Z]{2}$ ]]; then
# Append it to the wireless-regdom conf file that is used at boot
echo "WIRELESS_REGDOM=\"$COUNTRY\"" | sudo tee -a /etc/conf.d/wireless-regdom >/dev/null
echo "WIRELESS_REGDOM=\"$COUNTRY\"" | sudo tee -a /etc/conf.d/wireless-regdom > /dev/null
# Also set it one off now
if command -v iw &>/dev/null; then
if command -v iw &> /dev/null; then
sudo iw reg set ${COUNTRY}
fi
fi
fi
fi

5
install/config/hardware/usb-autosuspend.sh Normal file → Executable file
View File

@@ -1,5 +1,6 @@
#!/bin/bash
# Disable USB autosuspend to prevent peripheral disconnection issues
if [[ ! -f /etc/modprobe.d/disable-usb-autosuspend.conf ]]; then
echo "options usbcore autosuspend=-1" | sudo tee /etc/modprobe.d/disable-usb-autosuspend.conf
fi
fi

2
install/config/increase-lockout-limit.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
# Increase lockout limit to 10 and decrease timeout to 2 minutes
sudo sed -i 's|^\(auth\s\+required\s\+pam_faillock.so\)\s\+preauth.*$|\1 preauth silent deny=10 unlock_time=120|' "/etc/pam.d/system-auth"
sudo sed -i 's|^\(auth\s\+\[default=die\]\s\+pam_faillock.so\)\s\+authfail.*$|\1 authfail deny=10 unlock_time=120|' "/etc/pam.d/system-auth"

2
install/config/increase-sudo-tries.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
# Give the user 10 instead of 3 tries to fat finger their password before lockout
echo "Defaults passwd_tries=10" | sudo tee /etc/sudoers.d/passwd-tries
sudo chmod 440 /etc/sudoers.d/passwd-tries

View File

@@ -1 +0,0 @@
omarchy-lazyvim-setup

0
install/config/localdb.sh Normal file → Executable file
View File

2
install/config/mimetypes.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
omarchy-refresh-applications
update-desktop-database ~/.local/share/applications

23
install/config/mise-ruby.sh Normal file → Executable file
View File

@@ -1,26 +1,7 @@
#!/bin/bash
# Install Ruby using gcc-14 for compatibility
mise settings set ruby.ruby_build_opts "CC=gcc-14 CXX=g++-14"
# Trust .ruby-version
mise settings add idiomatic_version_file_enable_tools ruby
# Install pre-built Ruby + Rails for x86_64
if [[ $(uname -m) == "x86_64" ]]; then
RUBY_VERSION="3.4.5"
RUBY_TARBALL="ruby-${RUBY_VERSION}-rails-8.0.2.1-x86_64.tar.gz"
RUBY_URL="https://pkgs.omarchy.org/ruby/${RUBY_TARBALL}"
MISE_RUBY_DIR="$HOME/.local/share/mise/installs/ruby"
OFFLINE_CACHE="/var/cache/omarchy/ruby"
mkdir -p "$MISE_RUBY_DIR"
if [[ ${OMARCHY_INSTALL_MODE:-offline} == "offline" ]]; then
echo "Installing Ruby from offline cache..."
tar -xzf "${OFFLINE_CACHE}/${RUBY_TARBALL}" -C "$MISE_RUBY_DIR"
else
echo "Downloading pre-built Ruby ${RUBY_VERSION}..."
curl -fsSL "$RUBY_URL" | tar -xz -C "$MISE_RUBY_DIR"
fi
mise use --global "ruby@${RUBY_VERSION}"
fi

View File

@@ -1,9 +0,0 @@
# Add ./bin to path for all items in ~/Work
mkdir -p "$HOME/Work"
cat >"$HOME/Work/.mise.toml" <<'EOF'
[env]
_.path = "{{ cwd }}/bin"
EOF
mise trust ~/Work/.mise.toml

2
install/config/ssh-flakiness.sh Normal file → Executable file
View File

@@ -1,2 +1,4 @@
#!/bin/bash
# Solve common flakiness with SSH
echo "net.ipv4.tcp_mtu_probing=1" | sudo tee -a /etc/sysctl.d/99-sysctl.conf

2
install/config/sudoless-asdcontrol.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
# Setup sudo-less controls for controlling brightness on Apple Displays
echo "$USER ALL=(ALL) NOPASSWD: /usr/local/bin/asdcontrol" | sudo tee /etc/sudoers.d/asdcontrol
sudo chmod 440 /etc/sudoers.d/asdcontrol

8
install/config/theme.sh Normal file → Executable file
View File

@@ -1,6 +1,13 @@
#!/bin/bash
gsettings set org.gnome.desktop.interface gtk-theme "Adwaita-dark"
gsettings set org.gnome.desktop.interface color-scheme "prefer-dark"
gsettings set org.gnome.desktop.interface icon-theme "Yaru-blue"
# Set links for Nautilius action icons
sudo ln -snf /usr/share/icons/Adwaita/symbolic/actions/go-previous-symbolic.svg /usr/share/icons/Yaru/scalable/actions/go-previous-symbolic.svg
sudo ln -snf /usr/share/icons/Adwaita/symbolic/actions/go-next-symbolic.svg /usr/share/icons/Yaru/scalable/actions/go-next-symbolic.svg
sudo gtk-update-icon-cache /usr/share/icons/Yaru
# Setup theme links
mkdir -p ~/.config/omarchy/themes
@@ -19,3 +26,4 @@ ln -snf ~/.config/omarchy/current/theme/btop.theme ~/.config/btop/themes/current
mkdir -p ~/.config/mako
ln -snf ~/.config/omarchy/current/theme/mako.ini ~/.config/mako/config

2
install/config/timezones.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
# Ensure timezone can be updated without needing to sudo
sudo tee /etc/sudoers.d/omarchy-tzupdate >/dev/null <<EOF
%wheel ALL=(root) NOPASSWD: /usr/bin/tzupdate, /usr/bin/timedatectl

2
install/config/xcompose.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
# Set default XCompose that is triggered with CapsLock
tee ~/.XCompose >/dev/null <<EOF
include "%H/.local/share/omarchy/default/xcompose"

2
install/first-run/battery-monitor.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
if ls /sys/class/power_supply/BAT* &>/dev/null; then
# This computer runs on a battery
powerprofilesctl set balanced || true

2
install/first-run/firewall.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
# Allow nothing in, everything out
sudo ufw default deny incoming
sudo ufw default allow outgoing

View File

@@ -1,5 +0,0 @@
gsettings set org.gnome.desktop.interface gtk-theme "Adwaita-dark"
gsettings set org.gnome.desktop.interface color-scheme "prefer-dark"
gsettings set org.gnome.desktop.interface icon-theme "Yaru-blue"
sudo gtk-update-icon-cache /usr/share/icons/Yaru

View File

@@ -1,4 +0,0 @@
source $OMARCHY_INSTALL/helpers/chroot.sh
source $OMARCHY_INSTALL/helpers/presentation.sh
source $OMARCHY_INSTALL/helpers/errors.sh
source $OMARCHY_INSTALL/helpers/logging.sh

View File

@@ -1,159 +0,0 @@
# Directs user to Omarchy Discord
QR_CODE='
█▀▀▀▀▀█ ▄ ▄ ▀▄▄▄█ █▀▀▀▀▀█
█ ███ █ ▄▄▄▄▀▄▀▄▀ █ ███ █
█ ▀▀▀ █ ▄█ ▄█▄▄▀ █ ▀▀▀ █
▀▀▀▀▀▀▀ ▀▄█ █ █ █ ▀▀▀▀▀▀▀
▀▀█▀▀▄▀▀▀▀▄█▀▀█ ▀ █ ▀ █
█▄█ ▄▄▀▄▄ ▀ ▄ ▀█▄▄▄▄ ▀ ▀█
▄ ▄▀█ ▀▄▀▀▀▄ ▄█▀▄█▀▄▀▄▀█▀
█ ▄▄█▄▀▄█ ▄▄▄ ▀ ▄▀██▀ ▀█
▀ ▀ ▀ █ ▀▄ ▀▀█▀▀▀█▄▀
█▀▀▀▀▀█ ▀█ ▄▀▀ █ ▀ █▄▀██
█ ███ █ █▀▄▄▀ █▀███▀█▄██▄
█ ▀▀▀ █ ██ ▀ █▄█ ▄▄▄█▀ █
▀▀▀▀▀▀▀ ▀ ▀ ▀▀▀ ▀ ▀▀▀▀▀▀'
# Track if we're already handling an error to prevent double-trapping
ERROR_HANDLING=false
# Cursor is usually hidden while we install
show_cursor() {
printf "\033[?25h"
}
# Display truncated log lines from the install log
show_log_tail() {
if [[ -f $OMARCHY_INSTALL_LOG_FILE ]]; then
local log_lines=$(($TERM_HEIGHT - $LOGO_HEIGHT - 35))
local max_line_width=$((LOGO_WIDTH - 4))
tail -n $log_lines "$OMARCHY_INSTALL_LOG_FILE" | while IFS= read -r line; do
if ((${#line} > max_line_width)); then
local truncated_line="${line:0:$max_line_width}..."
else
local truncated_line="$line"
fi
gum style "$truncated_line"
done
echo
fi
}
# Display the failed command or script name
show_failed_script_or_command() {
if [[ -n ${CURRENT_SCRIPT:-} ]]; then
gum style "Failed script: $CURRENT_SCRIPT"
else
# Truncate long command lines to fit the display
local cmd="$BASH_COMMAND"
local max_cmd_width=$((LOGO_WIDTH - 4))
if ((${#cmd} > max_cmd_width)); then
cmd="${cmd:0:$max_cmd_width}..."
fi
gum style "$cmd"
fi
}
# Save original stdout and stderr for trap to use
save_original_outputs() {
exec 3>&1 4>&2
}
# Restore stdout and stderr to original (saved in FD 3 and 4)
# This ensures output goes to screen, not log file
restore_outputs() {
if [ -e /proc/self/fd/3 ] && [ -e /proc/self/fd/4 ]; then
exec 1>&3 2>&4
fi
}
# Error handler
catch_errors() {
# Prevent recursive error handling
if [[ $ERROR_HANDLING == true ]]; then
return
else
ERROR_HANDLING=true
fi
# Store exit code immediately before it gets overwritten
local exit_code=$?
stop_log_output
restore_outputs
clear_logo
show_cursor
gum style --foreground 1 --padding "1 0 1 $PADDING_LEFT" "Omarchy installation stopped!"
show_log_tail
gum style "This command halted with exit code $exit_code:"
show_failed_script_or_command
gum style "$QR_CODE"
echo
gum style "Get help from the community via QR code or at https://discord.gg/tXFUdasqhY"
# Offer options menu
while true; do
options=()
# If online install, show retry first
if [[ ${OMARCHY_INSTALL_MODE:-offline} == "online" ]]; then
options+=("Retry installation")
fi
# Add upload option if internet is available
if ping -c 1 -W 1 1.1.1.1 >/dev/null 2>&1; then
options+=("Upload log for support")
fi
# Add remaining options
options+=("View full log")
options+=("Exit")
choice=$(gum choose "${options[@]}" --header "What would you like to do?" --height 6 --padding "1 $PADDING_LEFT")
case "$choice" in
"Retry installation")
bash ~/.local/share/omarchy/install.sh
break
;;
"View full log")
less "$OMARCHY_INSTALL_LOG_FILE"
;;
"Upload log for support")
omarchy-upload-install-log
;;
"Exit" | "")
exit 1
;;
esac
done
}
# Exit handler - ensures cleanup happens on any exit
exit_handler() {
local exit_code=$?
# Only run if we're exiting with an error and haven't already handled it
if [[ $exit_code -ne 0 && $ERROR_HANDLING != true ]]; then
catch_errors
else
stop_log_output
show_cursor
fi
}
# Set up traps
trap catch_errors ERR INT TERM
trap exit_handler EXIT
# Save original outputs in case we trap
save_original_outputs

View File

@@ -1,134 +0,0 @@
start_log_output() {
local ANSI_SAVE_CURSOR="\033[s"
local ANSI_RESTORE_CURSOR="\033[u"
local ANSI_CLEAR_LINE="\033[2K"
local ANSI_HIDE_CURSOR="\033[?25l"
local ANSI_RESET="\033[0m"
local ANSI_GRAY="\033[90m"
# Save cursor position and hide cursor
printf $ANSI_SAVE_CURSOR
printf $ANSI_HIDE_CURSOR
(
local log_lines=20
local max_line_width=$((LOGO_WIDTH - 4))
while true; do
# Read the last N lines into an array
mapfile -t current_lines < <(tail -n $log_lines "$OMARCHY_INSTALL_LOG_FILE" 2>/dev/null)
# Build complete output buffer with escape sequences
output=""
for ((i = 0; i < log_lines; i++)); do
line="${current_lines[i]:-}"
# Truncate if needed
if [ ${#line} -gt $max_line_width ]; then
line="${line:0:$max_line_width}..."
fi
# Add clear line escape and formatted output for each line
if [ -n "$line" ]; then
output+="${ANSI_CLEAR_LINE}${ANSI_GRAY}${PADDING_LEFT_SPACES}${line}${ANSI_RESET}\n"
else
output+="${ANSI_CLEAR_LINE}${PADDING_LEFT_SPACES}\n"
fi
done
printf "${ANSI_RESTORE_CURSOR}%b" "$output"
sleep 0.1
done
) &
monitor_pid=$!
}
stop_log_output() {
if [ -n "${monitor_pid:-}" ]; then
kill $monitor_pid 2>/dev/null || true
wait $monitor_pid 2>/dev/null || true
unset monitor_pid
fi
}
start_install_log() {
sudo touch "$OMARCHY_INSTALL_LOG_FILE"
sudo chmod 666 "$OMARCHY_INSTALL_LOG_FILE"
export OMARCHY_START_TIME=$(date '+%Y-%m-%d %H:%M:%S')
echo "=== Omarchy Installation Started: $OMARCHY_START_TIME ===" >>"$OMARCHY_INSTALL_LOG_FILE"
start_log_output
}
stop_install_log() {
stop_log_output
show_cursor
if [[ -n ${OMARCHY_INSTALL_LOG_FILE:-} ]]; then
OMARCHY_END_TIME=$(date '+%Y-%m-%d %H:%M:%S')
echo "=== Omarchy Installation Completed: $OMARCHY_END_TIME ===" >>"$OMARCHY_INSTALL_LOG_FILE"
echo "" >>"$OMARCHY_INSTALL_LOG_FILE"
echo "=== Installation Time Summary ===" >>"$OMARCHY_INSTALL_LOG_FILE"
if [ -f "/var/log/archinstall/install.log" ]; then
ARCHINSTALL_START=$(grep -m1 '^\[' /var/log/archinstall/install.log 2>/dev/null | sed 's/^\[\([^]]*\)\].*/\1/' || true)
ARCHINSTALL_END=$(grep 'Installation completed without any errors' /var/log/archinstall/install.log 2>/dev/null | sed 's/^\[\([^]]*\)\].*/\1/' || true)
if [ -n "$ARCHINSTALL_START" ] && [ -n "$ARCHINSTALL_END" ]; then
ARCH_START_EPOCH=$(date -d "$ARCHINSTALL_START" +%s)
ARCH_END_EPOCH=$(date -d "$ARCHINSTALL_END" +%s)
ARCH_DURATION=$((ARCH_END_EPOCH - ARCH_START_EPOCH))
ARCH_MINS=$((ARCH_DURATION / 60))
ARCH_SECS=$((ARCH_DURATION % 60))
echo "Archinstall: ${ARCH_MINS}m ${ARCH_SECS}s" >>"$OMARCHY_INSTALL_LOG_FILE"
fi
fi
if [ -n "$OMARCHY_START_TIME" ]; then
OMARCHY_START_EPOCH=$(date -d "$OMARCHY_START_TIME" +%s)
OMARCHY_END_EPOCH=$(date -d "$OMARCHY_END_TIME" +%s)
OMARCHY_DURATION=$((OMARCHY_END_EPOCH - OMARCHY_START_EPOCH))
OMARCHY_MINS=$((OMARCHY_DURATION / 60))
OMARCHY_SECS=$((OMARCHY_DURATION % 60))
echo "Omarchy: ${OMARCHY_MINS}m ${OMARCHY_SECS}s" >>"$OMARCHY_INSTALL_LOG_FILE"
if [ -n "$ARCH_DURATION" ]; then
TOTAL_DURATION=$((ARCH_DURATION + OMARCHY_DURATION))
TOTAL_MINS=$((TOTAL_DURATION / 60))
TOTAL_SECS=$((TOTAL_DURATION % 60))
echo "Total: ${TOTAL_MINS}m ${TOTAL_SECS}s" >>"$OMARCHY_INSTALL_LOG_FILE"
fi
fi
echo "=================================" >>"$OMARCHY_INSTALL_LOG_FILE"
echo "Rebooting system..." >>"$OMARCHY_INSTALL_LOG_FILE"
fi
}
run_logged() {
local script="$1"
export CURRENT_SCRIPT="$script"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Starting: $script" >>"$OMARCHY_INSTALL_LOG_FILE"
# Use bash -c to create a clean subshell
bash -c "source '$script'" </dev/null >>"$OMARCHY_INSTALL_LOG_FILE" 2>&1
local exit_code=$?
if [ $exit_code -eq 0 ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Completed: $script" >>"$OMARCHY_INSTALL_LOG_FILE"
unset CURRENT_SCRIPT
else
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Failed: $script (exit code: $exit_code)" >>"$OMARCHY_INSTALL_LOG_FILE"
fi
return $exit_code
}

View File

@@ -1,48 +0,0 @@
# Ensure we have gum available
if ! command -v gum &>/dev/null; then
sudo pacman -S --needed --noconfirm gum
fi
# Get terminal size from /dev/tty (works in all scenarios: direct, sourced, or piped)
if [ -e /dev/tty ]; then
TERM_SIZE=$(stty size 2>/dev/null </dev/tty)
if [ -n "$TERM_SIZE" ]; then
export TERM_HEIGHT=$(echo "$TERM_SIZE" | cut -d' ' -f1)
export TERM_WIDTH=$(echo "$TERM_SIZE" | cut -d' ' -f2)
else
# Fallback to reasonable defaults if stty fails
export TERM_WIDTH=80
export TERM_HEIGHT=24
fi
else
# No terminal available (e.g., non-interactive environment)
export TERM_WIDTH=80
export TERM_HEIGHT=24
fi
export LOGO_PATH="$OMARCHY_PATH/logo.txt"
export LOGO_WIDTH=$(awk '{ if (length > max) max = length } END { print max+0 }' "$LOGO_PATH" 2>/dev/null || echo 0)
export LOGO_HEIGHT=$(wc -l <"$LOGO_PATH" 2>/dev/null || echo 0)
export PADDING_LEFT=$((($TERM_WIDTH - $LOGO_WIDTH) / 2))
export PADDING_LEFT_SPACES=$(printf "%*s" $PADDING_LEFT "")
# Tokyo Night theme for gum confirm
export GUM_CONFIRM_PROMPT_FOREGROUND="6" # Cyan for prompt
export GUM_CONFIRM_SELECTED_FOREGROUND="0" # Black text on selected
export GUM_CONFIRM_SELECTED_BACKGROUND="2" # Green background for selected
export GUM_CONFIRM_UNSELECTED_FOREGROUND="7" # White for unselected
export GUM_CONFIRM_UNSELECTED_BACKGROUND="0" # Black background for unselected
export PADDING="0 0 0 $PADDING_LEFT" # Gum Style
export GUM_CHOOSE_PADDING="$PADDING"
export GUM_FILTER_PADDING="$PADDING"
export GUM_INPUT_PADDING="$PADDING"
export GUM_SPIN_PADDING="$PADDING"
export GUM_TABLE_PADDING="$PADDING"
export GUM_CONFIRM_PADDING="$PADDING"
clear_logo() {
printf "\033[H\033[2J" # Clear screen and move cursor to top-left
gum style --foreground 2 --padding "1 0 0 $PADDING_LEFT" "$(<"$LOGO_PATH")"
}

View File

@@ -1,14 +0,0 @@
# Called by Omarchy ISO setup before starting configurator and archinstall
source "$OMARCHY_INSTALL/preflight/set-size-vars.sh"
source "$OMARCHY_INSTALL/helpers/logo.sh"
source "$OMARCHY_INSTALL/preflight/gum.sh"
source "$OMARCHY_INSTALL/helpers/tail-log-output.sh"
source "$OMARCHY_INSTALL/helpers/trap-errors.sh"
source $OMARCHY_INSTALL/helpers/chroot.sh
source $OMARCHY_INSTALL/helpers/logo.sh
source $OMARCHY_INSTALL/helpers/gum.sh
source $OMARCHY_INSTALL/helpers/errors.sh
source $OMARCHY_INSTALL/helpers/logging.sh
source $OMARCHY_INSTALL/helpers/layout.sh

View File

@@ -1,4 +0,0 @@
run_logged $OMARCHY_INSTALL/login/plymouth.sh
run_logged $OMARCHY_INSTALL/login/limine-snapper.sh
run_logged $OMARCHY_INSTALL/login/enable-mkinitcpio.sh
run_logged $OMARCHY_INSTALL/login/alt-bootloaders.sh

2
install/login/alt-bootloaders.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
if ! command -v limine &>/dev/null; then
# Add kernel hooks
if ! grep -Eq '^HOOKS=.*plymouth' /etc/mkinitcpio.conf; then

View File

@@ -1,18 +0,0 @@
echo "Re-enabling mkinitcpio hooks..."
# Restore the specific mkinitcpio pacman hooks
if [ -f /usr/share/libalpm/hooks/90-mkinitcpio-install.hook.disabled ]; then
sudo mv /usr/share/libalpm/hooks/90-mkinitcpio-install.hook.disabled /usr/share/libalpm/hooks/90-mkinitcpio-install.hook
fi
if [ -f /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook.disabled ]; then
sudo mv /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook.disabled /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook
fi
echo "mkinitcpio hooks re-enabled"
if command -v limine &>/dev/null; then
sudo limine-update
else
sudo mkinitcpio -P
fi

26
install/login/limine-snapper.sh Normal file → Executable file
View File

@@ -1,27 +1,14 @@
#!/bin/bash
if command -v limine &>/dev/null; then
sudo tee /etc/mkinitcpio.conf.d/omarchy_hooks.conf <<EOF >/dev/null
HOOKS=(base udev plymouth keyboard autodetect microcode modconf kms keymap consolefont block encrypt filesystems fsck btrfs-overlayfs)
EOF
[[ -f /boot/EFI/limine/limine.conf ]] || [[ -f /boot/EFI/BOOT/limine.conf ]] && EFI=true
[[ -f /boot/EFI/limine/limine.conf ]] && EFI=true
# Conf location is different between EFI and BIOS
if [[ -n "$EFI" ]]; then
# Check USB location first, then regular EFI location
if [[ -f /boot/EFI/BOOT/limine.conf ]]; then
limine_config="/boot/EFI/BOOT/limine.conf"
else
limine_config="/boot/EFI/limine/limine.conf"
fi
else
limine_config="/boot/limine/limine.conf"
fi
# Double-check and exit if we don't have a config file for some reason
if [[ ! -f $limine_config ]]; then
echo "Error: Limine config not found at $limine_config" >&2
exit 1
fi
[[ -n "$EFI" ]] && limine_config="/boot/EFI/limine/limine.conf" || limine_config="/boot/limine/limine.conf"
CMDLINE=$(grep "^[[:space:]]*cmdline:" "$limine_config" | head -1 | sed 's/^[[:space:]]*cmdline:[[:space:]]*//')
@@ -76,9 +63,10 @@ term_background_bright: 24283b
EOF
sudo pacman -S --noconfirm --needed limine-snapper-sync limine-mkinitcpio-hook
sudo limine-update
# Match Snapper configs if not installing from the ISO
if [[ -z ${OMARCHY_CHROOT_INSTALL:-} ]]; then
if [ -z "${OMARCHY_CHROOT_INSTALL:-}" ]; then
if ! sudo snapper list-configs 2>/dev/null | grep -q "root"; then
sudo snapper -c root create-config /
fi
@@ -97,7 +85,7 @@ EOF
fi
# Add UKI entry to UEFI machines to skip bootloader showing on normal boot
if [[ -n $EFI ]] && efibootmgr &>/dev/null && ! efibootmgr | grep -q Omarchy &&
if [ -n "$EFI" ] && efibootmgr &>/dev/null && ! efibootmgr | grep -q Omarchy &&
! cat /sys/class/dmi/id/bios_vendor 2>/dev/null | grep -qi "American Megatrends"; then
sudo efibootmgr --create \
--disk "$(findmnt -n -o SOURCE /boot | sed 's/p\?[0-9]*$//')" \

4
install/login/plymouth.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
# Hyprland launched via UWSM and login directly as user, rely on disk encryption + hyprlock for security
# ==============================================================================
@@ -6,7 +8,7 @@
if [ "$(plymouth-set-default-theme)" != "omarchy" ]; then
sudo cp -r "$HOME/.local/share/omarchy/default/plymouth" /usr/share/plymouth/themes/omarchy/
sudo plymouth-set-default-theme omarchy
sudo plymouth-set-default-theme -R omarchy
fi
# ==============================================================================

View File

@@ -1,131 +0,0 @@
# Omarchy core package list installed via install/packages.sh
# This file is also used by the ISO builder when determining needs
1password-beta
1password-cli
alacritty
asdcontrol-git
avahi
bash-completion
bat
blueberry
brightnessctl
btop
cargo
clang
cups
cups-browsed
cups-filters
cups-pdf
docker
docker-buildx
docker-compose
dust
evince
eza
fastfetch
fcitx5
fcitx5-gtk
fcitx5-qt
fd
ffmpegthumbnailer
fontconfig
fzf
gcc14
github-cli
gnome-calculator
gnome-keyring
gnome-themes-extra
gum
gvfs-mtp
gvfs-smb
hypridle
hyprland
hyprland-qtutils
hyprlock
hyprpicker
hyprshot
hyprsunset
imagemagick
impala
imv
inetutils
iwd
jq
kdenlive
kvantum-qt5
lazydocker
lazygit
less
libqalculate
libreoffice
llvm
localsend
luarocks
mako
man
mariadb-libs
mise
mpv
nautilus
noto-fonts
noto-fonts-cjk
noto-fonts-emoji
noto-fonts-extra
nss-mdns
nvim
obs-studio
obsidian
omarchy-chromium
omarchy-lazyvim
pamixer
pinta
playerctl
plocate
plymouth
polkit-gnome
postgresql-libs
power-profiles-daemon
python-gobject
python-poetry-core
python-terminaltexteffects
qt5-wayland
ripgrep
satty
signal-desktop
slurp
spotify
starship
sushi
swaybg
swayosd
system-config-printer
tldr
tree-sitter-cli
ttf-cascadia-mono-nerd
ttf-ia-writer
ttf-jetbrains-mono-nerd
typora
tzupdate
ufw
ufw-docker
unzip
uwsm
walker-bin
waybar
wf-recorder
whois
wireless-regdb
wiremix
wireplumber
wl-clip-persist
wl-clipboard
wl-screenrec
woff2-font-awesome
xdg-desktop-portal-gtk
xdg-desktop-portal-hyprland
xmlstarlet
xournalpp
yaru-icon-theme
yay
zoxide

View File

@@ -1,59 +0,0 @@
# Packages installed outside of install/packages.sh or optional packages
# Utilized by ISO builder to ensure package availability in the ISO
autoconf-archive
base
base-devel
broadcom-wl
btrfs-progs
dart
dkms
efibootmgr
egl-wayland
git
git
gst-plugin-pipewire
gtk4-layer-shell
gum
htop
intel-media-driver
intltool
iwd
jdk-openjdk
jq
lib32-nvidia-utils
libpulse
libsass
libva-intel-driver
libva-intel-driver
libva-mesa-driver
libva-nvidia-driver
limine
limine-mkinitcpio-hook
limine-snapper-sync
linux
linux-firmware
linux-headers
mesa
nvidia-dkms
nvidia-open-dkms
nvidia-utils
openssl
pipewire
pipewire-alsa
pipewire-jack
pipewire-pulse
plymouth
qt5-remoteobjects
qt6-wayland
sassc
snapper
sof-firmware
tzupdate
webp-pixbuf-loader
wget
xf86-video-amdgpu
xf86-video-ati
xf86-video-nouveau
yay-debug
zram-generator

130
install/packages.sh Normal file
View File

@@ -0,0 +1,130 @@
#!/bin/bash
sudo pacman -S --noconfirm --needed \
1password-beta \
1password-cli \
asdcontrol-git \
alacritty \
avahi \
bash-completion \
bat \
blueberry \
brightnessctl \
btop \
cargo \
clang \
cups \
cups-browsed \
cups-filters \
cups-pdf \
docker \
docker-buildx \
docker-compose \
dust \
evince \
eza \
fastfetch \
fcitx5 \
fcitx5-gtk \
fcitx5-qt \
fd \
ffmpegthumbnailer \
fontconfig \
fzf \
gcc14 \
github-cli \
gnome-calculator \
gnome-keyring \
gnome-themes-extra \
gum \
gvfs-mtp \
gvfs-smb \
hypridle \
hyprland \
hyprland-qtutils \
hyprlock \
hyprpicker \
hyprshot \
hyprsunset \
imagemagick \
impala \
imv \
inetutils \
iwd \
jq \
kdenlive \
kvantum-qt5 \
lazydocker \
lazygit \
less \
libqalculate \
libreoffice \
llvm \
localsend \
luarocks \
mako \
man \
mariadb-libs \
mise \
mpv \
nautilus \
noto-fonts \
noto-fonts-cjk \
noto-fonts-emoji \
noto-fonts-extra \
nss-mdns \
nvim \
obs-studio \
obsidian \
omarchy-chromium \
pamixer \
pinta \
playerctl \
plocate \
plymouth \
polkit-gnome \
postgresql-libs \
power-profiles-daemon \
python-gobject \
python-poetry-core \
python-terminaltexteffects \
qt5-wayland \
ripgrep \
satty \
signal-desktop \
slurp \
spotify \
starship \
sushi \
swaybg \
swayosd \
system-config-printer \
tldr \
tree-sitter-cli \
ttf-cascadia-mono-nerd \
ttf-ia-writer \
ttf-jetbrains-mono-nerd \
typora \
tzupdate \
ufw \
ufw-docker \
unzip \
uwsm \
walker-bin \
waybar \
wf-recorder \
whois \
wireless-regdb \
wiremix \
wireplumber \
wl-clip-persist \
wl-clipboard \
wl-screenrec \
woff2-font-awesome \
xdg-desktop-portal-gtk \
xdg-desktop-portal-hyprland \
xmlstarlet \
xournalpp \
yaru-icon-theme \
yay \
zoxide

View File

@@ -1,6 +0,0 @@
run_logged $OMARCHY_INSTALL/packaging/base.sh
run_logged $OMARCHY_INSTALL/packaging/fonts.sh
run_logged $OMARCHY_INSTALL/packaging/lazyvim.sh
run_logged $OMARCHY_INSTALL/packaging/icons.sh
run_logged $OMARCHY_INSTALL/packaging/webapps.sh
run_logged $OMARCHY_INSTALL/packaging/tuis.sh

View File

@@ -1,3 +0,0 @@
# Install all base packages
mapfile -t packages < <(grep -v '^#' "$OMARCHY_INSTALL/omarchy-base.packages" | grep -v '^$')
sudo pacman -S --noconfirm --needed "${packages[@]}"

2
install/packaging/fonts.sh Normal file → Executable file
View File

@@ -1,3 +1,5 @@
#!/bin/bash
# Omarchy logo in a font for Waybar use
mkdir -p ~/.local/share/fonts
cp ~/.local/share/omarchy/config/omarchy.ttf ~/.local/share/fonts/

View File

@@ -1,4 +0,0 @@
# Copy all bundled icons to the applications/icons directory
ICON_DIR="$HOME/.local/share/applications/icons"
mkdir -p "$ICON_DIR"
cp ~/.local/share/omarchy/applications/icons/*.png "$ICON_DIR/"

7
install/packaging/lazyvim.sh Normal file → Executable file
View File

@@ -1,3 +1,8 @@
#!/bin/bash
if [[ ! -d "$HOME/.config/nvim" ]]; then
omarchy-lazyvim-setup
git clone https://github.com/LazyVim/starter ~/.config/nvim
cp -R ~/.local/share/omarchy/config/nvim/* ~/.config/nvim/
rm -rf ~/.config/nvim/.git
echo "vim.opt.relativenumber = false" >>~/.config/nvim/lua/config/options.lua
fi

13
install/packaging/pins.sh Executable file
View File

@@ -0,0 +1,13 @@
#!/bin/bash
# We pin explicit packages that are bad upstream here
pinned_packages=$(omarchy-pkg-pinned)
if [[ -n $pinned_packages ]]; then
echo -e "\e[32m\nInstall pinned system packages\e[0m"
for pinned in $pinned_packages; do
echo "sudo pacman -U --noconfirm $pinned"
sudo pacman -U --noconfirm $pinned
done
fi

6
install/packaging/tuis.sh Normal file → Executable file
View File

@@ -1,4 +1,4 @@
ICON_DIR="$HOME/.local/share/applications/icons"
#!/bin/bash
omarchy-tui-install "Disk Usage" "bash -c 'dust -r; read -n 1 -s'" float "$ICON_DIR/Disk Usage.png"
omarchy-tui-install "Docker" "lazydocker" tile "$ICON_DIR/Docker.png"
omarchy-tui-install "Disk Usage" "bash -c 'dust -r; read -n 1 -s'" float https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/qdirstat.png
omarchy-tui-install "Docker" "lazydocker" tile https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/docker.png

28
install/packaging/webapps.sh Normal file → Executable file
View File

@@ -1,15 +1,15 @@
ICON_DIR="$HOME/.local/share/applications/icons"
#!/bin/bash
omarchy-webapp-install "HEY" https://app.hey.com "$ICON_DIR/HEY.png"
omarchy-webapp-install "Basecamp" https://launchpad.37signals.com "$ICON_DIR/Basecamp.png"
omarchy-webapp-install "WhatsApp" https://web.whatsapp.com/ "$ICON_DIR/WhatsApp.png"
omarchy-webapp-install "Google Photos" https://photos.google.com/ "$ICON_DIR/Google Photos.png"
omarchy-webapp-install "Google Contacts" https://contacts.google.com/ "$ICON_DIR/Google Contacts.png"
omarchy-webapp-install "Google Messages" https://messages.google.com/web/conversations "$ICON_DIR/Google Messages.png"
omarchy-webapp-install "ChatGPT" https://chatgpt.com/ "$ICON_DIR/ChatGPT.png"
omarchy-webapp-install "YouTube" https://youtube.com/ "$ICON_DIR/YouTube.png"
omarchy-webapp-install "GitHub" https://github.com/ "$ICON_DIR/GitHub.png"
omarchy-webapp-install "X" https://x.com/ "$ICON_DIR/X.png"
omarchy-webapp-install "Figma" https://figma.com/ "$ICON_DIR/Figma.png"
omarchy-webapp-install "Discord" https://discord.com/channels/@me "$ICON_DIR/Discord.png"
omarchy-webapp-install "Zoom" https://app.zoom.us/wc/home "$ICON_DIR/Zoom.png"
omarchy-webapp-install "HEY" https://app.hey.com https://www.hey.com/assets/images/general/hey.png
omarchy-webapp-install "Basecamp" https://launchpad.37signals.com https://basecamp.com/assets/images/general/basecamp.png
omarchy-webapp-install "WhatsApp" https://web.whatsapp.com/ https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/whatsapp.png
omarchy-webapp-install "Google Photos" https://photos.google.com/ https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/google-photos.png
omarchy-webapp-install "Google Contacts" https://contacts.google.com/ https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/google-contacts.png
omarchy-webapp-install "Google Messages" https://messages.google.com/web/conversations https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/google-messages.png
omarchy-webapp-install "ChatGPT" https://chatgpt.com/ https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/chatgpt.png
omarchy-webapp-install "YouTube" https://youtube.com/ https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/youtube.png
omarchy-webapp-install "GitHub" https://github.com/ https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/github-light.png
omarchy-webapp-install "X" https://x.com/ https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/x-light.png
omarchy-webapp-install "Figma" https://figma.com/ https://www.veryicon.com/download/png/application/app-icon-7/figma-1?s=256
omarchy-webapp-install "Discord" https://discord.com/channels/@me https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/discord.png
omarchy-webapp-install "Zoom" https://app.zoom.us/wc/home https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/zoom.png

View File

@@ -1,2 +0,0 @@
run_logged $OMARCHY_INSTALL/post-install/pacman.sh
source $OMARCHY_INSTALL/post-install/finished.sh

View File

@@ -1,37 +0,0 @@
stop_install_log
echo_in_style() {
echo "$1" | tte --canvas-width 0 --anchor-text c --frame-rate 640 print
}
clear
tte -i ~/.local/share/omarchy/logo.txt --canvas-width 0 --anchor-text c --frame-rate 920 laseretch
echo
# Display installation time if available
if [[ -f $OMARCHY_INSTALL_LOG_FILE ]] && grep -q "Total:" "$OMARCHY_INSTALL_LOG_FILE" 2>/dev/null; then
echo
TOTAL_TIME=$(tail -n 20 "$OMARCHY_INSTALL_LOG_FILE" | grep "^Total:" | sed 's/^Total:[[:space:]]*//')
if [ -n "$TOTAL_TIME" ]; then
echo_in_style "Installed in $TOTAL_TIME"
fi
fi
if sudo test -f /etc/sudoers.d/99-omarchy-installer; then
sudo rm -f /etc/sudoers.d/99-omarchy-installer &>/dev/null
echo
echo_in_style "Remember to remove USB installer!"
fi
# Exit gracefully if user chooses not to reboot
if gum confirm --padding "0 0 0 $((PADDING_LEFT + 32))" --show-help=false --default --affirmative "Reboot Now" --negative "" ""; then
# Clear screen to hide any shutdown messages
clear
# Use systemctl if available, otherwise fallback to reboot command
if command -v systemctl &>/dev/null; then
systemctl reboot --no-wall 2>/dev/null
else
reboot 2>/dev/null
fi
fi

View File

@@ -1,3 +0,0 @@
# Configure pacman
sudo cp -f ~/.local/share/omarchy/default/pacman/pacman.conf /etc/pacman.conf
sudo cp -f ~/.local/share/omarchy/default/pacman/mirrorlist /etc/pacman.d/mirrorlist

View File

@@ -1,7 +0,0 @@
source $OMARCHY_INSTALL/preflight/guard.sh
source $OMARCHY_INSTALL/preflight/begin.sh
run_logged $OMARCHY_INSTALL/preflight/show-env.sh
run_logged $OMARCHY_INSTALL/preflight/pacman.sh
run_logged $OMARCHY_INSTALL/preflight/migrations.sh
run_logged $OMARCHY_INSTALL/preflight/first-run-mode.sh
run_logged $OMARCHY_INSTALL/preflight/disable-mkinitcpio.sh

View File

@@ -1,3 +0,0 @@
clear_logo
gum style --foreground 3 --padding "1 0 0 $PADDING_LEFT" "Installing Omarchy..."
start_install_log

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