Skip to main content

Siduction KDE Guide

Philosophy: bleeding-edge (Debian Sid), rolling forward, modern CLI tooling, and strict safety protocols to keep a fast-moving system stable.

siduction tracks Debian unstable and ships its own repos (extra, fixes) alongside Debian’s. siduction recommends doing major upgrades in multi-user.target (text mode) rather than inside a running desktop session. (manual.siduction.org)


0 — The siduction Golden Rule (do this, avoid pain)

  1. Do not run apt full-upgrade inside a running GUI session when large core updates are involved (desktop stack, kernel, graphics drivers). siduction warns that upgrades not done in multi-user.target can cause problems when updating X/desktop components. (manual.siduction.org)
  2. Use this workflow instead:
    • In KDE: download-only: apt update && apt full-upgrade -d
    • Then switch to text mode (multi-user.target) to apply the upgrade. (manual.siduction.org)
  3. Always read apt-listbugs / apt-listchanges before you accept changes (especially when it says “grave” / “critical”).

1 — Essentials

1.1 — Certificates & keyrings

sudo apt update
sudo apt install -y ca-certificates debian-archive-keyring siduction-archive-keyring

1.2 — Repositories (deb822, siduction-style)

siduction uses deb822 .sources files in /etc/apt/sources.list.d/ by default (typically debian.sources, extra.sources, fixes.sources). (manual.siduction.org) This section rewrites those files into a clean, predictable baseline.

1.2.1 — Backup existing sources (timestamped)

ts="$(date +%Y%m%d_%H%M%S)"
sudo mkdir -p "/etc/apt/sources.list.d/backup-$ts"

# Back up deb822 sources
sudo sh -c 'ls /etc/apt/sources.list.d/*.sources >/dev/null 2>&1 && cp -a /etc/apt/sources.list.d/*.sources "/etc/apt/sources.list.d/backup-'"$ts"'/" || true'

# Back up old-style lists if they exist
sudo test -f /etc/apt/sources.list && sudo cp -a /etc/apt/sources.list "/etc/apt/sources.list.d/backup-$ts/sources.list.bak" || true
sudo sh -c 'ls /etc/apt/sources.list.d/*.list >/dev/null 2>&1 && cp -a /etc/apt/sources.list.d/*.list "/etc/apt/sources.list.d/backup-'"$ts"'/" || true'

1.2.2 — Write Debian + siduction repos (no deb-src by default)

# Debian unstable
cat <<'EOF' | sudo tee /etc/apt/sources.list.d/debian.sources
Types: deb
URIs: https://deb.debian.org/debian/
Suites: unstable
Components: main contrib non-free non-free-firmware
Enabled: yes
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
EOF

# siduction extra
cat <<'EOF' | sudo tee /etc/apt/sources.list.d/extra.sources
Types: deb
URIs: https://packages.siduction.org/extra
Suites: unstable
Components: main
Enabled: yes
Signed-By: /usr/share/keyrings/siduction-archive-keyring.gpg
EOF

# siduction fixes
cat <<'EOF' | sudo tee /etc/apt/sources.list.d/fixes.sources
Types: deb
URIs: https://packages.siduction.org/fixes
Suites: unstable
Components: main contrib non-free
Enabled: yes
Signed-By: /usr/share/keyrings/siduction-archive-keyring.gpg
EOF

sudo apt update

