Personal note: I (@Torxed) usually spend a bit of time curating these release notes.. However, I won't have time to clean up the "what's changed" this time, so it will be auto generated this release.. not that anyone probably cares but thought I should apologize anyway
New TUI
We (thanks to major work by @svartkanin) have swapped from curses to textual. This enables us to (hopefully) meet modern expectations in the terminal and look better in the process, as well as make it easier to maintain a lot of the menu stuff. Please be patient as we're transitioning to this new look and feel, as always with change — feedback is welcome, especially related to accessibility features.
What's Changed
- Update Italian translation by @vanmatten in #4060
- Update Turkish translation by @wiseweb-works in #4062
- Update Japanese translation by @utuhiro78 in #4064
- Add instructions for booting Arch ISO in a VM by @svartkanin in #4041
- Update Arch Installer translation before Jan 2026 release by @bittin in #4065
- Fixed #3689 - Do not attempt to mount btrfs partitions without mountpoints by @scrypt-kitty in #3992
- Czech localization update by @walken11 in #4068
- Fix pre-commit hook by @h8d13 in #4070
- Translation: Update hu.po/hu.mo by @summoner001 in #4071
- Change plasma-meta -> -desktop. by @h8d13 in #4076
- Translation: Update hungarian po/mo by @summoner001 in #4078
- Another small readme change for clarity by @h8d13 in #4077
- feat: firewalls by @h8d13 in #4074
- chore: missing dep libfido2 by @h8d13 in #4082
- fix: bootloader changes by @h8d13 in #4073
- Better Ukrainian v1.4 by @TSEPLNK in #4084
- Use serialization TypedDicts to reduce Any instances by @correctmost in #4085
- Update comment in _final_warning by @correctmost in #4086
- Migrate pytest configs to native TOML and enable strict mode by @correctmost in #4087
- Fix an invalid-type-form error reported by ty by @correctmost in #4088
- Add node_modules to .gitignore and Pylint's ignore list by @correctmost in #4089
- Remove unused pytest-mock dependency by @correctmost in #4091
- Avoid a reportPossiblyUnboundVariable warning with Pyright by @correctmost in #4092
- hotfix: Revert Grub changes by @h8d13 in #4099
- Add missing spanish translations by @esbendev in #4098
- hotfix: Firewall by @h8d13 in #4100
- Disable the non-empty-init-module ruff rule by @correctmost in #4106
- Fix typos in comments by @stoeckmann in #4107
- Fix typos by @codefiles in #4109
- Update classmethods to use cls by @codefiles in #4110
- Use instance method for _load_config by @codefiles in #4112
- Use instance method for type_to_text by @codefiles in #4113
- Change classmethods to staticmethods by @codefiles in #4114
- Change staticmethods to classmethods by @codefiles in #4115
- Use Self for return instances of cls by @codefiles in #4116
- Remove superfluous future imports by @codefiles in #4117
- Remove superfluous list creation in join calls by @codefiles in #4119
- Use sys.exit instead of exit by @codefiles in #4120
- Add firewalld to firewall menu by @Mattyan89 in #4093
- Replace enter return type with Self by @codefiles in #4121
- Use Self for parameters to dunder methods by @codefiles in #4123
- Refactor Boot by @codefiles in #4124
- Use Self in default_profiles by @codefiles in #4125
- Remove unused installation_hooks property by @codefiles in #4118
- Add header and update urdu translations by @Hannan-Javed in #4122
- Use Self in tui by @codefiles in #4126
- Remove leftover code from unattended script by @codefiles in #4127
- Remove storage module by @codefiles in #4128
- Use Self for Tui by @codefiles in #4130
- Updated Finnish translation in base.po by @Kenraaliskuutteri in #4129
- Use Self for remaining occurrences by @codefiles in #4135
- Remove quotes from Installer type annotations by @codefiles in #4136
- Enable quoted-annotation ruff rule and fixes by @codefiles in #4137
- Migrate UI to textual by @svartkanin in #3997
- Enable GRUB UKI menu entries by @codefiles in #4139
- Rework has_default_btrfs_vols by @codefiles in #4147
- Improve Hindi translations in base.po by @Nub-programmer in #4152
- Move script entry point by @codefiles in #4151
- Refactor error message by @codefiles in #4153
- Replace sys.exit calls with return values by @codefiles in #4156
- Improve Hindi translations (base.po) by @Nub-programmer in #4163
- Refactor wifi_handler to use dependency injection by @codefiles in #4161
- [README update] Clarify archinstall upgrade steps by @svartkanin in #4138
- Remove obsolete package functions by @svartkanin in #4145
- Fix - disk partitioning menu by @svartkanin in #4158
- Fix - Handle cancel from list manger properly by @svartkanin in #4160
- Improve Hindi translations and resolve all fuzzy entries by @Nub-programmer in #4167
- Delete dead code by @svartkanin in #4144
- Refactor mirror_list_handler to use DI by @codefiles in #4170
- Move Pacman out of init by @svartkanin in #4150
- Refactor auth_handler to use dependency injection by @codefiles in #4171
- Refactor application_handler to use DI by @codefiles in #4172
- Fix useless-return warnings reported by Pylint by @correctmost in #4173
- Refactor user menu file by @svartkanin in #4141
- Refactor network config installer by @svartkanin in #4143
- Refactor syscommand by @svartkanin in #4176
- Refactor script list by @codefiles in #4177
- Remove superfluous future import by @codefiles in #4178
- Use main() as script entrypoint by @codefiles in #4179
- Remove archinstall.svg from project root by @correctmost in #4180
- Refactor code to reduce circular dep by @svartkanin in #4175
- Reuse MirrorListHandler instance by @codefiles in #4184
- Update Hindi translations for archinstall by @Nub-programmer in #4185
- Add sponsors button by @h8d13 in #4056
- Fix: Resolve fuzzy strings and add note for 'Seat access translation' by @ImFefeTwo in #4186
- Rename ask* functions to select* by @svartkanin in #4191
- Avoid union syntax in an isinstance check by @correctmost in #4197
- Measure install time with monotonic clock instead of system clock by @correctmost in #4198
- Remove an unused milliseconds member from Installer by @correctmost in #4199
- Refactor skip_boot to use dependency injection by @codefiles in #4200
- Fix typo locale -> local by @codefiles in #4201
- Added Galician language support by @gaelgnz in #4202
- Add missing galician mo file by @svartkanin in #4209
- Make list manager run private by @svartkanin in #4192
- Handle whole-disk LUKS root params by @favilances in #4205
- Use TypeAdapter for Json serialization by @svartkanin in #4183
- Update Japanese translation by @utuhiro78 in #4217
- Translation: Update Italian by @vanmatten in #4219
- feat: update
pt_BRtranslations by @ComicShrimp in #4221 - Revert "Handle whole-disk LUKS root params (#4205)" by @correctmost in #4229
- Update Spanish translation by @castillofrancodamian in #4228
- Refactor SysInfo.has_uefi() to DI for bootloader by @codefiles in #4230
- Move mount() to disk.utils by @codefiles in #4232
- fix efistub bootloader to use backslashes by @h8d13 in #4231
- Move swapon() to disk.utils by @codefiles in #4233
- Move unlock_luks2_dev() by @codefiles in #4234
- Move get_unique_path_for_device() to disk.utils by @codefiles in #4242
- Fix install gfx before DE/WM/Server by @h8d13 in #4238
- Move get_parent_device_path() to disk.utils by @codefiles in #4243
- Move LVM helpers to dedicated module by @codefiles in #4245
- Remove arch_config_handler from installer by @codefiles in #4246
- feat: add
plasma-login-manageroption and set it as default for Plasma by @ComicShrimp in #4247 - locales: Add Nepali (ne) translation by @Nub-programmer in #4222
- Remove unused advanced member from Profile by @codefiles in #4248
- Add provision() to configure users for profiles by @codefiles in #4254
- Refactor general utility functions by @svartkanin in #4212
- Add missing linkify dependency by @svartkanin in #4208
- Locale timezone python chmod by @favilances in #4210
- Revert "Locale timezone python chmod" by @Torxed in #4257
- Convert imports to absolute imports by @svartkanin in #4196
- Remove unneeded chmod by @codefiles in #4262
- Fix a reportUnnecessaryIsInstance Pyright warning by @correctmost in #4263
- Refactor ISO check by @codefiles in #4264
- Remove unnecessary post-init by @codefiles in #4267
- Replace Installer with path parameter in Boot by @codefiles in #4268
- Enable if-key-in-dict-del ruff rule by @codefiles in #4269
- Move get_version() to version module by @codefiles in #4270
- Remove obsolete GRUB package install by @codefiles in #4277
- Use os.sync() instead of sync command by @codefiles in #4278
- Remove support for NTFS root file system by @codefiles in #4279
- Refactor arch_config_handler to use DI by @codefiles in #4280
- Move udev_sync() to disk.utils by @codefiles in #4281
- Add nepali translation by @Nub-programmer in #4282
- Move all LVM helpers to dedicated module by @codefiles in #4283
- Locales: Add Nepali (ne) translation (Initial 300+ strings) by @Nub-programmer in #4288
- Add nepali translation by @Nub-programmer in #4294
- Add nepali translation by @Nub-programmer in #4295
- better Ukrainian 1.4.2 by @TSEPLNK in #4301
- Removed unnecessary signal for multi-line comment. by @amisroilov in #4298
- Async menu by @svartkanin in #4308
- fix: reintegrate PasswordStrength (#4111) by @singhh-piyush in #4291
- Update Turkish translations and refresh locale template by @RosgyNG in #4310
- Fix iwd network installation and setup by @svartkanin in #4271
- Zram - remove custom size in config by @svartkanin in #4272
- Allow skip on password confirmation by @svartkanin in #4273
- Refactor mirrors by @svartkanin in #4274
- Refactor interactive module by @svartkanin in #4315
- Move luks into disk module by @svartkanin in #4296
- Handle enter on filter confirm by @svartkanin in #4324
- Fix AwaitComplete runtime error by @svartkanin in #4325
- Bumping version to: 4.0 by @Torxed in #4339
New Contributors
- @stoeckmann made their first contribution in #4107
- @Mattyan89 made their first contribution in #4093
- @Hannan-Javed made their first contribution in #4122
- @Kenraaliskuutteri made their first contribution in #4129
- @Nub-programmer made their first contribution in #4152
- @ImFefeTwo made their first contribution in #4186
- @gaelgnz made their first contribution in #4202
- @amisroilov made their first contribution in #4298
- @singhh-piyush made their first contribution in #4291
- @RosgyNG made their first contribution in #4310
Full Changelog: 3.0.15...4.0