Compare commits

...

87 Commits

Author SHA1 Message Date
Ryan Hughes
34dbfc0d7c Remove mimetypes 2025-11-16 23:35:19 -05:00
Ryan Hughes
c7203b6714 Fix upload-log file 2025-11-16 23:34:04 -05:00
Ryan Hughes
5552be964b Trim log output 2025-11-16 22:38:28 -05:00
Ryan Hughes
78bc4d34c5 Disown so we don't see it 2025-11-16 22:32:04 -05:00
Ryan Hughes
27dfc23139 Fix logging 2025-11-16 22:06:38 -05:00
Ryan Hughes
234f670310 A bunch of updates for rework 2025-11-16 19:25:52 -05:00
Ryan Hughes
080d287d74 Install updates 2025-11-16 11:58:50 -05:00
Ryan Hughes
286e6378e7 Change up plymouth 2025-11-16 11:58:35 -05:00
Ryan Hughes
ffb080d80d Move walker to work 2025-11-16 11:58:17 -05:00
Ryan Hughes
6eb6c79831 Add omarchy package 2025-11-11 23:52:01 -05:00
Ryan Hughes
98db372bce Dir updates 2025-11-11 23:50:18 -05:00
Ryan Hughes
a1ed2cf37f Dir update 2025-11-11 23:37:24 -05:00
Ryan Hughes
06ee173aca Update dir 2025-11-11 23:36:34 -05:00
Ryan Hughes
a966fbbc33 Update dirs 2025-11-11 23:35:28 -05:00
Ryan Hughes
b3755d423a Dir updates 2025-11-11 23:34:31 -05:00
Ryan Hughes
723ea545b5 Update mako paths 2025-11-11 23:30:43 -05:00
Ryan Hughes
4078102b80 Update reinstall 2025-11-11 23:24:29 -05:00
Ryan Hughes
507062f077 Add apps 2025-11-11 23:19:20 -05:00
Ryan Hughes
49e65067d5 Dir update 2025-11-11 23:19:15 -05:00
Ryan Hughes
81687e4f34 Dir updates 2025-11-11 23:19:07 -05:00
Ryan Hughes
75c0e965a0 Dir updates 2025-11-11 23:18:57 -05:00
Ryan Hughes
378497c8a2 Link built-in themes 2025-11-11 22:57:00 -05:00
Ryan Hughes
fe19eee32b Delegate plymouth theme to packaging 2025-11-10 17:55:01 -05:00
Ryan Hughes
14696c315e Change theme reference locatoin 2025-11-10 17:51:21 -05:00
Ryan Hughes
4178547bbf Centralize service enabling 2025-11-10 17:45:51 -05:00
Ryan Hughes
8984affcbe Make power button a drop-in 2025-11-10 17:28:49 -05:00
Ryan Hughes
4e15165155 Relocate printer configs 2025-11-10 17:26:17 -05:00
Ryan Hughes
6fd95b3e37 Change faillock config to proper location 2025-11-10 17:08:09 -05:00
David Heinemeier Hansson
42fed06d9f This has been swapped 2025-11-10 16:24:45 -05:00
Ryan Hughes
8963c0dd2d Version bump 2025-11-10 16:24:45 -05:00
karr
dc17299a69 Update pip.conf, fix Invalid rule/parameter errors after hyprland update
Updated hyprland throws Invalid rule / Invalid parameter on the pip windowrule
2025-11-10 16:24:45 -05:00
Ryan Hughes
132e42a45f Update to prevent error 2025-11-10 16:24:45 -05:00
David Heinemeier Hansson
36b7bc7342 Ensure successful ending of migration 2025-11-10 16:24:45 -05:00
Ryan Hughes
b9654a9372 Only run for Limine installs 2025-11-10 16:24:45 -05:00
Ryan Hughes
e4e7fae5ef Cleanup on install 2025-11-10 16:24:45 -05:00
Ryan Hughes
46db57acc5 Bump version 2025-11-10 16:24:45 -05:00
Ryan Hughes
89c5cc2d74 Remove any alternative limine.conf files 2025-11-10 16:24:45 -05:00
Ryan Hughes
7c2402ff5b Drop a breadcrumb for the user 2025-11-06 10:02:51 -05:00
Ryan Hughes
b609519c83 Resolve running as user 2025-11-06 10:02:51 -05:00
Ryan Hughes
6d583028d5 Update path 2025-11-06 10:02:51 -05:00
Ryan Hughes
0a8bcbe40a Update dir 2025-11-06 10:02:51 -05:00
Ryan Hughes
448cf86ff3 Update dir 2025-11-06 10:02:51 -05:00
Ryan Hughes
2ac65b5273 Update dir 2025-11-06 10:02:51 -05:00
Ryan Hughes
d0af0f998b Refactor fonts and icons 2025-11-06 10:02:51 -05:00
Ryan Hughes
76894b9c74 Update plymouth path 2025-11-06 10:02:51 -05:00
Ryan Hughes
b7ccb64082 Refactor autosuspend 2025-11-06 10:02:51 -05:00
Ryan Hughes
de4819bd17 Refactor walker-elephant 2025-11-06 10:02:51 -05:00
Ryan Hughes
6f73a52510 Refactor timezones 2025-11-06 10:02:51 -05:00
Ryan Hughes
b64046fd5e Update theme dir 2025-11-06 10:02:51 -05:00
Ryan Hughes
433346353e Refactor asdcontrol 2025-11-06 10:02:51 -05:00
Ryan Hughes
11bb11814b Refactor ssh-flakiness 2025-11-06 10:02:50 -05:00
Ryan Hughes
df3310a453 Refactor mimetypes 2025-11-06 10:02:50 -05:00
Ryan Hughes
087545e17e Elim 2025-11-06 10:02:44 -05:00
Ryan Hughes
442cd5917a Refactor gpg 2025-11-06 10:02:44 -05:00
Ryan Hughes
21ac298e88 Move fast-shutdown 2025-11-06 10:02:44 -05:00
Ryan Hughes
5ae7bad9b5 Don't need config anymore 2025-11-06 10:02:44 -05:00
Ryan Hughes
35c21d7bea Eliminate need for branding.sh 2025-11-06 10:02:44 -05:00
Ryan Hughes
29041f7a56 Update paths 2025-11-06 10:02:44 -05:00
Ryan Hughes
42bfa3582b Refactor Docker 2025-11-06 10:02:32 -05:00
Ryan Hughes
7f9ee95e1a Merge pull request #3084 from basecamp/dev
Omarchy 3.1.5
2025-11-03 12:13:01 -05:00
David Heinemeier Hansson
e369d68fe1 Take the rounding back a notch 2025-11-03 17:46:31 +01:00
Ryan Hughes
661abc89a6 Add omarchy-walker meta package 2025-11-03 11:37:20 -05:00
David Heinemeier Hansson
28ba448020 Merge branch 'master' into dev 2025-11-03 10:51:19 +01:00
David Heinemeier Hansson
4b15fe9a52 More wordsmithing 2025-11-03 10:50:54 +01:00
David Heinemeier Hansson
886a9f6f2c More wordsmithing 2025-11-03 10:49:35 +01:00
David Heinemeier Hansson
54795a2f55 Direct enhancements and ideas to discussions 2025-11-03 10:48:24 +01:00
Miha Rekar
d528393df6 Do not create eza theme symlink (#3092) 2025-11-03 10:19:54 +01:00
Ryan Hughes
4c97a31c98 Switch to xdg-terminal-exec
Solves the issue from ae10133b5e the right
way using the actual xdg-terminal-exec package and provides resillient
fallbacks no matter what the user might do.

This also removes the need to restart after changing terminals at all.

fixes #2198
fixes #2329
fixes #2673
fixes #1754
2025-11-03 01:11:09 -05:00
Ryan Hughes
66b5f7eab8 Move a few more to OPR 2025-11-02 22:50:25 -05:00
Ryan Hughes
9e971e3e56 Fix not working with alacritty 2025-11-02 18:58:11 -05:00
Ryan Hughes
ae10133b5e Fix neovim launching from files
Because of [hardcoded terminals in
glib](https://gitlab.gnome.org/GNOME/glib/-/blob/main/gio/gdesktopappinfo.c#L2755)
the previous fix still doesn't work well with Alacritty and Kitty.

Using our `omarchy-launch-terminal` aliased to `xdg-terminal-exec` does
the trick and doesn't introduce any new dependencies or rely on a lib
that isn't stable.
2025-11-02 17:57:25 -05:00
David Heinemeier Hansson
0f64a11f4e Follow naming convention from other hyprland scripts 2025-11-02 20:36:42 +01:00
Ryan Robitaille
b738c77acf Feature (hypr): add “Pop window” (float+pin) on SUPER+O (#2954)
* Feature (hypr): add “Pop window” (float+pin) on SUPER+L

* fix: changed default keybinding to SUPER+O
2025-11-02 20:36:28 +01:00
killeik
f76ba69f70 Make omarchy-launch-editor check that setted $EDITOR exists (#3072) 2025-11-02 20:28:41 +01:00
David Heinemeier Hansson
bfeb3a1e65 Gemini is now on extra/gemini-cli
Closes #3040
Co-authored-by: @maromalo
2025-11-02 20:12:08 +01:00
Wojciech Wnętrzak
3c89acadc1 Further instructions for auto nightlight (#3082)
Follow up to https://github.com/basecamp/omarchy/pull/2446l

I noticed that it did not work because the process was not running by default, vide d9efaac906
2025-11-02 20:04:53 +01:00
David Heinemeier Hansson
58ecda3b80 Make Yes the default 2025-10-31 14:34:08 +01:00
David Heinemeier Hansson
dd3b64ef7f Extract the confirmation into its own file 2025-10-31 14:33:54 +01:00
Brian Blakely
fc0983624e VS Code: Apply Omarchy theme during install (#2983)
* Apply Omarchy theme; Install Neovim extension (automatically scoops up LazyVim config).

* Just set the Omarchy theme

Removed installation of Neovim extension from script.

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2025-10-31 14:22:30 +01:00
David Heinemeier Hansson
fb3271f3af Fix phantom recording indicator
Closes #2656
Co-authored-by: @davidszp
2025-10-31 14:09:51 +01:00
Ryan Hughes
3344f33104 Use xdg-mime to set nvim as default
As @abenz1267 pointed out, the previous solution wasn't the greatest.
This is the proper solution.
2025-10-29 13:25:48 -04:00
David Heinemeier Hansson
407d283cb7 Rephrase 2025-10-29 10:58:24 +01:00
Joshua Fouch
ac8073fc81 Fix: Low Battery notification returning empty value on reboot (#2949)
* Fix: Low Battery notification returning empty value on reboot

* Simplify the check

* Double paste

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2025-10-29 10:58:06 +01:00
David Heinemeier Hansson
7770f49c1a Looks better without margin 2025-10-28 18:20:39 +01:00
David Heinemeier Hansson
9490e714c3 Moved 2025-10-28 18:19:28 +01:00
David Heinemeier Hansson
d3a54dc32e Show keybindings notice right away and vary update based on internet or not 2025-10-28 18:19:17 +01:00
David Heinemeier Hansson
d7cd1950ce Bump for the next version 2025-10-28 16:56:07 +01:00
130 changed files with 2143 additions and 551 deletions

View File

@@ -1,5 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: 🛟 Support 🛟
- name: Suggestion
url: https://github.com/basecamp/omarchy/discussions/categories/suggestions
about: Suggest a new feature, change to existing feature, or other ideas in Discussions.
- name: Support
url: https://omarchy.org/discord
about: Need help? Join our Discord community for support with any issues. GitHub issues should be used for verified bugs, documentation, and enhancement proposals only.
about: Need help? Join our Discord community for support with any issues. GitHub issues should be used for verified bugs only.

View File

@@ -1,16 +0,0 @@
name: Documentation
description: New pages or changes to existing
labels: [documentation]
body:
- type: markdown
attributes:
value: |
Remember: Omarchy is an open source gift, not a product you bought from a vendor
- type: textarea
id: steps
attributes:
label: What correction or addition do we need?
description: Please provide reference links and specifics of what should be updated
validations:
required: true

View File

@@ -1,15 +0,0 @@
name: Enhancement
description: Suggest a feature or change
labels: [enhancement]
body:
- type: markdown
attributes:
value: |
Remember: Omarchy is an open source gift, not a product you bought from a vendor
- type: textarea
id: steps
attributes:
label: What do you need?
validations:
required: true

View File

@@ -0,0 +1,21 @@
[Desktop Entry]
Type=Application
TryExec=alacritty
Exec=alacritty
Icon=Alacritty
Terminal=false
Categories=System;TerminalEmulator;
Name=Alacritty
GenericName=Terminal
Comment=A fast, cross-platform, OpenGL terminal emulator
StartupNotify=true
StartupWMClass=Alacritty
Actions=New;
X-TerminalArgExec=-e
X-TerminalArgAppId=--class=
X-TerminalArgTitle=--title=
X-TerminalArgDir=--working-directory=
[Desktop Action New]
Name=New Terminal
Exec=alacritty

View File

@@ -11,11 +11,13 @@ send_notification() {
notify-send -u critical "󱐋 Time to recharge!" "Battery is down to ${1}%" -i battery-caution -t 30000
}
if [[ $BATTERY_STATE == "discharging" && $BATTERY_LEVEL -le $BATTERY_THRESHOLD ]]; then
if [[ ! -f $NOTIFICATION_FLAG ]]; then
send_notification $BATTERY_LEVEL
touch $NOTIFICATION_FLAG
if [[ -n "$BATTERY_LEVEL" && "$BATTERY_LEVEL" =~ ^[0-9]+$ ]]; then
if [[ $BATTERY_STATE == "discharging" && $BATTERY_LEVEL -le $BATTERY_THRESHOLD ]]; then
if [[ ! -f $NOTIFICATION_FLAG ]]; then
send_notification $BATTERY_LEVEL
touch $NOTIFICATION_FLAG
fi
else
rm -f $NOTIFICATION_FLAG
fi
else
rm -f $NOTIFICATION_FLAG
fi

View File

@@ -14,6 +14,6 @@ if [[ -f "$FIRST_RUN_MODE" ]]; then
bash "$OMARCHY_PATH/install/first-run/gnome-theme.sh"
sudo rm -f /etc/sudoers.d/first-run
bash "$OMARCHY_PATH/install/first-run/wifi.sh"
bash "$OMARCHY_PATH/install/first-run/welcome.sh"
bash "$OMARCHY_PATH/install/first-run/wifi.sh"
fi

View File

@@ -1,5 +1,6 @@
#!/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

344
bin/omarchy-disk-config Executable file
View File

@@ -0,0 +1,344 @@
#!/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()

22
bin/omarchy-hyprland-window-pop Executable file
View File

@@ -0,0 +1,22 @@
#!/bin/bash
# Toggle to pop-out a tile to stay fixed on a display basis.
active=$(hyprctl activewindow -j)
pinned=$(echo "$active" | jq .pinned)
addr=$(echo "$active" | jq -r ".address")
[ -z "$addr" ] && { echo "No active window"; exit 0; }
if [ "$pinned" = "true" ]; then
hyprctl -q --batch \
"dispatch pin address:$addr;" \
"dispatch togglefloating address:$addr;" \
"dispatch tagwindow -pop address:$addr;"
else
hyprctl -q --batch \
"dispatch togglefloating address:$addr;" \
"dispatch centerwindow address:$addr;" \
"dispatch pin address:$addr;" \
"dispatch alterzorder top address:$addr;" \
"dispatch tagwindow +pop address:$addr;"
fi

258
bin/omarchy-install Executable file
View File

@@ -0,0 +1,258 @@
#!/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

@@ -0,0 +1,110 @@
#!/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

@@ -7,15 +7,41 @@ fi
package="$1"
# Map package name to desktop entry ID
case "$package" in
alacritty)
desktop_id="Alacritty.desktop"
;;
ghostty)
desktop_id="com.mitchellh.ghostty.desktop"
;;
kitty)
desktop_id="kitty.desktop"
;;
*)
echo "Unknown terminal: $package"
exit 1
;;
esac
# Install package
if omarchy-pkg-add $package; then
# Set as default terminal
echo "Setting $package as new default terminal..."
sed -i "/export TERMINAL=/ c\export TERMINAL=$package" ~/.config/uwsm/default
# Restart is needed for new default to take effect
echo
gum confirm "Restart to use new terminal?" && systemctl reboot --no-wall
# Copy custom desktop entry for alacritty with X-TerminalArg* keys
if [ "$package" = "alacritty" ]; then
mkdir -p ~/.local/share/applications
cp "$OMARCHY_PATH/applications/Alacritty.desktop" ~/.local/share/applications/
fi
# Update xdg-terminals.list to prioritize the proper terminal
cat > ~/.config/xdg-terminals.list << EOF
# Terminal emulator preference order for xdg-terminal-exec
# The first found and valid terminal will be used
$desktop_id
EOF
else
echo "Failed to install $package"
fi

View File

@@ -21,4 +21,7 @@ EOF
# Ensure VSC's own auto-update feature is turned off
printf '{\n "update.mode": "none"\n}\n' > ~/.config/Code/User/settings.json
# Apply Omarchy theme to VSCode
omarchy-theme-set-vscode
setsid gtk-launch code

View File

@@ -1,3 +1,3 @@
#!/bin/bash
exec setsid uwsm-app -- alacritty --class=Omarchy -o font.size=9 -e bash -c 'fastfetch; read -n 1 -s'
exec setsid uwsm-app -- xdg-terminal-exec --app-id=com.omarchy.Omarchy -e bash -c 'fastfetch; read -n 1 -s'

View File

@@ -1,8 +1,10 @@
#!/bin/bash
case "${EDITOR:-nvim}" in
omarchy-cmd-present "$EDITOR" || EDITOR=nvim
case "$EDITOR" in
nvim | vim | nano | micro | hx | helix)
exec setsid uwsm-app -- "$TERMINAL" -e "$EDITOR" "$@"
exec setsid uwsm-app -- xdg-terminal-exec "$EDITOR" "$@"
;;
*)
exec setsid uwsm-app -- "$EDITOR" "$@"

View File

@@ -1,4 +1,4 @@
#!/bin/bash
cmd="$*"
exec setsid uwsm-app -- alacritty -o font.size=9 --class=Omarchy --title=Omarchy -e bash -c "omarchy-show-logo; $cmd; omarchy-show-done"
exec setsid uwsm-app -- xdg-terminal-exec --app-id=com.omarchy.Omarchy --title=Omarchy -e bash -c "omarchy-show-logo; $cmd; omarchy-show-done"

View File

@@ -1,3 +0,0 @@
#!/bin/bash
exec setsid uwsm-app -- "${TERMINAL:-alacritty}" "$@"

View File

@@ -1,3 +1,3 @@
#!/bin/bash
exec setsid uwsm-app -- "$TERMINAL" --class=Impala -e impala "$@"
exec setsid uwsm-app -- xdg-terminal-exec --app-id=com.omarchy.Impala -e impala "$@"

View File

@@ -37,7 +37,7 @@ menu() {
}
terminal() {
alacritty --class=Omarchy -e "$@"
xdg-terminal-exec --app-id=com.omarchy.Omarchy "$@"
}
present_terminal() {
@@ -178,7 +178,7 @@ show_setup_menu() {
options="$options\n Defaults\n󰱔 DNS\n Security\n Config"
case $(menu "Setup" "$options") in
*Audio*) $TERMINAL --class=Wiremix -e wiremix ;;
*Audio*) xdg-terminal-exec --app-id=com.omarchy.Wiremix -e wiremix ;;
*Wifi*)
rfkill unblock wifi
omarchy-launch-wifi
@@ -264,7 +264,7 @@ show_install_editor_menu() {
*VSCode*) present_terminal omarchy-install-vscode ;;
*Cursor*) install_and_launch "Cursor" "cursor-bin" "cursor" ;;
*Zed*) install_and_launch "Zed" "zed" "dev.zed.Zed" ;;
*Sublime*) aur_install_and_launch "Sublime Text" "sublime-text-4" "sublime_text" ;;
*Sublime*) install_and_launch "Sublime Text" "sublime-text-4" "sublime_text" ;;
*Helix*) install "Helix" "helix" ;;
*Emacs*) install "Emacs" "emacs-wayland" && systemctl --user enable --now emacs.service ;;
*) show_install_menu ;;
@@ -287,11 +287,11 @@ show_install_ai_menu() {
echo ollama
)
case $(menu "Install" "󱚤 Claude Code\n󱚤 Cursor CLI [AUR]\n󱚤 Gemini [AUR]\n󱚤 OpenAI Codex\n󱚤 LM Studio\n󱚤 Ollama\n󱚤 Crush\n󱚤 opencode") in
case $(menu "Install" "󱚤 Claude Code\n󱚤 Cursor CLI\n󱚤 Gemini\n󱚤 OpenAI Codex\n󱚤 LM Studio\n󱚤 Ollama\n󱚤 Crush\n󱚤 opencode") in
*Claude*) install "Claude Code" "claude-code" ;;
*Cursor*) aur_install "Cursor CLI" "cursor-cli" ;;
*Cursor*) install "Cursor CLI" "cursor-cli" ;;
*OpenAI*) install "OpenAI Codex" "openai-codex-bin" ;;
*Gemini*) aur_install "Gemini" "gemini-cli" ;;
*Gemini*) install "Gemini" "gemini-cli" ;;
*Studio*) install "LM Studio" "lmstudio" ;;
*Ollama*) install "Ollama" $ollama_pkg ;;
*Crush*) install "Crush" "crush-bin" ;;
@@ -304,7 +304,7 @@ show_install_gaming_menu() {
case $(menu "Install" " Steam\n RetroArch [AUR]\n󰍳 Minecraft") in
*Steam*) present_terminal omarchy-install-steam ;;
*RetroArch*) aur_install_and_launch "RetroArch" "retroarch retroarch-assets libretro libretro-fbneo" "com.libretro.RetroArch.desktop" ;;
*Minecraft*) aur_install_and_launch "Minecraft [AUR]" "minecraft-launcher" "minecraft-launcher" ;;
*Minecraft*) install_and_launch "Minecraft" "minecraft-launcher" "minecraft-launcher" ;;
*) show_install_menu ;;
esac
}

