Compare commits

..

48 Commits

Author SHA1 Message Date
David Heinemeier Hansson
a881b7c45f Ensure Linux kernel is running preempt=full to avoid audio/linux jitter under load 2025-11-09 13:08:12 +01:00
David Heinemeier Hansson
70d15921b9 Add Super + Shift + Alt + Left/Right to move workspaces between monitors
Closes #1373, #3010
Co-authored-by: @jheuing
2025-11-09 11:37:43 +01:00
David Heinemeier Hansson
283a41c494 Add Super + Alt + PageUp/Down for tiling groups to mimic browser
More ergonomic to press than tab, but we will keep tab so not to confuse
folks who already adopted that.
2025-11-09 11:36:41 +01:00
David Heinemeier Hansson
3d10b38054 Ensure we can wake screen on both mouse and keyboard
Closes #2146
Co-authored-by: @nicoestrada
2025-11-09 11:14:32 +01:00
David Heinemeier Hansson
d33e947b99 We were already doing this! 2025-11-09 09:25:35 +01:00
David Heinemeier Hansson
79d48b4d8a Notify user that font changes require a Ghostty restart 2025-11-09 09:25:00 +01:00
David Heinemeier Hansson
4d3c02c69d Only restart if they are running 2025-11-09 09:22:48 +01:00
Dylan
e96bd085a5 Improve contrast on volume notification for Matte Black theme (#3212) 2025-11-09 08:10:12 +01:00
Rob Zolkos
64e581e5aa Use AAC audio codec for screen recordings (#3220)
AAC provides better cross-platform compatibility compared to Opus when
using MP4 containers. While Opus is supported in MP4, compatibility
varies across different media players and platforms.

In testing, screen recordings with Opus codec sent to Windows users
played without audio in Windows Media Player, while recordings with
AAC codec worked immediately without issues. AAC ensures recordings
are playable out-of-the-box across all platforms without requiring
users to install additional codecs or use alternative media players.
2025-11-09 08:08:23 +01:00
Chris Roth
694c83f518 Add binding to invoke last mako notification (#3232)
This additional bind lets the user follow the default action of a notification with a keystroke in the same position `,` as the other notification binds.
2025-11-09 08:07:09 +01:00
MatyiFKBT
49308eb12a Update Helium browser in omarchy-launch-webapp (#3225)
* Update Helium browser in omarchy-launch-webapp

see https://github.com/basecamp/omarchy/pull/1945#discussion_r2401957283

* Fix browser pattern matching in launch script for helium

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2025-11-09 08:06:23 +01:00
Adam
26d37ca2e0 Fix: hard-coded binding for changegroupactive (#3233)
Changed default bindings for switching to a window in a group. The original values did not respect different keyboard layouts.
2025-11-09 08:02:35 +01:00
Miguel P
c92362937a Use xdg-terminal-exec in TUI installer for terminal compatibility (#3237)
Replace hardcoded --class flag with xdg-terminal-exec --app-id to properly
support kitty and other terminals. This aligns with the rest of the codebase
and ensures floating window rules work correctly across different terminals.
2025-11-09 08:01:37 +01:00
Dmytro Budnyk
7a0fa07454 Update icon URL placeholder to accept SVG format (#3253)
SVGs work just fine, changing misleading caption
2025-11-09 07:50:36 +01:00
David Heinemeier Hansson
917279bff7 Merge branch 'master' into dev 2025-11-09 07:45:37 +01:00
David Heinemeier Hansson
8350b84eee This has been swapped 2025-11-09 07:17:38 +01:00
Ryan Hughes
d9acd35ef4 Version bump 2025-11-09 00:54:44 -05:00
Ryan Hughes
044e826bb7 Merge pull request #3258 from sk4rrjin/patch-1
Update pip.conf, fix Invalid rule/parameter errors after hyprland update
2025-11-09 00:43:25 -05:00
karr
57e726f0c5 Update pip.conf, fix Invalid rule/parameter errors after hyprland update
Updated hyprland throws Invalid rule / Invalid parameter on the pip windowrule
2025-11-08 23:37:30 +01:00
David Heinemeier Hansson
06fc4db4db Merge branch 'master' into dev 2025-11-07 21:54:13 +01:00
Ryan Hughes
15b5ee92d7 Merge pull request #3234 from basecamp/hotfix-limine-conf-location
Hotfix limine.conf order sourcing causing boot errors
2025-11-07 15:50:55 -05:00
Ryan Hughes
f6aa97350e Update to prevent error 2025-11-07 15:48:45 -05:00
David Heinemeier Hansson
5192c9b687 Ensure successful ending of migration 2025-11-07 21:35:41 +01:00
Ryan Hughes
e263b5d00a Only run for Limine installs 2025-11-07 15:09:34 -05:00
Ryan Hughes
26821c9b34 Cleanup on install 2025-11-07 15:04:23 -05:00
Ryan Hughes
7cd5661f89 Bump version 2025-11-07 14:57:19 -05:00
Ryan Hughes
6cdf4a3790 Remove any alternative limine.conf files 2025-11-07 14:46:29 -05:00
Ryan Hughes
c92a7eab81 Revert "Kill the actual screensaver command"
This reverts commit 33dde26902.
2025-11-06 11:32:19 -05:00
Ryan Hughes
8aa2d295e5 Revert "Make screensaver work with xdg-terminal-exec"
This reverts commit fc8e4c0400.
2025-11-06 11:32:10 -05:00
Ryan Hughes
5fb29c199a Revert "Update screensaver with 2x version"
This reverts commit b1b6e5d2a7.
2025-11-06 11:30:02 -05:00
David Heinemeier Hansson
962aca303d Change order and let it live forever 2025-11-06 09:14:33 +01:00
David Heinemeier Hansson
870356ecc3 Fix max_results to live under [providers]
Re #3175
2025-11-06 08:32:07 +01:00
David Heinemeier Hansson
cb03d7d84b Raise walker max_entries to 256
The default is only 50

Closes #3175
2025-11-05 17:29:10 +01:00
y0no
7a0bdaafa4 Scale with the right monitor (#3174) 2025-11-05 16:08:25 +01:00
David Heinemeier Hansson
638e35fcac Hyprland envs are superseeded by uwsm/env 2025-11-05 15:15:01 +01:00
David Heinemeier Hansson
904d253b4d Restart terminal (reload config) when changing font as well
This doesn't work for Ghostty (yet?) but it does work for Kitty
2025-11-05 11:59:51 +01:00
innerviewer
a40ff463c9 (Hypr) Added 'stayfocused' window rule for DaVinci Resolve dialog windows. (#3064) 2025-11-05 11:44:30 +01:00
Patrick Roza
8e210088c1 Fix class name for Microsoft Edge in browser.conf (#3145) 2025-11-05 11:20:28 +01:00
David Heinemeier Hansson
bf26366be4 Setting PS1 is not necessary when we have starship 2025-11-05 11:13:49 +01:00
David Heinemeier Hansson
4391df6853 Fix declining an update 2025-11-04 08:47:17 +01:00
David Heinemeier Hansson
2498216a4f Merge branch 'master' into dev 2025-11-04 08:35:27 +01:00
Ryan Hughes
33dde26902 Kill the actual screensaver command 2025-11-03 21:37:51 -05:00
Ryan Hughes
b1b6e5d2a7 Update screensaver with 2x version 2025-11-03 21:34:22 -05:00
Ryan Hughes
fc8e4c0400 Make screensaver work with xdg-terminal-exec 2025-11-03 21:34:22 -05:00
Ryan Hughes
f9557177dc Merge pull request #2648 from wolfgangw/patch-1
TTE go fullscreen: --no-eol (tte 0.12.2/0.13.0)
2025-11-03 21:33:06 -05:00
Ryan Hughes
3065ca9f2a Fix --dir 2025-11-03 15:37:46 -05:00
Ryan Hughes
ba5343ca11 Bump version 2025-11-03 15:37:27 -05:00
Wolfgang Woehl
1388a2558a Screensaver go fullscreen: --no-eol (tte 0.12.2/0.13.0) and --canvas-height 0 2025-10-21 02:44:41 +02:00
120 changed files with 532 additions and 1944 deletions

View File

@@ -62,7 +62,7 @@ start_screenrecording() {
# Merge audio tracks into one - separate tracks only play one at a time in most players
[[ "$AUDIO" == "true" ]] && audio_args="-a default_output|default_input"
gpu-screen-recorder -w "$@" -f 60 -c mp4 -o "$filename" $audio_args &
gpu-screen-recorder -w "$@" -f 60 -c mp4 $audio_args -ac aac -o "$filename" &
toggle_screenrecording_indicator
}

View File

@@ -18,7 +18,7 @@ hyprctl keyword cursor:invisible true &>/dev/null
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 \
--frame-rate 240 --canvas-width 0 --canvas-height $(($(tput lines) - 2)) --anchor-canvas c --anchor-text c \
--frame-rate 240 --canvas-width 0 --canvas-height 0 --anchor-canvas c --anchor-text c --no-eol \
"$effect" &
while pgrep -x tte >/dev/null; do

View File

@@ -1,6 +1,5 @@
#!/bin/bash
# FIXME: Update behavior
cd ~/.local/share/omarchy
migration_file="$HOME/.local/share/omarchy/migrations/$(git log -1 --format=%cd --date=unix).sh"
touch $migration_file

View File

@@ -1,344 +0,0 @@
#!/usr/bin/env python3
"""
Omarchy Disk Configuration Tool
Interactive partition editor and validator for Omarchy installations.
"""
import json
import sys
from pathlib import Path
def _find_root_partition(disk_config):
for dev_mod in disk_config.device_modifications:
for part in dev_mod.partitions:
if part.mountpoint == Path('/'):
return part
if part.btrfs_subvols:
for subvol in part.btrfs_subvols:
if subvol.mountpoint == Path('/'):
return part
return None
def validate_disk_config(config, interactive=True):
from archinstall.lib.models.device import FilesystemType, Size, Unit, EncryptionType
from archinstall.lib.output import info, warn
if not config.disk_config:
return 'CONTINUE'
validation_warnings = []
boot_partition = None
for dev_mod in config.disk_config.device_modifications:
for part in dev_mod.partitions:
if part.mountpoint == Path('/boot') or part.mountpoint == Path('/efi'):
boot_partition = part
break
if boot_partition:
min_boot_size = Size(2, Unit.GiB, boot_partition.length.sector_size)
if boot_partition.length >= min_boot_size:
size_gb = boot_partition.length.convert(Unit.GiB).value
info(f'✓ Boot partition size: {size_gb:.1f} GiB')
else:
size_mb = boot_partition.length.convert(Unit.MiB).value
warn(f'⚠ Boot partition is only {size_mb:.0f} MiB')
warn(' Omarchy recommends at least 2 GiB for boot partition')
warn(' Multiple kernels may not fit')
validation_warnings.append('boot_size')
else:
warn('⚠ Could not find boot partition (/boot or /efi)')
warn(' System may not boot correctly')
validation_warnings.append('no_boot')
root_partition = _find_root_partition(config.disk_config)
if root_partition:
if root_partition.fs_type == FilesystemType.Btrfs:
info('✓ Root filesystem is btrfs')
if root_partition.btrfs_subvols:
subvol_names = [str(sv.name) for sv in root_partition.btrfs_subvols]
subvol_mounts = {str(sv.mountpoint): str(sv.name) for sv in root_partition.btrfs_subvols}
required_subvols = {
'/': '@',
'/home': '@home',
'/var/log': '@log',
'/var/cache/pacman/pkg': '@pkg',
}
missing_subvols = []
for mount, expected_name in required_subvols.items():
if mount not in subvol_mounts:
missing_subvols.append(f'{expected_name} → {mount}')
elif subvol_mounts[mount] != expected_name:
warn(f'⚠ Subvolume at {mount} is named "{subvol_mounts[mount]}" not "{expected_name}"')
if missing_subvols:
warn(f'⚠ Missing recommended subvolumes: {", ".join(missing_subvols)}')
warn(' Omarchy recommends: @, @home, @log, @pkg')
warn(' Some features (like Snapper) may not work optimally')
info(f' Current subvolumes: {", ".join(subvol_names)}')
validation_warnings.append('missing_subvols')
else:
info(f'✓ Btrfs subvolumes: {", ".join(subvol_names)}')
else:
warn('⚠ Btrfs partition has no subvolumes defined')
warn(' Omarchy recommends subvolumes for snapshots')
warn(' Required: @ (root), @home, @log, @pkg')
validation_warnings.append('no_subvols')
else:
fs_name = root_partition.fs_type.value if root_partition.fs_type else 'unknown'
warn(f'⚠ Root filesystem is {fs_name}, not btrfs')
warn(' Omarchy is designed for btrfs with snapshots')
warn(' Some features may not work correctly')
validation_warnings.append('not_btrfs')
is_encrypted = False
if config.disk_config.disk_encryption:
enc = config.disk_config.disk_encryption
if enc.encryption_type != EncryptionType.NoEncryption:
is_encrypted = root_partition in enc.partitions
if is_encrypted:
info('✓ Root partition is encrypted with LUKS')
if config.disk_config.disk_encryption.iter_time != 2000:
old_time = config.disk_config.disk_encryption.iter_time
config.disk_config.disk_encryption.iter_time = 2000
info(f'✓ Adjusted iteration time: {old_time}ms → 2000ms')
else:
info('✓ Iteration time: 2000ms (optimal)')
else:
warn('⚠ Root partition is NOT encrypted')
warn(' Omarchy recommends LUKS encryption for security')
validation_warnings.append('no_encryption')
else:
warn('⚠ Could not identify root partition')
validation_warnings.append('no_root')
if validation_warnings and interactive:
import subprocess
import shutil
gum_path = shutil.which('gum')
if gum_path:
warn('')
try:
result = subprocess.run(
['gum', 'choose', '--header', 'Validation warnings detected. What would you like to do?',
'Re-edit partitions', 'Continue anyway', 'Abort'],
capture_output=True,
text=True,
)
choice = result.stdout.strip() if result.stdout else ''
if choice == 'Re-edit partitions':
return 'RE_EDIT'
elif choice == 'Abort':
return 'ABORT'
else:
info('Continuing despite warnings')
return 'CONTINUE'
except (subprocess.CalledProcessError, KeyboardInterrupt):
return 'ABORT'
return 'CONTINUE'
def apply_omarchy_partition_defaults():
import archinstall.lib.interactions.disk_conf as disk_conf_module
from archinstall.lib.models.device import (
PartitionModification, ModificationStatus, PartitionType,
Size, Unit, SectorSize, FilesystemType, PartitionFlag,
DeviceModification, BDevice
)
from archinstall.lib.interactions.disk_conf import get_default_btrfs_subvols
from archinstall.lib.disk.device_handler import device_handler
def _boot_partition_2gib(sector_size: SectorSize, using_gpt: bool) -> PartitionModification:
flags = [PartitionFlag.BOOT]
size = Size(2, Unit.GiB, sector_size)
start = Size(1, Unit.MiB, sector_size)
if using_gpt:
flags.append(PartitionFlag.ESP)
return PartitionModification(
status=ModificationStatus.Create,
type=PartitionType.Primary,
start=start,
length=size,
mountpoint=Path('/boot'),
fs_type=FilesystemType.Fat32,
flags=flags,
)
def _select_main_filesystem_btrfs() -> FilesystemType:
return FilesystemType.Btrfs
def _select_mount_options_compressed() -> list[str]:
return ['compress=zstd']
def _suggest_single_disk_auto_subvolumes(
device: BDevice,
filesystem_type: FilesystemType | None = None,
separate_home: bool | None = None,
):
if not filesystem_type:
filesystem_type = FilesystemType.Btrfs
if filesystem_type == FilesystemType.Btrfs:
using_subvolumes = True
mount_options = ['compress=zstd']
else:
using_subvolumes = False
mount_options = []
sector_size = device.device_info.sector_size
device_modification = DeviceModification(device, wipe=True)
using_gpt = device_handler.partition_table.is_gpt()
boot_partition = _boot_partition_2gib(sector_size, using_gpt)
device_modification.add_partition(boot_partition)
total_size = device.device_info.total_size
available_space = total_size - boot_partition.length - Size(1, Unit.MiB, sector_size)
root_partition = PartitionModification(
status=ModificationStatus.Create,
type=PartitionType.Primary,
start=boot_partition.start + boot_partition.length,
length=available_space,
mountpoint=None if using_subvolumes else Path('/'),
fs_type=filesystem_type,
mount_options=mount_options,
)
if using_subvolumes:
root_partition.btrfs_subvols = get_default_btrfs_subvols()
device_modification.add_partition(root_partition)
return device_modification
disk_conf_module._boot_partition = _boot_partition_2gib
disk_conf_module.select_main_filesystem_format = _select_main_filesystem_btrfs
disk_conf_module.select_mount_options = _select_mount_options_compressed
disk_conf_module.suggest_single_disk_layout = _suggest_single_disk_auto_subvolumes
def load_config(config_file: Path, creds_file: Path | None = None):
from archinstall.lib.args import ArchConfig, Arguments
with open(config_file) as f:
config_data = json.load(f)
if creds_file and creds_file.exists():
with open(creds_file) as f:
creds_data = json.load(f)
config_data.update(creds_data)
args = Arguments(
config=config_file,
creds=creds_file,
mountpoint=Path('/mnt'),
silent=True,
)
return ArchConfig.from_config(config_data, args)
def save_config(config, output_file: Path):
from archinstall.lib.output import info
try:
config_dict = config.safe_json()
with open(output_file, 'w') as f:
json.dump(config_dict, f, indent=2, default=str)
info(f'✓ Configuration saved to: {output_file}')
except Exception as e:
from archinstall.lib.output import error
error(f'Failed to save config: {e}')
raise
def main():
import argparse
parser = argparse.ArgumentParser(description='Omarchy Disk Configuration Tool')
parser.add_argument('--config', type=Path, required=True, help='Path to config file')
parser.add_argument('--creds', type=Path, help='Path to credentials file')
parser.add_argument('--output', type=Path, help='Output path (default: overwrites input)')
parser.add_argument('--non-interactive', action='store_true', help='Skip interactive prompts')
args = parser.parse_args()
output_file = args.output or args.config
if not args.config.exists():
print(f'ERROR: Config file not found: {args.config}', file=sys.stderr)
sys.exit(1)
if args.creds and not args.creds.exists():
print(f'ERROR: Credentials file not found: {args.creds}', file=sys.stderr)
sys.exit(1)
try:
from archinstall.lib.output import info, error
from archinstall.lib.disk.disk_menu import DiskLayoutConfigurationMenu
from archinstall.tui.curses_menu import Tui
apply_omarchy_partition_defaults()
info('Loading configuration...')
config = load_config(args.config, args.creds)
if not config.disk_config:
error('No disk configuration found in config file')
sys.exit(1)
while True:
info('Launching partition editor...')
with Tui():
edited_disk_config = DiskLayoutConfigurationMenu(config.disk_config).run()
if edited_disk_config:
config.disk_config = edited_disk_config
info('✓ Partition configuration updated')
else:
info('No changes made in partition editor')
interactive = not args.non_interactive
validation_result = validate_disk_config(config, interactive=interactive)
if validation_result == 'RE_EDIT':
continue
elif validation_result == 'ABORT':
info('Disk configuration cancelled by user')
sys.exit(1)
else:
break
save_config(config, output_file)
info('✓ Disk configuration complete!')
except KeyboardInterrupt:
print('\nCancelled by user', file=sys.stderr)
sys.exit(1)
except Exception as e:
print(f'ERROR: {e}', file=sys.stderr)
import traceback
traceback.print_exc()
sys.exit(1)
if __name__ == '__main__':
main()

View File

@@ -29,6 +29,10 @@ if [[ -n "$font_name" && "$font_name" != "CNCLD" ]]; then
omarchy-restart-swayosd
omarchy-restart-walker
if pgrep -x ghostty; then
notify-send " You must restart Ghostty to see font change"
fi
omarchy-hook font-set "$font_name"
else
echo "Font '$font_name' not found."

View File

@@ -1,258 +0,0 @@
#!/usr/bin/env python3
"""
Omarchy Install
Installs Arch Linux with Omarchy customizations using archinstall as a library.
For disk configuration, use omarchy-disk-config.
"""
import json
import sys
import time
from pathlib import Path
def load_config(config_file: Path, creds_file: Path | None = None):
from archinstall.lib.args import ArchConfig, Arguments
with open(config_file) as f:
config_data = json.load(f)
if creds_file and creds_file.exists():
with open(creds_file) as f:
creds_data = json.load(f)
config_data.update(creds_data)
args = Arguments(
config=config_file,
creds=creds_file,
mountpoint=Path('/mnt'),
silent=True,
skip_ntp=True,
skip_wkd=True,
)
return ArchConfig.from_config(config_data, args)
def load_omarchy_packages() -> list[str]:
omarchy_path = Path('/usr/share/omarchy/install')
packages = []
base_packages_file = omarchy_path / 'omarchy-base.packages'
if base_packages_file.exists():
with open(base_packages_file) as f:
packages.extend([line.strip() for line in f if line.strip() and not line.startswith('#')])
return packages
def perform_installation(config_file: Path, creds_file: Path | None = None) -> None:
from archinstall.lib.disk.filesystem import FilesystemHandler
from archinstall.lib.installer import Installer
from archinstall.lib.models.device import DiskLayoutType, EncryptionType
from archinstall.lib.output import error, info
from archinstall.lib.profile.profiles_handler import profile_handler
from archinstall.lib.authentication.authentication_handler import auth_handler
start_time = time.time()
info('Loading configuration...')
config = load_config(config_file, creds_file)
if not config.disk_config:
error('No disk configuration found in config file')
error('Use omarchy-disk-config to configure disk layout first')
sys.exit(1)
disk_config = config.disk_config
if disk_config.config_type != DiskLayoutType.Pre_mount:
info('Performing filesystem operations...')
fs_handler = FilesystemHandler(disk_config)
fs_handler.perform_filesystem_operations()
mountpoint = Path('/mnt')
info('Loading Omarchy base packages...')
omarchy_packages = load_omarchy_packages()
info('Starting Omarchy installation...')
with Installer(
mountpoint,
disk_config,
kernels=config.kernels or ['linux'],
) as installation:
info('Mounting filesystems...')
if disk_config.config_type != DiskLayoutType.Pre_mount:
installation.mount_ordered_layout()
installation.sanity_check()
if disk_config.disk_encryption and disk_config.disk_encryption.encryption_type != EncryptionType.NoEncryption:
info('Generating encryption keys...')
installation.generate_key_files()
if config.mirror_config:
info('Configuring mirrors...')
installation.set_mirrors(config.mirror_config, on_target=False)
info('Installing base system...')
installation.minimal_installation(
optional_repositories=config.mirror_config.optional_repositories if config.mirror_config else [],
mkinitcpio=not config.uki,
hostname=config.hostname,
locale_config=config.locale_config,
)
if config.mirror_config:
installation.set_mirrors(config.mirror_config, on_target=True)
if config.swap:
info('Setting up swap...')
installation.setup_swap('zram')
all_packages = omarchy_packages + (config.packages or [])
if all_packages:
info(f'Installing {len(all_packages)} packages...')
installation.add_additional_packages(all_packages)
if config.bootloader:
info(f'Installing bootloader: {config.bootloader.value}...')
installation.add_bootloader(config.bootloader, config.uki)
if config.network_config:
info('Configuring network...')
config.network_config.install_network_config(installation, config.profile_config)
if config.auth_config and config.auth_config.users:
info('Creating users...')
installation.create_users(config.auth_config.users)
auth_handler.setup_auth(installation, config.auth_config, config.hostname)
if config.app_config:
info('Installing applications...')
from archinstall.lib.applications.application_handler import application_handler
application_handler.install_applications(installation, config.app_config)
if config.profile_config:
info('Installing profile...')
profile_handler.install_profile_config(installation, config.profile_config)
if config.timezone:
installation.set_timezone(config.timezone)
if config.ntp:
installation.activate_time_synchronization()
from archinstall.lib.installer import accessibility_tools_in_use
if accessibility_tools_in_use():
installation.enable_espeakup()
if config.auth_config and config.auth_config.root_enc_password:
from archinstall.lib.models.users import User
root_user = User('root', config.auth_config.root_enc_password, False)
installation.set_user_password(root_user)
if config.profile_config and config.profile_config.profile:
config.profile_config.profile.post_install(installation)
if config.services:
info('Enabling services...')
installation.enable_service(config.services)
if disk_config.has_default_btrfs_vols():
btrfs_options = disk_config.btrfs_options
snapshot_config = btrfs_options.snapshot_config if btrfs_options else None
snapshot_type = snapshot_config.snapshot_type if snapshot_config else None
if snapshot_type:
installation.setup_btrfs_snapshot(snapshot_type, config.bootloader)
info('Mounting offline resources for chroot access...')
from archinstall.lib.general import SysCommand
import os
import shutil
offline_mirror_src = Path('/var/cache/omarchy/mirror/offline')
offline_mirror_dst = mountpoint / 'var/cache/omarchy/mirror/offline'
packages_src = Path('/opt/packages')
packages_dst = mountpoint / 'opt/packages'
os.makedirs(offline_mirror_dst, exist_ok=True)
os.makedirs(packages_dst, exist_ok=True)
if offline_mirror_src.exists():
SysCommand(f'mount --bind {offline_mirror_src} {offline_mirror_dst}')
if packages_src.exists():
SysCommand(f'mount --bind {packages_src} {packages_dst}')
pacman_conf_src = Path('/etc/pacman.conf')
pacman_conf_dst = mountpoint / 'etc/pacman.conf'
if pacman_conf_src.exists():
shutil.copy(pacman_conf_src, pacman_conf_dst)
info('Copying user info to chroot...')
os.makedirs(mountpoint / 'tmp', exist_ok=True)
if os.path.exists('/tmp/omarchy-user-name.txt'):
shutil.copy('/tmp/omarchy-user-name.txt', mountpoint / 'tmp/omarchy-user-name.txt')
if os.path.exists('/tmp/omarchy-user-email.txt'):
shutil.copy('/tmp/omarchy-user-email.txt', mountpoint / 'tmp/omarchy-user-email.txt')
if config.custom_commands:
info('Running Omarchy custom commands...')
from archinstall.lib.installer import run_custom_user_commands
run_custom_user_commands(config.custom_commands, installation)
info('Generating fstab...')
installation.genfstab()
end_time = time.time()
duration_seconds = int(end_time - start_time)
duration_mins = duration_seconds // 60
duration_secs = duration_seconds % 60
timing_file = mountpoint / 'tmp/omarchy-install-time.txt'
with open(timing_file, 'w') as f:
f.write(f"{duration_mins}m {duration_secs}s\n")
info(f'Installation complete! Total time: {duration_mins}m {duration_secs}s')
def main():
import argparse
parser = argparse.ArgumentParser(description='Omarchy Install')
parser.add_argument('--config', type=Path, required=True, help='Path to config file')
parser.add_argument('--creds', type=Path, help='Path to credentials file')
args = parser.parse_args()
if not args.config.exists():
print(f'ERROR: Config file not found: {args.config}', file=sys.stderr)
sys.exit(1)
if args.creds and not args.creds.exists():
print(f'ERROR: Credentials file not found: {args.creds}', file=sys.stderr)
sys.exit(1)
try:
perform_installation(
config_file=args.config,
creds_file=args.creds,
)
except KeyboardInterrupt:
print('\nInstallation cancelled by user', file=sys.stderr)
sys.exit(1)
except Exception as e:
print(f'ERROR: Installation failed: {e}', file=sys.stderr)
import traceback
traceback.print_exc()
sys.exit(1)
if __name__ == '__main__':
main()

View File

@@ -1,110 +0,0 @@
#!/bin/bash
#
# Omarchy Final Configurations Installer
#
# This script runs from archinstall's custom_commands after base packages
# and user creation. It switches to the created user and runs install.sh
# to complete package installation and system configuration.
#
# archinstall runs custom_commands as root via:
# arch-chroot -S /mnt bash /var/tmp/user-command.0.sh
#
set -eEo pipefail
# Setup comprehensive logging for chroot execution
# This ensures all output is captured even though we're running inside chroot
CHROOT_LOG_FILE="/var/log/omarchy-install-chroot.log"
mkdir -p "$(dirname "$CHROOT_LOG_FILE")"
touch "$CHROOT_LOG_FILE"
# Redirect all output to both the log file and stdout
# This way:
# 1. Output is saved to /var/log/omarchy-install-chroot.log (inside chroot = /mnt/var/log on ISO)
# 2. Output still goes to stdout so arch-chroot can potentially capture it
# 3. We use exec to redirect the entire script's output from this point forward
exec > >(tee -a "$CHROOT_LOG_FILE") 2>&1
# Log script start with timestamp
echo "========================================"
echo "Omarchy Chroot Install Starting"
echo "Started at: $(date '+%Y-%m-%d %H:%M:%S')"
echo "Log file: $CHROOT_LOG_FILE"
echo "========================================"
echo
# Find the first non-root user (UID >= 1000, < 60000)
OMARCHY_USER=$(getent passwd | awk -F: '$3 >= 1000 && $3 < 60000 {print $1; exit}')
if [[ -z "$OMARCHY_USER" ]]; then
echo "ERROR: No non-root user found!"
echo "Users created:"
getent passwd | awk -F: '$3 >= 1000 {print $1, $3}'
exit 1
fi
echo "Setting up Omarchy for user: $OMARCHY_USER"
# Setup passwordless sudo (will be removed by post-install)
echo "Setting up passwordless sudo..."
mkdir -p /etc/sudoers.d
cat >/etc/sudoers.d/99-omarchy-installer <<EOF
root ALL=(ALL:ALL) NOPASSWD: ALL
%wheel ALL=(ALL:ALL) NOPASSWD: ALL
$OMARCHY_USER ALL=(ALL:ALL) NOPASSWD: ALL
EOF
chmod 440 /etc/sudoers.d/99-omarchy-installer
# Get user info from /tmp (written by configurator)
if [[ -f /tmp/omarchy-user-name.txt ]]; then
OMARCHY_USER_NAME=$(cat /tmp/omarchy-user-name.txt)
else
OMARCHY_USER_NAME=""
fi
if [[ -f /tmp/omarchy-user-email.txt ]]; then
OMARCHY_USER_EMAIL=$(cat /tmp/omarchy-user-email.txt)
else
OMARCHY_USER_EMAIL=""
fi
# Run install.sh as the user
echo "========================================"
echo "Running Omarchy installation as user: $OMARCHY_USER"
echo "========================================"
echo
# Use runuser instead of su for better output handling
# runuser doesn't go through PAM and preserves stdout/stderr better
runuser -u "$OMARCHY_USER" -- bash -c "
set -eEo pipefail
export PYTHONUNBUFFERED=1
export OMARCHY_CHROOT_INSTALL=1
export OMARCHY_ARCHINSTALL_WRAPPER=1
export OMARCHY_USER='$OMARCHY_USER'
export OMARCHY_USER_NAME='$OMARCHY_USER_NAME'
export OMARCHY_USER_EMAIL='$OMARCHY_USER_EMAIL'
cd ~
source /usr/share/omarchy/install.sh
"
exit_code=$?
if [[ $exit_code -eq 0 ]]; then
echo
echo "========================================"
echo "Omarchy install.sh completed successfully!"
echo "========================================"
echo
echo "========================================"
echo "Omarchy Chroot Install Completed"
echo "Finished at: $(date '+%Y-%m-%d %H:%M:%S')"
echo "Log file: $CHROOT_LOG_FILE"
echo "========================================"
else
echo
echo "========================================"
echo "ERROR: Omarchy install.sh exited with code $exit_code"
echo "========================================"
exit $exit_code
fi

View File

@@ -3,7 +3,7 @@
browser=$(xdg-settings get default-web-browser)
case $browser in
google-chrome* | brave-browser* | microsoft-edge* | opera* | vivaldi* | helium-browser*) ;;
google-chrome* | brave-browser* | microsoft-edge* | opera* | vivaldi* | helium*) ;;
*) browser="chromium.desktop" ;;
esac

View File

@@ -89,6 +89,7 @@ dynamic_bindings() {
jq -r '.[] | {modmask, key, keycode, description, dispatcher, arg} | "\(.modmask),\(.key)@\(.keycode),\(.description),\(.dispatcher),\(.arg)"' |
sed -r \
-e 's/null//' \
-e 's,~/.local/share/omarchy/bin/,,' \
-e 's,uwsm app -- ,,' \
-e 's,uwsm-app -- ,,' \
-e 's/@0//' \

View File

@@ -8,7 +8,7 @@ mkdir -p "$STATE_DIR"
mkdir -p "$STATE_DIR/skipped"
# Run any pending migrations
for file in /usr/share/omarchy/migrations/*.sh; do
for file in ~/.local/share/omarchy/migrations/*.sh; do
filename=$(basename "$file")
if [[ ! -f "$STATE_DIR/$filename" && ! -f "$STATE_DIR/skipped/$filename" ]]; then

View File

@@ -2,12 +2,12 @@
# Copy and sync icon files
mkdir -p ~/.local/share/icons/hicolor/48x48/apps/
cp /usr/share/omarchy/applications/icons/*.png ~/.local/share/icons/hicolor/48x48/apps/
cp ~/.local/share/omarchy/applications/icons/*.png ~/.local/share/icons/hicolor/48x48/apps/
gtk-update-icon-cache ~/.local/share/icons/hicolor &>/dev/null
# Copy .desktop declarations
mkdir -p ~/.local/share/applications
cp /usr/share/omarchy/applications/*.desktop ~/.local/share/applications/
cp /usr/share/omarchy/applications/hidden/*.desktop ~/.local/share/applications/
cp ~/.local/share/omarchy/applications/*.desktop ~/.local/share/applications/
cp ~/.local/share/omarchy/applications/hidden/*.desktop ~/.local/share/applications/
update-desktop-database ~/.local/share/applications

View File

@@ -1,6 +1,6 @@
#!/bin/bash
# This script deploys /etc/skel/.config/X/Y/Z -> ~/.config/X/Y/Z
# This script deploys ~/.local/share/omarchy/config/X/Y/Z -> ~/.config/X/Y/Z
config_file=$1
if [[ -z "$config_file" ]]; then
@@ -8,16 +8,16 @@ if [[ -z "$config_file" ]]; then
Usage: $0 [config_file]
Must provide a file path from the .config directory to be refreshed.
To copy /etc/skel/.config/hypr/hyprlock.conf to ~/.config/hypr/hyprlock.conf
$0 hypr/hyprlock.conf
To copy ~/.local/share/omarchy/config/hypr/hyprlock.conf to ~/.config/hypr/hyprlock.conf
$0 hypr/hyprlock.conf
USAGE
exit 1
fi
# Backup the destination file (with timestamp) to avoid clobbering (Ex: hyprlock.conf.bak.1753817951)
user_config_file="${HOME}/.config/$config_file"
default_config_file="/etc/skel/.config/$config_file"
default_config_file="${HOME}/.local/share/omarchy/config/$config_file"
backup_config_file="$user_config_file.bak.$(date +%s)"
if [[ -f "$user_config_file" ]]; then

View File

@@ -2,6 +2,6 @@
omarchy-refresh-config hypr/autostart.conf
omarchy-refresh-config hypr/bindings.conf
omarchy-refresh-config hypr/envs.conf
omarchy-refresh-config hypr/input.conf
omarchy-refresh-config hypr/looknfeel.conf
omarchy-refresh-config hypr/hyprland.conf

View File

@@ -1,3 +1,3 @@
#!/bin/bash
sudo cp -f /usr/share/omarchy/default/pacman/mirrorlist /etc/pacman.d/mirrorlist
sudo cp -f ~/.local/share/omarchy/default/pacman/mirrorlist /etc/pacman.d/mirrorlist

View File

@@ -1,6 +1,6 @@
#!/bin/bash
sudo cp /usr/share/omarchy/default/plymouth/* /usr/share/plymouth/themes/omarchy/
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

View File

@@ -10,15 +10,19 @@ fi
echo -e "This will reinstall all the default Omarchy packages and reset all default configs.\nWarning: All changes to configs will be lost.\n"
if gum confirm "Are you sure you want to reinstall and lose all config changes?"; then
echo "Reinstalling Omarchy Package"
sudo pacman -Syu --noconfirm --needed omarchy
echo "Resetting Omarchy repository"
git clone "https://github.com/basecamp/omarchy.git" ~/.local/share/omarchy-new >/dev/null
rm -rf $OMARCHY_PATH
mv ~/.local/share/omarchy-new $OMARCHY_PATH
echo "Reinstalling missing Omarchy packages"
mapfile -t packages < <(grep -v '^#' "$OMARCHY_PATH/install/omarchy-base.packages" | grep -v '^$')
sudo pacman -Syu --noconfirm --needed "${packages[@]}"
echo "Resetting all Omarchy configs"
cp -R /etc/skel/.config/* ~/.config/
cp -R ~/.local/share/omarchy/config/* ~/.config/
cp ~/.local/share/omarchy/default/bashrc ~/.bashrc
echo '[[ -f ~/.bashrc ]] && . ~/.bashrc' | tee ~/.bash_profile >/dev/null
$(bash $OMARCHY_PATH/install/config/theme.sh)
$(bash $OMARCHY_PATH/install/config/git.sh)

View File

@@ -4,5 +4,10 @@ if [[ -f ~/.config/alacritty/alacritty.toml ]]; then
touch ~/.config/alacritty/alacritty.toml
fi
killall -SIGUSR1 kitty
killall -SIGUSR2 ghostty
if pgrep -x kitty; then
killall -SIGUSR1 kitty
fi
if pgrep -x ghostty; then
killall -SIGUSR2 ghostty
fi

View File

@@ -1,32 +1,21 @@
#!/bin/bash
pkill elephant
pkill walker
# Detect if we're running as root (from pacman hook)
if [[ $EUID -eq 0 ]]; then
# Find all logged-in users running Hyprland
for user_runtime in /run/user/*/; do
USER_UID=$(basename "$user_runtime")
USER_NAME=$(id -un "$USER_UID" 2>/dev/null)
# Get the owner of this script to determine which user to run as
SCRIPT_OWNER=$(stat -c '%U' "$0")
USER_UID=$(id -u "$SCRIPT_OWNER")
# Skip if we can't resolve the username or if no Hyprland session
[[ -z "$USER_NAME" ]] && continue
[[ ! -S "${user_runtime}hypr/"*"/.socket.sock" ]] && continue
# Kill existing processes for this user
pkill -u "$USER_NAME" elephant
pkill -u "$USER_NAME" walker
# Restart services as this user
systemd-run --uid="$USER_NAME" --setenv=XDG_RUNTIME_DIR="/run/user/$USER_UID" \
bash -c "
setsid uwsm-app -- elephant &
setsid uwsm-app -- walker --gapplication-service &
"
done
# Restart services as the script owner
systemd-run --uid="$SCRIPT_OWNER" --setenv=XDG_RUNTIME_DIR="/run/user/$USER_UID" \
bash -c "
setsid uwsm-app -- elephant &
setsid uwsm-app -- walker --gapplication-service &
"
else
# Running as user directly
pkill elephant
pkill walker
setsid uwsm-app -- elephant &
wait 2
setsid uwsm-app -- walker --gapplication-service &

View File

@@ -1,3 +0,0 @@
#!/bin/bash
# Track active Omarchy user for package migrations
echo "$USER:$HOME:$XDG_RUNTIME_DIR" > /tmp/omarchy-active-user

View File

@@ -2,6 +2,6 @@
clear
echo -e "\033[32m"
cat < /usr/share/omarchy/logo.txt
cat <~/.local/share/omarchy/logo.txt
echo -e "\033[0m"
echo

View File

@@ -28,12 +28,12 @@ if pgrep -x waybar >/dev/null; then
omarchy-restart-waybar
fi
omarchy-restart-swayosd
omarchy-restart-terminal
hyprctl reload
pkill -SIGUSR2 btop
makoctl reload
# Change gnome, browser, vscode, cursor themes
omarchy-theme-set-terminal
omarchy-theme-set-gnome
omarchy-theme-set-browser
omarchy-theme-set-vscode

View File

@@ -5,7 +5,7 @@ if [ "$#" -ne 4 ]; then
APP_NAME=$(gum input --prompt "Name> " --placeholder "My TUI")
APP_EXEC=$(gum input --prompt "Launch Command> " --placeholder "lazydocker or bash -c 'dust; read -n 1 -s'")
WINDOW_STYLE=$(gum choose --header "Window style" float tile)
ICON_URL=$(gum input --prompt "Icon URL> " --placeholder "See https://dashboardicons.com (must use PNG!)")
ICON_URL=$(gum input --prompt "Icon URL> " --placeholder "See https://dashboardicons.com (must use PNG or SVG!)")
else
APP_NAME="$1"
APP_EXEC="$2"
@@ -43,7 +43,7 @@ cat >"$DESKTOP_FILE" <<EOF
Version=1.0
Name=$APP_NAME
Comment=$APP_NAME
Exec=\$TERMINAL --class=$APP_CLASS -e $APP_EXEC
Exec=xdg-terminal-exec --app-id=$APP_CLASS -e $APP_EXEC
Terminal=false
Type=Application
Icon=$ICON_PATH

View File

@@ -4,7 +4,8 @@ set -e
trap 'echo ""; echo -e "\033[0;31mSomething went wrong during the update!\n\nPlease review the output above carefully, correct the error, and retry the update.\n\nIf you need assistance, get help from the community at https://omarchy.org/discord\033[0m"' ERR
omarchy-update-confirm
omarchy-snapshot create || [ $? -eq 127 ]
omarchy-update-git
omarchy-update-perform
if omarchy-update-confirm; then
omarchy-snapshot create || [ $? -eq 127 ]
omarchy-update-git
omarchy-update-perform
fi

View File

@@ -1,7 +1,5 @@
#!/bin/bash
set -e
gum style --border normal --border-foreground 6 --padding "1 2" \
"Ready to update Omarchy?" \
"" \
@@ -10,5 +8,5 @@ gum style --border normal --border-foreground 6 --padding "1 2" \
if ! gum confirm "Continue with update?"; then
echo "Update cancelled"
exit 0
exit 1
fi

View File

@@ -327,7 +327,7 @@ To stop: omarchy-windows-vm stop"
"$LIFECYCLE"
# Detect display scale from Hyprland
HYPR_SCALE=$(hyprctl monitors -j | jq -r '.[0].scale')
HYPR_SCALE=$(hyprctl monitors -j | jq -r '.[] | select (.focused == true) | .scale')
SCALE_PERCENT=$(echo "$HYPR_SCALE" | awk '{print int($1 * 100)}')
RDP_SCALE=""

25
boot.sh
View File

@@ -3,15 +3,15 @@
# Set install mode to online since boot.sh is used for curl installations
export OMARCHY_ONLINE_INSTALL=true
ansi_art=' ▄▄▄
▄█████▄ ▄███████████▄ ▄███████ ▄███████ ▄███████ ▄█ █▄ ▄█ █▄
ansi_art=' ▄▄▄
▄█████▄ ▄███████████▄ ▄███████ ▄███████ ▄███████ ▄█ █▄ ▄█ █▄
███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
███ ███ ███ ███ ███ ███ ███ ███ ███ ███ █▀ ███ ███ ███ ███
███ ███ ███ ███ ███ ▄███▄▄▄███ ▄███▄▄▄██▀ ███ ▄███▄▄▄███▄ ███▄▄▄███
███ ███ ███ ███ ███ ▀███▀▀▀███ ▀███▀▀▀▀ ███ ▀▀███▀▀▀███ ▀▀▀▀▀▀███
███ ███ ███ ███ ███ ███ ███ ██████████ ███ █▄ ███ ███ ▄██ ███
███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
▀█████▀ ▀█ ███ █▀ ███ █▀ ███ ███ ███████▀ ███ █▀ ▀█████▀
▀█████▀ ▀█ ███ █▀ ███ █▀ ███ ███ ███████▀ ███ █▀ ▀█████▀
███ █▀ '
clear
@@ -19,4 +19,21 @@ echo -e "\n$ansi_art\n"
sudo pacman -Syu --noconfirm --needed git
# FIXME: Update behavior or remove
# Use custom repo if specified, otherwise default to basecamp/omarchy
OMARCHY_REPO="${OMARCHY_REPO:-basecamp/omarchy}"
echo -e "\nCloning Omarchy from: https://github.com/${OMARCHY_REPO}.git"
rm -rf ~/.local/share/omarchy/
git clone "https://github.com/${OMARCHY_REPO}.git" ~/.local/share/omarchy >/dev/null
# Use custom branch if instructed, otherwise default to master
OMARCHY_REF="${OMARCHY_REF:-master}"
if [[ $OMARCHY_REF != "master" ]]; then
echo -e "\e[32mUsing branch: $OMARCHY_REF\e[0m"
cd ~/.local/share/omarchy
git fetch origin "${OMARCHY_REF}" && git checkout "${OMARCHY_REF}"
cd -
fi
echo -e "\nInstallation starting..."
source ~/.local/share/omarchy/install.sh

View File

@@ -1,6 +1,6 @@
--ozone-platform=wayland
--ozone-platform-hint=wayland
--enable-features=TouchpadOverscrollHistoryNavigation
--load-extension=/usr/share/omarchy/default/chromium/extensions/copy-url
--load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url
# Chromium crash workaround for Wayland color management on Hyprland - see https://github.com/hyprwm/Hyprland/issues/11957
--disable-features=WaylandWpColorManagerV1

View File

@@ -2,7 +2,7 @@
$terminal = uwsm-app -- xdg-terminal-exec
$browser = omarchy-launch-browser
bindd = SUPER, RETURN, Terminal, exec, $terminal --working-directory="$(omarchy-cmd-terminal-cwd)"
bindd = SUPER, RETURN, Terminal, exec, $terminal --dir="$(omarchy-cmd-terminal-cwd)"
bindd = SUPER SHIFT, F, File manager, exec, uwsm-app -- nautilus --new-window
bindd = SUPER SHIFT, B, Browser, exec, $browser
bindd = SUPER SHIFT ALT, B, Browser (private), exec, $browser --private

View File

@@ -1,2 +0,0 @@
# Extra env variables
# env = MY_GLOBAL_ENV,setting

View File

@@ -1,22 +1,21 @@
# Learn how to configure Hyprland: https://wiki.hyprland.org/Configuring/
# Use defaults Omarchy defaults (but don't edit these directly!)
source = /usr/share/omarchy/default/hypr/autostart.conf
source = /usr/share/omarchy/default/hypr/bindings/media.conf
source = /usr/share/omarchy/default/hypr/bindings/clipboard.conf
source = /usr/share/omarchy/default/hypr/bindings/tiling-v2.conf
source = /usr/share/omarchy/default/hypr/bindings/utilities.conf
source = /usr/share/omarchy/default/hypr/envs.conf
source = /usr/share/omarchy/default/hypr/looknfeel.conf
source = /usr/share/omarchy/default/hypr/input.conf
source = /usr/share/omarchy/default/hypr/windows.conf
source = ~/.local/share/omarchy/default/hypr/autostart.conf
source = ~/.local/share/omarchy/default/hypr/bindings/media.conf
source = ~/.local/share/omarchy/default/hypr/bindings/clipboard.conf
source = ~/.local/share/omarchy/default/hypr/bindings/tiling-v2.conf
source = ~/.local/share/omarchy/default/hypr/bindings/utilities.conf
source = ~/.local/share/omarchy/default/hypr/envs.conf
source = ~/.local/share/omarchy/default/hypr/looknfeel.conf
source = ~/.local/share/omarchy/default/hypr/input.conf
source = ~/.local/share/omarchy/default/hypr/windows.conf
source = ~/.config/omarchy/current/theme/hyprland.conf
# Change your own setup in these files (and overwrite any settings from defaults!)
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,36 +0,0 @@
[Default Applications]
image/png=imv.desktop
image/jpeg=imv.desktop
image/gif=imv.desktop
image/webp=imv.desktop
image/bmp=imv.desktop
image/tiff=imv.desktop
application/pdf=org.gnome.Evince.desktop
x-scheme-handler/http=chromium.desktop
x-scheme-handler/https=chromium.desktop
text/html=chromium.desktop
video/mp4=mpv.desktop
video/x-msvideo=mpv.desktop
video/x-matroska=mpv.desktop
video/x-flv=mpv.desktop
video/x-ms-wmv=mpv.desktop
video/mpeg=mpv.desktop
video/ogg=mpv.desktop
video/webm=mpv.desktop
video/quicktime=mpv.desktop
video/3gpp=mpv.desktop
video/3gpp2=mpv.desktop
video/x-ms-asf=mpv.desktop
video/x-ogm+ogg=mpv.desktop
video/x-theora+ogg=mpv.desktop
application/ogg=mpv.desktop
x-scheme-handler/mailto=HEY.desktop
[Added Associations]
image/png=imv.desktop;
image/jpeg=imv.desktop;
image/gif=imv.desktop;
image/webp=imv.desktop;
text/html=chromium.desktop;
x-scheme-handler/http=chromium.desktop;
x-scheme-handler/https=chromium.desktop;

View File

@@ -1,26 +0,0 @@
██████████████████████████████████████████████████████
██████████████████████████████████████████████████████
████ ████ ████
████ ████ ████
████ █████████████████████ ████████ ████
████ █████████████████████ ████████ ████
████ ████ ████ ████
████ ████ ████ ████
████ ████ ████ ████
████ ████ ████ ████
████ ████ ████ ████
████ ████ ████ ████
████████████ ████ ████
████████████ ████ ████
████ ████ ████ ████
████ ████ ████ ████
████ ████ ████ ████
████ ████ ████ ████
████ ████ ████ ████
████ ████ ████ ████
████ ██████████████████████████████████████ ████
████ ██████████████████████████████████████ ████
████ ████ ████
████ ████ ████
█████████████████████████████ ████████████████████
█████████████████████████████ ████████████████████

View File

@@ -1,10 +0,0 @@
▄▄▄
▄█████▄ ▄███████████▄ ▄███████ ▄███████ ▄███████ ▄█ █▄ ▄█ █▄
███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
███ ███ ███ ███ ███ ███ ███ ███ ███ ███ █▀ ███ ███ ███ ███
███ ███ ███ ███ ███ ▄███▄▄▄███ ▄███▄▄▄██▀ ███ ▄███▄▄▄███▄ ███▄▄▄███
███ ███ ███ ███ ███ ▀███▀▀▀███ ▀███▀▀▀▀ ███ ▀▀███▀▀▀███ ▀▀▀▀▀▀███
███ ███ ███ ███ ███ ███ ███ ██████████ ███ █▄ ███ ███ ▄██ ███
███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
▀█████▀ ▀█ ███ █▀ ███ █▀ ███ ███ ███████▀ ███ █▀ ▀█████▀
███ █▀

View File

@@ -1,7 +1,8 @@
# Changes require a restart to take effect.
# Set default OMARCHY_PATH
export OMARCHY_PATH=/usr/share/omarchy
# Ensure Omarchy bins are in the path
export OMARCHY_PATH=$HOME/.local/share/omarchy
export PATH=$OMARCHY_PATH/bin:$PATH
# Set default terminal and editor
source ~/.config/uwsm/default

View File

@@ -1,6 +1,7 @@
force_keyboard_focus = true # forces keyboard forcus to stay in Walker
selection_wrap = true # wrap list if at bottom or top
theme = "omarchy-default" # theme to use
force_keyboard_focus = true # forces keyboard forcus to stay in Walker
selection_wrap = true # wrap list if at bottom or top
theme = "omarchy-default" # theme to use
additional_theme_location = "~/.local/share/omarchy/default/walker/themes/"
[placeholders]
"default" = { input = " Search...", list = "No Results" } # placeholders for input and empty list, key is the providers name, so f.e. "desktopapplications" or "menus:other"
@@ -9,6 +10,7 @@ theme = "omarchy-default" # th
quick_activate = []
[providers]
max_results = 256 # 256 should be enough for everyone
default = [
"desktopapplications",
"menus",

View File

@@ -1,7 +0,0 @@
# Technicolor dreams
force_color_prompt=yes
color_prompt=yes
# Simple prompt with path in the window/pane title and caret for typing line
PS1=$'\uf0a9 '
PS1="\[\e]0;\w\a\]$PS1"

View File

@@ -1,7 +1,6 @@
source /usr/share/omarchy/default/bash/shell
source /usr/share/omarchy/default/bash/aliases
source /usr/share/omarchy/default/bash/functions
source /usr/share/omarchy/default/bash/prompt
source /usr/share/omarchy/default/bash/init
source /usr/share/omarchy/default/bash/envs
[[ $- == *i* ]] && bind -f /usr/share/omarchy/default/bash/inputrc
source ~/.local/share/omarchy/default/bash/shell
source ~/.local/share/omarchy/default/bash/aliases
source ~/.local/share/omarchy/default/bash/functions
source ~/.local/share/omarchy/default/bash/init
source ~/.local/share/omarchy/default/bash/envs
[[ $- == *i* ]] && bind -f ~/.local/share/omarchy/default/bash/inputrc

View File

@@ -3,7 +3,7 @@
# All the default Omarchy aliases and functions
# (don't mess with these directly, just overwrite them here!)
source /usr/share/omarchy/default/bash/rc
source ~/.local/share/omarchy/default/bash/rc
# Add your own exports, aliases, and functions here.
#

View File

@@ -1,15 +1,15 @@
# App-specific tweaks
source = /usr/share/omarchy/default/hypr/apps/1password.conf
source = /usr/share/omarchy/default/hypr/apps/bitwarden.conf
source = /usr/share/omarchy/default/hypr/apps/browser.conf
source = /usr/share/omarchy/default/hypr/apps/hyprshot.conf
source = /usr/share/omarchy/default/hypr/apps/jetbrains.conf
source = /usr/share/omarchy/default/hypr/apps/localsend.conf
source = /usr/share/omarchy/default/hypr/apps/pip.conf
source = /usr/share/omarchy/default/hypr/apps/qemu.conf
source = /usr/share/omarchy/default/hypr/apps/retroarch.conf
source = /usr/share/omarchy/default/hypr/apps/steam.conf
source = /usr/share/omarchy/default/hypr/apps/system.conf
source = /usr/share/omarchy/default/hypr/apps/terminals.conf
source = /usr/share/omarchy/default/hypr/apps/walker.conf
source = /usr/share/omarchy/default/hypr/apps/webcam-overlay.conf
source = ~/.local/share/omarchy/default/hypr/apps/1password.conf
source = ~/.local/share/omarchy/default/hypr/apps/bitwarden.conf
source = ~/.local/share/omarchy/default/hypr/apps/browser.conf
source = ~/.local/share/omarchy/default/hypr/apps/hyprshot.conf
source = ~/.local/share/omarchy/default/hypr/apps/jetbrains.conf
source = ~/.local/share/omarchy/default/hypr/apps/localsend.conf
source = ~/.local/share/omarchy/default/hypr/apps/pip.conf
source = ~/.local/share/omarchy/default/hypr/apps/qemu.conf
source = ~/.local/share/omarchy/default/hypr/apps/retroarch.conf
source = ~/.local/share/omarchy/default/hypr/apps/steam.conf
source = ~/.local/share/omarchy/default/hypr/apps/system.conf
source = ~/.local/share/omarchy/default/hypr/apps/terminals.conf
source = ~/.local/share/omarchy/default/hypr/apps/walker.conf
source = ~/.local/share/omarchy/default/hypr/apps/webcam-overlay.conf

View File

@@ -1,5 +1,5 @@
# Browser types
windowrule = tag +chromium-based-browser, class:((google-)?[cC]hrom(e|ium)|[bB]rave-browser|Microsoft-edge|Vivaldi-stable|helium)
windowrule = tag +chromium-based-browser, class:((google-)?[cC]hrom(e|ium)|[bB]rave-browser|[mM]icrosoft-edge|Vivaldi-stable|helium)
windowrule = tag +firefox-based-browser, class:([fF]irefox|zen|librewolf)
# Force chromium-based browsers into a tile to deal with --app bug

View File

@@ -0,0 +1,2 @@
# Focus floating DaVinci Resolve dialog windows
windowrule = stayfocused, class:.*[Rr]esolve.*, floating:1

View File

@@ -1,4 +1,3 @@
exec-once = omarchy-set-user
exec-once = uwsm-app -- hypridle
exec-once = uwsm-app -- mako
exec-once = uwsm-app -- waybar

View File

@@ -11,6 +11,6 @@ bindd = SUPER, G, Messenger, exec, $messenger
bindd = SUPER, O, Obsidian, exec, obsidian -disable-gpu
bindd = SUPER, SLASH, Password manager, exec, $passwordManager
source = /usr/share/omarchy/default/hypr/bindings/media.conf
source = /usr/share/omarchy/default/hypr/bindings/tiling.conf
source = /usr/share/omarchy/default/hypr/bindings/utilities.conf
source = ~/.local/share/omarchy/default/hypr/bindings/media.conf
source = ~/.local/share/omarchy/default/hypr/bindings/tiling.conf
source = ~/.local/share/omarchy/default/hypr/bindings/utilities.conf

View File

@@ -48,6 +48,10 @@ bindd = SUPER, TAB, Next workspace, workspace, e+1
bindd = SUPER SHIFT, TAB, Previous workspace, workspace, e-1
bindd = SUPER CTRL, TAB, Former workspace, workspace, previous
# Move workspaces to other monitors
bindd = SUPER SHIFT ALT, LEFT, Move workspace to left monitor, movecurrentworkspacetomonitor, l
bindd = SUPER SHIFT ALT, RIGHT, Move workspace to right monitor, movecurrentworkspacetomonitor, r
# Swap active window with the one next to it with SUPER + SHIFT + arrow keys
bindd = SUPER SHIFT, LEFT, Swap window to the left, swapwindow, l
bindd = SUPER SHIFT, RIGHT, Swap window to the right, swapwindow, r
@@ -87,14 +91,14 @@ bindd = SUPER ALT, DOWN, Move window to group on bottom, moveintogroup, d
# Navigate a single set of grouped windows
bindd = SUPER ALT, TAB, Next window in group, changegroupactive, f
bindd = SUPER ALT SHIFT, TAB, Previous window in group, changegroupactive, b
# Scroll through a set of grouped windows with SUPER + ALT + scroll
bindd = SUPER ALT, page_up, Next window in group, changegroupactive, f
bindd = SUPER ALT, page_down, Previous window in group, changegroupactive, b
bindd = SUPER ALT, mouse_down, Next window in group, changegroupactive, f
bindd = SUPER ALT, mouse_up, Previous window in group, changegroupactive, b
# Activate window in a group by number
bindd = SUPER ALT, 1, Switch to group window 1, changegroupactive, 1
bindd = SUPER ALT, 2, Switch to group window 2, changegroupactive, 2
bindd = SUPER ALT, 3, Switch to group window 3, changegroupactive, 3
bindd = SUPER ALT, 4, Switch to group window 4, changegroupactive, 4
bindd = SUPER ALT, 5, Switch to group window 5, changegroupactive, 5
bindd = SUPER ALT, code:10, Switch to group window 1, changegroupactive, 1
bindd = SUPER ALT, code:11, Switch to group window 2, changegroupactive, 2
bindd = SUPER ALT, code:12, Switch to group window 3, changegroupactive, 3
bindd = SUPER ALT, code:13, Switch to group window 4, changegroupactive, 4
bindd = SUPER ALT, code:14, Switch to group window 5, changegroupactive, 5

View File

@@ -18,6 +18,7 @@ bindd = SUPER SHIFT, BACKSPACE, Toggle workspace gaps, exec, omarchy-hyprland-wo
bindd = SUPER, COMMA, Dismiss last notification, exec, makoctl dismiss
bindd = SUPER SHIFT, COMMA, Dismiss all notifications, exec, makoctl dismiss --all
bindd = SUPER CTRL, COMMA, Toggle silencing notifications, exec, makoctl mode -t do-not-disturb && makoctl mode | grep -q 'do-not-disturb' && notify-send "Silenced notifications" || notify-send "Enabled notifications"
bindd = SUPER ALT, COMMA, Invoke last notification, exec, makoctl invoke
# Toggle idling
bindd = SUPER CTRL, I, Toggle locking on idle, exec, omarchy-toggle-idle

View File

@@ -14,3 +14,8 @@ input {
natural_scroll = false
}
}
misc {
key_press_enables_dpms = true # key press will trigger wake
mouse_move_enables_dpms = true # mouse move will trigger wake
}

View File

@@ -8,4 +8,4 @@ windowrule = opacity 0.97 0.9, class:.*
windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0
# App-specific tweaks
source = /usr/share/omarchy/default/hypr/apps.conf
source = ~/.local/share/omarchy/default/hypr/apps.conf

View File

@@ -1,4 +1,4 @@
@import "../../../omarchy/current/theme/walker.css";
@import "../../../../../../../.config/omarchy/current/theme/walker.css";
* {
all: unset;

View File

@@ -1,750 +0,0 @@
# All configuration options described here can also be supplied on the
# command line of cups-browsed via the "-o" option. In case of
# contradicting settings the setting defined in the configuration file
# will get used.
# Unknown directives are ignored, also unknown values.
# Where should cups-browsed save information about the print queues it had
# generated when shutting down, like whether one of these queues was the
# default printer, or default option settings of the queues?
# CacheDir /var/cache/cups
# Where should cups-browsed create its debug log file (if "DebugLogging file"
# is set)?
# LogDir /var/log/cups
# How should debug logging be done? Into the file
# /var/log/cups/cups-browsed_log ('file'), to stderr ('stderr'), or
# not at all ('none')?
# Note that if cups-browsed is running as a system service (for
# example via systemd) logging to stderr makes the log output going to
# the journal or syslog. Only if you run cups-browsed from the command
# line (for development or debugging) it will actually appear on
# stderr.
# DebugLogging file
# DebugLogging stderr
# DebugLogging file stderr
# DebugLogging none
# Which protocols will we use to discover printers on the network?
# Can use DNSSD or 'none'.
BrowseRemoteProtocols dnssd
# Which protocols will we use to broadcast shared local printers to the network?
# Can use DNSSD or 'none'.
# Broadcasting is currently not supported, as DNSSD is done by CUPS itself
# (we ignore DNSSD in this directive).
# BrowseLocalProtocols none
# Settings of this directive apply to both BrowseRemoteProtocols and
# BrowseLocalProtocols.
# Can use DNSSD or 'none'.
# BrowseProtocols none
# Only browse remote printers (via DNS-SD) from
# selected servers using the "BrowseAllow", "BrowseDeny", and
# "BrowseOrder" directives
# This serves for restricting the choice of printers in print dialogs
# to trusted servers or to reduce the number of listed printers in the
# print dialogs to a more user-friendly amount in large networks with
# very many shared printers.
# This only filters the selection of remote printers for which
# cups-browsed creates local queues. If the print dialog uses other
# mechanisms to list remote printers as for example direct DNS-SD
# access, cups-browsed has no influence. cups-browsed also does not
# prevent the user from manually accessing non-listed printers.
# "BrowseAllow": Accept printers from these hosts or networks. If
# there are only "BrowseAllow" lines and no "BrowseOrder" and/or
# "BrowseDeny" lines, only servers matching at last one "BrowseAllow"
# line are accepted.
# "BrowseDeny": Deny printers from these hosts or networks. If there
# are only "BrowseDeny" lines and no "BrowseOrder" and/or
# "BrowseAllow" lines, all servers NOT matching any of the
# "BrowseDeny" lines are accepted.
# "BrowseOrder": Determine the order in which "BrowseAllow" and
# "BrowseDeny" lines are applied. With "BrowseOrder Deny,Allow" in the
# beginning all servers are accepted, then the "BrowseDeny" lines are
# applied to exclude unwished servers or networks and after that the
# "BrowseAllow" lines to re-include servers or networks. With
# "BrowseOrder Allow,Deny" we start with denying all servers, then
# applying the "BrowseAllow" lines and afterwards the "BrowseDeny"
# lines.
# Default for "BrowseOrder" is "Deny.Allow" if there are both
# "BrowseAllow" and "BrowseDeny" lines.
# If there are no "Browse..." lines at all, all servers are accepted.
# BrowseAllow All
# BrowseAllow cups.example.com
# BrowseAllow 192.168.1.12
# BrowseAllow 192.168.1.0/24
# BrowseAllow 192.168.1.0/255.255.255.0
# BrowseDeny All
# BrowseDeny printserver.example.com
# BrowseDeny 192.168.1.13
# BrowseDeny 192.168.3.0/24
# BrowseDeny 192.168.3.0/255.255.255.0
# BrowseOrder Deny,Allow
# BrowseOrder Allow,Deny
# The interval between browsing/broadcasting cycles, local and/or
# remote, can be adjusted with the BrowseInterval directive.
# BrowseInterval 60
# Browsing-related operations such as adding or removing printer queues
# and broadcasting are each allowed to take up to a given amount of time.
# It can be configured, in seconds, with the BrowseTimeout directive.
# BrowseTimeout 300
# Filtering of remote printers by other properties than IP addresses
# of their servers
# Often the desired selection of printers cannot be reached by only
# taking into account the IP addresses of the servers. For these cases
# there is the BrowseFilter directive to filter by most of the known
# properties of the printer.
# By default there is no BrowseFilter line meaning that no filtering
# is applied.
# To do filtering one can supply one or more BrowseFilter directives
# like this:
# BrowseFilter [NOT] [EXACT] <FIELD> [<VALUE>]
# The BrowseFilter directive always starts with the word
# "BrowseFilter" and it must at least contain the name of the data
# field (<FIELD>) of the printer's properties to which it should
# apply.
# Available field names are:
# name: Name of the local print queue to be created
# host: Host name of the remote print server
# port: Port through which the printer is accessed on the server
# service: DNS/SD service name of the remote printer
# domain: Domain of the remote print server
# Also all field names in the TXT records of DNS-SD-advertised printers
# are valid, like "color", "duplex", "pdl", ... If the field name of
# the filter rule does not exist for the printer, the rule is skipped.
# The optional <VALUE> field is either the exact value (when the
# option EXACT is supplied) or a regular expression (Run "man 7 regex"
# in a terminal window) to be matched with the data field.
# If no <VALUE> filed is supplied, rules with field names of the TXT
# record are considered for boolean matching (true/false) of boolean
# field (like duplex, which can have the values "T" for true and "F"
# for false).
# If the option NOT is supplied, the filter rule is fulfilled if the
# regular expression or the exact value DOES NOT match the content of
# the data field. In a boolean rule (without <VALUE>) the rule matches
# false.
# Regular expressions are always considered case-insensitive and
# extended POSIX regular expressions. Field names and options (NOT,
# EXACT) are all evaluated case-insensitive. If there is an error in a
# regular expression, the BrowseFilter line gets ignored.
# Especially to note is that supplying any simple string consisting of
# only letters, numbers, spaces, and some basic special characters as
# a regular expression matches if it is contained somewhere in the
# data field.
# If there is more than one BrowseFilter directive, ALL the directives
# need to be fulfilled for the remote printer to be accepted. If one
# is not fulfilled, the printer will get ignored.
# Examples:
# Rules for standard data items which are supplied with any remote
# printer advertised via DNS-SD:
# Print queue name must contain "hum_res_", this matches
# "hum_res_mono" or "hum_res_color" but also "old_hum_res_mono":
# BrowseFilter name hum_res_
# This matches if the remote host name contains "printserver", like
# "printserver.local", "printserver2.example.com", "newprintserver":
# BrowseFilter host printserver
# This matches all ports with 631 int its number, for example 631,
# 8631, 10631,...:
# BrowseFilter port 631
# This rule matches if the DNS-SD service name contains "@ printserver":
# Browsefilter service @ printserver
# Matches all domains with "local" in their names, not only "local" but
# also things like "printlocally.com":
# BrowseFilter domain local
# Examples for rules applying to items of the TXT record:
# This rule selects PostScript printers, as the "PDL" field in the TXT
# record contains "postscript" then. This includes also remote CUPS
# queues which accept PostScript, independent of whether the physical
# printer behind the CUPS queue accepts PostScript or not.
# BrowseFilter pdl postscript
# Color printers usually contain a "Color" entry set to "T" (for true)
# in the TXT record. This rule selects them:
# BrowseFilter color
# This is a similar rule to select only duplex (automatic double-sided
# printing) printers:
# BrowseFilter duplex
# Rules with the NOT option:
# This rule EXCLUDES printers from all hosts containing "financial" in
# their names, nice to get rid of the 100s of printers of the
# financial department:
# BrowseFilter NOT host financial
# Get only monochrome printers ("Color" set to "F", meaning false, in
# the TXT record):
# BrowseFilter NOT color
# Rules with more advanced use of regular expressions:
# Only queue names which BEGIN WITH "hum_res_" are accepted now, so we
# still get "hum_res_mono" or "hum_res_color" but not
# "old_hum_res_mono" any more:
# BrowseFilter name ^hum_res_
# Server names is accepted if it contains "print_server" OR
# "graphics_dep_server":
# BrowseFilter host print_server|graphics_dep_server
# "printserver1", "printserver2", and "printserver3", nothing else:
# BrowseFilter host ^printserver[1-3]$
# Printers understanding at least one of PostScript, PCL, or PDF:
# BrowseFilter pdl postscript|pcl|pdf
# Examples for the EXACT option:
# Only printers from "printserver.local" are accepted:
# BrowseFilter EXACT host printserver.local
# Printers from all servers except "prinserver2.local" are accepted:
# BrowseFilter NOT EXACT host prinserver2.local
# Use BrowsePoll to poll a particular CUPS server
# BrowsePoll cups.example.com
# BrowsePoll cups.example.com:631
# BrowsePoll cups.example.com:631/version=1.1
# Use DomainSocket to access the local CUPS daemon via another than the
# default domain socket. "None" or "Off" lets cups-browsed not use CUPS'
# domain socket.
# DomainSocket /var/run/cups/cups.sock
# DomainSocket None
# DomainSocket Off
# Set HTTP timeout (in seconds) for requests sent to local/remote
# resources Note that too short timeouts can make services getting
# missed when they are present and operations be unnecessarily
# repeated and too long timeouts can make operations take too long
# when the server does not respond.
# HttpLocalTimeout 5
# HttpRemoteTimeout 10
# Set how many retries (N) should cups-browsed do for creating print
# queues for remote printers which receive timeouts during print queue
# creation. The printers which are not successfully set up even after
# N retries, are skipped until the next restart of the service. Note
# that too many retries can cause high CPU load.
# HttpMaxRetries 5
# Set OnlyUnsupportedByCUPS to "Yes" will make cups-browsed not create
# local queues for remote printers for which CUPS creates queues by
# itself. These printers are printers advertised via DNS-SD and doing
# CUPS-supported (currently PWG Raster and Apple Raster) driverless
# printing, including remote CUPS queues. Queues for other printers
# (like for legacy PostScript/PCL printers) are always created
# (depending on the other configuration settings of cups-browsed).
# With OnlyUnsupportedByCUPS set to "No", cups-browsed creates queues
# for all printers which it supports, including printers for which
# CUPS would create queues by itself. Temporary queues created by CUPS
# will get overwritten. This way it is assured that any extra
# functionality of cups-browsed will apply to these queues. As queues
# created by cups-browsed are permanent CUPS queues this setting is
# also recommended if applications/print dialogs which do not support
# temporary CUPS queues are installed. This setting is the default.
# OnlyUnsupportedByCUPS Yes
# With UseCUPSGeneratedPPDs set to "Yes" cups-browsed creates queues
# for IPP printers with PPDs generated by the PPD generator of CUPS
# and not with the one of cups-browsed. So any new development in
# CUPS' PPD generator gets available. As CUPS' PPD generator is not
# directly accessible, we need to make CUPS generate a temporary print
# queue with the desired PPD. Therefore we can only use these PPDs
# when our queue replaces a temporary CUPS queue, meaning that the
# queue is for a printer on which CUPS supports driverless printing
# (IPP 2.x, PDLs: PDF, PWG Raster, and/or Apple Raster) and that its
# name is the same as CUPS uses for the temporary queue
# ("LocalQueueNamingIPPPrinter DNS-SD" must be set). The directive
# applies only to IPP printers, not to remote CUPS queues, to not
# break clustering. Setting this directive to "No" lets cups-browsed
# generate the PPD file. Default setting is "No".
# UseCUPSGeneratedPPDs No
# With the directives LocalQueueNamingRemoteCUPS and
# LocalQueueNamingIPPPrinter you can determine how the names for local
# queues generated by cups-browsed are generated, separately for
# remote CUPS printers and IPP printers.
# DNS-SD (the default in both cases) bases the naming on the service
# name of the printer's advertised DNS-SD record. This is exactly the
# same naming scheme as CUPS uses for its temporary queues, so the
# local queue from cups-browsed prevents CUPS from listing and
# creating an additional queue. As DNS-SD service names have to be
# unique, queue names of printers from different servers will also be
# unique and so there is no automatic clustering for load-balanced
# printing.
# MakeModel bases the queue name on the printer's manufacturer and
# model names. This scheme cups-browsed used formerly for IPP
# printers.
# RemoteName is only available for remote CUPS queues and uses the
# name of the queue on the remote CUPS server as the local queue's
# name. This makes printers on different CUPS servers with equal queue
# names automatically forming a load-balancing cluster as CUPS did
# formerly (CUPS 1.5.x and older) with CUPS-broadcasted remote
# printers. This scheme cups-browsed used formerly for remote CUPS
# printers.
# LocalQueueNamingRemoteCUPS DNS-SD
# LocalQueueNamingRemoteCUPS MakeModel
# LocalQueueNamingRemoteCUPS RemoteName
# LocalQueueNamingIPPPrinter DNS-SD
# LocalQueueNamingIPPPrinter MakeModel
# Set DNSSDBasedDeviceURIs to "Yes" if cups-browsed should use
# DNS-SD-service-name-based device URIs for its local queues, as CUPS
# also does. These queues use the DNS-SD service name of the
# discovered printer. With this the URI is independent of network
# interfaces and ports, giving reliable connections to always the same
# physical device. This setting is the default.
# Set DNSSDBasedDeviceURIs to "No" if cups-browsed should use the
# conventional host-name/IP-based URIs.
# Note that this option has only influence on URIs for printers
# discovered via DNS-SD, not via BrowsePoll.
# Those printers get always assigned the conventional URIs.
# DNSSDBasedDeviceURIs Yes
# Set IPBasedDeviceURIs to "Yes" if cups-browsed should create its
# local queues with device URIs with the IP addresses instead of the
# host names of the remote servers. This mode is there for any
# problems with host name resolution in the network, especially also
# if avahi-daemon is only run for printer discovery and already
# stopped while still printing. By default this mode is turned off,
# meaning that we use URIs with host names.
# Note that the IP addresses depend on the network interface through
# which the printer is accessed. So do not use IP-based URIs on systems
# with many network interfaces and where interfaces can appear and
# disappear frequently.
# This mode could also be useful for development and debugging.
# If you prefer IPv4 or IPv6 IP addresses in the URIs, you can set
# IPBasedDeviceURIs to "IPv4" to only get IPv4 IP addresses or
# IPBasedDeviceURIs to "IPv6" to only get IPv6 IP addresses.
# IPBasedDeviceURIs No
# IPBasedDeviceURIs Yes
# IPBasedDeviceURIs IPv4
# IPBasedDeviceURIs IPv6
# The AllowResharingRemoteCUPSPrinters directive determines whether a
# print queue pointing to a remote CUPS queue will be re-shared to the
# local network or not. Since the queues generated using the BrowsePoll
# directive are also pointing to remote queues, they are also shared
# automatically if the following option is set. Default is not to share
# remote printers.
# AllowResharingRemoteCUPSPrinters Yes
# The NewBrowsePollQueuesShared directive determines whether a print
# queue for a newly discovered printer (discovered by the BrowsePoll directive)
# will be shared to the local network or not. This directive will only work
# if AllowResharingRemoteCUPSPrinters is set to yes. Default is
# not to share printers discovered using BrowsePoll.
# NewBrowsePollQueuesShared Yes
# Set CreateRemoteRawPrinterQueues to "Yes" to let cups-browsed also
# create local queues pointing to remote raw CUPS queues. Normally,
# only queues pointing to remote queues with PPD/driver are created
# as we do not use drivers on the client side, but in some cases
# accessing a remote raw queue can make sense, for example if the
# queue forwards the jobs by a special backend like Tea4CUPS.
# CreateRemoteRawPrinterQueues Yes
# cups-browsed by default creates local print queues for each shared
# CUPS print queue which it discovers on remote machines in the local
# network(s). Set CreateRemoteCUPSPrinterQueues to "No" if you do not
# want cups-browsed to do this. For example you can set cups-browsed
# to only create queues for IPP network printers setting
# CreateIPPPrinterQueues not to "No" and CreateRemoteCUPSPrinterQueues
# to "No".
# CreateRemoteCUPSPrinterQueues No
# Set CreateIPPPrinterQueues to "All" to let cups-browsed discover IPP
# network printers (native printers, not CUPS queues) with known page
# description languages (PWG Raster, PDF, PostScript, PCL XL, PCL
# 5c/e) in the local network and auto-create print queues for them.
# Set CreateIPPPrinterQueues to "Everywhere" to let cups-browsed
# discover IPP Everywhere printers in the local network (native
# printers, not CUPS queues) and auto-create print queues for them.
# Set CreateIPPPrinterQueues to "AppleRaster" to let cups-browsed
# discover Apple Raster printers in the local network (native
# printers, not CUPS queues) and auto-create print queues for them.
# Set CreateIPPPrinterQueues to "Driverless" to let cups-browsed
# discover printers designed for driverless use (currently IPP
# Everywhere and Apple Raster) in the local network (native printers,
# not CUPS queues) and auto-create print queues for them.
# Set CreateIPPPrinterQueues to "LocalOnly" to auto-create print
# queues only for local printers made available as IPP printers. These
# are for example IPP-over-USB printers, made available via
# ippusbxd. This is the default.
# Set CreateIPPPrinterQueues to "No" to not auto-create print queues
# for IPP network printers.
# The PPDs are auto-generated by cups-browsed based on properties of
# the printer polled via IPP. In case of missing information, info
# from the Bonjour record is used as last mean for the default values.
# This functionality is primarily for mobile devices running
# CUPS to not need a printer setup tool nor a collection of printer
# drivers and PPDs.
# CreateIPPPrinterQueues No
# CreateIPPPrinterQueues LocalOnly
# CreateIPPPrinterQueues Everywhere
# CreateIPPPrinterQueues AppleRaster
# CreateIPPPrinterQueues Everywhere AppleRaster
# CreateIPPPrinterQueues Driverless
# CreateIPPPrinterQueues All
# The NewIPPPrinterQueuesShared directive determines whether a print
# queue for a newly discovered IPP network printer (not remote CUPS
# queue) will be shared to the local network or not. This is only
# valid for newly discovered printers. For printers discovered in an
# earlier cups-browsed session, cups-browsed will remember whether the
# printer was shared, so changes by the user get conserved. Default is
# not to share newly discovered IPP printers.
# NewIPPPrinterQueuesShared Yes
# How to handle the print queues cups-browsed creates when
# cups-browsed is shut down:
# "KeepGeneratedQueuesOnShutdown No" makes the queues being
# removed. This makes sense as these queues only work while
# cups-browsed is running. cups-browsed has to determine to which
# member printer of a cluster to pass on the job.
# "KeepGeneratedQueuesOnShutdown Yes" (the default) makes the queues
# not being removed. This is the recommended setting for a system
# where cups-browsed is permanently running and only stopped for short
# times (like log rotation) or on shutdown. This avoids the
# re-creation of the queues when cups-browsed is restarted, which
# often causes a clutter of CUPS notifications on the desktop.
# KeepGeneratedQueuesOnShutdown No
# If there is more than one remote CUPS printer whose local queue
# would get the same name and AutoClustering is set to "Yes" (the
# default) only one local queue is created which makes up a
# load-balancing cluster of the remote printers which would get this
# queue name (implicit class). This means that when several jobs are
# sent to this queue they get distributed between the printers, using
# the method chosen by the LoadBalancing directive.
# Note that the forming of clusters depends on the naming scheme for
# local queues created by cups-browsed. If you have set
# LocalQueueNamingRemoteCUPS to "DNSSD" you will not get automatic
# clustering as the DNS-SD service names are always unique. With
# LocalQueueNamingRemoteCUPS set to "RemoteName" local queues are
# named as the CUPS queues on the remote servers are named and so
# equally named queues on different servers get clustered (this is how
# CUPS did it in version 1.5.x or older). LocalQueueNamingRemoteCUPS
# set to "MakeModel" makes remote printers of the same model get
# clustered. Note that then a cluster can contain more than one queue
# of the same server.
# With AutoClustering set to "No", for each remote CUPS printer an
# individual local queue is created, and to avoid name clashes when
# using the LocalQueueNamingRemoteCUPS settings "RemoteName" or
# "MakeModel" "@<server name>" is added to the local queue name.
# Only remote CUPS printers get clustered, not IPP network printers or
# IPP-over-USB printers.
# AutoClustering Yes
# AutoClustering No
# Load-balancing printer cluster formation can also be manually
# controlled by defining explicitly which remote CUPS printers should
# get clustered together.
# This is done by the "Cluster" directive:
# Cluster <QUEUENAME>: <EXPRESSION1> <EXPRESSION2> ...
# Cluster <QUEUENAME>
# If no expressions are given, <QUEUENAME> is used as the first and
# only expression for this cluster.
# Discovered printers are matched against all the expressions of all
# defined clusters. The first expression which matches the discovered
# printer determines to which cluster it belongs. Note that this way a
# printer can only belong to one cluster. Once matched, further
# cluster definitions will not checked any more.
# With the first printer matching a cluster's expression a local queue
# with the name <QUEUENAME> is created. If more printers are
# discovered and match this cluster, they join the cluster. Printing
# to this queue prints to all these printers in a load-balancing
# manner, according to to the setting of the LoadBalancing directive.
# Each expression must be a string of characters without spaces. If
# spaces are needed, replace them by underscores ('_').
# An expression can be matched in three ways:
# 1. By the name of the CUPS queue on the remote server
# 2. By make and model name of the remote printer
# 3. By the DNS-SD service name of the remote printer
# Note that the matching is done case-insensitively and any group of
# non-alphanumerical characters is replaced by a single underscore.
# So if an expression is "HP_DeskJet_2540" and the remote server
# reports "hp Deskjet-2540" the printer gets matched to this cluster.
# If "AutoClustering" is not set to "No" both your manual cluster
# definitions will be followed and automatic clustering of
# equally-named remote queues will be performed. If a printer matches
# in both categories the match to the manually defined cluster has
# priority. Automatic clustering of equally-named remote printers is
# not performed if there is a manually defined cluster with this name
# (at least as the printers do not match this cluster).
# Examples:
# To cluster all remote CUPS queues named "laserprinter" in your local
# network but not cluster any other equally-named remote CUPS printers
# use (Local queue will get named "laserprinter"):
# AutoClustering No
# Cluster laserprinter
# To cluster all remote CUPS queues of HP LaserJet 4050 printers in a
# local queue named "LJ4050":
# Cluster LJ4050: HP_LaserJet_4050
# As DNS-SD service names are unique in a network you can create a
# cluster from exactly specified printers (spaces replaced by
# underscores):
# Cluster hrdep: oldlaser_@_hr-server1 newlaser_@_hr-server2
# The LoadBalancing directive switches between two methods of handling
# load balancing between equally-named remote queues which are
# represented by one local print queue making up a cluster of them
# (implicit class).
# The two methods are:
# Queuing of jobs on the client (LoadBalancing QueueOnClient):
# Here we queue up the jobs on the client and regularly check the
# clustered remote print queues. If we find an idle queue, we pass
# on a job to it.
# This is also the method which CUPS uses for classes. Advantage is a
# more even distribution of the job workload on the servers
# (especially if the printing speed of the servers is very different),
# and if a server fails, there are not several jobs stuck or
# lost. Disadvantage is that if one takes the client (laptop, mobile
# phone, ...) out of the local network, printing stops with the jobs
# waiting in the local queue.
# Queuing of jobs on the servers (LoadBalancing QueueOnServers):
# Here we check the number of jobs on each of the clustered remote
# printers and send an incoming job immediately to the remote printer
# with the lowest amount of jobs in its queue. This way no jobs queue
# up locally, all jobs which are waiting are waiting on one of the
# remote servers.
# Not having jobs waiting locally has the advantage that we can take
# the local machine from the network and all jobs get printed.
# Disadvantage is that if a server with a full queue of jobs goes
# away, the jobs go away, too.
# Default is queuing the jobs on the client as this is what CUPS does
# with classes.
# LoadBalancing QueueOnClient
# LoadBalancing QueueOnServers
# With the DefaultOptions directive one or more option settings can be
# defined to be applied to every print queue newly created by
# cups-browsed. Each option is supplied as one supplies options with
# the "-o" command line argument to the "lpadmin" command (Run "man
# lpadmin" for more details). More than one option can be supplied
# separating the options by spaces. By default no option settings are
# pre-defined.
# Note that print queues which cups-browsed already created before
# remember their previous settings and so these settings do not get
# applied.
# DefaultOptions Option1=Value1 Option2=Value2 Option3 noOption4
# The AutoShutdown directive specifies whether cups-browsed should
# automatically terminate when it has no local raw queues set up
# pointing to any discovered remote printers or no jobs on such queues
# depending on AutoShutdownOn setting (auto shutdown mode). Setting it
# to "On" activates the auto-shutdown mode, setting it to "Off"
# deactiivates it (the default). The special mode "avahi" turns auto
# shutdown off while avahi-daemon is running and on when avahi-daemon
# stops. This allows running cups-browsed on-demand when avahi-daemon
# is run on-demand.
# AutoShutdown Off
# AutoShutdown On
# AutoShutdown avahi
# The AutoShutdownOn directive determines what event cups-browsed
# considers as inactivity in auto shutdown mode. "NoQueues" (the
# default) means that auto shutdown is initiated when there are no
# queues for discovered remote printers generated by cups-browsed any
# more. "NoJobs" means that all queues generated by cups-browsed are
# without jobs.
# AutoShutdownOn NoQueues
# AutoShutdownOn NoJobs
# The AutoShutdownTimeout directive specifies after how many seconds
# without local raw queues set up pointing to any discovered remote
# printers or jobs on these queues cups-browsed should actually shut
# down in auto shutdown mode. Default is 30 seconds, 0 means immediate
# shutdown.
# AutoShutdownTimeout 30
# DebugLogFileSize defines the maximum size possible (in KBytes)
# of the log files (cups-browsed_log and cups-browsed_previous_logs)
# that is created using cups-browsed in the debugging mode.
# Setting its value to 0 would turn off any restriction
# on the size of the file.
# DebugLogFileSize 300
# NotifLeaseDuration defines how long the D-BUS subscription created by cups-browsed
# in cupsd will last before cupsd cancels it. The default value is 1 day
# in seconds - 86400. The subscription renewal is set to happen after half of
# NotifLeaseDuration passed. The D-BUS notifications are used for watching over queues
# and doing specific actions when a D-BUS notification comes.
# NotifLeaseDuration 86400
# FrequentNetifUpdate turns on/off the network interface update routines
# which happen for each found entry, which can slow up cups-browsed significantly
# if we are on a network with many shared printers or if we use BrowsePoll to a server
# with many queues. Network interface updates after receiving D-BUS notification
# from NetworkManager won't be turned off with the directive. The default value
# is 'Yes'.
#
# FrequentNetifUpdate Yes
# Omarchy: Automatically create queues for discovered remote printers
CreateRemotePrinters Yes

View File

@@ -1,6 +0,0 @@
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "5" },
"dns": ["172.17.0.1"],
"bip": "172.17.0.1/16"
}

View File

@@ -1,7 +0,0 @@
keyserver hkps://keyserver.ubuntu.com
keyserver hkps://pgp.surfnet.nl
keyserver hkps://keys.mailvelope.com
keyserver hkps://keyring.debian.org
keyserver hkps://pgp.mit.edu
connect-quick-timeout 4

View File

@@ -1 +0,0 @@
options usbcore autosuspend=-1

View File

@@ -1,19 +0,0 @@
# Name Service Switch configuration file.
# See nsswitch.conf(5) for details.
passwd: files systemd
group: files [SUCCESS=merge] systemd
shadow: files systemd
gshadow: files systemd
publickey: files
hosts: mymachines mdns_minimal [NOTFOUND=return] resolve files myhostname dns
networks: files
protocols: files
services: files
ethers: files
rpc: files
netgroup: files

View File

@@ -1,11 +0,0 @@
[Trigger]
Type = Package
Operation = Upgrade
Target = walker
Target = walker-debug
Target = elephant*
[Action]
Description = Restarting Walker services after system update
When = PostTransaction
Exec = /usr/bin/omarchy-restart-walker

View File

@@ -1,3 +0,0 @@
[Daemon]
Theme=omarchy
ShowDelay=0

View File

@@ -1,62 +0,0 @@
# Configuration for locking the user after multiple failed
# authentication attempts.
#
# The directory where the user files with the failure records are kept.
# The default is /var/run/faillock.
# dir = /var/run/faillock
#
# Will log the user name into the system log if the user is not found.
# Enabled if option is present.
# audit
#
# Don't print informative messages.
# Enabled if option is present.
# silent
#
# Don't log informative messages via syslog.
# Enabled if option is present.
# no_log_info
#
# Only track failed user authentications attempts for local users
# in /etc/passwd and ignore centralized (AD, IdM, LDAP, etc.) users.
# The `faillock` command will also no longer track user failed
# authentication attempts. Enabling this option will prevent a
# double-lockout scenario where a user is locked out locally and
# in the centralized mechanism.
# Enabled if option is present.
# local_users_only
#
# Deny access if the number of consecutive authentication failures
# for this user during the recent interval exceeds n tries.
# The default is 3.
deny = 10
#
# The length of the interval during which the consecutive
# authentication failures must happen for the user account
# lock out is <replaceable>n</replaceable> seconds.
# The default is 900 (15 minutes).
# fail_interval = 900
#
# The access will be re-enabled after n seconds after the lock out.
# The value 0 has the same meaning as value `never` - the access
# will not be re-enabled without resetting the faillock
# entries by the `faillock` command.
# The default is 600 (10 minutes).
unlock_time = 120
#
# Root account can become locked as well as regular accounts.
# Enabled if option is present.
# even_deny_root
#
# This option implies the `even_deny_root` option.
# Allow access after n seconds to root account after the
# account is locked. In case the option is not specified
# the value is the same as of the `unlock_time` option.
# root_unlock_time = 900
#
# If a group name is specified with this option, members
# of the group will be handled by this module the same as
# the root account (the options `even_deny_root>` and
# `root_unlock_time` will apply to them.
# By default, the option is not set.
# admin_group = <admin_group_name>

View File

@@ -1 +0,0 @@
%wheel ALL=(ALL) NOPASSWD: /usr/bin/asdcontrol

View File

@@ -1 +0,0 @@
Defaults passwd_tries=10

View File

@@ -1 +0,0 @@
%wheel ALL=(root) NOPASSWD: /usr/bin/tzupdate, /usr/bin/timedatectl

View File

@@ -1 +0,0 @@
net.ipv4.tcp_mtu_probing=1

View File

@@ -1,4 +0,0 @@
# Disable shutting system down on power button
# This allows binding the power button to a custom power menu in Hyprland
[Login]
HandlePowerKey=ignore

View File

@@ -1,4 +0,0 @@
# Disable multicast DNS in systemd-resolved
# Avahi will provide mDNS instead for better network printer discovery
[Resolve]
MulticastDNS=no

View File

@@ -1,2 +0,0 @@
[Resolve]
DNSStubListenerExtra=172.17.0.1

View File

@@ -1,2 +0,0 @@
[Manager]
DefaultTimeoutStopSec=5s

View File

@@ -1,2 +0,0 @@
[Unit]
DefaultDependencies=no

View File

@@ -4,33 +4,14 @@
set -eEo pipefail
# Define Omarchy locations
export OMARCHY_PATH="/usr/share/omarchy"
export OMARCHY_PATH="$HOME/.local/share/omarchy"
export OMARCHY_INSTALL="$OMARCHY_PATH/install"
export OMARCHY_INSTALL_LOG_FILE="/var/log/omarchy-install.log"
export PATH="$OMARCHY_PATH/bin:$PATH"
# Load helpers
source "$OMARCHY_INSTALL/helpers/chroot.sh"
# Simple script runner that outputs to stdout/stderr
# archinstall captures all output in /var/log/archinstall/install.log
run_logged() {
local script="$1"
local script_name=$(basename "$script")
echo "Running: $script_name"
source "$script"
local exit_code=$?
if [ $exit_code -eq 0 ]; then
echo "✓ Completed: $script_name"
echo
else
echo "✗ Failed: $script_name (exit code: $exit_code)"
return $exit_code
fi
}
# Run installation phases
# 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"

View File

@@ -1,13 +1,29 @@
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-work.sh
run_logged $OMARCHY_INSTALL/config/fix-powerprofilesctl-shebang.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/walker-elephant.sh
run_logged $OMARCHY_INSTALL/config/fast-shutdown.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-bcm43xx.sh
@@ -15,6 +31,3 @@ run_logged $OMARCHY_INSTALL/config/hardware/fix-apple-spi-keyboard.sh
run_logged $OMARCHY_INSTALL/config/hardware/fix-apple-suspend-nvme.sh
run_logged $OMARCHY_INSTALL/config/hardware/fix-apple-t2.sh
run_logged $OMARCHY_INSTALL/config/hardware/fix-surface-keyboard.sh
# Enable all services at the end to minimize daemon reloads
run_logged $OMARCHY_INSTALL/config/enable-services.sh

View File

@@ -0,0 +1,4 @@
# 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
cp ~/.local/share/omarchy/logo.txt ~/.config/omarchy/branding/screensaver.txt

6
install/config/config.sh Normal file
View File

@@ -0,0 +1,6 @@
# Copy over Omarchy configs
mkdir -p ~/.config
cp -R ~/.local/share/omarchy/config/* ~/.config/
# Use default bashrc from Omarchy
cp ~/.local/share/omarchy/default/bashrc ~/.bashrc

View File

@@ -1,2 +1,32 @@
# Add user to docker group
# Configure Docker daemon:
# - limit log size to avoid running out of disk
# - use host's DNS resolver
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json >/dev/null <<'EOF'
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "5" },
"dns": ["172.17.0.1"],
"bip": "172.17.0.1/16"
}
EOF
# Expose systemd-resolved to our Docker network
sudo mkdir -p /etc/systemd/resolved.conf.d
echo -e '[Resolve]\nDNSStubListenerExtra=172.17.0.1' | sudo tee /etc/systemd/resolved.conf.d/20-docker-dns.conf >/dev/null
sudo systemctl restart systemd-resolved
# Start Docker automatically
sudo systemctl enable docker
# Give this user privileged Docker access
sudo usermod -aG docker ${USER}
# Prevent Docker from preventing boot for network-online.target
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/no-block-boot.conf <<'EOF'
[Unit]
DefaultDependencies=no
EOF
sudo systemctl daemon-reload

View File

@@ -1,27 +0,0 @@
# Enable all Omarchy system services
# This is run at the end of configuration to minimize daemon reloads
# Note: sddm and ufw are enabled in their respective setup scripts (login/sddm.sh and first-run/firewall.sh)
# Networking
chrootable_systemctl_enable iwd.service
chrootable_systemctl_enable avahi-daemon.service
# Bluetooth
chrootable_systemctl_enable bluetooth.service
# Printing
chrootable_systemctl_enable cups.service
chrootable_systemctl_enable cups-browsed.service
# Docker
chrootable_systemctl_enable docker.service
# Prevent systemd-networkd-wait-online timeout on boot
sudo systemctl disable systemd-networkd-wait-online.service
sudo systemctl mask systemd-networkd-wait-online.service
# Single daemon-reload at the end
sudo systemctl daemon-reload
# Restart systemd-resolved for Docker DNS configuration
sudo systemctl restart systemd-resolved

View File

@@ -0,0 +1,7 @@
sudo mkdir -p /etc/systemd/system.conf.d
cat <<EOF | sudo tee /etc/systemd/system.conf.d/10-faster-shutdown.conf
[Manager]
DefaultTimeoutStopSec=5s
EOF
sudo systemctl daemon-reload

View File

@@ -1,2 +1,6 @@
# 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/
sudo chmod 644 /etc/gnupg/dirmngr.conf
sudo gpgconf --kill dirmngr || true
sudo gpgconf --launch dirmngr || true

View File

@@ -0,0 +1,2 @@
# Turn on bluetooth by default
chrootable_systemctl_enable bluetooth.service

View File

@@ -0,0 +1,2 @@
# 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

View File

@@ -0,0 +1,6 @@
# Ensure iwd service will be started
sudo systemctl enable iwd.service
# Prevent systemd-networkd-wait-online timeout on boot
sudo systemctl disable systemd-networkd-wait-online.service
sudo systemctl mask systemd-networkd-wait-online.service

View File

@@ -0,0 +1,16 @@
chrootable_systemctl_enable cups.service
# Disable multicast dns in resolved. Avahi will provide this for better network printer discovery
sudo mkdir -p /etc/systemd/resolved.conf.d
echo -e "[Resolve]\nMulticastDNS=no" | sudo tee /etc/systemd/resolved.conf.d/10-disable-multicast.conf
chrootable_systemctl_enable avahi-daemon.service
# Enable mDNS resolution for .local domains
sudo sed -i 's/^hosts:.*/hosts: mymachines mdns_minimal [NOTFOUND=return] resolve files myhostname dns/' /etc/nsswitch.conf
# Enable automatically adding remote printers
if ! grep -q '^CreateRemotePrinters Yes' /etc/cups/cups-browsed.conf; then
echo 'CreateRemotePrinters Yes' | sudo tee -a /etc/cups/cups-browsed.conf
fi
chrootable_systemctl_enable cups-browsed.service

View File

@@ -0,0 +1,5 @@
# 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

View File

@@ -0,0 +1,3 @@
# 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"

View File

@@ -0,0 +1,3 @@
# 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

@@ -0,0 +1,57 @@
omarchy-refresh-applications
update-desktop-database ~/.local/share/applications
# Open all images with imv
xdg-mime default imv.desktop image/png
xdg-mime default imv.desktop image/jpeg
xdg-mime default imv.desktop image/gif
xdg-mime default imv.desktop image/webp
xdg-mime default imv.desktop image/bmp
xdg-mime default imv.desktop image/tiff
# Open PDFs with the Document Viewer
xdg-mime default org.gnome.Evince.desktop application/pdf
# Use Chromium as the default browser
xdg-settings set default-web-browser chromium.desktop
xdg-mime default chromium.desktop x-scheme-handler/http
xdg-mime default chromium.desktop x-scheme-handler/https
# Open video files with mpv
xdg-mime default mpv.desktop video/mp4
xdg-mime default mpv.desktop video/x-msvideo
xdg-mime default mpv.desktop video/x-matroska
xdg-mime default mpv.desktop video/x-flv
xdg-mime default mpv.desktop video/x-ms-wmv
xdg-mime default mpv.desktop video/mpeg
xdg-mime default mpv.desktop video/ogg
xdg-mime default mpv.desktop video/webm
xdg-mime default mpv.desktop video/quicktime
xdg-mime default mpv.desktop video/3gpp
xdg-mime default mpv.desktop video/3gpp2
xdg-mime default mpv.desktop video/x-ms-asf
xdg-mime default mpv.desktop video/x-ogm+ogg
xdg-mime default mpv.desktop video/x-theora+ogg
xdg-mime default mpv.desktop application/ogg
# Use Hey for mailto: links
xdg-mime default HEY.desktop x-scheme-handler/mailto
# Open text files with nvim
xdg-mime default nvim.desktop text/plain
xdg-mime default nvim.desktop text/english
xdg-mime default nvim.desktop text/x-makefile
xdg-mime default nvim.desktop text/x-c++hdr
xdg-mime default nvim.desktop text/x-c++src
xdg-mime default nvim.desktop text/x-chdr
xdg-mime default nvim.desktop text/x-csrc
xdg-mime default nvim.desktop text/x-java
xdg-mime default nvim.desktop text/x-moc
xdg-mime default nvim.desktop text/x-pascal
xdg-mime default nvim.desktop text/x-tcl
xdg-mime default nvim.desktop text/x-tex
xdg-mime default nvim.desktop application/x-shellscript
xdg-mime default nvim.desktop text/x-c
xdg-mime default nvim.desktop text/x-c++
xdg-mime default nvim.desktop application/xml
xdg-mime default nvim.desktop text/xml

View File

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

View File

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

View File

@@ -4,13 +4,11 @@ sudo ln -snf /usr/share/icons/Adwaita/symbolic/actions/go-next-symbolic.svg /usr
# Setup theme links
mkdir -p ~/.config/omarchy/themes
for f in /usr/share/omarchy/themes/*; do ln -nfs "$f" ~/.config/omarchy/themes/; done
for f in ~/.local/share/omarchy/themes/*; do ln -nfs "$f" ~/.config/omarchy/themes/; done
# Set initial theme to tokyo-night
# Theme files are managed by the package at /usr/share/omarchy/themes/
# User's current theme selection is stored at ~/.config/omarchy/current
# Set initial theme
mkdir -p ~/.config/omarchy/current
ln -snf /usr/share/omarchy/themes/tokyo-night ~/.config/omarchy/current/theme
ln -snf ~/.config/omarchy/themes/tokyo-night ~/.config/omarchy/current/theme
ln -snf ~/.config/omarchy/current/theme/backgrounds/1-scenery-pink-lakeside-sunset-lake-landscape-scenic-panorama-7680x3215-144.png ~/.config/omarchy/current/background
# Set specific app links for current theme
@@ -22,9 +20,6 @@ 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
mkdir -p ~/.config/walker/themes
ln -snf /usr/share/omarchy/default/walker/themes/omarchy-default ~/.config/walker/themes/omarchy-default
# Add managed policy directories for Chromium and Brave for theme changes
sudo mkdir -p /etc/chromium/policies/managed
sudo chmod a+rw /etc/chromium/policies/managed

View File

@@ -0,0 +1,5 @@
# 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
EOF
sudo chmod 0440 /etc/sudoers.d/omarchy-tzupdate

View File

@@ -0,0 +1,17 @@
#!/bin/bash
# Create pacman hook to restart walker after updates
sudo mkdir -p /etc/pacman.d/hooks
sudo tee /etc/pacman.d/hooks/walker-restart.hook > /dev/null << EOF
[Trigger]
Type = Package
Operation = Upgrade
Target = walker
Target = walker-debug
Target = elephant*
[Action]
Description = Restarting Walker services after system update
When = PostTransaction
Exec = $OMARCHY_PATH/bin/omarchy-restart-walker
EOF

View File

@@ -1,6 +1,6 @@
if ! ping -c3 -W1 1.1.1.1 >/dev/null 2>&1; then
notify-send "󰖩 Click to Setup Wi-Fi" "Tab to navigate, Space to select, ? for help." -u critical -t 30000
notify-send " Update System" "When you have internet, click to update the system." -u critical
notify-send "󰖩 Click to Setup Wi-Fi" "Tab to navigate, Space to select, ? for help." -u critical
else
notify-send " Update System" "Click to update the system." -u critical
fi

View File

@@ -1,5 +1,4 @@
# Helper functions for ISO/non-chroot usage
# These are used by .automated_script.sh on the ISO
source $OMARCHY_INSTALL/helpers/chroot.sh
source $OMARCHY_INSTALL/helpers/presentation.sh
source $OMARCHY_INSTALL/helpers/logging.sh
source $OMARCHY_INSTALL/helpers/errors.sh
source $OMARCHY_INSTALL/helpers/logging.sh

View File

@@ -4,11 +4,11 @@ QR_CODE='
█ ███ █ ▄▄▄▄▀▄▀▄▀ █ ███ █
█ ▀▀▀ █ ▄█ ▄█▄▄▀ █ ▀▀▀ █
▀▀▀▀▀▀▀ ▀▄█ █ █ █ ▀▀▀▀▀▀▀
▀▀█▀▀▄▀▀▀▀▄█▀▀█ ▀ █ ▀ █
▀▀█▀▀▄▀▀▀▀▄█▀▀█ ▀ █ ▀ █
█▄█ ▄▄▀▄▄ ▀ ▄ ▀█▄▄▄▄ ▀ ▀█
▄ ▄▀█ ▀▄▀▀▀▄ ▄█▀▄█▀▄▀▄▀█▀
█ ▄▄█▄▀▄█ ▄▄▄ ▀ ▄▀██▀ ▀█
▀ ▀ ▀ █ ▀▄ ▀▀█▀▀▀█▄▀
▀ ▀ ▀ █ ▀▄ ▀▀█▀▀▀█▄▀
█▀▀▀▀▀█ ▀█ ▄▀▀ █ ▀ █▄▀██
█ ███ █ █▀▄▄▀ █▀███▀█▄██▄
█ ▀▀▀ █ ██ ▀ █▄█ ▄▄▄█▀ █
@@ -122,7 +122,6 @@ catch_errors() {
case "$choice" in
"Retry installation")
# FIXME: Update based on final setup
bash ~/.local/share/omarchy/install.sh
break
;;
@@ -134,7 +133,7 @@ catch_errors() {
fi
;;
"Upload log for support")
omarchy-upload-log
omarchy-upload-install-log
;;
"Exit" | "")
exit 1

View File

@@ -1,7 +1,3 @@
# Log output UI for .automated_script.sh
# Tails one or more log files and displays them with pretty formatting
# Supports multiple files: start_log_output file1 file2 file3
# Uses tail -F so it waits for files that don't exist yet
start_log_output() {
local ANSI_SAVE_CURSOR="\033[s"
local ANSI_RESTORE_CURSOR="\033[u"
@@ -9,9 +5,6 @@ start_log_output() {
local ANSI_HIDE_CURSOR="\033[?25l"
local ANSI_RESET="\033[0m"
local ANSI_GRAY="\033[90m"
# Support multiple log files, default to main install log
local log_files=("${@:-/var/log/omarchy-install.log}")
# Save cursor position and hide cursor
printf $ANSI_SAVE_CURSOR
@@ -20,68 +13,122 @@ start_log_output() {
(
local log_lines=20
local max_line_width=$((LOGO_WIDTH - 4))
# Use tail -F to follow multiple files, even if they don't exist yet
# -F = --follow=name --retry (follows by name, waits for files to appear)
# -n 0 = start from end (don't show existing content)
# -q = quiet (no headers when switching between files)
tail -F -n 0 -q "${log_files[@]}" 2>/dev/null | while IFS= read -r line; do
# Keep a rolling buffer of the last N lines
if [ ! -f /tmp/omarchy-log-buffer.txt ]; then
touch /tmp/omarchy-log-buffer.txt
fi
# Append new line and keep only last N lines
echo "$line" >> /tmp/omarchy-log-buffer.txt
tail -n $log_lines /tmp/omarchy-log-buffer.txt > /tmp/omarchy-log-buffer.tmp
mv /tmp/omarchy-log-buffer.tmp /tmp/omarchy-log-buffer.txt
# Read current buffer
mapfile -t current_lines < /tmp/omarchy-log-buffer.txt
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
current_line="${current_lines[i]:-}"
line="${current_lines[i]:-}"
# Truncate if needed
if [ ${#current_line} -gt $max_line_width ]; then
current_line="${current_line:0:$max_line_width}..."
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 "$current_line" ]; then
output+="${ANSI_CLEAR_LINE}${ANSI_GRAY}${PADDING_LEFT_SPACES}${current_line}${ANSI_RESET}\n"
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() {
local ANSI_SHOW_CURSOR="\033[?25h"
if [ -n "${monitor_pid:-}" ]; then
# Disown the process to prevent "Killed" message
disown $monitor_pid 2>/dev/null || true
# Kill child processes first (tail -F) with SIGKILL
pkill -9 -P $monitor_pid 2>/dev/null || true
# Kill the monitor process with SIGKILL for immediate termination
kill -9 $monitor_pid 2>/dev/null || true
# Clean up temp buffer file
rm -f /tmp/omarchy-log-buffer.txt /tmp/omarchy-log-buffer.tmp 2>/dev/null || true
kill $monitor_pid 2>/dev/null || true
wait $monitor_pid 2>/dev/null || true
unset monitor_pid
fi
# Restore cursor visibility
printf $ANSI_SHOW_CURSOR
}
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,3 +1,4 @@
run_logged $OMARCHY_INSTALL/login/plymouth.sh
run_logged $OMARCHY_INSTALL/login/default-keyring.sh
run_logged $OMARCHY_INSTALL/login/sddm.sh
run_logged $OMARCHY_INSTALL/login/limine-snapper.sh

View File

@@ -33,7 +33,7 @@ TARGET_OS_NAME="Omarchy"
ESP_PATH="/boot"
KERNEL_CMDLINE[default]="$CMDLINE"
KERNEL_CMDLINE[default]+="quiet splash"
KERNEL_CMDLINE[default]+="quiet splash preempt=full"
ENABLE_UKI=yes
CUSTOM_UKI_NAME="omarchy"

View File

@@ -0,0 +1,4 @@
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
fi

View File

@@ -4,6 +4,7 @@
1password-beta
1password-cli
aether
alacritty
asdcontrol
avahi
bash-completion
@@ -11,7 +12,7 @@ bat
blueberry
brightnessctl
btop
rust
cargo
clang
cups
cups-browsed
@@ -32,7 +33,6 @@ fd
ffmpegthumbnailer
fontconfig
fzf
ghostty
github-cli
gnome-calculator
gnome-keyring
@@ -64,12 +64,12 @@ less
libsecret
libyaml
libqalculate
libreoffice-fresh
libreoffice
llvm
localsend
luarocks
mako
man-db
man
mariadb-libs
mise
mpv
@@ -83,7 +83,6 @@ nss-mdns
nvim
obs-studio
obsidian
omarchy
omarchy-chromium
omarchy-nvim
omarchy-walker

View File

@@ -35,7 +35,7 @@ pipewire
pipewire-alsa
pipewire-jack
pipewire-pulse
# qt5-remoteobjects # REMOVED: Package no longer exists in repos
qt5-remoteobjects
qt6-wayland
sassc
snapper

View File

@@ -1,11 +1,6 @@
# Skip base package installation if running from archinstall wrapper
# The wrapper already installed base packages before user creation
if [[ -z "$OMARCHY_ARCHINSTALL_WRAPPER" ]]; then
run_logged $OMARCHY_INSTALL/packaging/base.sh
fi
run_logged $OMARCHY_INSTALL/packaging/apps.sh
run_logged $OMARCHY_INSTALL/packaging/base.sh
run_logged $OMARCHY_INSTALL/packaging/fonts.sh
run_logged $OMARCHY_INSTALL/packaging/nvim.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 +0,0 @@
omarchy-refresh-applications

View File

@@ -1 +1,4 @@
# Omarchy logo in a font for Waybar use
mkdir -p ~/.local/share/fonts
cp ~/.local/share/omarchy/config/omarchy.ttf ~/.local/share/fonts/
fc-cache

View File

@@ -0,0 +1,4 @@
# 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/"

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