Notes:

  • siduction documents deb822, including Signed-By and Enabled, and uses unstable for both Debian and siduction repos. (manual.siduction.org)
  • Optional cleanup (only if you see duplicate warnings): check /etc/apt/sources.list and /etc/apt/sources.list.d/*.list for old entries and disable/remove duplicates.

1.3 — APT safety helpers (mandatory for Sid)

sudo apt install -y apt-listbugs apt-listchanges

1.4 — First synchronization (download in KDE, apply in TTY)

Download-only (OK in KDE):

sudo apt update
sudo apt full-upgrade -d

siduction explicitly recommends the -d workflow: download packages while in X, then do the real upgrade later in multi-user.target. (manual.siduction.org)

Apply safely (recommended):

sudo systemctl isolate multi-user.target
# log in on the TTY
sudo apt update
sudo apt full-upgrade
sudo reboot

multi-user.target is siduction’s recommended “system update” target. (manual.siduction.org)

1.5 - Set default.target

If you only update one time a day, you can set the default boot option to console using multi-user.target as follows:

sudo systemctl set-default multi-user.target

When you want to switch back, you can type the following command:

sudo systemctl set-default graphical.target

2 — Installation & Configuration

2.1 — App installation (same choices; do the big install in multi-user.target)

Do not chain systemctl isolate ... && apt ... on one line—isolate will switch targets and terminate the GUI session.

Use this workflow:

  1. From KDE, log out, then switch to a TTY (siduction commonly suggests Ctrl+Alt+F3) and log in, or run sudo systemctl isolate multi-user.target and then log in on the TTY. (manual.siduction.org)

  2. Run:

sudo apt update
sudo apt install -y \
7zip audacity bat blender btop build-essential chromium cmake composer curl \
debian-goodies debconf-utils dnsutils dxvk earlyoom exfatprogs eza fancontrol fastfetch \
fd-find ffmpeg ffmpegthumbs flatpak foliate fwupd fzf gdu gh gimp git gparted \
gping gufw gwenview handbrake hardinfo2 haruna httpie imagemagick inxi inkscape \
iproute2 jq kde-config-flatpak kde-config-sddm kde-standard kdenlive kdesvn \
kdevelop krename krita ksystemlog lazygit libreoffice lm-sensors lshw meld \
mesa-utils meson micro mpv musescore nala ninja-build nmap nodejs npm ntfs-3g \
obs-studio pandoc partitionmanager pavucontrol php pipx pkg-config \
plasma-discover-backend-flatpak powertop python3 python3-pip python3-venv \
qbittorrent qt6-image-formats-plugins ripgrep smartmontools svgpart \
telegram-desktop tig ufw vulkan-tools wayland-utils webp wget whois wine \
winetricks wl-clipboard xdg-desktop-portal xdg-desktop-portal-kde \
xfonts-terminus zsh zsh-autosuggestions zsh-syntax-highlighting
  1. When done, reboot (simple and safe after large installs):
sudo reboot

2.2 — Fonts

2.2.1 — System + MS core fonts

sudo apt install -y \
fonts-atkinson-hyperlegible fonts-cantarell fonts-dejavu fonts-fantasque-sans \
fonts-firacode fonts-font-awesome fonts-ibm-plex fonts-inconsolata \
fonts-inter-variable fonts-jetbrains-mono fonts-liberation \
fonts-liberation-sans-narrow fonts-montserrat fonts-noto fonts-noto-cjk \
fonts-noto-cjk-extra fonts-noto-color-emoji fonts-noto-extra fonts-noto-mono \
fonts-noto-ui-core fonts-noto-ui-extra fonts-open-sans fonts-opendyslexic \
fonts-opensymbol fonts-powerline fonts-recommended fonts-roboto fonts-sora \
fonts-source-code-pro fonts-symbola fonts-ubuntu fonts-unfonts-core fonts-unifont

echo "ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true" | sudo debconf-set-selections
sudo apt install -y ttf-mscorefonts-installer

2.2.2 — Nerd Fonts (manual)

https://www.nerdfonts.com/font-downloads

2.3 — OOM protection + firewall (UFW)

sudo systemctl enable --now earlyoom
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Optional (only if you use SSH):
sudo ufw limit ssh

# KDE Connect:
sudo ufw allow 1714:1764/udp
sudo ufw allow 1714:1764/tcp

sudo ufw --force enable
sudo ufw status verbose

2.4 — Flatpak (Flathub)

sudo flatpak remote-add --if-not-exists --system flathub https://dl.flathub.org/repo/flathub.flatpakrepo

2.5 — siduction kernel meta-packages + firmware updates

siduction’s kernel meta-packages:

sudo apt update
sudo apt install -y linux-image-siduction-amd64 linux-headers-siduction-amd64

These are the documented meta packages, and keeping them installed means kernel updates are included during normal system updates. (manual.siduction.org)

Firmware (non-fatal if nothing is supported):

sudo fwupdmgr refresh || true
sudo fwupdmgr get-updates || true
sudo fwupdmgr update || true

3 — Microcode packages

3.1 - Install Linux Firmware Packages

sudo apt install -y firmware-linux-nonfree firmware-iwlwifi firmware-realtek

3.2 — For Intel CPUs

sudo apt install -y intel-microcode

3.3 — AMD CPUs

sudo apt install -y amd64-microcode firmware-amd-graphics

Note: You need to sudo reboot after running the above commands.


4 — Manual software installation

https://antigravity.google/download/linux
https://code.visualstudio.com/
https://docs.unity3d.com/hub/manual/InstallHub.html#install-hub-linux
https://gdevelop.io/download
https://learn.microsoft.com/en-us/dotnet/core/install/linux-debian
https://support.mozilla.org/en-US/kb/install-firefox-linux#w_install-firefox-deb-package-for-debian-based-distributions
https://www.jetbrains.com/toolbox-app/

4.2 — Others

https://gitfiend.com/
https://github.com/rustdesk/rustdesk/releases/
https://www.mql5.com/en/articles/625

5 — ZSH: Custom functions & aliases (~/.zshrc)

Append the following to ~/.zshrc:

# ~/.zshrc
# ============================================================================
# siduction Linux - Zsh Configuration
# ============================================================================
# Custom configuration for siduction Linux with safe update workflows,
# system diagnostics, and development utilities. All custom commands are
# prefixed with 'x' for easy identification and tab completion.
#
# IMPORTANT: siduction uses a rolling-release model with specific update
# requirements. This config implements safe update patterns per siduction
# documentation (GUI detection, multi-user.target isolation for upgrades).
#
# QUICK REFERENCE - ALL AVAILABLE COMMANDS
# ============================================================================
#
# SYSTEM UPDATES & MAINTENANCE
# xupdate - Safe system update (GUI-aware, download-only)
# xclean - Remove unused packages and clean apt cache
# xclean_zsh - Clear Zsh history file
# xmaid - Update + Clean
# xsupermaid - Update + Clean History + Clean Packages
# xuoff - Update + Clean + Poweroff
#
# SYSTEM DIAGNOSTICS & INFO
# xinfo - Display comprehensive system information
# xbaloo_reset - Reset KDE Baloo file indexer (purge + rebuild)
# xhr - Print horizontal rule separator
# xclear - Clear terminal (full reset)
#
# FILE & EDITOR OPERATIONS
# xedit_zsh - Edit this ~/.zshrc file
# xedit_hosts - Edit /etc/hosts with sudoedit
#
# DEVELOPMENT TOOLS
# xnpm_update - Update npm packages using npm-check-updates
# xserver - Start Python HTTP server on localhost:8080
# xenv - Create/activate Python venv in current directory
#
# FILE LISTING (requires eza)
# xls - List files with icons (eza)
# xll - List files detailed with icons (eza)
# xla - List all files including hidden (eza)
# xlt - Tree view, 2 levels deep (eza)
#
# COMPATIBILITY ALIASES
# fd - fdfind alias (if fd not installed)
# bat - batcat alias (if bat not installed)
#
# ============================================================================

# ============================================================================
# HELPER FUNCTIONS (INTERNAL)
# ============================================================================

# _xget_editor - Detect available editor with support for args
# Priority: $VISUAL > $EDITOR > kate > micro > nano > vi
# Returns editor command as array via Zsh's $reply variable
_xget_editor() {
emulate -L zsh
local user_ed="${VISUAL:-${EDITOR:-}}"

if [[ -n "$user_ed" ]]; then
reply=(${(z)user_ed})
return 0
fi

if (( $+commands[kate] )); then
reply=(kate)
elif (( $+commands[micro] )); then
reply=(micro)
elif (( $+commands[nano] )); then
reply=(nano)
elif (( $+commands[vi] )); then
reply=(vi)
else
return 1
fi
}

# xhr - Print horizontal rule separator
xhr() {
emulate -L zsh
print -r -- ${(l:60:::)}
}

# ============================================================================
# SYSTEM UPDATE & MAINTENANCE FUNCTIONS
# ============================================================================
# siduction requires special care during system upgrades:
# - Full upgrades should be done from multi-user.target (no GUI)
# - Running dist-upgrade from GUI can cause issues
# - These functions implement safe patterns per siduction documentation
# ============================================================================

# xupdate - Safe system update with GUI detection
#
# BEHAVIOR:
# GUI Session → Download only (apt full-upgrade -d)
# TTY/Console → Full upgrade + Flatpak + Firmware
#
# If in GUI, provides instructions for safe upgrade via multi-user.target

xupdate() {
emulate -L zsh
setopt err_return pipe_fail

# Detect if GUI services are active (preferred over env vars)
local -i gui_active=0
if (( $+commands[systemctl] )); then
systemctl is-active --quiet display-manager.service && gui_active=1
systemctl is-active --quiet graphical.target && gui_active=1
else
[[ -n "${DISPLAY:-}" || -n "${WAYLAND_DISPLAY:-}" ]] && gui_active=1
fi

# Cache sudo credentials early
sudo -v || return 1

# GUI active => download only
if (( gui_active )); then
print -P "%F{yellow}$sep%f"
print -P "%F{yellow}GUI SERVICES DETECTED - DOWNLOAD ONLY%f"
print -P "%F{yellow}$sep%f"
print ""

sudo apt update || return $?
sudo apt full-upgrade -d || return $?

print ""
print -P "%F{yellow}$sep%f"
print "Downloads complete. To apply safely:"
print " sudo systemctl isolate multi-user.target"
print " # log in on TTY"
print " xupdate"
print -P "%F{yellow}$sep%f"
return 0
fi

# Console mode => full upgrade
print -P "%F{green}$sep%f"
print -P "%F{green}CONSOLE MODE - RUNNING FULL SYSTEM UPGRADE%f"
print -P "%F{green}$sep%f"
print ""

print "Updating package lists..."
sudo apt update || return $?

print "\nPerforming full system upgrade..."
sudo apt full-upgrade || return $?

# Reboot heuristic: running kernel vs newest vmlinuz in /boot
local running_kernel newest_kernel
running_kernel="$(uname -r)"

local -a vmlinuz
vmlinuz=(/boot/vmlinuz-*(N))
if (( ${#vmlinuz} )); then
newest_kernel="$(
print -rl -- ${vmlinuz:t} \
| sed 's/^vmlinuz-//' \
| command sort -V \
| tail -n 1
)"
else
newest_kernel=""
fi

local -i reboot_recommended=0
[[ -n "$newest_kernel" && "$newest_kernel" != "$running_kernel" ]] && reboot_recommended=1

# Optional Flatpak updates
if (( $+commands[flatpak] )) && [[ -n "$(flatpak remotes 2>/dev/null)" ]]; then
print "\nUpdating Flatpak packages..."
flatpak update -y || print -u2 "Warning: Flatpak update had issues (non-fatal)."
fi

print "\nCleaning apt cache..."
sudo apt clean || true

print ""
print "Optional: review orphaned packages:"
print " sudo apt autoremove --dry-run"
print " (then run without --dry-run if you agree)"

print ""
print -P "%F{green}$sep%f"
print -P "%F{green}UPDATE COMPLETE%f"
print -P "%F{green}$sep%f"
print ""

# Only prompt if we're on an interactive terminal
if [[ -t 0 ]]; then
if (( reboot_recommended )); then
print -P "%F{yellow}Reboot recommended: running kernel = ${running_kernel}, newest installed = ${newest_kernel}%f"
print -n "Reboot now? (y/N): "
if read -q; then
print "\nRebooting..."
sudo systemctl reboot
else
print "\nReboot skipped. Run: sudo systemctl reboot"
print "To start GUI without reboot: sudo systemctl isolate graphical.target"
fi
else
print -n "Start graphical environment now? (y/N): "
if read -q; then
print "\nSwitching to graphical.target..."
sudo systemctl isolate graphical.target
else
print "\nStaying in console mode."
print "To start GUI later: sudo systemctl isolate graphical.target"
fi
fi
fi
}

# xclean - Remove unused packages and clean apt cache
xclean() {
emulate -L zsh
print "Cleaning system..."

print "Removing unused packages..."
sudo apt autoremove --purge -y && print "✓ Autoremove complete." || print "✗ Autoremove failed." >&2

print "Cleaning apt cache..."
sudo apt autoclean && print "✓ Autoclean complete." || print "✗ Autoclean failed." >&2

print "System cleaning finished."
}

# xclean_zsh - Clear Zsh history file
xclean_zsh() {
emulate -L zsh
local hf="${HISTFILE:-$HOME/.zsh_history}"
print "Clearing Zsh history file ($hf)..."

: >| "$hf" || { print -u2 "xclean_zsh: failed to truncate $hf"; return 1; }
fc -R "$hf" || { print -u2 "xclean_zsh: failed to reload history from $hf"; return 1; }

print -u2 "Zsh history file truncated and re-read. Current session history cleared."
}

# xmaid - Update + Clean
xmaid() {
emulate -L zsh
xupdate && xclean
}

# xsupermaid - Update + Clean History + Clean Packages
xsupermaid() {
emulate -L zsh
xupdate && xclean_zsh && xclean
}

# xuoff - Update + Clean + Poweroff
xuoff() {
emulate -L zsh
xmaid && sudo poweroff
}

# ============================================================================
# SYSTEM DIAGNOSTICS & INFORMATION FUNCTIONS
# ============================================================================

# xinfo - Display comprehensive system information
# Shows: OS details, hardware, graphics stack, kernel, session type
xinfo() {
emulate -L zsh

xhr
print -P "%B═══ OS & Hardware ═══%b"
if (( $+commands[fastfetch] )); then
fastfetch
else
print "✗ fastfetch not found."
fi

xhr
print -P "%B═══ System Details ═══%b"
if (( $+commands[inxi] )); then
inxi -FGx
else
print "✗ inxi not found."
fi

xhr
print -P "%B═══ Graphics Stack ═══%b"
print "Kernel: $(uname -r)"
print "Session: ${XDG_SESSION_TYPE:-Unknown}"

# OpenGL info
if (( $+commands[glxinfo] )); then
print ""
print "OpenGL Information:"
glxinfo -B 2>/dev/null | grep -Ei "direct rendering|device|vendor|version|renderer" || true
fi

# Vulkan info
if (( $+commands[vulkaninfo] )); then
print ""
print "Vulkan Information:"
vulkaninfo --summary 2>/dev/null | grep -E "deviceName|driverInfo|apiVersion" || true
fi

xhr
}

# xbaloo_reset - Reset KDE Baloo file indexer
# Suspends/disables, purges index, then resumes/enables and checks
xbaloo_reset() {
emulate -L zsh

if (( $+commands[balooctl6] )); then
print "Resetting Baloo (KDE 6)..."
balooctl6 suspend
sleep 2
balooctl6 purge
balooctl6 resume
sleep 1
balooctl6 check
print "✓ Baloo reset complete (KDE 6)."

elif (( $+commands[balooctl] )); then
print "Resetting Baloo (KDE 5)..."
balooctl disable
sleep 2
balooctl purge
balooctl enable
sleep 1
balooctl check
print "✓ Baloo reset complete (KDE 5)."

else
print -u2 "✗ Baloo control command not found."
return 1
fi
}

# ============================================================================
# EDITOR FUNCTIONS
# ============================================================================

# xedit_zsh - Edit ~/.zshrc
xedit_zsh() {
emulate -L zsh
local -a ed

if ! _xget_editor; then
print -u2 "✗ No editor found."
return 1
fi

ed=("${reply[@]}")
"${ed[@]}" "$HOME/.zshrc"
}

# xedit_hosts - Edit /etc/hosts with sudoedit
xedit_hosts() {
emulate -L zsh
local -a ed

if ! _xget_editor; then
print -u2 "✗ No editor found."
return 1
fi

ed=("${reply[@]}")
SUDO_EDITOR="${(j: :)${(q)ed[@]}}" sudoedit /etc/hosts
}

# ============================================================================
# DEVELOPMENT FUNCTIONS
# ============================================================================

# xnpm_update - Update npm packages using npm-check-updates
# Requires package.json in current directory
xnpm_update() {
emulate -L zsh
setopt localoptions errexit nounset pipefail

if [[ ! -f package.json ]]; then
print -u2 "✗ No package.json found in $PWD"
return 1
fi

print "Checking for npm package updates..."
npx --yes npm-check-updates -u

print "Installing updated packages..."
npm install

print "Running npm audit..."
npm audit || print -u2 "⚠ npm audit reported issues."

print "✓ npm update complete."
}

# xenv - Create and/or activate Python virtual environment
# Creates 'venv' directory if it doesn't exist, then activates and updates pip
xenv() {
emulate -L zsh

if [[ ! -d venv ]]; then
print "Creating Python virtual environment..."
python3 -m venv venv || { print -u2 "✗ Failed to create venv"; return 1; }
fi

print "Activating virtual environment..."
source venv/bin/activate

print "Updating pip, setuptools, and wheel..."
python -m pip install -U pip setuptools wheel

print "✓ Virtual environment ready."
}

# ============================================================================
# ALIASES - UTILITIES
# ============================================================================

alias xclear='tput reset'

# ============================================================================
# ALIASES - FILE LISTING (requires eza)
# ============================================================================

if (( $+commands[eza] )); then
alias xls='eza --icons --group-directories-first'
alias xll='eza -lh --icons --group-directories-first'
alias xla='eza -a --icons --group-directories-first'
alias xlt='eza --tree --level=2 --icons'
fi

# ============================================================================
# ALIASES - DEBIAN PACKAGE NAME COMPATIBILITY
# ============================================================================
# Debian packages some tools with different names than upstream

(( $+commands[fdfind] )) && ! (( $+commands[fd] )) && alias fd='fdfind'
(( $+commands[batcat] )) && ! (( $+commands[bat] )) && alias bat='batcat'

# ============================================================================
# ALIASES - DEVELOPMENT
# ============================================================================

alias xserver='python3 -m http.server 8080 --bind 127.0.0.1'

# ============================================================================
# ZSH CONFIGURATION
# ============================================================================

# Setup cache directory for completion dumps
ZSH_CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/zsh"
mkdir -p "$ZSH_CACHE"

# Initialize completion system
autoload -Uz compinit
compinit -d "$ZSH_CACHE/zcompdump-$ZSH_VERSION"

# History settings
HISTFILE="${ZDOTDIR:-$HOME}/.zsh_history"
HISTSIZE=10000
SAVEHIST=10000

# Shell options
setopt HIST_IGNORE_ALL_DUPS # Remove older duplicates from history
setopt SHARE_HISTORY # Share history between sessions
setopt CORRECT # Command spelling correction
setopt INTERACTIVE_COMMENTS # Allow comments in interactive shell
setopt PROMPT_SUBST # Enable parameter expansion in prompts

# ============================================================================
# PROMPT CONFIGURATION
# ============================================================================
# Pure Zsh prompt with VCS info (no external dependencies)
# Colors: Catppuccin Mocha theme

autoload -Uz colors vcs_info add-zsh-hook
colors

# Configure VCS info (git branch only for performance)
zstyle ':vcs_info:*' enable git
zstyle ':vcs_info:git:*' formats '(%b)'
zstyle ':vcs_info:git:*' actionformats '(%b|%a)'

add-zsh-hook precmd vcs_info

# Prompt format:
# user@host ~/path (git-branch)
# ❯
PROMPT='%F{#cba6f7}%n%f@%F{#fab387}%m%f %F{#89b4fa}%~%f %F{#a6e3a1}${vcs_info_msg_0_}%f
%F{#a6e3a1}❯%f '

# ============================================================================
# PLUGIN LOADING
# ============================================================================
# Load system-installed Zsh plugins (Debian package locations)

# zsh-autosuggestions: Fish-like suggestions based on history
[[ -f /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh ]] && \
source /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh

# zsh-syntax-highlighting: Fish-like syntax highlighting (must be loaded last)
[[ -f /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh ]] && \
source /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

# ============================================================================
# END OF CONFIGURATION
# ============================================================================

6 — Best-practice checklist (siduction reality)

  • Before big upgrades, check siduction upgrade warnings/news. siduction explicitly recommends following upgrade warnings on the main page. (manual.siduction.org)
  • Keep at least one older kernel installed for a few days after a kernel upgrade. (manual.siduction.org)
  • Update cadence: every 1–2 weeks is a practical guideline; don’t let Sid rot for months. (manual.siduction.org)
  • If you want to migrate old .list entries to deb822 cleanly, siduction notes apt modernize-sources. (manual.siduction.org)