summaryrefslogtreecommitdiff
path: root/releng/airootfs
diff options
context:
space:
mode:
Diffstat (limited to 'releng/airootfs')
-rw-r--r--releng/airootfs/etc/NetworkManager/conf.d/wifi_backend.conf2
-rw-r--r--releng/airootfs/etc/default/grub54
-rw-r--r--releng/airootfs/etc/group17
-rw-r--r--releng/airootfs/etc/gshadow2
-rw-r--r--releng/airootfs/etc/hostname1
-rw-r--r--releng/airootfs/etc/iwd/main.conf2
-rw-r--r--releng/airootfs/etc/locale.conf1
l---------releng/airootfs/etc/localtime1
-rw-r--r--releng/airootfs/etc/mkinitcpio.conf.d/archiso.conf3
-rw-r--r--releng/airootfs/etc/mkinitcpio.d/linux.preset8
-rw-r--r--releng/airootfs/etc/modprobe.d/broadcom-wl.conf11
-rw-r--r--releng/airootfs/etc/motd11
-rw-r--r--releng/airootfs/etc/os-release11
-rw-r--r--releng/airootfs/etc/pacman.conf108
-rw-r--r--releng/airootfs/etc/pacman.d/chaotic-mirrorlist349
-rw-r--r--releng/airootfs/etc/pacman.d/hooks/reflector-mirrorlist.hook11
-rw-r--r--releng/airootfs/etc/pacman.d/hooks/zzzz99-remove-custom-hooks-from-airootfs.hook18
-rw-r--r--releng/airootfs/etc/pacman.d/mirrorlist111
-rw-r--r--releng/airootfs/etc/passwd2
-rw-r--r--releng/airootfs/etc/polkit-1/rules.d/49-nopasswd_global.rules8
-rwxr-xr-xreleng/airootfs/etc/profile.d/autostart.sh4
-rw-r--r--releng/airootfs/etc/profile.d/raveos-fastfetch.sh18
-rw-r--r--releng/airootfs/etc/resolv.conf1
-rw-r--r--releng/airootfs/etc/shadow2
-rw-r--r--releng/airootfs/etc/skel/.bashrc16
-rw-r--r--releng/airootfs/etc/skel/.config/fastfetch/config-kitty.jsonc43
-rw-r--r--releng/airootfs/etc/skel/.config/fastfetch/config.jsonc93
-rw-r--r--releng/airootfs/etc/skel/.config/fastfetch/raveos-logo.pngbin0 -> 136727 bytes
-rw-r--r--releng/airootfs/etc/skel/.config/fastfetch/raveos-logo.txt19
-rw-r--r--releng/airootfs/etc/ssh/sshd_config.d/10-archiso.conf3
-rw-r--r--releng/airootfs/etc/sudoers139
-rw-r--r--releng/airootfs/etc/systemd/journald.conf.d/volatile-storage.conf2
-rw-r--r--releng/airootfs/etc/systemd/logind.conf.d/do-not-suspend.conf4
-rw-r--r--releng/airootfs/etc/systemd/network/20-ethernet.network24
-rw-r--r--releng/airootfs/etc/systemd/network/20-wlan.network.disabled20
-rw-r--r--releng/airootfs/etc/systemd/network/20-wwan.network19
-rw-r--r--releng/airootfs/etc/systemd/networkd.conf.d/ipv6-privacy-extensions.conf2
-rw-r--r--releng/airootfs/etc/systemd/resolved.conf.d/archiso.conf4
l---------releng/airootfs/etc/systemd/system-generators/systemd-gpt-auto-generator1
-rw-r--r--releng/airootfs/etc/systemd/system/choose-mirror.service10
l---------releng/airootfs/etc/systemd/system/cloud-init.target.wants/cloud-config.service1
l---------releng/airootfs/etc/systemd/system/cloud-init.target.wants/cloud-final.service1
l---------releng/airootfs/etc/systemd/system/cloud-init.target.wants/cloud-init-local.service1
l---------releng/airootfs/etc/systemd/system/cloud-init.target.wants/cloud-init-main.service1
l---------releng/airootfs/etc/systemd/system/cloud-init.target.wants/cloud-init-network.service1
l---------releng/airootfs/etc/systemd/system/dbus-org.freedesktop.ModemManager1.service1
l---------releng/airootfs/etc/systemd/system/dbus-org.freedesktop.network1.service1
l---------releng/airootfs/etc/systemd/system/dbus-org.freedesktop.resolve1.service1
l---------releng/airootfs/etc/systemd/system/dbus-org.freedesktop.timesync1.service1
-rw-r--r--releng/airootfs/etc/systemd/system/etc-pacman.d-gnupg.mount8
-rw-r--r--releng/airootfs/etc/systemd/system/getty@tty1.service.d/autologin.conf3
-rw-r--r--releng/airootfs/etc/systemd/system/livecd-alsa-unmuter.service13
-rw-r--r--releng/airootfs/etc/systemd/system/livecd-talk.service20
l---------releng/airootfs/etc/systemd/system/multi-user.target.wants/ModemManager.service1
l---------releng/airootfs/etc/systemd/system/multi-user.target.wants/NetworkManager.service1
l---------releng/airootfs/etc/systemd/system/multi-user.target.wants/choose-mirror.service1
l---------releng/airootfs/etc/systemd/system/multi-user.target.wants/hv_fcopy_daemon.service1
l---------releng/airootfs/etc/systemd/system/multi-user.target.wants/hv_kvp_daemon.service1
l---------releng/airootfs/etc/systemd/system/multi-user.target.wants/hv_vss_daemon.service1
l---------releng/airootfs/etc/systemd/system/multi-user.target.wants/iwd.service1
l---------releng/airootfs/etc/systemd/system/multi-user.target.wants/livecd-talk.service1
l---------releng/airootfs/etc/systemd/system/multi-user.target.wants/pacman-init.service1
l---------releng/airootfs/etc/systemd/system/multi-user.target.wants/reflector-once.service1
l---------releng/airootfs/etc/systemd/system/multi-user.target.wants/sshd.service1
l---------releng/airootfs/etc/systemd/system/multi-user.target.wants/systemd-resolved.service1
l---------releng/airootfs/etc/systemd/system/multi-user.target.wants/vboxservice.service1
l---------releng/airootfs/etc/systemd/system/multi-user.target.wants/vmtoolsd.service1
l---------releng/airootfs/etc/systemd/system/multi-user.target.wants/vmware-vmblock-fuse.service1
l---------releng/airootfs/etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service1
-rw-r--r--releng/airootfs/etc/systemd/system/pacman-init.service16
-rw-r--r--releng/airootfs/etc/systemd/system/reflector-once.service11
l---------releng/airootfs/etc/systemd/system/sockets.target.wants/pcscd.socket1
l---------releng/airootfs/etc/systemd/system/sockets.target.wants/systemd-networkd.socket1
l---------releng/airootfs/etc/systemd/system/sound.target.wants/livecd-alsa-unmuter.service1
l---------releng/airootfs/etc/systemd/system/sysinit.target.wants/systemd-time-wait-sync.service1
l---------releng/airootfs/etc/systemd/system/sysinit.target.wants/systemd-timesyncd.service1
-rw-r--r--releng/airootfs/etc/systemd/system/systemd-networkd-wait-online.service.d/wait-for-only-one-interface.conf6
l---------releng/airootfs/etc/systemd/system/wpa_supplicant.service1
-rwxr-xr-xreleng/airootfs/root/.automated_script.sh44
-rwxr-xr-xreleng/airootfs/root/.config/openbox/autostart8
-rw-r--r--releng/airootfs/root/.config/openbox/menu.xml22
-rw-r--r--releng/airootfs/root/.config/openbox/rc.xml46
-rw-r--r--releng/airootfs/root/.gnupg/scdaemon.conf4
-rwxr-xr-xreleng/airootfs/root/.loader.conf4
-rw-r--r--releng/airootfs/root/.xinitrc1
-rw-r--r--releng/airootfs/root/.zlogin6
-rwxr-xr-xreleng/airootfs/usr/local/bin/Installation_guide5
-rwxr-xr-xreleng/airootfs/usr/local/bin/choose-mirror29
-rwxr-xr-xreleng/airootfs/usr/local/bin/livecd-sound239
-rw-r--r--releng/airootfs/usr/local/share/livecd-sound/asound.conf.in3
-rwxr-xr-xreleng/airootfs/usr/share/calamares/kernel-install/95-raveos.install84
91 files changed, 1758 insertions, 0 deletions
diff --git a/releng/airootfs/etc/NetworkManager/conf.d/wifi_backend.conf b/releng/airootfs/etc/NetworkManager/conf.d/wifi_backend.conf
new file mode 100644
index 0000000..515c976
--- /dev/null
+++ b/releng/airootfs/etc/NetworkManager/conf.d/wifi_backend.conf
@@ -0,0 +1,2 @@
+[device]
+wifi.backend=iwd
diff --git a/releng/airootfs/etc/default/grub b/releng/airootfs/etc/default/grub
new file mode 100644
index 0000000..c9416a2
--- /dev/null
+++ b/releng/airootfs/etc/default/grub
@@ -0,0 +1,54 @@
+# GRUB boot loader configuration
+
+GRUB_DEFAULT=0
+GRUB_TIMEOUT=5
+GRUB_DISTRIBUTOR="RaveOS"
+GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet"
+GRUB_CMDLINE_LINUX=""
+
+# Preload both GPT and MBR modules so that they are not missed
+GRUB_PRELOAD_MODULES="part_gpt part_msdos"
+
+# Uncomment to enable booting from LUKS encrypted devices
+GRUB_ENABLE_CRYPTODISK=y
+
+# Set to 'countdown' or 'hidden' to change timeout behavior,
+# press ESC key to display menu.
+GRUB_TIMEOUT_STYLE=menu
+
+# Uncomment to use basic console
+GRUB_TERMINAL_INPUT=console
+
+# Uncomment to disable graphical terminal
+#GRUB_TERMINAL_OUTPUT=console
+
+# The resolution used on graphical terminal
+# note that you can use only modes which your graphic card supports via VBE
+# you can see them in real GRUB with the command `vbeinfo'
+GRUB_GFXMODE=auto
+
+# Uncomment to allow the kernel use the same resolution used by grub
+GRUB_GFXPAYLOAD_LINUX=keep
+
+# Uncomment if you want GRUB to pass to the Linux kernel the old parameter
+# format "root=/dev/xxx" instead of "root=/dev/disk/by-uuid/xxx"
+#GRUB_DISABLE_LINUX_UUID=true
+
+# Uncomment to disable generation of recovery mode menu entries
+GRUB_DISABLE_RECOVERY=true
+
+# Uncomment and set to the desired menu colors. Used by normal and wallpaper
+# modes only. Entries specified as foreground/background.
+#GRUB_COLOR_NORMAL="light-blue/black"
+#GRUB_COLOR_HIGHLIGHT="light-cyan/blue"
+
+# Uncomment one of them for the gfx desired, a image background or a gfxtheme
+#GRUB_BACKGROUND="/path/to/wallpaper"
+#GRUB_THEME="/path/to/gfxtheme"
+
+# Uncomment to get a beep at GRUB start
+#GRUB_INIT_TUNE="480 440 1"
+
+# Uncomment to make GRUB remember the last selection. This requires
+# setting 'GRUB_DEFAULT=saved' above.
+#GRUB_SAVEDEFAULT="true"
diff --git a/releng/airootfs/etc/group b/releng/airootfs/etc/group
new file mode 100644
index 0000000..5b8b111
--- /dev/null
+++ b/releng/airootfs/etc/group
@@ -0,0 +1,17 @@
+root:x:0:root
+sys:x:3:bin,raveos
+network:x:90:raveos
+power:x:98:raveos
+adm:x:999:raveos
+wheel:x:998:raveos
+uucp:x:987:raveos
+optical:x:990:raveos
+rfkill:x:983:raveos
+video:x:986:raveos
+storage:x:988:raveos
+audio:x:995:raveos
+users:x:985:raveos
+nopasswdlogin:x:966:raveos
+autologin:x:967:raveos
+plugdev:x:46:raveos
+raveos:x:1000:
diff --git a/releng/airootfs/etc/gshadow b/releng/airootfs/etc/gshadow
new file mode 100644
index 0000000..b37e18f
--- /dev/null
+++ b/releng/airootfs/etc/gshadow
@@ -0,0 +1,2 @@
+root:!*::root
+raveos:!*::
diff --git a/releng/airootfs/etc/hostname b/releng/airootfs/etc/hostname
new file mode 100644
index 0000000..02af87a
--- /dev/null
+++ b/releng/airootfs/etc/hostname
@@ -0,0 +1 @@
+raveos-netinst
diff --git a/releng/airootfs/etc/iwd/main.conf b/releng/airootfs/etc/iwd/main.conf
new file mode 100644
index 0000000..d613231
--- /dev/null
+++ b/releng/airootfs/etc/iwd/main.conf
@@ -0,0 +1,2 @@
+[General]
+EnableNetworkConfiguration=false
diff --git a/releng/airootfs/etc/locale.conf b/releng/airootfs/etc/locale.conf
new file mode 100644
index 0000000..f9c983c
--- /dev/null
+++ b/releng/airootfs/etc/locale.conf
@@ -0,0 +1 @@
+LANG=C.UTF-8
diff --git a/releng/airootfs/etc/localtime b/releng/airootfs/etc/localtime
new file mode 120000
index 0000000..0e35b57
--- /dev/null
+++ b/releng/airootfs/etc/localtime
@@ -0,0 +1 @@
+/usr/share/zoneinfo/UTC \ No newline at end of file
diff --git a/releng/airootfs/etc/mkinitcpio.conf.d/archiso.conf b/releng/airootfs/etc/mkinitcpio.conf.d/archiso.conf
new file mode 100644
index 0000000..5c008e5
--- /dev/null
+++ b/releng/airootfs/etc/mkinitcpio.conf.d/archiso.conf
@@ -0,0 +1,3 @@
+HOOKS=(base udev microcode modconf kms memdisk archiso archiso_loop_mnt archiso_pxe_common archiso_pxe_nbd archiso_pxe_http archiso_pxe_nfs block filesystems keyboard)
+COMPRESSION="xz"
+COMPRESSION_OPTIONS=(-9e)
diff --git a/releng/airootfs/etc/mkinitcpio.d/linux.preset b/releng/airootfs/etc/mkinitcpio.d/linux.preset
new file mode 100644
index 0000000..8e85205
--- /dev/null
+++ b/releng/airootfs/etc/mkinitcpio.d/linux.preset
@@ -0,0 +1,8 @@
+# mkinitcpio preset file for the 'linux' package on archiso
+
+PRESETS=('archiso')
+
+ALL_kver='/boot/vmlinuz-linux'
+archiso_config='/etc/mkinitcpio.conf.d/archiso.conf'
+
+archiso_image="/boot/initramfs-linux.img"
diff --git a/releng/airootfs/etc/modprobe.d/broadcom-wl.conf b/releng/airootfs/etc/modprobe.d/broadcom-wl.conf
new file mode 100644
index 0000000..d57bc07
--- /dev/null
+++ b/releng/airootfs/etc/modprobe.d/broadcom-wl.conf
@@ -0,0 +1,11 @@
+# The broadcom-wl package requires some modules to be disabled in order to use
+# wl. Since the ISO image needs to cover many hardware cases, this file
+# overrides the default blacklist in /usr/lib/modprobe.d/
+#
+# If you need to use wl, you may need to delete this file, then `rmmod` any
+# already-loaded modules that are now blacklisted before proceeding to modprobe
+# wl itself.
+
+blacklist b43
+blacklist bcma
+blacklist ssb \ No newline at end of file
diff --git a/releng/airootfs/etc/motd b/releng/airootfs/etc/motd
new file mode 100644
index 0000000..4d9eda1
--- /dev/null
+++ b/releng/airootfs/etc/motd
@@ -0,0 +1,11 @@
+To install Arch Linux follow the installation guide:
+https://wiki.archlinux.org/title/Installation_guide
+
+For Wi-Fi, authenticate to the wireless network using the iwctl utility.
+For mobile broadband (WWAN) modems, connect with the mmcli utility.
+Ethernet, WLAN and WWAN interfaces using DHCP should work automatically.
+
+After connecting to the internet, the installation guide can be accessed
+via the convenience script Installation_guide.
+
+                                          
diff --git a/releng/airootfs/etc/os-release b/releng/airootfs/etc/os-release
new file mode 100644
index 0000000..4728aeb
--- /dev/null
+++ b/releng/airootfs/etc/os-release
@@ -0,0 +1,11 @@
+NAME="RaveOS"
+PRETTY_NAME="RaveOS"
+ID=arch
+BUILD_ID=rolling
+ANSI_COLOR="38;2;23;147;209"
+HOME_URL="https://rp1.hu"
+DOCUMENTATION_URL="https://rp1.hu/"
+SUPPORT_URL="https://rp1.hu/"
+BUG_REPORT_URL="https://git.rp1.hu"
+PRIVACY_POLICY_URL="https://git.rp1.hu"
+LOGO=raveos-logo
diff --git a/releng/airootfs/etc/pacman.conf b/releng/airootfs/etc/pacman.conf
new file mode 100644
index 0000000..9ba30ee
--- /dev/null
+++ b/releng/airootfs/etc/pacman.conf
@@ -0,0 +1,108 @@
+#
+# /etc/pacman.conf
+#
+# See the pacman.conf(5) manpage for option and repository directives
+
+#
+# GENERAL OPTIONS
+#
+[options]
+# The following paths are commented out with their default values listed.
+# If you wish to use different paths, uncomment and update the paths.
+#RootDir = /
+#DBPath = /var/lib/pacman/
+#CacheDir = /var/cache/pacman/pkg/
+#LogFile = /var/log/pacman.log
+#GPGDir = /etc/pacman.d/gnupg/
+#HookDir = /etc/pacman.d/hooks/
+HoldPkg = pacman glibc
+#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
+#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
+#CleanMethod = KeepInstalled
+Architecture = auto
+
+# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
+#IgnorePkg = linux-cachyos linux-cachyos-headers gnome-session gnome-console gedit gnome-disk-utility gnome-system-monitor eog gnome-calculator baobab gnome-control-center gnome-tweaks gnome-browser-connector gnome-settings-daemon nautilus gnome-shell-extensions mutter
+#IgnoreGroup =
+
+#NoUpgrade =
+#NoExtract =
+
+# Misc options
+#UseSyslog
+Color
+#NoProgressBar
+# We cannot check disk space from within a chroot environment
+#CheckSpace
+#VerbosePkgLists
+ILoveCandy
+ParallelDownloads = 5
+#DownloadUser = alpm
+#DisableSandbox
+
+# By default, pacman accepts packages signed by keys that its local keyring
+# trusts (see pacman-key and its man page), as well as unsigned packages.
+SigLevel = Required DatabaseOptional
+LocalFileSigLevel = Optional
+#RemoteFileSigLevel = Required
+
+# NOTE: You must run `pacman-key --init` before first using pacman; the local
+# keyring can then be populated with the keys of all official Arch Linux
+# packagers with `pacman-key --populate archlinux`.
+
+#
+# REPOSITORIES
+# - can be defined here or included from another file
+# - pacman will search repositories in the order defined here
+# - local/custom mirrors can be added here or in separate files
+# - repositories listed first will take precedence when packages
+# have identical names, regardless of version number
+# - URLs will have $repo replaced by the name of the current repo
+# - URLs will have $arch replaced by the name of the architecture
+#
+# Repository entries are of the format:
+# [repo-name]
+# Server = ServerName
+# Include = IncludePath
+#
+# The header [repo-name] is crucial - it must be present and
+# uncommented to enable the repo.
+#
+
+# The testing repositories are disabled by default. To enable, uncomment the
+# repo name header and Include lines. You can add preferred servers immediately
+# after the header, and they will be used before the default mirrors.
+
+#[core-testing]
+#Include = /etc/pacman.d/mirrorlist
+
+[core]
+Include = /etc/pacman.d/mirrorlist
+
+#[extra-testing]
+#Include = /etc/pacman.d/mirrorlist
+
+[extra]
+Include = /etc/pacman.d/mirrorlist
+
+# If you want to run 32 bit applications on your x86_64 system,
+# enable the multilib repositories as required here.
+
+#[multilib-testing]
+#Include = /etc/pacman.d/mirrorlist
+
+[multilib]
+Include = /etc/pacman.d/mirrorlist
+
+# An example of a custom package repository. See the pacman manpage for
+# tips on creating your own repositories.
+#[custom]
+#SigLevel = Optional TrustAll
+#Server = file:///home/custompkgs
+
+[raveos-core-repo]
+SigLevel = Never TrustAll
+Server = https://page.rp1.hu/x86_64/
+
+[chaotic-aur]
+Include = /etc/pacman.d/chaotic-mirrorlist
diff --git a/releng/airootfs/etc/pacman.d/chaotic-mirrorlist b/releng/airootfs/etc/pacman.d/chaotic-mirrorlist
new file mode 100644
index 0000000..283a314
--- /dev/null
+++ b/releng/airootfs/etc/pacman.d/chaotic-mirrorlist
@@ -0,0 +1,349 @@
+# Mirrorlist for Chaotic-AUR (https://aur.chaotic.cx/)
+
+# This file contains 3 different types of mirrors:
+# 1. Virtual mirrors: These mirrors do not refer to any specific mirror or region of the world
+# * geo-mirror.chaotic.cx: Automatically routes to the geographically closest up-to-date mirror based on IP address.
+# * random-mirror.chaotic.cx: Automatically routes to a random (but semi-persistent) up-to-date mirror.
+# 2. Country mirrors: Any requests made to these mirrors will be routed to an up-to-date mirror located in the specific country.
+# * If your machine is located in the same country as the country mirror in question, the closest mirror in that country will be used.
+# * If your machine is located in a different country than the country mirror, a random (but semi-persistent) mirror in that country will be used.
+# * Common format: [country code]-mirror.chaotic.cx
+# 3. Regular mirrors: These refer to specific mirrors and do not automatically route to any other mirror.
+# * If the mirror is out of date or offline, the mirror will return an appropriate error code. Pacman will skip it automatically.
+# * Common format: [country code]-[number]-mirror.chaotic.cx (but there are exceptions to this format)
+
+# Most of these mirrors are disabled by default. The topmost mirror will be the default mirror. The rest will be fallbacks.
+# Uncomment+move the mirrors to your desire. By default, geo-mirror, cdn-mirror and a few country mirrors are enabled,
+# to allow for a reasonable number of fallbacks while keeping the defaults short. Have fun!
+
+## Geo mirror (virtual)
+# Automatic routing to the geographically closest mirror (default)
+Server = https://geo-mirror.chaotic.cx/$repo/$arch
+
+## CDN mirror (regular)
+# Global
+# * By: Garuda Linux donators, hosted on Cloudflare R2
+Server = https://cdn-mirror.chaotic.cx/$repo/$arch
+
+
+## --- Country mirrors ---
+
+# Argentina (AR)
+#Server = https://ar-mirror.chaotic.cx/$repo/$arch
+
+# Australia (AU)
+#Server = https://au-mirror.chaotic.cx/$repo/$arch
+
+# Brazil (BR)
+Server = https://br-mirror.chaotic.cx/$repo/$arch
+
+# Canada (CA)
+#Server = https://ca-mirror.chaotic.cx/$repo/$arch
+
+# Chile (CL)
+#Server = https://cl-mirror.chaotic.cx/$repo/$arch
+
+# Colombia (CO)
+#Server = https://co-mirror.chaotic.cx/$repo/$arch
+
+# France (FR)
+#Server = https://fr-mirror.chaotic.cx/$repo/$arch
+
+# Germany (DE)
+Server = https://de-mirror.chaotic.cx/$repo/$arch
+
+# Greece (GR)
+#Server = https://gr-mirror.chaotic.cx/$repo/$arch
+
+# Hong Kong (HK)
+#Server = https://hk-mirror.chaotic.cx/$repo/$arch
+
+# India (IN)
+Server = https://in-mirror.chaotic.cx/$repo/$arch
+
+# Indonesia (ID)
+#Server = https://id-mirror.chaotic.cx/$repo/$arch
+
+# Israel (IL)
+#Server = https://il-mirror.chaotic.cx/$repo/$arch
+
+# Italy (IT)
+#Server = https://it-mirror.chaotic.cx/$repo/$arch
+
+# Japan (JP)
+#Server = https://jp-mirror.chaotic.cx/$repo/$arch
+
+# Mexico (MX)
+#Server = https://mx-mirror.chaotic.cx/$repo/$arch
+
+# Netherlands (NL)
+#Server = https://nl-mirror.chaotic.cx/$repo/$arch
+
+# New Zealand (NZ)
+#Server = https://nz-mirror.chaotic.cx/$repo/$arch
+
+# Nigeria (NG)
+#Server = https://ng-mirror.chaotic.cx/$repo/$arch
+
+# Peru (PE)
+#Server = https://pe-mirror.chaotic.cx/$repo/$arch
+
+# Poland (PL)
+#Server = https://pl-mirror.chaotic.cx/$repo/$arch
+
+# Russia (RU)
+#Server = https://ru-mirror.chaotic.cx/$repo/$arch
+
+# Saudi Arabia (SA)
+#Server = https://sa-mirror.chaotic.cx/$repo/$arch
+
+# Singapore (SG)
+#Server = https://sg-mirror.chaotic.cx/$repo/$arch
+
+# South Africa (ZA)
+#Server = https://za-mirror.chaotic.cx/$repo/$arch
+
+# South Korea (KR)
+#Server = https://kr-mirror.chaotic.cx/$repo/$arch
+
+# Spain (ES)
+#Server = https://es-mirror.chaotic.cx/$repo/$arch
+
+# Sweden (SE)
+#Server = https://se-mirror.chaotic.cx/$repo/$arch
+
+# Switzerland (CH)
+#Server = https://ch-mirror.chaotic.cx/$repo/$arch
+
+# Taiwan (TW)
+#Server = https://tw-mirror.chaotic.cx/$repo/$arch
+
+# Thailand (TH)
+#Server = https://th-mirror.chaotic.cx/$repo/$arch
+
+# United Arab Emirates (AE)
+#Server = https://ae-mirror.chaotic.cx/$repo/$arch
+
+# United Kingdom (GB)
+#Server = https://gb-mirror.chaotic.cx/$repo/$arch
+
+# United States of America (US)
+Server = https://us-mirror.chaotic.cx/$repo/$arch
+
+# Vietnam (VN)
+#Server = https://vn-mirror.chaotic.cx/$repo/$arch
+
+
+## --- Regular mirrors ---
+
+# Argentina (AR)
+# * By: a0xz
+#Server = https://ar-1-mirror.chaotic.cx/$repo/$arch
+
+# Australia (AU)
+# * By: a0xz
+#Server = https://au-1-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://au-2-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://au-3-mirror.chaotic.cx/$repo/$arch
+
+# Brazil (BR)
+# * By: Universidade Federal de São Carlos (São Carlos)
+#Server = https://br-1-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://br-2-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://br-3-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://br-4-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://br-5-mirror.chaotic.cx/$repo/$arch
+
+# Canada (CA)
+# * By: All Things Linux
+#Server = https://ca-1-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://ca-2-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://ca-3-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://ca-4-mirror.chaotic.cx/$repo/$arch
+
+# Chile (CL)
+# * By: Jonathan Gutiérrez
+#Server = https://cl-1-mirror.chaotic.cx/$repo/$arch
+# * By: Jonathan Gutiérrez
+#Server = https://cl-2-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://cl-3-mirror.chaotic.cx/$repo/$arch
+
+# Colombia (CO)
+# * By: Eduard Tolosa
+#Server = https://co-1-mirror.chaotic.cx/$repo/$arch
+
+# France (FR)
+# * By: a0xz
+#Server = https://fr-1-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://fr-2-mirror.chaotic.cx/$repo/$arch
+
+# Germany (DE)
+# * By: Nico
+#Server = https://de-2-mirror.chaotic.cx/$repo/$arch
+# * By: redgloboli
+#Server = https://de-4-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://de-1-mirror.chaotic.cx/$repo/$arch
+
+# Greece (GR)
+# * By: vmmaniac <github.com/vmmaniac>
+#Server = https://gr-1-mirror.chaotic.cx/$repo/$arch
+
+# Hong Kong (HK)
+# * By: a0xz
+#Server = https://hk-1-mirror.chaotic.cx/$repo/$arch
+
+# India (IN)
+# * By: Albony <https://albony.xyz/>
+#Server = https://in-2-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://in-3-mirror.chaotic.cx/$repo/$arch
+# * By: Albony (Chennai)
+#Server = https://in-4-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://in-5-mirror.chaotic.cx/$repo/$arch
+
+# Indonesia (ID)
+# * By: a0xz
+#Server = https://id-1-mirror.chaotic.cx/$repo/$arch
+
+# Israel (IL)
+# * By: a0xz
+#Server = https://il-1-mirror.chaotic.cx/$repo/$arch
+
+# Italy (IT)
+# * By: a0xz
+#Server = https://it-1-mirror.chaotic.cx/$repo/$arch
+
+# Japan (JP)
+# * By: a0xz
+#Server = https://jp-1-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://jp-2-mirror.chaotic.cx/$repo/$arch
+
+# Mexico (MX)
+# * By: a0xz
+#Server = https://mx-1-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://mx-2-mirror.chaotic.cx/$repo/$arch
+
+# Netherlands (NL)
+# * By: a0xz
+#Server = https://nl-1-mirror.chaotic.cx/$repo/$arch
+
+# New Zealand (NZ)
+# * By: a0xz
+#Server = https://nz-1-mirror.chaotic.cx/$repo/$arch
+
+# Nigeria (NG)
+# * By: a0xz
+#Server = https://ng-1-mirror.chaotic.cx/$repo/$arch
+
+# Peru (PE)
+# * By: a0xz
+#Server = https://pe-1-mirror.chaotic.cx/$repo/$arch
+
+# Poland (PL)
+# * By: a0xz
+#Server = https://pl-1-mirror.chaotic.cx/$repo/$arch
+
+# Russia (RU)
+# * By: Котпро203
+#Server = https://ru-1-mirror.chaotic.cx/$repo/$arch
+
+# Saudi Arabia (SA)
+# * By: a0xz
+#Server = https://sa-1-mirror.chaotic.cx/$repo/$arch
+
+# Singapore (SG)
+# * By: freedif.org (City state)
+#Server = https://sg-1-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://sg-2-mirror.chaotic.cx/$repo/$arch
+
+# South Africa (ZA)
+# * By: a0xz
+#Server = https://za-1-mirror.chaotic.cx/$repo/$arch
+
+# South Korea (KR)
+# * By: <t.me/silent_heigou> (Seoul)
+#Server = https://kr-1-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://kr-2-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://kr-3-mirror.chaotic.cx/$repo/$arch
+
+# Spain (ES)
+# * By: JKANetwork
+#Server = https://es-1-mirror.chaotic.cx/$repo/$arch
+# * By: Ícar <t.me/IcarNS>
+#Server = https://es-2-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://es-3-mirror.chaotic.cx/$repo/$arch
+
+# Sweden (SE)
+# * By: Academic Computer Club in Umeå (accum.se)
+#Server = https://se-1-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://se-2-mirror.chaotic.cx/$repo/$arch
+
+# Switzerland (CH)
+# * By: a0xz
+#Server = https://ch-1-mirror.chaotic.cx/$repo/$arch
+
+# Taiwan (TW)
+# * By: a0xz
+#Server = https://tw-1-mirror.chaotic.cx/$repo/$arch
+
+# Thailand (TH)
+# * By: a0xz
+#Server = https://th-1-mirror.chaotic.cx/$repo/$arch
+
+# United Arab Emirates (AE)
+# * By: a0xz
+#Server = https://ae-1-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://ae-2-mirror.chaotic.cx/$repo/$arch
+
+# United Kingdom (GB)
+# * By: Wilbur <github.com/ThisCatLikesCrypto>
+#Server = https://gb-1-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://gb-2-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://gb-3-mirror.chaotic.cx/$repo/$arch
+
+# United States of America (US)
+# * By: Technetium1 <github.com/Technetium1>
+#Server = https://us-mi-mirror.chaotic.cx/$repo/$arch
+# * By: ash <t.me/the_ashh>
+#Server = https://us-ut-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://us-hi-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://us-nv-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://us-fl-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://us-ny-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://us-az-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://us-or-mirror.chaotic.cx/$repo/$arch
+# * By: a0xz
+#Server = https://us-ca-mirror.chaotic.cx/$repo/$arch
+
+# Vietnam (VN)
+# * By: <t.me/meowice>
+#Server = https://vn-1-mirror.chaotic.cx/$repo/$arch
diff --git a/releng/airootfs/etc/pacman.d/hooks/reflector-mirrorlist.hook b/releng/airootfs/etc/pacman.d/hooks/reflector-mirrorlist.hook
new file mode 100644
index 0000000..312c41e
--- /dev/null
+++ b/releng/airootfs/etc/pacman.d/hooks/reflector-mirrorlist.hook
@@ -0,0 +1,11 @@
+[Trigger]
+Operation = Install
+Operation = Upgrade
+Type = Package
+Target = pacman-mirrorlist
+
+[Action]
+Description = Updating mirrorlist with reflector (Hungary)...
+When = PostTransaction
+Depends = reflector
+Exec = /usr/bin/reflector -c HU --protocol https --sort rate --latest 20 --download-timeout 5 --threads 20 --save /etc/pacman.d/mirrorlist
diff --git a/releng/airootfs/etc/pacman.d/hooks/zzzz99-remove-custom-hooks-from-airootfs.hook b/releng/airootfs/etc/pacman.d/hooks/zzzz99-remove-custom-hooks-from-airootfs.hook
new file mode 100644
index 0000000..8dfb943
--- /dev/null
+++ b/releng/airootfs/etc/pacman.d/hooks/zzzz99-remove-custom-hooks-from-airootfs.hook
@@ -0,0 +1,18 @@
+# remove from airootfs!
+# As a workaround for https://bugs.archlinux.org/task/49347 , remove pacman hooks specific to the ISO build process.
+# If not, they would be used when pacstrap is run in the live environment.
+
+[Trigger]
+Operation = Install
+Operation = Upgrade
+Operation = Remove
+Type = Package
+Target = *
+
+[Action]
+Description = Work around FS#49347 by removing custom pacman hooks that are only required during ISO build...
+When = PostTransaction
+Depends = sh
+Depends = coreutils
+Depends = grep
+Exec = /bin/sh -c "rm -- $(grep -Frl 'remove from airootfs' /etc/pacman.d/hooks/)"
diff --git a/releng/airootfs/etc/pacman.d/mirrorlist b/releng/airootfs/etc/pacman.d/mirrorlist
new file mode 100644
index 0000000..71078e6
--- /dev/null
+++ b/releng/airootfs/etc/pacman.d/mirrorlist
@@ -0,0 +1,111 @@
+
+
+## France
+Server = http://mirror.trap.moe/archlinux/$repo/os/$arch
+Server = http://mirror.cyberbits.eu/archlinux/$repo/os/$arch
+Server = http://archlinux.mailtunnel.eu/$repo/os/$arch
+Server = https://mirror.cyberbits.eu/archlinux/$repo/os/$arch
+Server = https://archlinux.mailtunnel.eu/$repo/os/$arch
+Server = https://mirror.theo546.fr/archlinux/$repo/os/$arch
+Server = http://mirror.theo546.fr/archlinux/$repo/os/$arch
+Server = http://fr.mirrors.cicku.me/archlinux/$repo/os/$arch
+Server = https://fr.mirrors.cicku.me/archlinux/$repo/os/$arch
+Server = https://f.matthieul.dev/mirror/archlinux/$repo/os/$arch
+Server = http://f.matthieul.dev/mirror/archlinux/$repo/os/$arch
+Server = https://mirror.trap.moe/archlinux/$repo/os/$arch
+Server = https://mirror.peeres-telecom.fr/archlinux/$repo/os/$arch
+Server = https://mirrors.jtremesay.org/archlinux/$repo/os/$arch
+Server = http://mirror.peeres-telecom.fr/archlinux/$repo/os/$arch
+Server = http://archlinux.datagr.am/$repo/os/$arch
+Server = https://arch.syxpi.fr/arch/$repo/os/$arch
+Server = http://archmirror.hogwarts.fr/$repo/os/$arch
+Server = http://arch.yourlabs.org/$repo/os/$arch
+Server = http://mirror.oldsql.cc/archlinux/$repo/os/$arch
+Server = https://mirror.rznet.fr/archlinux/$repo/os/$arch
+Server = http://mirror.rznet.fr/archlinux/$repo/os/$arch
+Server = https://arch.yourlabs.org/$repo/os/$arch
+Server = https://mirror.oldsql.cc/archlinux/$repo/os/$arch
+Server = https://mirror.thekinrar.fr/archlinux/$repo/os/$arch
+Server = http://mirror.bakertelekom.fr/Arch/$repo/os/$arch
+Server = https://mirror.bakertelekom.fr/Arch/$repo/os/$arch
+Server = http://arch.syxpi.fr/arch/$repo/os/$arch
+Server = https://archmirror.hogwarts.fr/$repo/os/$arch
+Server = https://mirror.smayzy.ovh/archlinux/$repo/os/$arch
+Server = http://mirror.lastmikoi.net/archlinux/$repo/os/$arch
+Server = https://mirrors.eric.ovh/arch/$repo/os/$arch
+Server = http://mir.archlinux.fr/$repo/os/$arch
+Server = http://mirrors.gandi.net/archlinux/$repo/os/$arch
+Server = https://mirrors.gandi.net/archlinux/$repo/os/$arch
+Server = http://mirror.archlinux.ikoula.com/archlinux/$repo/os/$arch
+Server = http://mirror.its-tps.fr/archlinux/$repo/os/$arch
+Server = https://mirror.its-tps.fr/archlinux/$repo/os/$arch
+Server = https://mirror.wormhole.eu/archlinux/$repo/os/$arch
+Server = http://archlinux.mirrors.ovh.net/archlinux/$repo/os/$arch
+Server = https://archlinux.mirrors.ovh.net/archlinux/$repo/os/$arch
+Server = http://ftp.u-strasbg.fr/linux/distributions/archlinux/$repo/os/$arch
+Server = https://elda.asgardius.company/archlinux/$repo/os/$arch
+
+
+## Netherlands
+Server = http://ams.nl.mirrors.bjg.at/arch/$repo/os/$arch
+Server = https://ams.nl.mirrors.bjg.at/arch/$repo/os/$arch
+Server = http://ftp.nluug.nl/os/Linux/distr/archlinux/$repo/os/$arch
+Server = https://nl.mirrors.cicku.me/archlinux/$repo/os/$arch
+Server = http://nl.mirrors.cicku.me/archlinux/$repo/os/$arch
+Server = http://mirror.ams1.nl.leaseweb.net/archlinux/$repo/os/$arch
+Server = https://mirror.ams1.nl.leaseweb.net/archlinux/$repo/os/$arch
+Server = http://mirror.nl.cdn-perfprod.com/archlinux/$repo/os/$arch
+Server = http://ftp.snt.utwente.nl/pub/os/linux/archlinux/$repo/os/$arch
+Server = http://mirror.cj2.nl/archlinux/$repo/os/$arch
+Server = https://mirror.nl.cdn-perfprod.com/archlinux/$repo/os/$arch
+Server = https://mirror.cj2.nl/archlinux/$repo/os/$arch
+Server = http://archlinux.mirror.wearetriple.com/$repo/os/$arch
+Server = https://archlinux.mirror.wearetriple.com/$repo/os/$arch
+Server = http://mirrors.xtom.nl/archlinux/$repo/os/$arch
+Server = https://mirrors.xtom.nl/archlinux/$repo/os/$arch
+Server = http://mirror.bouwhuis.network/archlinux/$repo/os/$arch
+Server = https://mirror.bouwhuis.network/archlinux/$repo/os/$arch
+Server = https://nl.mirror.flokinet.net/archlinux/$repo/os/$arch
+Server = http://nl.mirror.flokinet.net/archlinux/$repo/os/$arch
+Server = http://arch.mirrors.lavatech.top/$repo/os/$arch
+Server = http://mirror.koddos.net/archlinux/$repo/os/$arch
+Server = https://mirror.mijn.host/archlinux/$repo/os/$arch
+Server = http://mirror.mijn.host/archlinux/$repo/os/$arch
+Server = https://mirror.koddos.net/archlinux/$repo/os/$arch
+Server = https://arch.mirrors.lavatech.top/$repo/os/$arch
+Server = https://archlinux.mirror.liteserver.nl/$repo/os/$arch
+Server = http://archlinux.mirror.liteserver.nl/$repo/os/$arch
+Server = http://mirror.lyrahosting.com/archlinux/$repo/os/$arch
+Server = https://mirror.lyrahosting.com/archlinux/$repo/os/$arch
+Server = https://mirror.iusearchbtw.nl/$repo/os/$arch
+Server = http://mirrors.evoluso.com/archlinux/$repo/os/$arch
+Server = http://mirror.serverion.com/archlinux/$repo/os/$arch
+Server = https://mirror.serverion.com/archlinux/$repo/os/$arch
+
+
+## United Kingdom
+Server = https://london.mirror.pkgbuild.com/$repo/os/$arch
+Server = https://archlinux.uk.mirror.allworldit.com/archlinux/$repo/os/$arch
+Server = http://archlinux.uk.mirror.allworldit.com/archlinux/$repo/os/$arch
+Server = https://repo.c48.uk/arch/$repo/os/$arch
+Server = https://uk.repo.c48.uk/arch/$repo/os/$arch
+Server = https://gb.mirrors.cicku.me/archlinux/$repo/os/$arch
+Server = http://gb.mirrors.cicku.me/archlinux/$repo/os/$arch
+Server = http://mirrors.melbourne.co.uk/archlinux/$repo/os/$arch
+Server = https://mirror.server.net/archlinux/$repo/os/$arch
+Server = http://mirror.server.net/archlinux/$repo/os/$arch
+Server = https://mirrors.melbourne.co.uk/archlinux/$repo/os/$arch
+Server = https://repo.slithery.uk/$repo/os/$arch
+Server = http://mirror.netweaver.uk/archlinux/$repo/os/$arch
+Server = https://mirror.netweaver.uk/archlinux/$repo/os/$arch
+Server = https://mirror.st2projects.com/archlinux/$repo/os/$arch
+Server = http://mirrors.ukfast.co.uk/sites/archlinux.org/$repo/os/$arch
+Server = https://mirrors.ukfast.co.uk/sites/archlinux.org/$repo/os/$arch
+Server = https://www.mirrorservice.org/sites/ftp.archlinux.org/$repo/os/$arch
+Server = http://www.mirrorservice.org/sites/ftp.archlinux.org/$repo/os/$arch
+Server = http://mirror.marcusn.net/archlinux/$repo/os/$arch
+Server = https://mirror.marcusn.net/archlinux/$repo/os/$arch
+Server = http://mirror.cov.ukservers.com/archlinux/$repo/os/$arch
+Server = https://mirror.cov.ukservers.com/archlinux/$repo/os/$arch
+Server = https://lon.mirror.rackspace.com/archlinux/$repo/os/$arch
+Server = http://lon.mirror.rackspace.com/archlinux/$repo/os/$arch
diff --git a/releng/airootfs/etc/passwd b/releng/airootfs/etc/passwd
new file mode 100644
index 0000000..e997f05
--- /dev/null
+++ b/releng/airootfs/etc/passwd
@@ -0,0 +1,2 @@
+root:x:0:0:root:/root:/usr/bin/zsh
+raveos:x:1000:1000::/home/raveos:/usr/bin/bash
diff --git a/releng/airootfs/etc/polkit-1/rules.d/49-nopasswd_global.rules b/releng/airootfs/etc/polkit-1/rules.d/49-nopasswd_global.rules
new file mode 100644
index 0000000..cca8039
--- /dev/null
+++ b/releng/airootfs/etc/polkit-1/rules.d/49-nopasswd_global.rules
@@ -0,0 +1,8 @@
+/* Allow members of the wheel group to execute any actions
+ * without password authentication, similar to "sudo NOPASSWD:"
+ */
+polkit.addRule(function(action, subject) {
+ if (subject.isInGroup("wheel")) {
+ return polkit.Result.YES;
+ }
+});
diff --git a/releng/airootfs/etc/profile.d/autostart.sh b/releng/airootfs/etc/profile.d/autostart.sh
new file mode 100755
index 0000000..1dfb4a5
--- /dev/null
+++ b/releng/airootfs/etc/profile.d/autostart.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+if [[ -z $DISPLAY ]] && [[ $(tty) = /dev/tty1 ]]; then
+ startx
+fi
diff --git a/releng/airootfs/etc/profile.d/raveos-fastfetch.sh b/releng/airootfs/etc/profile.d/raveos-fastfetch.sh
new file mode 100644
index 0000000..c97dc67
--- /dev/null
+++ b/releng/airootfs/etc/profile.d/raveos-fastfetch.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+# RaveOS terminal greeting
+# Guard: prevent double execution (login shell profile.d + .bashrc)
+[[ -n "$_RAVEOS_GREETING_DONE" ]] && return 2>/dev/null
+_RAVEOS_GREETING_DONE=1
+
+if command -v fastfetch &>/dev/null; then
+ if [[ "$TERM" == "xterm-kitty" ]]; then
+ _rows=$(tput lines 2>/dev/null || echo 40)
+ _logo_h=$(( _rows * 40 / 100 ))
+ (( _logo_h < 8 )) && _logo_h=8
+ (( _logo_h > 24 )) && _logo_h=24
+ fastfetch --config ~/.config/fastfetch/config-kitty.jsonc --logo-height "$_logo_h"
+ unset _rows _logo_h
+ else
+ fastfetch
+ fi
+fi
diff --git a/releng/airootfs/etc/resolv.conf b/releng/airootfs/etc/resolv.conf
new file mode 100644
index 0000000..8dda3fc
--- /dev/null
+++ b/releng/airootfs/etc/resolv.conf
@@ -0,0 +1 @@
+nameserver 1.1.1.1
diff --git a/releng/airootfs/etc/shadow b/releng/airootfs/etc/shadow
new file mode 100644
index 0000000..824230b
--- /dev/null
+++ b/releng/airootfs/etc/shadow
@@ -0,0 +1,2 @@
+root::14871::::::
+raveos:$6$jcfVB0VnKJYxHo7t$j/U9j8Civmx0O9f/mb1.nzw.BZLISLEKS.QwgOXNKWGpkLVisvP5Zfs4lcuzXglZBUAxj9oknnPBiCZOIgd25.:14871::::::
diff --git a/releng/airootfs/etc/skel/.bashrc b/releng/airootfs/etc/skel/.bashrc
new file mode 100644
index 0000000..2d2fb5e
--- /dev/null
+++ b/releng/airootfs/etc/skel/.bashrc
@@ -0,0 +1,16 @@
+#
+# ~/.bashrc
+#
+
+# If not running interactively, don't do anything
+[[ $- != *i* ]] && return
+
+alias ls='ls --color=auto'
+alias grep='grep --color=auto'
+PS1='[\u@\h \W]\$ '
+
+# >>> RaveOS terminal greeting >>>
+if [[ -f /etc/profile.d/raveos-fastfetch.sh ]]; then
+ source /etc/profile.d/raveos-fastfetch.sh
+fi
+# <<< RaveOS terminal greeting <<<
diff --git a/releng/airootfs/etc/skel/.config/fastfetch/config-kitty.jsonc b/releng/airootfs/etc/skel/.config/fastfetch/config-kitty.jsonc
new file mode 100644
index 0000000..d99f7a7
--- /dev/null
+++ b/releng/airootfs/etc/skel/.config/fastfetch/config-kitty.jsonc
@@ -0,0 +1,43 @@
+{
+ "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
+ "logo": {
+ "source": "~/.config/fastfetch/raveos-logo.png",
+ "type": "kitty-direct",
+ "height": 16,
+ "padding": {
+ "top": 1,
+ "left": 2,
+ "right": 2
+ }
+ },
+ "display": {
+ "separator": " → ",
+ "color": {
+ "keys": "green",
+ "title": "cyan"
+ }
+ },
+ "modules": [
+ { "type": "custom", "format": "\u001b[1;32mRaveOS \u001b[0;36m" },
+ "separator",
+ { "type": "os", "key": "OS" },
+ { "type": "kernel", "key": "Kernel" },
+ { "type": "uptime", "key": "Uptime" },
+ { "type": "packages", "key": "Packages" },
+ { "type": "shell", "key": "Shell" },
+ { "type": "de", "key": "DE" },
+ { "type": "wm", "key": "WM" },
+ { "type": "terminal", "key": "Terminal" },
+ "separator",
+ { "type": "cpu", "key": "CPU" },
+ { "type": "gpu", "key": "GPU" },
+ { "type": "memory", "key": "RAM" },
+ { "type": "disk", "key": "Disk", "folders": "/" },
+ "separator",
+ { "type": "display", "key": "Display" },
+ { "type": "theme", "key": "Theme" },
+ { "type": "icons", "key": "Icons" },
+ "break",
+ "colors"
+ ]
+}
diff --git a/releng/airootfs/etc/skel/.config/fastfetch/config.jsonc b/releng/airootfs/etc/skel/.config/fastfetch/config.jsonc
new file mode 100644
index 0000000..f5f842d
--- /dev/null
+++ b/releng/airootfs/etc/skel/.config/fastfetch/config.jsonc
@@ -0,0 +1,93 @@
+{
+ "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
+ "logo": {
+ "source": "~/.config/fastfetch/raveos-logo.txt",
+ "type": "file",
+ "color": {
+ "1": "green",
+ "2": "36",
+ "3": "white"
+ },
+ "padding": {
+ "top": 1,
+ "left": 2,
+ "right": 3
+ }
+ },
+ "display": {
+ "separator": " → ",
+ "color": {
+ "keys": "green",
+ "title": "cyan"
+ }
+ },
+ "modules": [
+ "title",
+ "separator",
+ {
+ "type": "os",
+ "key": "OS"
+ },
+ {
+ "type": "kernel",
+ "key": "Kernel"
+ },
+ {
+ "type": "uptime",
+ "key": "Uptime"
+ },
+ {
+ "type": "packages",
+ "key": "Packages"
+ },
+ {
+ "type": "shell",
+ "key": "Shell"
+ },
+ {
+ "type": "de",
+ "key": "DE"
+ },
+ {
+ "type": "wm",
+ "key": "WM"
+ },
+ {
+ "type": "terminal",
+ "key": "Terminal"
+ },
+ "separator",
+ {
+ "type": "cpu",
+ "key": "CPU"
+ },
+ {
+ "type": "gpu",
+ "key": "GPU"
+ },
+ {
+ "type": "memory",
+ "key": "RAM"
+ },
+ {
+ "type": "disk",
+ "key": "Disk",
+ "folders": "/"
+ },
+ "separator",
+ {
+ "type": "display",
+ "key": "Display"
+ },
+ {
+ "type": "theme",
+ "key": "Theme"
+ },
+ {
+ "type": "icons",
+ "key": "Icons"
+ },
+ "break",
+ "colors"
+ ]
+}
diff --git a/releng/airootfs/etc/skel/.config/fastfetch/raveos-logo.png b/releng/airootfs/etc/skel/.config/fastfetch/raveos-logo.png
new file mode 100644
index 0000000..93ebb33
--- /dev/null
+++ b/releng/airootfs/etc/skel/.config/fastfetch/raveos-logo.png
Binary files differ
diff --git a/releng/airootfs/etc/skel/.config/fastfetch/raveos-logo.txt b/releng/airootfs/etc/skel/.config/fastfetch/raveos-logo.txt
new file mode 100644
index 0000000..41f87e2
--- /dev/null
+++ b/releng/airootfs/etc/skel/.config/fastfetch/raveos-logo.txt
@@ -0,0 +1,19 @@
+⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
+⠀⠀⠀⠀⠀⠀⢠⡀⠀⠀⠀⠀⠀⠀⡀⠀⣰⣾⣿⣿⣷⣄⠀⣠⠀⠀⠀⠀⠀⠀⢀⠄⠀⠀⠀⠀⠀⠀
+⠀⠀⠀⠀⠀⠀⠀⠙⣦⣄⡀⠠⡀⠀⣿⡆⠙⣿⣿⣿⡿⠃⢰⣧⠀⣀⠄⢀⣤⡴⠋⠀⠀⠀⠀⠀⠀⠀
+⠀⠀⠀⠀⠀⣀⠀⠑⢮⣙⠛⠂⠙⠀⡅⣹⣄⢸⣿⣿⡇⣠⡏⠁⠈⠉⠐⠟⣉⡵⠊⠀⣠⠀⠀⠀⠀⠀
+⠀⠀⠀⠀⠄⢈⣃⡀⠐⠿⣷⣦⣀⢰⣼⣈⣿⣾⣿⣿⣿⣿⢁⣥⡆⣠⣴⣾⠿⠂⢀⣀⠁⠀⠀⠀⠀⠀
+⠀⠀⠀⠀⠠⠤⠬⠿⠿⠷⠌⠻⢿⢷⡝⢿⣿⡌⣿⡿⢱⣿⡿⢫⡾⠿⠟⠡⠾⠿⠯⠥⠤⠄⠀⠀⠀⠀
+⠀⠀⠀⠙⠂⠈⠀⠀⠄⠀⠉⠀⠐⠶⢷⣦⣬⡁⠏⠷⢈⣥⣴⠿⠶⠂⠀⠉⠁⠀⠀⠀⠁⠘⠊⠂⠀⠀
+⠀⠀⠀⠀⢀⠄⢠⣴⣶⠀⠀⠀⢀⡀⠀⠉⠙⠃⣠⡄⠘⠉⠁⠀⢀⡀⠀⠀⢠⣶⣦⠀⠀⠀⠀⠀⠀⠀
+⠀⠀⠀⣠⠤⠌⠁⣩⣿⣇⡀⠢⣜⣛⠛⠀⠀⡴⢫⡝⣄⠀⠀⠛⢛⡡⠔⢀⣼⣯⣅⠈⠁⠤⡄⠀⠀⠀
+⠀⠀⠀⢀⡠⢴⠾⠉⢉⣿⣿⣷⣶⣭⣶⣾⡟⣱⣿⣿⡜⢻⣶⣦⣥⣶⣾⣿⣯⡉⠉⠷⡤⢄⠀⠀⠀⠀
+⠀⠀⠀⠀⠀⢀⡴⠂⢚⠟⢉⣾⠿⠛⢙⠉⣠⠈⢹⠇⠁⣄⢈⠋⠛⠿⣷⡉⠿⡓⡐⢦⡀⠀⠁⠀⠀⠀
+⠀⠀⠀⠀⠀⠒⢉⣵⣿⣷⣧⠆⢂⠶⢿⡽⠛⠰⣦⣴⠀⠛⣯⠿⡢⡐⠲⣽⣼⣿⣮⡙⠓⠀⠀⠄⠀⠀
+⠀⠀⢀⣴⠷⠂⣾⣿⠿⠛⣡⣾⡤⠀⠘⠁⢰⣴⣿⣿⣤⠀⠈⠃⠀⢤⣶⣌⠻⢿⣿⣧⠐⠾⣦⡀⠀⠀
+⠀⠀⠀⠀⠀⠘⠉⠀⢠⣼⠏⠋⣠⢠⡄⢀⠻⠉⣿⡿⠈⠟⡄⢰⡀⡀⠻⠹⣦⡀⠀⠉⠃⠀⠀⠀⠀⠀
+⠀⠀⠀⠀⠀⠀⠀⠂⠀⠁⠀⡄⡿⠀⢣⠀⠀⠐⡌⢡⠀⠈⢀⡌⠈⢧⠂⠀⠈⠀⠑⠀⠀⠀⠀⠀⠀⠀
+⢠⣤⣤⣤⣤⣄⣰⢠⣤⣴⣦⠟⣥⣦⣀⢳⣦⡆⣴⣦⣶⣴⣾⣄⠀⢈⣷⣶⣶⣦⣄⣄⣠⣴⣶⣦⣤⠀
+⢸⣿⣧⣤⣽⡿⢁⣿⣟⣹⣿⡄⠘⣿⣿⣾⡿⠀⣿⣿⣶⣶⣾⠋⠀⢾⣿⡍⠁⢹⣿⡎⠿⠷⠶⣶⣭⡀
+⠸⣿⠇⠙⢿⡦⢼⡿⠛⠛⢿⣷⠀⠹⣿⡿⠁⠀⢿⣿⣶⣶⣶⠆⠀⠘⠿⢷⣶⠿⠟⠀⠿⢿⣶⡾⠿⠃
+⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
diff --git a/releng/airootfs/etc/ssh/sshd_config.d/10-archiso.conf b/releng/airootfs/etc/ssh/sshd_config.d/10-archiso.conf
new file mode 100644
index 0000000..6ea7b41
--- /dev/null
+++ b/releng/airootfs/etc/ssh/sshd_config.d/10-archiso.conf
@@ -0,0 +1,3 @@
+# Allow root login using password authentication
+PasswordAuthentication yes
+PermitRootLogin yes
diff --git a/releng/airootfs/etc/sudoers b/releng/airootfs/etc/sudoers
new file mode 100644
index 0000000..faf0e3f
--- /dev/null
+++ b/releng/airootfs/etc/sudoers
@@ -0,0 +1,139 @@
+## sudoers file.
+##
+## This file MUST be edited with the 'visudo' command as root.
+## Failure to use 'visudo' may result in syntax or file permission errors
+## that prevent sudo from running.
+##
+## See the sudoers man page for the details on how to write a sudoers file.
+##
+
+##
+## Host alias specification
+##
+## Groups of machines. These may include host names (optionally with wildcards),
+## IP addresses, network numbers or netgroups.
+# Host_Alias WEBSERVERS = www1, www2, www3
+
+##
+## User alias specification
+##
+## Groups of users. These may consist of user names, uids, Unix groups,
+## or netgroups.
+# User_Alias ADMINS = millert, dowdy, mikef
+
+##
+## Cmnd alias specification
+##
+## Groups of commands. Often used to group related commands together.
+# Cmnd_Alias PROCESSES = /usr/bin/nice, /bin/kill, /usr/bin/renice, \
+# /usr/bin/pkill, /usr/bin/top
+#
+# Cmnd_Alias REBOOT = /sbin/halt, /sbin/reboot, /sbin/poweroff
+#
+# Cmnd_Alias DEBUGGERS = /usr/bin/gdb, /usr/bin/lldb, /usr/bin/strace, \
+# /usr/bin/truss, /usr/bin/bpftrace, \
+# /usr/bin/dtrace, /usr/bin/dtruss
+#
+# Cmnd_Alias PKGMAN = /usr/bin/apt, /usr/bin/dpkg, /usr/bin/rpm, \
+# /usr/bin/yum, /usr/bin/dnf, /usr/bin/zypper, \
+# /usr/bin/pacman
+
+##
+## Defaults specification
+##
+## Preserve editor environment variables for visudo.
+## To preserve these for all commands, remove the "!visudo" qualifier.
+Defaults!/usr/bin/visudo env_keep += "SUDO_EDITOR EDITOR VISUAL"
+##
+## Use a hard-coded PATH instead of the user's to find commands.
+## This also helps prevent poorly written scripts from running
+## arbitrary commands under sudo.
+Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/bin"
+##
+## You may wish to keep some of the following environment variables
+## when running commands via sudo.
+##
+## Locale settings
+# Defaults env_keep += "LANG LANGUAGE LINGUAS LC_* _XKB_CHARSET"
+##
+## Run X applications through sudo; HOME is used to find the
+## .Xauthority file. Note that other programs use HOME to find
+## configuration files and this may lead to privilege escalation!
+# Defaults env_keep += "HOME"
+##
+## X11 resource path settings
+# Defaults env_keep += "XAPPLRESDIR XFILESEARCHPATH XUSERFILESEARCHPATH"
+##
+## Desktop path settings
+# Defaults env_keep += "QTDIR KDEDIR"
+##
+## Allow sudo-run commands to inherit the callers' ConsoleKit session
+# Defaults env_keep += "XDG_SESSION_COOKIE"
+##
+## Uncomment to enable special input methods. Care should be taken as
+## this may allow users to subvert the command being run via sudo.
+# Defaults env_keep += "XMODIFIERS GTK_IM_MODULE QT_IM_MODULE QT_IM_SWITCHER"
+##
+## Uncomment to disable "use_pty" when running commands as root.
+## Commands run as non-root users will run in a pseudo-terminal,
+## not the user's own terminal, to prevent command injection.
+# Defaults>root !use_pty
+##
+## Uncomment to run commands in the background by default.
+## This can be used to prevent sudo from consuming user input while
+## a non-interactive command runs if "use_pty" or I/O logging are
+## enabled. Some commands may not run properly in the background.
+# Defaults exec_background
+##
+## Uncomment to send mail if the user does not enter the correct password.
+# Defaults mail_badpass
+##
+## Uncomment to enable logging of a command's output, except for
+## sudoreplay and reboot. Use sudoreplay to play back logged sessions.
+## Sudo will create up to 2,176,782,336 I/O logs before recycling them.
+## Set maxseq to a smaller number if you don't have unlimited disk space.
+# Defaults log_output
+# Defaults!/usr/bin/sudoreplay !log_output
+# Defaults!/usr/local/bin/sudoreplay !log_output
+# Defaults!REBOOT !log_output
+# Defaults maxseq = 1000
+##
+## Uncomment to disable intercept and log_subcmds for debuggers and
+## tracers. Otherwise, anything that uses ptrace(2) will be unable
+## to run under sudo if intercept_type is set to "trace".
+# Defaults!DEBUGGERS !intercept, !log_subcmds
+##
+## Uncomment to disable intercept and log_subcmds for package managers.
+## Some package scripts run a huge number of commands, which is made
+## slower by these options and also can clutter up the logs.
+# Defaults!PKGMAN !intercept, !log_subcmds
+##
+## Uncomment to disable PAM silent mode. Otherwise messages by PAM
+## modules such as pam_faillock will not be printed.
+# Defaults !pam_silent
+
+##
+## Runas alias specification
+##
+
+##
+## User privilege specification
+##
+root ALL=(ALL:ALL) ALL
+
+## Uncomment to allow members of group wheel to execute any command
+%wheel ALL=(ALL:ALL) ALL
+
+## Same thing without a password
+# %wheel ALL=(ALL:ALL) NOPASSWD: ALL
+
+## Uncomment to allow members of group sudo to execute any command
+# %sudo ALL=(ALL:ALL) ALL
+
+## Uncomment to allow any user to run sudo if they know the password
+## of the user they are running the command as (root by default).
+# Defaults targetpw # Ask for the password of the target user
+# ALL ALL=(ALL:ALL) ALL # WARNING: only use this together with 'Defaults targetpw'
+
+## Read drop-in files from /etc/sudoers.d
+@includedir /etc/sudoers.d
diff --git a/releng/airootfs/etc/systemd/journald.conf.d/volatile-storage.conf b/releng/airootfs/etc/systemd/journald.conf.d/volatile-storage.conf
new file mode 100644
index 0000000..b69850d
--- /dev/null
+++ b/releng/airootfs/etc/systemd/journald.conf.d/volatile-storage.conf
@@ -0,0 +1,2 @@
+[Journal]
+Storage=volatile
diff --git a/releng/airootfs/etc/systemd/logind.conf.d/do-not-suspend.conf b/releng/airootfs/etc/systemd/logind.conf.d/do-not-suspend.conf
new file mode 100644
index 0000000..f3ecb39
--- /dev/null
+++ b/releng/airootfs/etc/systemd/logind.conf.d/do-not-suspend.conf
@@ -0,0 +1,4 @@
+[Login]
+HandleSuspendKey=ignore
+HandleHibernateKey=ignore
+HandleLidSwitch=ignore
diff --git a/releng/airootfs/etc/systemd/network/20-ethernet.network b/releng/airootfs/etc/systemd/network/20-ethernet.network
new file mode 100644
index 0000000..d3a3271
--- /dev/null
+++ b/releng/airootfs/etc/systemd/network/20-ethernet.network
@@ -0,0 +1,24 @@
+[Match]
+# Matching with "Type=ether" causes issues with containers because it also matches virtual Ethernet interfaces (veth*).
+# See https://bugs.archlinux.org/task/70892
+# Instead match by globbing the network interface name.
+Name=en*
+Name=eth*
+
+[Link]
+RequiredForOnline=routable
+
+[Network]
+DHCP=yes
+MulticastDNS=yes
+
+# systemd-networkd does not set per-interface-type default route metrics
+# https://github.com/systemd/systemd/issues/17698
+# Explicitly set route metric, so that Ethernet is preferred over Wi-Fi and Wi-Fi is preferred over mobile broadband.
+# Use values from NetworkManager. From nm_device_get_route_metric_default in
+# https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/blob/main/src/core/devices/nm-device.c
+[DHCPv4]
+RouteMetric=100
+
+[IPv6AcceptRA]
+RouteMetric=100
diff --git a/releng/airootfs/etc/systemd/network/20-wlan.network.disabled b/releng/airootfs/etc/systemd/network/20-wlan.network.disabled
new file mode 100644
index 0000000..8b70a95
--- /dev/null
+++ b/releng/airootfs/etc/systemd/network/20-wlan.network.disabled
@@ -0,0 +1,20 @@
+[Match]
+Name=wl*
+
+[Link]
+RequiredForOnline=routable
+
+[Network]
+DHCP=yes
+MulticastDNS=yes
+
+# systemd-networkd does not set per-interface-type default route metrics
+# https://github.com/systemd/systemd/issues/17698
+# Explicitly set route metric, so that Ethernet is preferred over Wi-Fi and Wi-Fi is preferred over mobile broadband.
+# Use values from NetworkManager. From nm_device_get_route_metric_default in
+# https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/blob/main/src/core/devices/nm-device.c
+[DHCPv4]
+RouteMetric=600
+
+[IPv6AcceptRA]
+RouteMetric=600
diff --git a/releng/airootfs/etc/systemd/network/20-wwan.network b/releng/airootfs/etc/systemd/network/20-wwan.network
new file mode 100644
index 0000000..6e1c8dd
--- /dev/null
+++ b/releng/airootfs/etc/systemd/network/20-wwan.network
@@ -0,0 +1,19 @@
+[Match]
+Name=ww*
+
+[Link]
+RequiredForOnline=routable
+
+[Network]
+DHCP=yes
+
+# systemd-networkd does not set per-interface-type default route metrics
+# https://github.com/systemd/systemd/issues/17698
+# Explicitly set route metric, so that Ethernet is preferred over Wi-Fi and Wi-Fi is preferred over mobile broadband.
+# Use values from NetworkManager. From nm_device_get_route_metric_default in
+# https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/blob/main/src/core/devices/nm-device.c
+[DHCPv4]
+RouteMetric=700
+
+[IPv6AcceptRA]
+RouteMetric=700
diff --git a/releng/airootfs/etc/systemd/networkd.conf.d/ipv6-privacy-extensions.conf b/releng/airootfs/etc/systemd/networkd.conf.d/ipv6-privacy-extensions.conf
new file mode 100644
index 0000000..0e9ceb4
--- /dev/null
+++ b/releng/airootfs/etc/systemd/networkd.conf.d/ipv6-privacy-extensions.conf
@@ -0,0 +1,2 @@
+[Network]
+IPv6PrivacyExtensions=yes
diff --git a/releng/airootfs/etc/systemd/resolved.conf.d/archiso.conf b/releng/airootfs/etc/systemd/resolved.conf.d/archiso.conf
new file mode 100644
index 0000000..636f3bd
--- /dev/null
+++ b/releng/airootfs/etc/systemd/resolved.conf.d/archiso.conf
@@ -0,0 +1,4 @@
+# Default systemd-resolved configuration for archiso
+
+[Resolve]
+MulticastDNS=yes
diff --git a/releng/airootfs/etc/systemd/system-generators/systemd-gpt-auto-generator b/releng/airootfs/etc/systemd/system-generators/systemd-gpt-auto-generator
new file mode 120000
index 0000000..dc1dc0c
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system-generators/systemd-gpt-auto-generator
@@ -0,0 +1 @@
+/dev/null \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/choose-mirror.service b/releng/airootfs/etc/systemd/system/choose-mirror.service
new file mode 100644
index 0000000..b6a3562
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/choose-mirror.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Choose mirror from the kernel command line
+ConditionKernelCommandLine=mirror
+
+[Service]
+Type=oneshot
+ExecStart=/usr/local/bin/choose-mirror
+
+[Install]
+WantedBy=multi-user.target
diff --git a/releng/airootfs/etc/systemd/system/cloud-init.target.wants/cloud-config.service b/releng/airootfs/etc/systemd/system/cloud-init.target.wants/cloud-config.service
new file mode 120000
index 0000000..ebc50f0
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/cloud-init.target.wants/cloud-config.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/cloud-config.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/cloud-init.target.wants/cloud-final.service b/releng/airootfs/etc/systemd/system/cloud-init.target.wants/cloud-final.service
new file mode 120000
index 0000000..80fa3c8
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/cloud-init.target.wants/cloud-final.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/cloud-final.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/cloud-init.target.wants/cloud-init-local.service b/releng/airootfs/etc/systemd/system/cloud-init.target.wants/cloud-init-local.service
new file mode 120000
index 0000000..dd8e9f1
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/cloud-init.target.wants/cloud-init-local.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/cloud-init-local.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/cloud-init.target.wants/cloud-init-main.service b/releng/airootfs/etc/systemd/system/cloud-init.target.wants/cloud-init-main.service
new file mode 120000
index 0000000..875ff73
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/cloud-init.target.wants/cloud-init-main.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/cloud-init-main.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/cloud-init.target.wants/cloud-init-network.service b/releng/airootfs/etc/systemd/system/cloud-init.target.wants/cloud-init-network.service
new file mode 120000
index 0000000..ae77734
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/cloud-init.target.wants/cloud-init-network.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/cloud-init-network.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/dbus-org.freedesktop.ModemManager1.service b/releng/airootfs/etc/systemd/system/dbus-org.freedesktop.ModemManager1.service
new file mode 120000
index 0000000..dcf7c8e
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/dbus-org.freedesktop.ModemManager1.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/ModemManager.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/dbus-org.freedesktop.network1.service b/releng/airootfs/etc/systemd/system/dbus-org.freedesktop.network1.service
new file mode 120000
index 0000000..4c158e6
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/dbus-org.freedesktop.network1.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/systemd-networkd.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/dbus-org.freedesktop.resolve1.service b/releng/airootfs/etc/systemd/system/dbus-org.freedesktop.resolve1.service
new file mode 120000
index 0000000..4f6ae34
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/dbus-org.freedesktop.resolve1.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/systemd-resolved.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/dbus-org.freedesktop.timesync1.service b/releng/airootfs/etc/systemd/system/dbus-org.freedesktop.timesync1.service
new file mode 120000
index 0000000..cd00411
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/dbus-org.freedesktop.timesync1.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/systemd-timesyncd.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/etc-pacman.d-gnupg.mount b/releng/airootfs/etc/systemd/system/etc-pacman.d-gnupg.mount
new file mode 100644
index 0000000..038961e
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/etc-pacman.d-gnupg.mount
@@ -0,0 +1,8 @@
+[Unit]
+Description=Temporary /etc/pacman.d/gnupg directory
+
+[Mount]
+What=tmpfs
+Where=/etc/pacman.d/gnupg
+Type=tmpfs
+Options=mode=0755,noswap
diff --git a/releng/airootfs/etc/systemd/system/getty@tty1.service.d/autologin.conf b/releng/airootfs/etc/systemd/system/getty@tty1.service.d/autologin.conf
new file mode 100644
index 0000000..b9d22eb
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/getty@tty1.service.d/autologin.conf
@@ -0,0 +1,3 @@
+[Service]
+ExecStart=
+ExecStart=-/sbin/agetty -o '-p -f -- \\u' --noclear --autologin root - $TERM
diff --git a/releng/airootfs/etc/systemd/system/livecd-alsa-unmuter.service b/releng/airootfs/etc/systemd/system/livecd-alsa-unmuter.service
new file mode 100644
index 0000000..03db4b9
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/livecd-alsa-unmuter.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Unmute All Sound Card Controls For Use With The Live Arch Environment
+# This needs to run after the audio device becomes available.
+Wants=systemd-udev-settle.service
+After=systemd-udev-settle.service sound.target
+ConditionKernelCommandLine=accessibility=on
+
+[Service]
+Type=oneshot
+ExecStart=/usr/local/bin/livecd-sound -u
+
+[Install]
+WantedBy=sound.target
diff --git a/releng/airootfs/etc/systemd/system/livecd-talk.service b/releng/airootfs/etc/systemd/system/livecd-talk.service
new file mode 100644
index 0000000..b38df22
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/livecd-talk.service
@@ -0,0 +1,20 @@
+[Unit]
+Description=Screen reader service
+After=livecd-alsa-unmuter.service
+Before=getty@tty1.service
+ConditionKernelCommandLine=accessibility=on
+
+[Service]
+Type=oneshot
+TTYPath=/dev/tty13
+ExecStartPre=/usr/bin/chvt 13
+ExecStart=/usr/local/bin/livecd-sound -p
+ExecStartPost=/usr/bin/chvt 1
+ExecStartPost=systemctl start espeakup.service
+StandardInput=tty
+TTYVHangup=yes
+TTYVTDisallocate=yes
+RemainAfterExit=true
+
+[Install]
+WantedBy=multi-user.target
diff --git a/releng/airootfs/etc/systemd/system/multi-user.target.wants/ModemManager.service b/releng/airootfs/etc/systemd/system/multi-user.target.wants/ModemManager.service
new file mode 120000
index 0000000..dcf7c8e
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/multi-user.target.wants/ModemManager.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/ModemManager.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/multi-user.target.wants/NetworkManager.service b/releng/airootfs/etc/systemd/system/multi-user.target.wants/NetworkManager.service
new file mode 120000
index 0000000..e874a9b
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/multi-user.target.wants/NetworkManager.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/NetworkManager.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/multi-user.target.wants/choose-mirror.service b/releng/airootfs/etc/systemd/system/multi-user.target.wants/choose-mirror.service
new file mode 120000
index 0000000..2d8d256
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/multi-user.target.wants/choose-mirror.service
@@ -0,0 +1 @@
+../choose-mirror.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/multi-user.target.wants/hv_fcopy_daemon.service b/releng/airootfs/etc/systemd/system/multi-user.target.wants/hv_fcopy_daemon.service
new file mode 120000
index 0000000..20ac7b2
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/multi-user.target.wants/hv_fcopy_daemon.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/hv_fcopy_daemon.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/multi-user.target.wants/hv_kvp_daemon.service b/releng/airootfs/etc/systemd/system/multi-user.target.wants/hv_kvp_daemon.service
new file mode 120000
index 0000000..a7eac4a
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/multi-user.target.wants/hv_kvp_daemon.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/hv_kvp_daemon.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/multi-user.target.wants/hv_vss_daemon.service b/releng/airootfs/etc/systemd/system/multi-user.target.wants/hv_vss_daemon.service
new file mode 120000
index 0000000..eae19ef
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/multi-user.target.wants/hv_vss_daemon.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/hv_vss_daemon.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/multi-user.target.wants/iwd.service b/releng/airootfs/etc/systemd/system/multi-user.target.wants/iwd.service
new file mode 120000
index 0000000..3625abd
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/multi-user.target.wants/iwd.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/iwd.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/multi-user.target.wants/livecd-talk.service b/releng/airootfs/etc/systemd/system/multi-user.target.wants/livecd-talk.service
new file mode 120000
index 0000000..b917481
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/multi-user.target.wants/livecd-talk.service
@@ -0,0 +1 @@
+/etc/systemd/system/livecd-talk.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/multi-user.target.wants/pacman-init.service b/releng/airootfs/etc/systemd/system/multi-user.target.wants/pacman-init.service
new file mode 120000
index 0000000..d09eec6
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/multi-user.target.wants/pacman-init.service
@@ -0,0 +1 @@
+../pacman-init.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/multi-user.target.wants/reflector-once.service b/releng/airootfs/etc/systemd/system/multi-user.target.wants/reflector-once.service
new file mode 120000
index 0000000..d1b7b88
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/multi-user.target.wants/reflector-once.service
@@ -0,0 +1 @@
+../reflector-once.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/multi-user.target.wants/sshd.service b/releng/airootfs/etc/systemd/system/multi-user.target.wants/sshd.service
new file mode 120000
index 0000000..d21ebd9
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/multi-user.target.wants/sshd.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/sshd.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/multi-user.target.wants/systemd-resolved.service b/releng/airootfs/etc/systemd/system/multi-user.target.wants/systemd-resolved.service
new file mode 120000
index 0000000..4f6ae34
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/multi-user.target.wants/systemd-resolved.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/systemd-resolved.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/multi-user.target.wants/vboxservice.service b/releng/airootfs/etc/systemd/system/multi-user.target.wants/vboxservice.service
new file mode 120000
index 0000000..cb2d560
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/multi-user.target.wants/vboxservice.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/vboxservice.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/multi-user.target.wants/vmtoolsd.service b/releng/airootfs/etc/systemd/system/multi-user.target.wants/vmtoolsd.service
new file mode 120000
index 0000000..e0a11a7
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/multi-user.target.wants/vmtoolsd.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/vmtoolsd.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/multi-user.target.wants/vmware-vmblock-fuse.service b/releng/airootfs/etc/systemd/system/multi-user.target.wants/vmware-vmblock-fuse.service
new file mode 120000
index 0000000..173f306
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/multi-user.target.wants/vmware-vmblock-fuse.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/vmware-vmblock-fuse.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service b/releng/airootfs/etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service
new file mode 120000
index 0000000..7d6ad92
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/systemd-networkd-wait-online.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/pacman-init.service b/releng/airootfs/etc/systemd/system/pacman-init.service
new file mode 100644
index 0000000..82e0e0f
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/pacman-init.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=Initializes Pacman keyring
+Requires=etc-pacman.d-gnupg.mount
+Wants=network-online.target
+After=etc-pacman.d-gnupg.mount time-sync.target network-online.target
+BindsTo=etc-pacman.d-gnupg.mount
+Before=archlinux-keyring-wkd-sync.service
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/pacman-key --init
+ExecStart=/usr/bin/pacman-key --populate
+
+[Install]
+WantedBy=multi-user.target
diff --git a/releng/airootfs/etc/systemd/system/reflector-once.service b/releng/airootfs/etc/systemd/system/reflector-once.service
new file mode 100644
index 0000000..5a73044
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/reflector-once.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Update pacman mirrorlist with reflector
+Wants=network-online.target
+After=network-online.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/reflector -c HU --protocol https --sort rate --latest 20 --download-timeout 5 --threads 20 --save /etc/pacman.d/mirrorlist
+
+[Install]
+WantedBy=multi-user.target
diff --git a/releng/airootfs/etc/systemd/system/sockets.target.wants/pcscd.socket b/releng/airootfs/etc/systemd/system/sockets.target.wants/pcscd.socket
new file mode 120000
index 0000000..3897c63
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/sockets.target.wants/pcscd.socket
@@ -0,0 +1 @@
+/usr/lib/systemd/system/pcscd.socket \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/sockets.target.wants/systemd-networkd.socket b/releng/airootfs/etc/systemd/system/sockets.target.wants/systemd-networkd.socket
new file mode 120000
index 0000000..51942c8
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/sockets.target.wants/systemd-networkd.socket
@@ -0,0 +1 @@
+/usr/lib/systemd/system/systemd-networkd.socket \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/sound.target.wants/livecd-alsa-unmuter.service b/releng/airootfs/etc/systemd/system/sound.target.wants/livecd-alsa-unmuter.service
new file mode 120000
index 0000000..98c0fc8
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/sound.target.wants/livecd-alsa-unmuter.service
@@ -0,0 +1 @@
+../livecd-alsa-unmuter.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/sysinit.target.wants/systemd-time-wait-sync.service b/releng/airootfs/etc/systemd/system/sysinit.target.wants/systemd-time-wait-sync.service
new file mode 120000
index 0000000..cabf28b
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/sysinit.target.wants/systemd-time-wait-sync.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/systemd-time-wait-sync.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/sysinit.target.wants/systemd-timesyncd.service b/releng/airootfs/etc/systemd/system/sysinit.target.wants/systemd-timesyncd.service
new file mode 120000
index 0000000..cd00411
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/sysinit.target.wants/systemd-timesyncd.service
@@ -0,0 +1 @@
+/usr/lib/systemd/system/systemd-timesyncd.service \ No newline at end of file
diff --git a/releng/airootfs/etc/systemd/system/systemd-networkd-wait-online.service.d/wait-for-only-one-interface.conf b/releng/airootfs/etc/systemd/system/systemd-networkd-wait-online.service.d/wait-for-only-one-interface.conf
new file mode 100644
index 0000000..c9f9bce
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/systemd-networkd-wait-online.service.d/wait-for-only-one-interface.conf
@@ -0,0 +1,6 @@
+# Allow systemd-networkd-wait-online to succeed with one interface, otherwise, if multiple network interfaces exist,
+# network-online.target gets needlessly delayed.
+# See https://wiki.archlinux.org/title/systemd-networkd#systemd-networkd-wait-online
+[Service]
+ExecStart=
+ExecStart=/usr/lib/systemd/systemd-networkd-wait-online --any
diff --git a/releng/airootfs/etc/systemd/system/wpa_supplicant.service b/releng/airootfs/etc/systemd/system/wpa_supplicant.service
new file mode 120000
index 0000000..dc1dc0c
--- /dev/null
+++ b/releng/airootfs/etc/systemd/system/wpa_supplicant.service
@@ -0,0 +1 @@
+/dev/null \ No newline at end of file
diff --git a/releng/airootfs/root/.automated_script.sh b/releng/airootfs/root/.automated_script.sh
new file mode 100755
index 0000000..f7f3ced
--- /dev/null
+++ b/releng/airootfs/root/.automated_script.sh
@@ -0,0 +1,44 @@
+#!/usr/bin/env bash
+
+script_cmdline() {
+ local param
+ for param in $(</proc/cmdline); do
+ case "${param}" in
+ script=*)
+ echo "${param#*=}"
+ return 0
+ ;;
+ esac
+ done
+}
+
+automated_script() {
+ local script rt
+ script="$(script_cmdline)"
+ if [[ -n "${script}" && ! -x /tmp/startup_script ]]; then
+ if [[ "${script}" =~ ^((http|https|ftp|tftp)://) ]]; then
+ # there's no synchronization for network availability before executing this script
+ printf '%s: waiting for network-online.target\n' "$0"
+ until systemctl --quiet is-active network-online.target; do
+ sleep 1
+ done
+ printf '%s: downloading %s\n' "$0" "${script}"
+ curl "${script}" --location --retry-connrefused --retry 10 --fail -s -o /tmp/startup_script
+ rt=$?
+ else
+ cp "${script}" /tmp/startup_script
+ rt=$?
+ fi
+ if [[ ${rt} -eq 0 ]]; then
+ chmod +x /tmp/startup_script
+ printf '%s: executing automated script\n' "$0"
+ # note that script is executed when other services (like pacman-init) may be still in progress, please
+ # synchronize to "systemctl is-system-running --wait" when your script depends on other services
+ /tmp/startup_script
+ fi
+ fi
+}
+
+if [[ $(tty) == "/dev/tty1" ]]; then
+ automated_script
+fi
diff --git a/releng/airootfs/root/.config/openbox/autostart b/releng/airootfs/root/.config/openbox/autostart
new file mode 100755
index 0000000..b1180b2
--- /dev/null
+++ b/releng/airootfs/root/.config/openbox/autostart
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+xset s off
+xset -dpms
+xset s noblank
+
+# Launch Calamares fullscreen
+calamares &
diff --git a/releng/airootfs/root/.config/openbox/menu.xml b/releng/airootfs/root/.config/openbox/menu.xml
new file mode 100644
index 0000000..53c742e
--- /dev/null
+++ b/releng/airootfs/root/.config/openbox/menu.xml
@@ -0,0 +1,22 @@
+
+<?xml version="1.0" encoding="UTF-8"?>
+<openbox_menu>
+ <menu id="root-menu" label="Openbox">
+ <item label="Terminal">
+ <action name="Execute">
+ <command>xterm</command>
+ </action>
+ </item>
+ <item label="Installer">
+ <action name="Execute">
+ <command>calamares</command>
+ </action>
+ </item>
+ <separator/>
+ <item label="Reboot">
+ <action name="Execute">
+ <command>systemctl reboot</command>
+ </action>
+ </item>
+ </menu>
+</openbox_menu>
diff --git a/releng/airootfs/root/.config/openbox/rc.xml b/releng/airootfs/root/.config/openbox/rc.xml
new file mode 100644
index 0000000..6fb7896
--- /dev/null
+++ b/releng/airootfs/root/.config/openbox/rc.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openbox_config>
+ <theme>
+ <name>Clearlooks</name>
+
+ <font place="ActiveWindow">
+ <name>Noto Sans</name>
+ <size>10</size>
+ <weight>Bold</weight>
+ <slant>Normal</slant>
+ </font>
+
+ <font place="InactiveWindow">
+ <name>Noto Sans</name>
+ <size>10</size>
+ <weight>Normal</weight>
+ <slant>Normal</slant>
+ </font>
+
+ <font place="MenuHeader">
+ <name>Noto Sans</name>
+ <size>10</size>
+ <weight>Bold</weight>
+ <slant>Normal</slant>
+ </font>
+
+ <font place="MenuItem">
+ <name>Noto Sans</name>
+ <size>10</size>
+ <weight>Normal</weight>
+ <slant>Normal</slant>
+ </font>
+
+ <font place="OnScreenDisplay">
+ <name>Noto Sans</name>
+ <size>10</size>
+ <weight>Normal</weight>
+ <slant>Normal</slant>
+ </font>
+ </theme>
+<applications>
+ <application class="*">
+ <decor>no</decor>
+ </application>
+</applications>
+</openbox_config> \ No newline at end of file
diff --git a/releng/airootfs/root/.gnupg/scdaemon.conf b/releng/airootfs/root/.gnupg/scdaemon.conf
new file mode 100644
index 0000000..e1f3d1f
--- /dev/null
+++ b/releng/airootfs/root/.gnupg/scdaemon.conf
@@ -0,0 +1,4 @@
+disable-ccid
+disable-pinpad
+pcsc-driver /usr/lib/libpcsclite.so
+pcsc-shared
diff --git a/releng/airootfs/root/.loader.conf b/releng/airootfs/root/.loader.conf
new file mode 100755
index 0000000..0ca44c8
--- /dev/null
+++ b/releng/airootfs/root/.loader.conf
@@ -0,0 +1,4 @@
+default raveos.conf
+timeout 3
+editor no
+
diff --git a/releng/airootfs/root/.xinitrc b/releng/airootfs/root/.xinitrc
new file mode 100644
index 0000000..2c21291
--- /dev/null
+++ b/releng/airootfs/root/.xinitrc
@@ -0,0 +1 @@
+exec openbox-session
diff --git a/releng/airootfs/root/.zlogin b/releng/airootfs/root/.zlogin
new file mode 100644
index 0000000..bf6bc8f
--- /dev/null
+++ b/releng/airootfs/root/.zlogin
@@ -0,0 +1,6 @@
+# fix for screen readers
+if grep -Fqa 'accessibility=' /proc/cmdline &> /dev/null; then
+ setopt SINGLE_LINE_ZLE
+fi
+
+~/.automated_script.sh
diff --git a/releng/airootfs/usr/local/bin/Installation_guide b/releng/airootfs/usr/local/bin/Installation_guide
new file mode 100755
index 0000000..58b97b0
--- /dev/null
+++ b/releng/airootfs/usr/local/bin/Installation_guide
@@ -0,0 +1,5 @@
+#!/bin/sh
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+exec xdg-open 'https://wiki.archlinux.org/title/Installation_guide'
diff --git a/releng/airootfs/usr/local/bin/choose-mirror b/releng/airootfs/usr/local/bin/choose-mirror
new file mode 100755
index 0000000..d2349de
--- /dev/null
+++ b/releng/airootfs/usr/local/bin/choose-mirror
@@ -0,0 +1,29 @@
+#!/bin/bash
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+get_cmdline() {
+ local param
+ for param in $(</proc/cmdline); do
+ case "${param}" in
+ "${1}="*)
+ echo "${param##*=}"
+ return 0
+ ;;
+ esac
+ done
+}
+
+mirror="$(get_cmdline mirror)"
+[[ "$mirror" == 'auto' ]] && mirror="$(get_cmdline archiso_http_srv)"
+[[ -n "$mirror" ]] || exit 0
+
+mv /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.orig
+cat >/etc/pacman.d/mirrorlist <<EOF
+#
+# Arch Linux repository mirrorlist
+# Generated by archiso
+#
+
+Server = ${mirror%%/}/\$repo/os/\$arch
+EOF
diff --git a/releng/airootfs/usr/local/bin/livecd-sound b/releng/airootfs/usr/local/bin/livecd-sound
new file mode 100755
index 0000000..b92fcf2
--- /dev/null
+++ b/releng/airootfs/usr/local/bin/livecd-sound
@@ -0,0 +1,239 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+usage() {
+ cat <<-_EOF_
+ live cd sound helper script.
+ Usage: livecdsound [OPTION]
+ OPTIONS
+ -u, --unmute unmute all sound cards
+ -p, --pick select a card for speetch output
+ -h, --help Show this usage message
+
+_EOF_
+}
+
+bugout() {
+ printf "/usr/local/bin/livecdsound: programming error"
+ stat_fail
+}
+
+echo_card_indices() {
+ if [[ -f /proc/asound/cards ]]; then
+ sed -n -e's/^[[:space:]]*\([0-7]\)[[:space:]].*/\1/p' /proc/asound/cards
+ fi
+}
+
+# The following functions try to set many controls.
+# No card has all the controls and so some of the attempts are bound to fail.
+# Because of this, the functions can't return useful status values.
+
+# $1 <card id>
+# $2 <control>
+# $3 <level>
+unmute_and_set_level() {
+ [[ -n "$3" && -n "$2" && -n "$1" ]] || bugout
+ systemd-cat -t "livecdsound" printf "Setting: %s on card: %s to %s\n" "$2" "$1" "$3"
+ systemd-cat -t "livecdsound" amixer -c "$1" set "$2" "$3" unmute
+ return 0
+}
+
+# $1 <card id>
+# $2 <control>
+mute_and_zero_level() {
+ [[ -n "$1" && -n "$2" ]] || bugout
+ systemd-cat -t "livecdsound" printf "Muting control: %s on card: %s\n" "$2" "$1"
+ systemd-cat -t "livecdsound" amixer -c "$1" set "$2" "0%" mute
+ return 0
+}
+
+# $1 <card ID>
+# $2 <control>
+# $3 "on" | "off"
+switch_control() {
+ [[ -n "$3" && -n "$1" ]] || bugout
+ systemd-cat -t "livecdsound" printf "Switching control: %s on card: %s to %s\n" "$2" "$1" "$3"
+ systemd-cat -t "livecdsound" amixer -c "$1" set "$2" "$3"
+ return 0
+}
+
+# $1 <card ID>
+sanify_levels_on_card() {
+ unmute_and_set_level "$1" "Front" "80%"
+ unmute_and_set_level "$1" "Master" "80%"
+ unmute_and_set_level "$1" "Master Mono" "80%"
+ unmute_and_set_level "$1" "Master Digital" "80%" # E.g., cs4237B
+ unmute_and_set_level "$1" "Playback" "80%"
+ unmute_and_set_level "$1" "Headphone" "100%"
+ unmute_and_set_level "$1" "PCM" "80%"
+ unmute_and_set_level "$1" "PCM,1" "80%" # E.g., ess1969
+ unmute_and_set_level "$1" "DAC" "80%" # E.g., envy24, cs46xx
+ unmute_and_set_level "$1" "DAC,0" "80%" # E.g., envy24
+ unmute_and_set_level "$1" "DAC,1" "80%" # E.g., envy24
+ unmute_and_set_level "$1" "Synth" "80%"
+ unmute_and_set_level "$1" "CD" "80%"
+ unmute_and_set_level "$1" "PC Speaker" "100%"
+
+ mute_and_zero_level "$1" "Mic"
+ mute_and_zero_level "$1" "IEC958" # Ubuntu #19648
+
+ # Intel P4P800-MX
+ switch_control "$1" "Master Playback Switch" on
+ switch_control "$1" "Master Surround" on
+
+ # Trident/YMFPCI/emu10k1:
+ unmute_and_set_level "$1" "Wave" "80%"
+ unmute_and_set_level "$1" "Music" "80%"
+ unmute_and_set_level "$1" "AC97" "80%"
+
+ # DRC:
+ unmute_and_set_level "$1" "Dynamic Range Compression" "80%"
+
+ # Required for HDA Intel (hda-intel):
+ unmute_and_set_level "$1" "Front" "80%"
+
+ # Required for SB Live 7.1/24-bit (ca0106):
+ unmute_and_set_level "$1" "Analog Front" "80%"
+
+ # Required at least for Via 823x hardware on DFI K8M800-MLVF Motherboard
+ switch_control "$1" "IEC958 Capture Monitor" off
+
+ # Required for hardware allowing toggles for AC97 through IEC958,
+ # valid values are 0, 1, 2, 3. Needs to be set to 0 for PCM1.
+ unmute_and_set_level "$1" "IEC958 Playback AC97-SPSA" "0"
+
+ # Required for newer Via hardware
+ unmute_and_set_level "$1" "VIA DXS,0" "80%"
+ unmute_and_set_level "$1" "VIA DXS,1" "80%"
+ unmute_and_set_level "$1" "VIA DXS,2" "80%"
+ unmute_and_set_level "$1" "VIA DXS,3" "80%"
+
+ # Required on some notebooks with ICH4:
+ switch_control "$1" "Headphone Jack Sense" off
+ switch_control "$1" "Line Jack Sense" off
+
+ # Some machines need one or more of these to be on;
+ # others need one or more of these to be off:
+
+ switch_control "$1" "Audigy Analog/Digital Output Jack" on
+ switch_control "$1" "SB Live Analog/Digital Output Jack" on
+
+ # D1984 -- Thinkpad T61/X61
+ switch_control "$1" "Speaker" on
+ switch_control "$1" "Headphone" on
+
+ # HDA-Intel w/ "Digital" capture mixer (See Ubuntu #193823)
+ unmute_and_set_level "$1" "Digital" "80%"
+
+ return 0
+}
+
+# $1 <card ID> | "all"
+sanify_levels() {
+ local ttsdml_returnstatus=0
+ local card
+ case "$1" in
+ all)
+ for card in $(echo_card_indices); do
+ sanify_levels_on_card "$card" || ttsdml_returnstatus=1
+ done
+ ;;
+ *)
+ sanify_levels_on_card "$1" || ttsdml_returnstatus=1
+ ;;
+ esac
+ return "$ttsdml_returnstatus"
+}
+
+# List all cards that *should* be usable for PCM audio. In my experience,
+# the console speaker (handled by the pcsp driver) isn't a suitable playback
+# device, so we'll exclude it.
+list_non_pcsp_cards() {
+ for card in $(echo_card_indices); do
+ local cardfile="/proc/asound/card${card}/id"
+ if [[ -r "$cardfile" && -f "$cardfile" && "$(cat "$cardfile")" != pcsp ]]; then
+ echo "$card"
+ fi
+ done
+}
+
+# Properly initialize the sound card so that we have audio at boot.
+unmute_all_cards() {
+ sanify_levels all
+}
+
+is_numeric() {
+ local str="$1"
+ [[ "$str" =~ ^[0-9]+$ ]]
+}
+
+set_default_card() {
+ local card="$1"
+ sed -e "s/%card%/$card/g" </usr/local/share/livecd-sound/asound.conf.in \
+ >/etc/asound.conf
+}
+
+play_on_card() {
+ local card="$1" file="$2"
+ aplay -q "-Dplughw:$card,0" "$file"
+}
+
+# If there are multiple usable sound cards, prompt the user to choose one,
+# using auditory feedback.
+pick_a_card() {
+ set -f
+ usable_cards="$(list_non_pcsp_cards)"
+ num_usable_cards="$(wc -w <<<"$usable_cards")"
+
+ if (( num_usable_cards == 1 )); then
+ systemd-cat -t "livecdsound" printf "Only one sound card is detected\n"
+ exit 0
+ fi
+ systemd-cat -t "livecdsound" printf "multiple sound cards detected\n"
+ for card in "${usable_cards[@]}"; do
+ if ! is_numeric "$card"; then
+ continue
+ fi
+ play_on_card "$card" /usr/share/livecd-sounds/pick-a-card.wav &
+ done
+ wait
+ sleep 1
+ for card in "${usable_cards[@]}"; do
+ if ! is_numeric "$card"; then
+ continue
+ fi
+ play_on_card "$card" /usr/share/livecd-sounds/beep.wav
+ if read -r -t 10; then
+ systemd-cat -t "livecdsound" printf "Selecting %s sound card as default\n" "$card"
+ set_default_card "$card"
+ break
+ fi
+ done
+}
+
+if (( $# == 0 )); then
+ echo "error: No argument passed."
+ exit 1
+fi
+while [[ "${1}" != "" ]]; do
+ case ${1} in
+ -h|--help)
+ usage
+ exit
+ ;;
+ -u|--unmute)
+ systemd-cat -t "livecdsound" printf "Unmuting all cards"
+ unmute_all_cards
+ ;;
+ -p|--pick)
+ pick_a_card
+ ;;
+ *)
+ echo "error: Unsupported argument"
+ usage
+ exit 1
+ ;;
+ esac
+ shift
+done
diff --git a/releng/airootfs/usr/local/share/livecd-sound/asound.conf.in b/releng/airootfs/usr/local/share/livecd-sound/asound.conf.in
new file mode 100644
index 0000000..3f9c7aa
--- /dev/null
+++ b/releng/airootfs/usr/local/share/livecd-sound/asound.conf.in
@@ -0,0 +1,3 @@
+Defaults node
+defaults.ctl.card %card%;
+defaults.pcm.card %card%;
diff --git a/releng/airootfs/usr/share/calamares/kernel-install/95-raveos.install b/releng/airootfs/usr/share/calamares/kernel-install/95-raveos.install
new file mode 100755
index 0000000..fc31285
--- /dev/null
+++ b/releng/airootfs/usr/share/calamares/kernel-install/95-raveos.install
@@ -0,0 +1,84 @@
+#!/bin/bash
+# Single-entry, systemd-compliant kernel-install hook for CachyOS
+
+set -e
+
+COMMAND="$1" # add | remove
+KERNEL_VERSION="$2" # e.g. 6.18.4-1-cachyos
+
+# Only act on CachyOS kernels
+case "$KERNEL_VERSION" in
+ *cachyos*) ;;
+ *) exit 0 ;;
+esac
+
+BOOT_ROOT="${KERNEL_INSTALL_BOOT_ROOT:-/boot}"
+ENTRY_DIR="$BOOT_ROOT/loader/entries"
+ENTRY_FILE="$ENTRY_DIR/raveos.conf"
+
+# --------------------------------------------------
+# Fixed CachyOS kernel paths (non-versioned)
+# --------------------------------------------------
+LINUX_IMAGE="/vmlinuz-linux-cachyos"
+INITRAMFS_IMAGE="/initramfs-linux-cachyos.img"
+
+# --------------------------------------------------
+# Microcode (must be first initrd)
+# --------------------------------------------------
+MICROCODE=""
+[ -f "$BOOT_ROOT/intel-ucode.img" ] && MICROCODE="/intel-ucode.img"
+[ -f "$BOOT_ROOT/amd-ucode.img" ] && MICROCODE="/amd-ucode.img"
+
+# --------------------------------------------------
+# Root device detection
+# --------------------------------------------------
+ROOT_SRC="$(findmnt -no SOURCE /)"
+ROOT_FS="$(findmnt -no FSTYPE /)"
+ROOT_OPTS="$(findmnt -no OPTIONS /)"
+
+OPTIONS="rw quiet"
+
+# LUKS
+if [[ "$ROOT_SRC" == /dev/mapper/* ]]; then
+ UUID="$(blkid -s UUID -o value "$ROOT_SRC" || true)"
+ if [ -n "$UUID" ]; then
+ OPTIONS="cryptdevice=UUID=$UUID:cryptroot root=/dev/mapper/cryptroot $OPTIONS"
+ else
+ OPTIONS="root=$ROOT_SRC $OPTIONS"
+ fi
+else
+ PARTUUID="$(blkid -s PARTUUID -o value "$ROOT_SRC" || true)"
+ [ -n "$PARTUUID" ] && OPTIONS="root=PARTUUID=$PARTUUID $OPTIONS"
+fi
+
+# --------------------------------------------------
+# Btrfs subvolume support
+# --------------------------------------------------
+if [ "$ROOT_FS" = "btrfs" ]; then
+ SUBVOL="$(echo "$ROOT_OPTS" | tr ',' '\n' | grep '^subvol=' || true)"
+ [ -n "$SUBVOL" ] && OPTIONS="$OPTIONS rootflags=$SUBVOL"
+fi
+
+mkdir -p "$ENTRY_DIR"
+
+case "$COMMAND" in
+ add)
+ {
+ echo "title RaveOS Linux (CachyOS Kernel)"
+ echo "linux $LINUX_IMAGE"
+ [ -n "$MICROCODE" ] && echo "initrd $MICROCODE"
+ echo "initrd $INITRAMFS_IMAGE"
+ echo "options $OPTIONS"
+ } > "$ENTRY_FILE"
+ ;;
+
+ remove)
+ # Only remove entry if this was the last CachyOS kernel
+ rm -f "$ENTRY_FILE"
+ ;;
+
+ *)
+ exit 0
+ ;;
+esac
+