Install cosmic and deps

yay -S cosmic cosmic-session cosmic-applets cosmic-launcher cosmic-files cosmic-term cosmic-settings cosmic-workspaces cosmic-panel cosmic-comp cosmic-text cosmic-notifications cosmic-bg cosmic-calendar cosmic-screenshot cosmic-greeter

This did take a while

(some were missing, we’ll just see what happens) :shrug:

Check which display manager is being used.

sudo systemctl list-unit-files | grep display-manager
display-manager.service                      alias           -
 
systemctl list-units --type=service | grep dm
  sddm.service                                          loaded active running Simple Desktop Display Manager

OK, post reboot it;‘s not working.

Looking in sessions we see this.

lsd -l /usr/share/wayland-sessions/
lsd -l /usr/share/xsessions/
.rw-r--r-- root root 146 B Wed Oct 29 06:10:48 2025 cosmic.desktop
.rw-r--r-- root root 190 B Tue Oct 14 17:00:22 2025 hyprland-uwsm.desktop
.rw-r--r-- root root 176 B Tue Oct 14 17:00:22 2025 hyprland.desktop
lsd: /usr/share/xsessions/: No such file or directory (os error 2).

Added this to /etc/sddm.conf

[General]
InputMethod=
 
[Wayland]
SessionDir=/usr/share/wayland-sessions
 
[X11]
SessionDir=/usr/share/xsessions
 

Since I have ml4w, we need to do some other things…

# Wrapper that strips Hyprland-specific env before starting COSMIC
sudo tee /usr/local/bin/start-cosmic-plain >/dev/null <<'EOF'
#!/usr/bin/env bash
# Avoid inherited Wayland/Hyprland session vars
unset XDG_CURRENT_DESKTOP
unset XDG_SESSION_TYPE
unset WAYLAND_DISPLAY
unset HYPRLAND_INSTANCE_SIGNATURE
exec /usr/bin/start-cosmic
EOF
sudo chmod +x /usr/local/bin/start-cosmic-plain
 
sudo tee /usr/share/wayland-sessions/cosmic-ml4w.desktop >/dev/null <<'EOF'
[Desktop Entry]
Name=COSMIC (Wayland, ML4W-safe)
Comment=The COSMIC desktop environment via a clean session wrapper
Exec=/usr/local/bin/start-cosmic-plain
Type=Application
DesktopNames=cosmic
EOF

Disable things

systemctl --user disable --now hypridle.service 2>/dev/null
systemctl --user disable --now hyprpaper.service 2>/dev/null
systemctl --user disable --now hyprpolkit-agent.service 2>/dev/null
systemctl --user disable --now hyprlock.service 2>/dev/null
systemctl --user disable --now waybar.service 2>/dev/null
systemctl --user disable --now xdg-desktop-portal-hyprland.service 2>/dev/null

And make them start only for hyprland

systemctl --user add-wants hyprland-session.target hypridle.service 2>/dev/null
systemctl --user add-wants hyprland-session.target hyprpaper.service 2>/dev/null
systemctl --user add-wants hyprland-session.target hyprpolkit-agent.service 2>/dev/null
systemctl --user add-wants hyprland-session.target hyprlock.service 2>/dev/null
systemctl --user add-wants hyprland-session.target waybar.service 2>/dev/null
systemctl --user add-wants hyprland-session.target xdg-desktop-portal-hyprland.service 2>/dev/null

Start cosmic and cosmic only

systemctl --user enable cosmic-session.target 2>/dev/null || true

Fix SDM gears again

sudo mkdir -p /usr/share/xsessions
sudo install -d /etc/sddm.conf.d
sudo tee /etc/sddm.conf.d/10-session-dirs.conf >/dev/null <<'EOF'
[Wayland]
SessionDir=/usr/share/wayland-sessions
 
[X11]
SessionDir=/usr/share/xsessions
EOF
 
# Clear any odd cache and bounce SDDM
sudo rm -rf /var/lib/sddm/.cache/* 2>/dev/null
sudo systemctl restart sddm
 

To try this again..

sudo systemctl restart sddm
 

Ensure Hyperlock doesn’t start things

systemctl --user disable --now hyprlock.service 2>/dev/null
systemctl --user disable --now hypridle.service 2>/dev/null
systemctl --user disable --now hyprpaper.service 2>/dev/null
systemctl --user disable --now waybar.service 2>/dev/null
systemctl --user disable --now xdg-desktop-portal-hyprland.service 2>/dev/null
 
# bind them to Hyprland session only (safe if they don’t exist)
systemctl --user add-wants hyprland-session.target hyprlock.service 2>/dev/null
systemctl --user add-wants hyprland-session.target hypridle.service 2>/dev/null
systemctl --user add-wants hyprland-session.target hyprpaper.service 2>/dev/null
systemctl --user add-wants hyprland-session.target waybar.service 2>/dev/null
systemctl --user add-wants hyprland-session.target xdg-desktop-portal-hyprland.service 2>/dev/null
 

Remove hyprland autostarts

sudo mkdir -p /usr/share/xsessions
sudo install -d /etc/sddm.conf.d
sudo tee /etc/sddm.conf.d/10-session-dirs.conf >/dev/null <<'EOF'
[Wayland]
SessionDir=/usr/share/wayland-sessions
[X11]
SessionDir=/usr/share/xsessions
EOF
sudo rm -rf /var/lib/sddm/.cache/* 2>/dev/null

Add cosmic desktop session

# verify binary exists
command -v cosmic-session || echo "cosmic-session not found"

# update the session descriptor to call it directly
sudo tee /usr/share/wayland-sessions/cosmic.desktop >/dev/null <<'EOF'
[Desktop Entry]
Name=COSMIC (Wayland)
Comment=The COSMIC desktop environment
Exec=/usr/bin/cosmic-session
Type=Application
DesktopNames=cosmic
EOF

Rollback (quick)

  • Remove the ML4W-safe session:

    sudo rm -f /usr/share/wayland-sessions/cosmic-ml4w.desktop /usr/local/bin/start-cosmic-plain

  • Re-enable Hyprland helpers globally (if you want):

    systemctl --user enable --now hypridle.service hyprpaper.service hyprpolkit-agent.service hyprlock.service waybar.service


If any unit names don’t match (ML4W sometimes prefixes them), paste:

systemctl --user list-unit-files | grep -i hypr

and I’ll give you the exact add-wants lines for your setup.

🧩 (Optional) Set COSMIC as default session

If you want SDDM to always start COSMIC automatically:

sudo mkdir -p /usr/share/xsessions /usr/share/wayland-sessions sudo cp /usr/share/wayland-sessions/cosmic.desktop /usr/share/wayland-sessions/default.desktop

Or edit:

sudo nano /etc/sddm.conf

and set:

[Autologin] Session=cosmic


Would you like me to show how to make COSMIC the default (so SDDM always logs into it without selecting it manually)?