Changelog¶
Historical changes before I went rogue: h8d13 commits master
0.1.11-0¶
- Documentation moved to MkDocs + Material, published to GitHub Pages via Actions
- Source stays in-repo (`.github/*.md`); `README.md` is the single-source index (symlink), cross-tree links made absolute
- GitHub-style `> [!TIP]` alerts render as Material admonitions (callouts plugin)
- Build/deploy only runs on `.md` or docs-config changes
- Type hygiene pass across the installer
- `cast` / explicit `Any` / `# type: ignore` cut down to genuine FFI/dynamic boundaries; `ANN401` + banned-`cast` ruff rules added as a ratchet against new ones
- JSON boundaries validated instead of cast; ctypes/parted reads typed via annotation
- archlinux.org mirror v3 schema modeled as `TypedDict`
- Removed the dead `archlinux.de` fallback (API is `410 Gone`) and a latent `to_json` datetime bug with it
- `scripts/size.py`: estimate target-system size from a saved config
- Reuses `count.py`'s package resolution (extracted to `scripts/_resolve.py`); sums sync-DB download/install sizes via `expac`
- `--unit` to pin the output unit, `--top N` for the largest packages
- Package manager fixes
- Never leave the host `pacman.conf` modified after a host-to-target run
- Route GPGME/signature sync errors to a keyring reset
- LUKS: surface `cryptsetup` error output when unlock fails (upstream fix credits to 0xdeadd)
- Hardware: add Marvell PCI IDs
- btrfs: level-1 zstd for the default layout (credits to Tiagoquix)
0.1.10-1¶
- Enum value parsing fixes and schema consistency
0.1.10-0¶
- Enum normalization: all profiles, bootloaders, drivers, snapshot/network/disk types to lowercase/kebab-case
- Added `display_name()` methods for human-readable UI display
- Schema keys aligned with enum `.value` fields
- Saved configs with old casing require migration (altho most people use the menu directly, this will allow for better checks/tests)
- Hardware detection allow for vendor specific list in `Firmware`
- Updated `count.py` to work with new firmware choice logic
- Fix doas path resolution on grimaur installs
- Configure `/etc/makepkg.conf` directly
- Validate AUR selection requires elevation
- Update grimaur to new version -> respects makepkg properly now + other various changes
- Convert docstrings to plain `#` comments
- Logging fixes: Escaping using existing helpers
- Clean up help text and user-facing messages
- Add `exhaustive-match` pattern (16 sites)
- Enable additional ruff rules (noqa S shell, cast reduction)
- Remove test hacks from upstream
- Remove easter-egg
- Leave fork network
- Various docs refreshes
0.1.09-0¶
- UKI + grub-btrfs co-existence (#4505)
- `add_bootloader(..., keep_standalone_initramfs=True)` keeps `linux`/`initrd` artifacts alongside the UKI when the user picks GRUB + UKI + btrfs snapshots (grub-btrfs's snapshot entries cannot consume a UKI)
- `_config_uki` rewrites mkinitcpio presets: prepends `default` to `PRESETS=(...)`, skips the redundant-image unlink, leaves the standard initramfs in place
- Decision pulled into `scripts/guided.py` so `setup_btrfs_snapshot` runs after bootloader install with the correct flag
- Fix grub-btrfs cfg path when ESP is not at `/boot`
- grub-btrfs's `41_snapshots-btrfs` hook hardcodes `/boot/grub`; archinstoo writes `<esp>/grub` when the ESP mounts at `/efi`
- Now writes `/etc/default/grub-btrfs/config` with `GRUB_BTRFS_GRUB_DIRNAME="<esp>/grub"` so snapshot entries land in the right cfg
- `iwd` standalone option in network menu
- New `NicType.IWD` alongside existing `NM` and `NM_IWD`
- `Installer.configure_iwd_standalone()` writes `/etc/iwd/main.conf` with `EnableNetworkConfiguration=true` + `NameResolvingService=systemd` (iwd handles DHCP, systemd-resolved picks up DNS)
- `NetworkHandler` enables `iwd` + `systemd-resolved`, no NetworkManager pulled in
- `scripts/count.py` adjusted accordingly
- Profiles: package customization step
- New `Customize packages` menu item under `ProfileMenu`, multi-select toggle of each profile's package list
- Persists exclusions in `Profile.custom_settings['excluded_packages']`; only enabled when at least one selected profile is non-`Minimal`
- Drops dead-code "advanced" profile path
- `--list` rework
- Adds `count` to `ROOTLESS_SCRIPTS`
- New `DEFAULT = 'guided'` sentinel; `scripts/list.py` marks the default script in the listing and pulls the `[*] requires root` legend out of the per-row formatting
- TUI: SIGWINCH race condition in `Tui._sig_win_resize`
- Bails when `Tui._t is None` (signal can fire after teardown)
- Wraps `curses.endwin()`/`initscr()`/resize in `try/except curses.error`
- `__enter__` saves the previous SIGWINCH handler; `__exit__` restores it (was leaking into the host process after `Tui` exit)
- `pm/packages.py`: additional packages parsing
- `installed_package` / `enrich_package_info` switch `.strip()` -> `.rstrip()` so leading whitespace in pacman `-Q --info` / `-Si` output (continuation lines for multi-line fields) is preserved
- Avoids field merges when a value wraps onto the next line
- Log / artifact sync ordering
- `_sync_artifacts_to_target` promoted to public; called from `scripts/guided.py` rather than `Installer.__exit__`
- Sync now runs before the post-install menu (chroot, reboot, exit) so users picking "exit" still get the artifacts on target
- Sync also runs on the failure path
- `pathnames.ARTIFACTS_STORE` now relative to `/` so chroot-relative writes resolve correctly
- `share-log` curl hint switched from `0x0.st` (dead) to `paste.rs` (`curl --data-binary @<log> https://paste.rs`)
- `scripts/count.py` parsing fixes
- Excludes-count cleanup for profiles that contribute no packages
- Per-profile parsing reworked to match the new exclusion field
- `examples/config-sample-full.json`: add missing fields, drop stales from `schema.jsonc`
- `desktops/hyprland.py`: drop `polkit` (pulled in transitively); revert niri profile change
- Drop `cutefish` desktop profile (#4514, upstream-archived project)
- Locale fixes (#4500): missing `tr()` ids in encryption/profile menus, `.pot` regen
- `network/`: small helper for nic stub creation path
- `sysctl`: drop redundant duplicate lines
- Dev: `TVM` script (renamed from `VM`) for boot-time VM smoke-test (credits to softer)
- Deps: bump `mypy` to v2 (project + pre-commit mirror), pre-commit hooks resync
- Various docs refresh (BUILD_ISOS, DEP_CHAINS, link/block fixes)
- Various upstream syncs
0.1.08-0¶
- Auto-detect firmware vendors from PCI bus
- New `_SysInfo.firmware_vendors` cached probe reads `/sys/bus/pci/devices/*/vendor` maps to `FirmwareVendor` enum names
- AMD disambiguation via `/sys/bus/pci/devices/*/driver` symlink (amdgpu vs radeon)
- VM short-circuit (`SysInfo.is_vm()`) skips PCI scan on virtio-only hosts
- `select_firmware()` seeds the multi-select with detected vendors only when no preset is loaded saved configs with explicit picks still win
- Refactor: `DisplayServer` moved out of `hardware.py`
- Now lives in `lib/profile/base.py` next to `ProfileType` / `GreeterType` / `SelectResult` (it's a profile-derived choice, not a hardware probe)
- `GfxDriver.gfx_packages()` no longer bundles xorg-server/xorg-xinit
- Multi-profile X11+Wayland selection now correctly includes X11 base packages (passes aggregated `profile_config.display_servers()`
- `info(..., step=True)` for major install-phases
- Prepends `==>` (cyan) and trailing blank line for visual separation
- Wired at `mount_ordered_layout`, `minimal_installation`, `add_bootloader`, `create_users`, `genfstab`
- `cleanup.py` module extracted from `installer.py` (#4496 upstream port)
- `teardown_layout` / `swapoff_layout` / `close_luks` as free functions
- `__exit__` runs teardown via `try/finally` on every exit (success and failure paths)
- `_layout_teardown_required` flag guards no-op when nothing was mounted
- Minimal ISO support
- `isos/ISOMOD` reworked to optionally produce minimal ISOs (smaller, faster build)
- Doc updates with size references (`.github/BUILD_ISOS.md`)
- Post-install artifact sync uses `ARTIFACTS_STORE` constant from `pathnames.py`
- `_sync_artifacts_to_target` simplified (loop over `(src, dst)` pairs, drop `import stat`)
- Various docs refresh
- Various upstream syncs
0.1.07-1¶
- CI: add `release.yaml` workflow to auto-publish a GitHub release when `PKGBUILD` `pkgver`/`pkgrel` change
- Publish `.tar.gz` as official format
- Fix deps pinning, remove 'procps-ng' dep by using python internals
0.1.07-0¶
- TPM2 auto-unlock for LUKS-encrypted installs (opt-in)
- New `Installer.enroll_tpm2()` runs `systemd-cryptenroll --tpm2-device=auto` in chroot at bootloader-install time
- Hardware-gated menu toggle: only appears when `/sys/class/tpm/*/tpm_version_major == 2` (`SysInfo.has_tpm2()`)
- Multi-select PCR picker restricted to firmware-time PCRs (0, 1, 2, 3, 7) that are stable host->target
- Default `0+7` (firmware + Secure Boot state); passphrase keyslot stays as fallback
- Adds `rd.luks.options=tpm2-device=auto` to kernel cmdline so sd-encrypt attempts TPM2 unlock at boot
- Transient unlock keyfile follows `_create_root_keyfile` convention (`/etc/cryptsetup-keys.d/`), unlinked after enrollment
- Post-install artifacts synced into target for debugging
- `/etc/archinstoo.d/<UTC-timestamp>-install.log` and `<UTC-timestamp>-config.json`
- Runs in `Installer.__exit__` on both success and failure paths
- Target teardown on successful install (`_teardown_target`)
- Encryption-topology-aware order: unmount tree, deactivate VGs, close LUKS mappers
- Lazy `umount -R -l` fallback for stuck mountpoints (e.g. leftover `arch-chroot -S` scopes)
- `cryptsetup close --deferred` so the close completes asynchronously without blocking on residual fds
- Host left in a clean state after install: re-running the installer no longer requires a reboot to clear stale mounts/mappers
0.1.06-1¶
- Sibling import cycle cleanup (internal restructuring)
- 24 -> 3 cycle-breaking edges across `archinstoo.lib` (`grimp`/`import-linter`)
- Move `crypt.py` out of `authentication/` (leaf util)
- Move `fetch_data_from_url` / `DownloadTimer` from `network/` into `utils/net.py`
- Move `confirm_abort` into `tui/prompts.py`; `get_password` into `authentication/password_prompt.py`
- Move `add_number_of_parallel_downloads` into `pm/config.set_parallel_downloads`
- Move `select_driver` into `profile/driver_select.py`
- Promote `default_profiles/profile.py` -> `lib/profile/base.py`
- Move `DisplayServer` enum into `hardware.py`; inline `Profile.display_servers()` (drop lazy handler call)
- Rename `network/utils.py` -> `network/interfaces.py`
- CI track-only checks (`continue-on-error: true`)
- Add `import-linter` sibling-acyclicity contract
- Add `vulture` dead-code detection (with `vulture_whitelist.py` for false positives)
- Remove dead code surfaced by `vulture` (~17 symbols across `installer.py`, `models/device.py`, `tui/`, etc.)
- `disk` module split (`disk.layouts` + `disk.selectors`) to reduce circular-dep risk
- `ISOMOD_LIVE` script merged into `ISOMOD` via `LIVE=1` flag (single source for installer + Plasma live-session ISO)
- AUR update menu: wire up `format_update_candidate` print loop in `interactive_select_updates`
- Add `mkinitcpio` to `__base_packages__` (#4484 upstream port)
- Pacstrap installs deterministically; avoids dracut/etc. being picked up on non-Arch hosts (EndeavourOS prefers dracut)
- Various other upstream ports
- Add `audit` security option
- Drop `ELEV` workaround hacks
- Docs: new `.github/BUILD_ISOS.md` for ISO scripts and flags
0.1.06-0¶
- Explicit vendor firmware selection
- New `firmware.py` model + `system_conf` interaction wired into global menu and guided script
- Rework explicit `None` options
- Always last in the menu, returns `None` to config
- Available in `Greeter`, `Graphics driver`, `Network`, `Audio`, `Bootloader`
- LIVE KDE ISO
- New `isos/ISOMOD_LIVE` script
- Plasma profile cleanups (drop redundant entry, add missing `bluedevil`)
- Switch plasma to new plasma-login-manager (PLM)
- Seatd vs logind conflict (#4471)
- Return `ly` greeter when `seatd` is selected
- Guard `uses_logind()` to filter based on `seat_access` selection (`needs_seatd`)
- Drop `default_greeter_type` from most Wayland profiles (works for aggregate profiles)
- Wire `makepkg.conf` to `elev` (privilege escalation selection)
- Installer edge case fix on non-Arch host distros
- Upstream syncs
- #4443 installer cleanup
- #4473 new pattern for commands + port across call sites (audio, docker, shell, installer)
- #4474 port smaller validations into global menu
0.1.05-2¶
- Upstream syncs:
- Enum casing: `FilesystemType`, `ModificationStatus`, `PartitionType` migrated to `StrEnum` / UPPER_CASE
- Limine validation uses `FilesystemType.is_fat()`; block install when ESP is boot partition mounted outside `/boot` without UKI
- Power management: auto-enable `power-profiles-daemon.service` / `tuned.service` based on selection
- New `LPath` helper and `pathnames` module (centralizes `ARCHISO_MOUNTPOINT`, `PACMAN_CONF`)
- Installer ordering, mirrors, pacman config, budgie profile, general.py tweaks
- Docs: refresh project structure tree
- Enable ruff `RUF051` (if-key-in-dict-del)
- Dependency updates
0.1.05-1¶
- Missing deps in linux-variant-headers
- Reported https://github.com/archlinux/archinstall/issues/4360
- Fixed upstream https://gitlab.archlinux.org/archlinux/packaging/packages/linux/-/work_items/188
- Deduplicate `_base_packages` before pacstrap
- Multiple bcachefs partitions (e.g. / + /home) caused duplicate packages
- ESP permissions fix for /boot mountpoint
- `fmask=0077,dmask=0077` now applied when ESP is mounted at `/boot` (was previously skipped, leaving random seed file world-accessible)
- PM: file:// custom repos inserted before [core] for priority
- Custom repos (file://) stripped from target pacman.conf on persist
- Install-time local cache repos no longer leak into the installed system
0.1.05-0¶
- Limine bootloader fixes
- Fix boot failure when EFI is mounted at `/efi` or `/boot/efi`
- `path_root` was incorrectly staying as `boot()` instead of `uuid(root)`,
causing kernel/initramfs paths to resolve on the EFI partition rather than root
- Fix `limine.conf` placed in wrong location for removable installs
- Config was written to `/boot/limine/` instead of alongside the EFI binary on the ESP
- Both bugs are upstream regressions from archinstall#3932
- AUR: fix install order to run after DE/WM profile
- Prevents AUR packages that depend on a desktop environment from failing
- grimAUR improvements
- Prefer `run0` over `sudo` in GUI mode
- Add `--depth=1` to all git clone commands
- Add kernel version and build date to env utils
- LUKS: explicitly load `dm_crypt` module before use
- `run()`: capture stderr from subprocess calls
- Installer: replace `SysCommand('sync')` with `os.sync()` builtin, remove custom `sync()` method
- Config: fix key name `archinstoo-language` → `archinstoo_language` in serialization/deserialization
- Repo: move ISO files into `isos/` subdirectory
- Docs: add multi-boot guidance for issue #100 (manual partitioning + `skip-boot` hint)
- Dependency updates: ruff 0.15.8, actions/upload-artifact v7, actions/checkout digest bump
0.1.04-0¶
- Bcachefs support
- Add Bcachefs as a filesystem option
- Bcachefs backed in ISO builds
- BIOS/GPT partitioning
- Offer partition table choice on BIOS systems (MBR or GPT)
- Add gating logic for BIOS/GPT layouts
- Use `raw` type instead of `unknown` for unformatted partitions
- Sysctl editor
- Add sysctl configuration editor
- Allow Ctrl+C to clear editor values
- ZRAM configuration (#4266)
- Add default option for kernel default ZRAM settings
- Add recompression algorithm choice when not using default
- Simplify ZRAM size to RAM / 2
- Btrfs
- Add btrfs subvolume option (#582)
- Niri window manager Various fixes
- Encryption fix (#1856)
- Check if `/` is not encrypted before generating keyfile
- Skip keyfile generation and use password prompt for unencrypted root
- TUI input fixes
- Fix dsync behaviors on TUI inputs (behave like insert mode)
- Delete/backspace works correctly and never overwrites current selected char
- LVM refactor
- Refactor LVM logic
- Advanced mode
- Pass `--advanced` flag consistently for filesystems
- Fix ownerships gate
- CI/CD and tooling
- Pin dependencies
- Drop flake8 in favor of more ruff rules
- Remove flake8 workflow
- Add nvchecker dependency to DEV PKGBUILD
- Add nvchecker version tracking
- Documentation
- Add man page
- Drop Sphinx entirely
- Remove readthedocs integration
- Remove Python publish workflow
- Add curl upload logs helper
- Chores
- Remove legacy `wireless_tools`
- Remove unnecessary post-init
- Help text updates
- Various linting and structure cleanups
0.1.03-2¶
- Refactor disk utils (DI Ext.)
- Add `plasma-login-manager` greeter
- Add `PlasmaLoginManager` to `GreeterType` enum, schema, and install logic
- LVM fixes for `/efi`-only layouts
- Fix `suggest_lvm_layout` crashing when no `/boot` partition exists (fallback to `/efi`)
- Fix `/efi` partition not being formatted before LVM setup in `filesystem.py`
- Exclude `/efi` from LVM physical volumes in both `/efi`-only and `/efi`+`/boot` layouts
- Bootloader defaults fix
- Fix UKI and Removable disabled by default for GRUB (regression from `df046f01` merge)
- `get_default()` was receiving `skip_boot` as `uefi` parameter
- Encryption improvements (#86 follow ups)
- Refactor LUKS UUID helper from `device_handler` to `luks.py`
- Add info print for key file generation (shows encryption type)
- Fix auto-unlock gating: require EFI partition present
- Disk utils refactor
- Separate `swapoff` into `disk/utils.py`
- Clean up `device_handler` by moving utility functions out
- Misc
- Fix rescue script paths
- Remove private prefixes from public API methods
- Contributing docs: add testing notes
0.1.03-1¶
- Encryption (#84)
- Add choices for LUKS key derivation function (argon2id/pbkdf2)
- Add auto-unlock option for non-UKI/GRUB setups (shorter iters for mem restrictions)
- Switch from `encrypt` hook to `sd-encrypt` with systemd initramfs hooks
- Update `schema.jsonc` for new encryption fields
- New `EncryptionType` and derivation models in device module
- Security applications
- Switch from `busybox` type initramfs hooks to `systemd` hooks
- This will simplify `sbctl` and `systemd-cryptenroll` setups
- Add `pam-u2f` and `sbctl` to Security category options
- Bootloader fixes
- Fix efistub installation path
- Refactor UEFI references across bootloader menu and models (cf)
- Error handling
- Refactor error reporting for bad configs in global menu
- Rename error variables in `grimaur.py` for consistency
- Resume and config fixes
- Fix resume behavior for multiple settings
- Fix profile names for `httpd` and `sshd` servers
- Update `config-sample-full.json` with new fields
- Chores
- Update ruff to latest version
0.1.03-0¶
- Encrypted `/boot` separate `/efi` (GRUB + argon2id)
- Constrain LUKS key slot PBKDF for boot partitions (`--pbkdf-memory 32768 --iter-time 200`)
- Apply same constraints to keyfile generation (`luksAddKey`) so GRUB can decrypt both slots
- Add `--batch-mode` to `cryptsetup open` for non-interactive unlock
- ESP mount security
- Mount FAT32 ESP with `fmask=0077,dmask=0077` (root-only access)
- Applied at mount time in installer for both Default and Manual partitioning
- Default BTRFS layout: mount ESP at `/efi` so `/boot` stays in `@` subvolume
- User services and multi-profile support
- New `UserService` model for per-user systemd `--user` services
- Service enable/disable during installation
- Move `fail2ban` from Management to Security category
- Service auto-enabled on install
- Schema and count script updates
- Add `security` section to `schema.jsonc`
- Count script now resolves security tools
- Docs
- Add beginner notes and network documentation
- Fix example configs
- Fix install order: kernel headers/AUR before profiles
0.1.02-1¶
- Add `smartmontools` to Server profiles (disk health monitoring)
- This means original profiles list now only contains `xdg-utils | smartmontools` for desktops
Down from original list (the rest is all in logic or choices):
@property
@override
def packages(self) -> list[str]:
return [
'vi',
'openssh',
'wget',
'iwd',
'wireless_tools',
'smartmontools',
'xdg-utils',
]
0.1.02-0¶
- Graphics driver improvements
- Add VM-specific options: `VM (software rendering)` and `VM (virtio-gpu)` allows to pick guest drivers
- `Mesa (open-source)` auto-detects vulkan-intel or vulkan-radeon based on hardware
- Plan future implementation for other drivers
- Virtual: `vulkan-driver`
ALREADY COVERED: `nvidia-utils, vulkan-intel, vulkan-radeon, vulkan-swrast, vulkan-virtio, vulkan-nouveau`
MISSING: `vulkan-gfxstream, vulkan-dzn, vulkan-asahi, vulkan-freedreno, vulkan-broadcom, vulkan-panfrost, vulkan-powervr`
- Fix gfx driver installation OoO: now installs BEFORE profiles to satisfy vulkan-driver dependency.
- This avoid pulling in nvidia-utils on a non-nvidia install because none was installed yet, default or 1st choice
- Update recommendation text with VM detection hint
- Pacman config changes
- Move `parallel_downloads` setting into Pacman config submenu
- Fix misc options (ILoveCandy) not applied when option doesn't exist in pacman.conf
- Profile fixes
- Rename `desktop_base` to `profile_base` (applies to any profile, not just desktop)
- Move `wireless_tools` to wpa_supplicant backend installation (remove from always installed)
- Fix profile types: DesktopEnv → WindowMgr
- Add `preview_text` to WaylandProfile (shows "Type: X (Wayland) or (Xorg)")
- Bug fixes
- Fix guided.py advanced options disappearing on install
- Fix duplicate grub package installation on UEFI systems
- Fix locale menu
0.1.01-1¶
- New Security application category
- AppArmor support with kernel LSM parameter (`lsm=landlock,lockdown,yama,integrity,apparmor,bpf`)
- Firejail namespace-based sandboxing
- Bubblewrap low-level sandboxing
- Multi-select menu allowing any combination of tools
- Add `fail2ban` to Management tools
- Auto-enables `fail2ban.service` on install
- Add `run0` privilege escalation option
- Systemd-based alternative to sudo/doas
- Uses polkit, wheel group membership sufficient
- Update `base-devel-flex` and `grur`
- Add poweroff option to post-installation menu
- Useful for VM testing workflows
- Installer improvements
- Add `add_kernel_param()` method for applications to set kernel parameters
- Order:
- Move user creation before application installation
- Move application installation before bootloader (kernel params now included in bootloader config)
- CI/Workflow changes
- Remove publish workflow
- Trigger only on pushes
- Test updates
- Add security_config to test fixtures
- Update test assertions for new Security model
- Work on grimaur linting
0.1.01-0¶
- ARM (aarch64) support
- Parse ARM mirror list format (different HTML from x86)
- Filter out `reflector` on non-x86_64 (not packaged for ARM)
- Remove `vi` from desktop_base (conflicts with vi compat on ARM)
- Skip filesystem ops when `wipe=False` on existing partitions and safe copies
- Graphics driver menu shows only Mesa on ARM
- Live mode (`--script live`)
- New `scripts/live.py` for configuring the running system in-place
- Uses `pacman -S --needed` instead of `pacstrap` when target is `/`
- Skips `arch-chroot` wrapper when target is `/`
- Disables disk, bootloader, kernel menu items
- AUR support
- Full AUR builder (`grimaur.py`) with temporary non-root user
- AUR packages menu item (gated behind `--advanced`)
- Fix `/tmp` writability inside chroot for `makepkg`
- Out-of-tree DKMS module builds
- Graphics driver overhaul
- Replace `VMOpenSource` with `MesaOpenSource` (mesa + libva-mesa-driver)
- VMs and ARM both default to Mesa group
- Boot / EFI fixes
- Move EFI bitness check to `hardware.py`
- Fix UKI, Grub, EFISTUB installation paths
- UEFI `/efi` partition maps to `/boot`
- Add pretty name to `os-release`
- Named kernel entries (e.g. `linux-zen`)
- Show `linux-home` flag when mountpoint is `/home`
- Dependency injection for bootloader skip logic
- TUI improvements
- Remove hjkl nav in favor of type-to-search anywhere
- Fix number key selection
- Add `greetd` greeter choice (hopefully cage option soon)
- Code quality
- Lazy imports in `__init__.py`
- Move `ROOTLESS_SCRIPTS` to `__init__.py`, fix `--list` formatting
- Type checking and mypy fixes
- Fix resume behavior for saved configurations
- Docs
- Add multi-boot guide
- Add AUR / out-of-tree docs
- Add philosophy doc
- Update contributing and headless guides
0.0.02-2¶
- Add Tailscale and Java (headless JRE) server profiles
- Add headless server docs with SteamCMD examples
- Add fallback for common Pacman issues
- Auto-reset keyring on corrupted packages
- Auto-reset pacman.conf on dependency failures
- Fix #3772 try block for mount, add `wipefs` helper
- Rename `ask` functions to `select` across codebase
- Remove `advanced_mode` from profile base class
- Remove all `from __future__ import annotations` lines
- Change to absolute imports (35 files)
- Apply ruff lint rules A, C4, FURB, PERF, RET, SIM (-307 lines net)
- Default root elevation to empty
- Add `-h2t` flag to DEV script
- Add `--depth 1` to docs clone
- Fix honest `type: Any` in output
- Peek outputs for pacman operations
- Docs restructure and refresh
0.0.02-1¶
- Add `/boot` encryption support (#74)
- Fix /efi mount logic
- /efi exists → /efi = ESP, /boot = no flags needed
- /efi absent → /boot = ESP
- Mark bootable flag only available for BIOS systems
- Add `argon2id` memory limit, better print
- Remove `wget` and `openssh` from defaults
- Auto select Minimal Profile and remove from list
- Add separator between base actions and terminate actions
- Fix duplicate entries/filters
- Clean up comments
0.0.02-0¶
- Encrypted swap partition support (#4169)
- Allow swap partitions in the encryption selection menu
- Add `swap` mapper name (consistent with `root`/`home` naming)
- Call `swapon` on the LUKS mapper device for encrypted swap
- Manually add swap fstab entry (genfstab doesn't capture swap mount points)
- Generate keyfile and crypttab entry for passwordless unlock at boot
- Fix multi-select ENTER key behavior
- ENTER now only confirms selection, no longer auto-selects the focused item
- TAB/SPACE remain the toggle keys for individual items
- TUI search improvements
- Auto-activate search when typing any letter (no longer need to press `/` first)
- Remove `/` requirement from help text
- Remove `--silent` flag
- Disk and Authentication config are always required interactively
- Remove `silent` param from `Pacman`, `ConfigurationHandler.prompt_resume()`
- Fix custom commands only running with `--advanced` flag
- Fix final confirmation prompt using recursion
- Replace recursive `return guided()` / `return format_disk()` with `while` loop
- Fix `sudo` mention to `elevated privileges` in validation message
- Console fonts listing
- Skip `README*` files in `/usr/share/kbd/consolefonts/`
- Move `generate_password()` from `general.py` to `disk/luks.py`
- Finish `count` script, move `schema.jsonc` into `archinstall/`
- Smaller mini config sample
- Docs: rewrite PHILOSOPHY.md
0.0.01-9¶
- Add console fonts config
- Add optional groups per user
- Move shell config to be per user
- Various UX changes for resumes/clears
- Various structure changes
- Add `count` script to list total pkgs installed by a given config
- Add custom profiles examples
0.0.01-8¶
- Start building `env` utils for support to build on alpine
- Rework `--script list` to show what needs root or not
- Add actual custom examples #71
- Add `count` script that let's you map out how many pkgs would be installed by a profile
- Add schema.jsonc with all the possible packages installed
- Add mirrors progress indicator and average bit rate
- Style changes use `SystemExit` instead of importing sys on every file
- Add `--clean` args to remove logs too
- Wrap parted imports in try blocks
- Update missing packages from plasma profile
- Add newb docs and refresh more docs
- Fix missing iwd case for resume
- Fix disks menu QOL for resume
- Add `mirror` script
- Add lazy fallback to unmount
- Change disks to always show debug
0.0.01-7¶
- Manual partitioning improvements
- Add "Create empty layout (wipe all)" option for fresh starts
- Add "Default layout" option in manual partitioning for brtfs subvolumes
- Manual partitioning highlighted by default
- Add udev_sync calls between disk operations for timing issues
- Remove partprobe (redundant with disk.commit)
- Add mount_fs to all formatting calls (attempt fixes #4164 vfat mount issues)
- Always log mount disk operations
- Init/startup refactor
- Rework init with cleaner OS imports and lazy args
- Separate offline check and wire up rc functions properly
- Move prepare hook, separate helper for ping
- Bypass unnecessary init steps
- Config improvements
- Add config-sample-mini.json (no disk/user data)
- Add test shortcuts in DEV script (-tf, -tm)
- Remove duplicate audio_config from test config
- Fixes
- Fix shell not being set for user
- Remove hardcoded sudo mention
- Grub as default bootloader
- Chores
- Update ruff to v0.14.14
- Code comments and structure cleanup
0.0.01-6¶
- Mirrors module rework
- Move mirrors code to `lib/pm/` (package manager)
- Use class-level cache for `MirrorListHandler` (fetch once, reuse)
- Swap mirror fetch order: archlinux.org first, archlinux.de fallback
- Fix "Loading mirror regions..." showing repeatedly
- Fix "database already registered" error for custom repos
- Skip duplicate repos when writing to pacman.conf
- X11 keyboard layout configuration
- Auto-write `/etc/X11/xorg.conf.d/00-keyboard.conf` for Xorg profiles
- Use `DisplayServer.X11` check instead of profile type checks
- Verify layout inside chroot where X11 is installed
- Strip vconsole suffixes (-latin1, -nodeadkeys, etc.) for X11 format
- Remove Boot module that had complex systemd-spwn logic for setting this
- Remove unused `is_xorg_type_profile()` method
- Use `profile.display_servers()` for graphics driver installation check
- Network refactor with DI pattern
- Add accent colors to theme selector
- Add menu previews
- Various type hints and cleanup
0.0.01-5¶
- Dependency Injection refactor (from archinstoo issues #4149)
- Remove module-level singletons: device_handler, profile_handler, mirror_list_handler, application_handler
- Consumer classes accept optional handler params with fallback defaults
- Keep logger and translation_handler as singletons
- Add `Os` class wrapper for environment variables
- `Os.get_env()`, `Os.set_env()`, `Os.has_env()`
- Merge `resumehandler.py` into `ConfigurationHandler`
- Add `ConfigurationHandler.prompt_resume()` method
- Fix resume config loading bug (config was captured before resume check)
- Menu UX improvements
- Move Disk config and Authentication to top (assumed encryption empty/same for auth)
- Add `MenuItem.separator()` factory method for visual separators
- Change "Cancel" to "Back" in sub-menus (ListManager)
- Move Archinstoo settings to bottom with Install/Abort
- Update tests and docs for refactors
- New `logs/` dir for outputs (restore_perms on h2t mode)
- Move `tui/` into `lib/` for more readable imports / flat lib / honest architecture
- A lot of UI code is called from lib interactions or similar
- Having them as siblings when they are interlaced is misleading
- Separate `env` module in utils for these types of checks
- Rename `MirrorConfiguration` to `PacmanConfiguration`
- Add pacman misc options (Color, ILoveCandy, VerbosePkgLists)
- Rename `mirror_config` field to `pacman_config`
- Custom repos browsable in Additional packages
- Apply config on GlobalMenu init for loaded configs
- Fix repos being added multiple times
- Rename `.sudo` to `.elev` across codebase
- Add `User.any_elevated()` static helper
- Consolidate duplicate elevated user checks
- Simplify `Password` class
- Remove unused setter
- Log to current directory for debugging
- Light/dark mode theme selector with accent colors
- Add resizing and various UI fixes
- Separate scripts that need preparation phase
- Various test updates for renamed fields
0.0.01-4¶
- Remove `python-pydantic` dataclasses dependency
- Use ClassVar abstractions reduce copy/paste
- Fixes #3717 enable cryptodisk in grub cfg + More UKI
- Fix #4148 pass script to main and handle non-root commands early
- Add stash module for git dotfiles
- Allow multiple stashes per user (clones to `.stash/repo`)
- Branch parsing with #branch format
- New settings submenu with color themes
- Nvidia driver better hints
- Fix config assertion error on reload
- Add validators for checkmark and config loading
- Fix input cursor not being shown and various UI
- Rework menu sections/orders
- Simplify bootloader entry naming
- Remove init_time timestamp mechanism
- Add examples (custom commands, priv esc, deps)
- Docs refresh
- Create `base-devel-flex` pkg for `doas` alternative
0.0.01-3¶
- Change menu order for mirrors
- Work on ISOMOD scripts to add pre-caching
- Profile system/cow space mods
- Logging etc
- Work on init scripts debugging
- Add is_venv check
- More formatting
0.0.01-2¶
- Fix vgs not closing properly
- Fix menu/ Add dynamic resize
- Chores use walrus op where available
- Work on DEV / BUILD utils
0.0.01-1¶
- Change structure to be more readable
- Editor/PCH goes to top level
- Rest of checks are specific to archinstall
- Seperate into DEV / ONLINE PKGBUILDS
- Add dev/run helpers bash
- Remove UV from runners
- Change more PKGBUILD/workflows for new structure
- Work on refreshing docs
0.0.01-0¶
- Change PKGBUILD strucs for proper dependency mngmnt
- Remove python-cryptography -> Only ever used to encrypt config file which now assumes passwords/disk passwords to never be resumed.
- Remove python-textual -> Keep ncurses for portability
- Add __init__ check of deps
- Simplify auth config to be inside global config
- Never output passwords/FDE related
- Load config but never creds (disk/auth config to do only)
- Offer choice to delete all of contents post-install
- Lock root and doas alternative
- Add resume/abort features with proper deletions of cfg archlinux/archinstall#4035
- Wayland/x11 major refactor
- Nvidia fixes
- Sway, River, Niri fixes
- Explicit Nogreeter type
- Custom commands handler
- Replaced plugins system
- Explicit --script utils
- Rescue/Format/Minimal/...
- More bootloader/UKI fixes
- More applications menus, less hardcoded defaults
- Update user facing instructions
- Remove U2F in favor of configurable privilege escalation tools
- Remove all backwards compat related code
- Remove all dead code snippets