From 2ce0f0b4b19ae6e8a6644ad99ee68b84dec9135e Mon Sep 17 00:00:00 2001 From: suraj kumar Date: Fri, 31 Jul 2026 08:02:10 +0530 Subject: [PATCH 1/6] feat(gnome): add minimal GNOME installation flavor option Fixes #4681 Adds a GnomeFlavor enum with two options: - Minimal (recommended default): installs only essential packages gnome-shell, gnome-session, gnome-terminal, gnome-control-center, gnome-settings-daemon, nautilus, xdg-desktop-portal-gnome, gnome-tweaks - Full: installs the entire gnome package group (previous behavior) User is prompted to choose a flavor via an interactive TUI dialog when selecting the GNOME desktop profile, following the same pattern as the KDE Plasma profile. --- .../default_profiles/desktops/gnome.py | 101 +++++++++++++++++- archinstall/default_profiles/profile.py | 1 + 2 files changed, 97 insertions(+), 5 deletions(-) diff --git a/archinstall/default_profiles/desktops/gnome.py b/archinstall/default_profiles/desktops/gnome.py index fe3ca486d1..9d7e8cf9c2 100644 --- a/archinstall/default_profiles/desktops/gnome.py +++ b/archinstall/default_profiles/desktops/gnome.py @@ -1,6 +1,64 @@ +from enum import StrEnum from typing import override -from archinstall.default_profiles.profile import DisplayServerType, GreeterType, Profile, ProfileType +from archinstall.default_profiles.profile import CustomSetting, DisplayServerType, GreeterType, Profile, ProfileType +from archinstall.lib.menu.helpers import Selection +from archinstall.lib.translationhandler import tr +from archinstall.tui.menu_item import MenuItem, MenuItemGroup +from archinstall.tui.result import ResultType + + +class GnomeFlavor(StrEnum): + Full = 'gnome' + Minimal = 'gnome-minimal' + + def show(self) -> str: + match self: + case GnomeFlavor.Full: + return f'gnome ({tr("Full")})' + case GnomeFlavor.Minimal: + return f'gnome-minimal ({tr("Recommended")})' + + def description(self) -> str: + match self: + case GnomeFlavor.Full: + return tr( + 'Installs the full gnome package group.\n' + 'Includes all GNOME apps such as Maps, Contacts,\n' + 'Characters, Calendar, Weather, and more.' + ) + case GnomeFlavor.Minimal: + return tr( + 'Installs a minimal GNOME environment.\n' + 'Includes only the essential components:\n' + ' - gnome-shell\n' + ' - gnome-session\n' + ' - gnome-terminal\n' + ' - gnome-control-center\n' + ' - gnome-settings-daemon\n' + ' - nautilus\n' + ' - xdg-desktop-portal-gnome\n' + ' - gnome-tweaks' + ) + + def packages(self) -> list[str]: + match self: + case GnomeFlavor.Full: + return [ + 'gnome', + 'gnome-tweaks', + ] + case GnomeFlavor.Minimal: + return [ + 'gnome-shell', + 'gnome-session', + 'gnome-terminal', + 'gnome-control-center', + 'gnome-settings-daemon', + 'nautilus', + 'xdg-desktop-portal-gnome', + 'gnome-tweaks', + ] class GnomeProfile(Profile): @@ -15,12 +73,45 @@ def __init__(self) -> None: @property @override def packages(self) -> list[str]: - return [ - 'gnome', - 'gnome-tweaks', - ] + flavor_str = self.custom_settings.get(CustomSetting.GnomeFlavor) + + if flavor_str is not None: + flavor = GnomeFlavor(flavor_str) + return flavor.packages() + else: + return GnomeFlavor.Minimal.packages() # minimal as the recommended default @property @override def default_greeter_type(self) -> GreeterType: return GreeterType.Gdm + + async def _select_flavor(self) -> None: + header = tr('Select a GNOME installation flavor') + '\n' + + items = [ + MenuItem( + s.show(), + value=s, + preview_action=lambda x: x.value.description() if x.value else None, + ) + for s in GnomeFlavor + ] + group = MenuItemGroup(items, sort_items=False) + + default = self.custom_settings.get(CustomSetting.GnomeFlavor, None) + group.set_default_by_value(default) + + result = await Selection[GnomeFlavor]( + group, + header=header, + allow_skip=False, + preview_location='right', + ).show() + + if result.type_ == ResultType.Selection: + self.custom_settings[CustomSetting.GnomeFlavor] = result.get_value().value + + @override + async def do_on_select(self) -> None: + await self._select_flavor() diff --git a/archinstall/default_profiles/profile.py b/archinstall/default_profiles/profile.py index 6c328a4636..1538cd4427 100644 --- a/archinstall/default_profiles/profile.py +++ b/archinstall/default_profiles/profile.py @@ -49,6 +49,7 @@ class SelectResult(Enum): class CustomSetting(StrEnum): SeatAccess = 'seat_access' PlasmaFlavor = 'plasma_flavor' + GnomeFlavor = 'gnome_flavor' class Profile: From 6a244eb2c22da8f8b9f48d714fb4eb64a32e3c7a Mon Sep 17 00:00:00 2001 From: suraj kumar Date: Sun, 2 Aug 2026 14:36:29 +0530 Subject: [PATCH 2/6] chore(cockpit): annotate outdated package entries in packages() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The current packages list contains udisks2 and packagekit which are low-level dependenices pulled in by cockpit itself. These should not be explicitly listed — the proper cockpit app components should be used instead. Adding a NOTE comment to flag this for the next step. --- archinstall/default_profiles/servers/cockpit.py | 1 + 1 file changed, 1 insertion(+) diff --git a/archinstall/default_profiles/servers/cockpit.py b/archinstall/default_profiles/servers/cockpit.py index 7283bad60b..35bf6bef2e 100644 --- a/archinstall/default_profiles/servers/cockpit.py +++ b/archinstall/default_profiles/servers/cockpit.py @@ -13,6 +13,7 @@ def __init__(self) -> None: @property @override def packages(self) -> list[str]: + # NOTE: udisks2 and packagekit are raw dependenices, not cockpit app components return ['cockpit', 'udisks2', 'packagekit'] @property From f2d78e5993ab28edccad95da1b4451a2f628d0cc Mon Sep 17 00:00:00 2001 From: suraj kumar Date: Sun, 2 Aug 2026 14:37:08 +0530 Subject: [PATCH 3/6] fix(cockpit): replace udisks2 with cockpit-storaged The cockpit package was split upstream into seperate app components. udisks2 is a low-level D-Bus service (a dependency), whereas cockpit-storaged is the actual Cockpit UI component for storage management. Installing the app component is the correct approach as documented on the Arch Wiki and the cockpit package page. --- archinstall/default_profiles/servers/cockpit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/archinstall/default_profiles/servers/cockpit.py b/archinstall/default_profiles/servers/cockpit.py index 35bf6bef2e..e3ed51d186 100644 --- a/archinstall/default_profiles/servers/cockpit.py +++ b/archinstall/default_profiles/servers/cockpit.py @@ -14,7 +14,7 @@ def __init__(self) -> None: @override def packages(self) -> list[str]: # NOTE: udisks2 and packagekit are raw dependenices, not cockpit app components - return ['cockpit', 'udisks2', 'packagekit'] + return ['cockpit', 'cockpit-storaged', 'packagekit'] @property @override From 30791c24820f7c1fd95bb89ef868f76928839ffc Mon Sep 17 00:00:00 2001 From: suraj kumar Date: Sun, 2 Aug 2026 14:41:43 +0530 Subject: [PATCH 4/6] fix(cockpit): replace packagekit with cockpit-packagekit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Same reason as previous commit — packagekit is a backend service and not a cockpit component. cockpit-packagekit is the proper frontend app that provides the software update UI inside Cockpit. The split happened upstream in the cockpit packaging repo and is also refferenced in cockpit-project/cockpit#19315. --- archinstall/default_profiles/servers/cockpit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/archinstall/default_profiles/servers/cockpit.py b/archinstall/default_profiles/servers/cockpit.py index e3ed51d186..1b3d31f639 100644 --- a/archinstall/default_profiles/servers/cockpit.py +++ b/archinstall/default_profiles/servers/cockpit.py @@ -14,7 +14,7 @@ def __init__(self) -> None: @override def packages(self) -> list[str]: # NOTE: udisks2 and packagekit are raw dependenices, not cockpit app components - return ['cockpit', 'cockpit-storaged', 'packagekit'] + return ['cockpit', 'cockpit-storaged', 'cockpit-packagekit'] @property @override From 76db2ce58c627f795461856db43b53e321338936 Mon Sep 17 00:00:00 2001 From: suraj kumar Date: Sun, 2 Aug 2026 14:42:16 +0530 Subject: [PATCH 5/6] chore(cockpit): remove temporary NOTE comment after fix applied The NOTE comment was added to flag the wrong packages during investigation. Now that both udisks2 and packagekit have been replaced with there proper cockpit components, the comment is no longer needed and can be safely removed. --- archinstall/default_profiles/servers/cockpit.py | 1 - 1 file changed, 1 deletion(-) diff --git a/archinstall/default_profiles/servers/cockpit.py b/archinstall/default_profiles/servers/cockpit.py index 1b3d31f639..1e010d445d 100644 --- a/archinstall/default_profiles/servers/cockpit.py +++ b/archinstall/default_profiles/servers/cockpit.py @@ -13,7 +13,6 @@ def __init__(self) -> None: @property @override def packages(self) -> list[str]: - # NOTE: udisks2 and packagekit are raw dependenices, not cockpit app components return ['cockpit', 'cockpit-storaged', 'cockpit-packagekit'] @property From cec66db4ba60a34c567468a3c6e72d35a504096c Mon Sep 17 00:00:00 2001 From: suraj kumar Date: Sun, 2 Aug 2026 14:42:50 +0530 Subject: [PATCH 6/6] fix(cockpit): install app componets instead of dependencies - closes #4688 Summary of what was done and why: The cockpit profile in archinstall was listing udisks2 and packagekit as explicit packages. These are low-level backend dependenices and not cockpit-specific UI components. The Arch Linux cockpit package was split upstream (see the packaging repo commit and cockpit-project/cockpit#19315), introducing dedicated cockpit app components: - cockpit-storaged (replaces udisks2) - cockpit-packagekit (replaces packagekit) Installing the app components is the correct way to get the Cockpit UI panels for storage and software management, as documented on: https://wiki.archlinux.org/title/Cockpit Without this fix, users would get the raw backend packages without the actual Cockpit UI panels, making the web interface incomplete.