View File

@@ -89,7 +89,6 @@ 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 ~/.local/share/omarchy/migrations/*.sh; do
for file in /usr/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 ~/.local/share/omarchy/applications/icons/*.png ~/.local/share/icons/hicolor/48x48/apps/
cp /usr/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 ~/.local/share/omarchy/applications/*.desktop ~/.local/share/applications/
cp ~/.local/share/omarchy/applications/hidden/*.desktop ~/.local/share/applications/
cp /usr/share/omarchy/applications/*.desktop ~/.local/share/applications/
cp /usr/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 ~/.local/share/omarchy/config/X/Y/Z -> ~/.config/X/Y/Z
# This script deploys /etc/skel/.config/X/Y/Z -> ~/.config/X/Y/Z
config_file=$1
if [[ -z "$config_file" ]]; then
@@ -8,7 +8,7 @@ if [[ -z "$config_file" ]]; then
Usage: $0 [config_file]
Must provide a file path from the .config directory to be refreshed.
To copy ~/.local/share/omarchy/config/hypr/hyprlock.conf to ~/.config/hypr/hyprlock.conf
To copy /etc/skel/.config/hypr/hyprlock.conf to ~/.config/hypr/hyprlock.conf
$0 hypr/hyprlock.conf
USAGE
@@ -17,7 +17,7 @@ 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="${HOME}/.local/share/omarchy/config/$config_file"
default_config_file="/etc/skel/.config/$config_file"
backup_config_file="$user_config_file.bak.$(date +%s)"
if [[ -f "$user_config_file" ]]; then

View File

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

View File

@@ -1,6 +1,6 @@
#!/bin/bash
sudo cp ~/.local/share/omarchy/default/plymouth/* /usr/share/plymouth/themes/omarchy/
sudo cp /usr/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,19 +10,15 @@ 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 "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 Omarchy Package"
sudo pacman -Syu --noconfirm --needed omarchy
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 ~/.local/share/omarchy/config/* ~/.config/
cp ~/.local/share/omarchy/default/bashrc ~/.bashrc
echo '[[ -f ~/.bashrc ]] && . ~/.bashrc' | tee ~/.bash_profile >/dev/null
cp -R /etc/skel/.config/* ~/.config/
$(bash $OMARCHY_PATH/install/config/theme.sh)
$(bash $OMARCHY_PATH/install/config/git.sh)

View File

@@ -1,21 +1,32 @@
#!/bin/bash
pkill elephant
pkill walker
# Detect if we're running as root (from pacman hook)
if [[ $EUID -eq 0 ]]; then
# 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")
# 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)
# 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 &
"
# 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
else
# Running as user directly
pkill elephant
pkill walker
setsid uwsm-app -- elephant &
wait 2
setsid uwsm-app -- walker --gapplication-service &

3
bin/omarchy-set-user Executable file
View File

@@ -0,0 +1,3 @@
#!/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 <~/.local/share/omarchy/logo.txt
cat < /usr/share/omarchy/logo.txt
echo -e "\033[0m"
echo

View File

@@ -4,17 +4,7 @@ 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
gum style --border normal --border-foreground 6 --padding "1 2" --margin "1 0" \
"Ready to update Omarchy?" \
"" \
"• You cannot stop the update once you start!" \
"• Make sure you're not on battery power or have sufficient charge"
if ! gum confirm --default=false "Continue with update?"; then
echo "Update cancelled"
exit 0
fi
omarchy-update-confirm
omarchy-snapshot create || [ $? -eq 127 ]
omarchy-update-git
omarchy-update-perform

14
bin/omarchy-update-confirm Executable file
View File

@@ -0,0 +1,14 @@
#!/bin/bash
set -e
gum style --border normal --border-foreground 6 --padding "1 2" \
"Ready to update Omarchy?" \
"" \
"• You cannot stop the update once you start!" \
"• Make sure you're connected to power or have a full battery"
if ! gum confirm "Continue with update?"; then
echo "Update cancelled"
exit 0
fi

19
boot.sh
View File

@@ -19,21 +19,4 @@ echo -e "\n$ansi_art\n"
sudo pacman -Syu --noconfirm --needed git
# 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
# FIXME: Update behavior or remove

Binary file not shown.

View File

@@ -1,6 +1,6 @@
--ozone-platform=wayland
--ozone-platform-hint=wayland
--enable-features=TouchpadOverscrollHistoryNavigation
--load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url
--load-extension=/usr/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

@@ -1,5 +1,5 @@
# Application bindings
$terminal = uwsm-app -- $TERMINAL
$terminal = uwsm-app -- xdg-terminal-exec
$browser = omarchy-launch-browser
bindd = SUPER, RETURN, Terminal, exec, $terminal --working-directory="$(omarchy-cmd-terminal-cwd)"

View File

@@ -1,15 +1,15 @@
# Learn how to configure Hyprland: https://wiki.hyprland.org/Configuring/
# Use defaults Omarchy defaults (but don't edit these directly!)
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 = /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 = ~/.config/omarchy/current/theme/hyprland.conf
# Change your own setup in these files (and overwrite any settings from defaults!)

View File

@@ -5,7 +5,9 @@ profile {
identity = true
}
# Enable auto switch to nightlight:
# To enable auto switch to nightlight, set in your .config/hypr/autostart:
# exec-once = uwsm app -- hyprsunset
# and use the following:
# profile {
# time = 20:00
# temperature = 4000

36
config/mimeapps.list Normal file
View File

@@ -0,0 +1,36 @@
[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

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

View File

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

View File

@@ -1,7 +1,7 @@
# Changes require a restart to take effect.
# Install other terminals via Install > Terminal
export TERMINAL=alacritty
export TERMINAL=xdg-terminal-exec
# Use code for VSCode
export EDITOR=nvim

View File

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

View File

@@ -1,7 +1,6 @@
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"

View File

@@ -41,7 +41,7 @@
"custom/omarchy": {
"format": "<span font='omarchy'>\ue900</span>",
"on-click": "omarchy-menu",
"on-click-right": "omarchy-launch-terminal",
"on-click-right": "xdg-terminal-exec",
"tooltip-format": "Omarchy Menu\n\nSuper + Alt + Space"
},
"custom/update": {
@@ -56,7 +56,7 @@
"cpu": {
"interval": 5,
"format": "󰍛",
"on-click": "$TERMINAL -e btop"
"on-click": "xdg-terminal-exec btop"
},
"clock": {
"format": "{:L%A %H:%M}",
@@ -105,7 +105,7 @@
},
"pulseaudio": {
"format": "{icon}",
"on-click": "$TERMINAL --class=Wiremix -e wiremix",
"on-click": "xdg-terminal-exec --app-id=com.omarchy.Wiremix -e wiremix",
"on-click-right": "pamixer -t",
"tooltip-format": "Playing at {volume}%",
"scroll-step": 5,

View File

@@ -1,7 +1,7 @@
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/prompt
source ~/.local/share/omarchy/default/bash/init
source ~/.local/share/omarchy/default/bash/envs
[[ $- == *i* ]] && bind -f ~/.local/share/omarchy/default/bash/inputrc
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

View File

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

View File

@@ -1,15 +1,15 @@
# App-specific tweaks
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
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

View File

@@ -1,5 +1,5 @@
# Picture-in-picture overlays
windowrule = tag +pip, title:(Picture.{0,1}in.{0,1}[Pp]icture)
windowrule = tag +pip, title:(Picture.?in.?[Pp]icture)
windowrule = float, tag:pip
windowrule = pin, tag:pip
windowrule = size 600 338, tag:pip

View File

@@ -1,9 +1,9 @@
# Floating windows
windowrule = float, tag:floating-window
windowrule = center, tag:floating-window
windowrule = size 800 600, tag:floating-window
windowrule = size 875 600, tag:floating-window
windowrule = tag +floating-window, class:(blueberry.py|Impala|Wiremix|org.gnome.NautilusPreviewer|com.gabm.satty|Omarchy|About|TUI.float)
windowrule = tag +floating-window, class:(blueberry.py|com.omarchy.Impala|com.omarchy.Wiremix|com.omarchy.Omarchy|org.gnome.NautilusPreviewer|com.gabm.satty|Omarchy|About|TUI.float)
windowrule = tag +floating-window, class:(xdg-desktop-portal-gtk|sublime_text|DesktopEditors|org.gnome.Nautilus), title:^(Open.*Files?|Open [F|f]older.*|Save.*Files?|Save.*As|Save|All Files|.*wants to [open|save].*|[C|c]hoose.*)
windowrule = float, class:org.gnome.Calculator
@@ -12,3 +12,6 @@ windowrule = fullscreen, class:Screensaver
# No transparency on media windows
windowrule = opacity 1 1, class:^(zoom|vlc|mpv|org.kde.kdenlive|com.obsproject.Studio|com.github.PintaProject.Pinta|imv|org.gnome.NautilusPreviewer)$
# Popped window rounding
windowrule = rounding 8, tag:pop

View File

@@ -1,3 +1,4 @@
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 = ~/.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
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

View File

@@ -9,6 +9,7 @@ bindd = SUPER, T, Toggle window floating/tiling, togglefloating,
bindd = SUPER, F, Full screen, fullscreen, 0
bindd = SUPER CTRL, F, Tiled full screen, fullscreenstate, 0 2
bindd = SUPER ALT, F, Full width, fullscreen, 1
bindd = SUPER, O, Pop window out (float & pin), exec, omarchy-hyprland-window-pop
# Move focus with SUPER + arrow keys
bindd = SUPER, LEFT, Move window focus left, movefocus, l

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 = ~/.local/share/omarchy/default/hypr/apps.conf
source = /usr/share/omarchy/default/hypr/apps.conf

View File

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

View File

@@ -1,6 +1,6 @@
#!/bin/bash
if pgrep -f "gpu-screen-recorder" >/dev/null; then
if pgrep -f "^gpu-screen-recorder" >/dev/null; then
echo '{"text": "󰻂", "tooltip": "Stop recording", "class": "active"}'
else
echo '{"text": ""}'

750
etc/cups/cups-browsed.conf Normal file
View File

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

6
etc/docker/daemon.json Normal file
View File

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

7
etc/gnupg/dirmngr.conf Normal file
View File

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

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

19
etc/nsswitch.conf Normal file
View File

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

@@ -0,0 +1,11 @@
[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

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

View File

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

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

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

View File

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

View File

@@ -4,14 +4,33 @@
set -eEo pipefail
# Define Omarchy locations
export OMARCHY_PATH="$HOME/.local/share/omarchy"
export OMARCHY_PATH="/usr/share/omarchy"
export OMARCHY_INSTALL="$OMARCHY_PATH/install"
export OMARCHY_INSTALL_LOG_FILE="/var/log/omarchy-install.log"
export PATH="$OMARCHY_PATH/bin:$PATH"
# Install
source "$OMARCHY_INSTALL/helpers/all.sh"
source "$OMARCHY_INSTALL/preflight/all.sh"
# 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
source "$OMARCHY_INSTALL/packaging/all.sh"
source "$OMARCHY_INSTALL/config/all.sh"
source "$OMARCHY_INSTALL/login/all.sh"

View File

@@ -1,29 +1,13 @@
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
@@ -31,3 +15,6 @@ 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

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

View File

@@ -1,6 +0,0 @@
# 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,32 +1,2 @@
# 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
# Add user to docker group
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

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

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

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

View File

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

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

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

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

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

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

View File

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

View File

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

View File

@@ -1,3 +0,0 @@
# 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,11 +4,13 @@ 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 ~/.local/share/omarchy/themes/*; do ln -nfs "$f" ~/.config/omarchy/themes/; done
for f in /usr/share/omarchy/themes/*; do ln -nfs "$f" ~/.config/omarchy/themes/; done
# Set initial theme
# 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
mkdir -p ~/.config/omarchy/current
ln -snf ~/.config/omarchy/themes/tokyo-night ~/.config/omarchy/current/theme
ln -snf /usr/share/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
@@ -20,8 +22,8 @@ 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/eza
ln -snf ~/.config/omarchy/current/theme/eza.yml ~/.config/eza/theme.yml
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

View File

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

@@ -1,17 +0,0 @@
#!/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,2 +1 @@
notify-send " Update System" "When you have internet, click to update the system." -u critical
notify-send " Learn Keybindings" "Super + K for cheatsheet.\nSuper + Space for application launcher.\nSuper + Alt + Space for Omarchy Menu." -u critical

View File

@@ -1,3 +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
else
notify-send " Update System" "Click to update the system." -u critical
fi

View File

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

View File

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

View File

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

View File

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

@@ -78,6 +78,11 @@ term_background_bright: 24283b
EOF
# Remove the original config file if it's not /boot/limine.conf
if [[ "$limine_config" != "/boot/limine.conf" ]] && [[ -f "$limine_config" ]]; then
sudo rm "$limine_config"
fi
# Match Snapper configs if not installing from the ISO
if [[ -z ${OMARCHY_CHROOT_INSTALL:-} ]]; then

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