A fast, calm Linux desktop based on Debian 12. It sets itself up, updates itself, and you never need a terminal.
⬇ Download Simple OS (latest release, about 1.5 GB) · Known issues · Questions · Report a bug
![]() The desktop |
![]() Setup Wizard on the first login |
![]() Control Center |
![]() App menu |
- 64-bit PC (x86-64) with UEFI or legacy BIOS. Secure Boot is supported, so you can leave it on.
- 2 GB RAM (1 GB minimum for the installer, 4 GB or more recommended for browsing and gaming)
- 20 GB disk space (the installer accepts 10 GB)
- Internet for the setup wizard (browser, office suite, games) and for updates
Which computers Simple OS is known to work on, what didn't work, and how to add yours: hardware compatibility.
- Download
Simple-OS.isoandSimple-OS.iso.sha256from the latest release. - Check the download (optional, recommended):
- Linux:
sha256sum -c Simple-OS.iso.sha256should printSimple-OS.iso: OK - Windows (PowerShell):
Get-FileHash Simple-OS.isoand compare the hash with the one inSimple-OS.iso.sha256
- Linux:
- Make a USB stick (4 GB or larger, everything on it is erased):
- Windows / macOS / Linux: balenaEtcher – pick the ISO, pick the stick, Flash.
- Windows: Rufus also works. If it asks, choose "Write in DD Image mode".
- Linux: Disks (gnome-disks) → select the stick → Restore Disk Image…, or
sudo dd if=Simple-OS.iso of=/dev/sdX bs=4M status=progress oflag=sync(replacesdXwith the stick – check withlsblk!)
- Start from the stick. Usually F12, F9, F2 or Esc right after power-on, depending on the brand. The live
session needs no password. If something unexpected asks: user
simple, passwordlive. - Install with Install Simple OS on the desktop.
Already running Simple OS? New versions arrive through Software Updates – no need to reinstall.
Thank you for testing! Every report helps, especially from real hardware.
Wanted right now (1.0.6 is out):
- The screen lock: leave the computer alone until the screen locks itself (or close the lid), then sign in again. Does your desktop come back every time?
- Installing next to Windows (dual boot), also without internet: is the clock right afterwards, in Windows and in Simple OS?
- Installing on real hardware, in legacy BIOS / MBR mode as well as UEFI. Do your other systems stay in the boot menu after the first GRUB update?
- Updating from 1.0.5 through Software Updates: does the "What's new" window show up after the restart? Does Control Center → Wi-Fi list your networks?
- Installing in your language (not English), and the search with a non-US keyboard (Super key, then type).
How to report:
- Open Menu → Help → Report a Problem. It saves a report file to your Desktop (your name, user name, network names and addresses are removed).
- Open a bug report, fill in the form and drag the report file into it.
- Useful extra logs, if something went wrong:
- errors of the current start:
journalctl -b -p err - errors of the previous start (e.g. after a hang at shutdown):
journalctl -b -1 -p err - an install that did not finish (still in the live session):
sudo cat /root/.cache/calamares/session.log
- errors of the current start:
Not sure if it's a bug, or a question like "does it run on my PC?" – ask in Discussions.
Thanks to all Testers & Users <3
Every test on real hardware, every bug report and every idea makes Simple OS better.
A minimal desktop based on Debian 12 "Bookworm" with Openbox, built with live-build.
Brand: SOS – Simple Operating System. The "O" is a lifebuoy (red and white – a rescue from Big Tech), the
slogan is "Keep it Simple". The name stays "Simple OS" (IDs, packages and paths use simpleos); SOS is the
logo and short form.
| Command | Purpose |
|---|---|
./build_iso.sh |
Build the ISO → output/Simple-OS.iso + .sha256 + Simple-OS.packages.txt (needs sudo, log in build/build.log) |
./build_iso.sh --config-only |
Only generate the live-build configuration in build/config (no sudo) |
./test_vm.sh [--uefi|--secureboot] |
Boot the ISO in QEMU and install it: BIOS (output/disk.qcow2), UEFI, or UEFI with Secure Boot and Microsoft keys (OVMF, output/disk-<mode>.qcow2, NVRAM in output/ovmf-vars-<mode>.fd) |
./test_installed_vm.sh [--uefi|--secureboot] |
Boot the installed system from that mode's disk |
./tools/release.sh key |
Once: create the release signing key (private key outside the repo, public key into the image) |
./tools/release.sh version X.Y.Z |
Set the version of the next edition everywhere it is shown (usr/lib/os-release, installer branding) |
./tools/release.sh sign / publish [--no-iso] |
Sign output/repo, publish it with the ISO as GitHub release v<VERSION> ("latest") |
Release: test checklist in TESTING.md, text for the download page in RELEASE_NOTES.md (its #known-issues
section is the target of the installer's "Known issues" button).
Installed systems follow the newest Simple OS on their own – through Software Updates, like any Debian update:
- Everything Simple OS adds to Debian is the package
simpleos(tools/build_deb.sh, built by every./build_iso.sh, also--config-only):config/includes.chrootminus installer/live-only files and first defaults (EXCLUDE), its/etcfiles are conffiles. Version =VERSION_IDinusr/lib/os-release, also the version on the boot menu../tools/release.sh version X.Y.Zsets it together withVERSION,PRETTY_NAMEand the installer's branding (etc/calamares/branding/simpleos/branding.desc);build_deb.shrefuses to build when they do not match (before 1.0.1 the installer had "1.0" written in by hand). - The image installs the package (live-build
packages.chroot) and the APT source/etc/apt/sources.list.d/simpleos.sources:https://github.com/FreakySneaky787/simple-os/releases/latest/download/, a flat repository signed withusr/share/keyrings/simpleos-archive-keyring.asc. Every GitHub release carries the repository (output/repo:simpleos_<v>_all.deb, fastfetch,Packages,Release,InRelease,Release.gpg); "latest" always points to the newest one. Hook98_update_channelswitches the source off in the image if GitHub is not reachable during the build (the first release does not exist yet);simpleos-post-installswitches it on. simpleos-updatelists the new edition at the top ("Simple OS 1.1"),simpleos-system-setup --upgradeinstalls it with the other updates. If only the Simple OS source fails (GitHub down), Debian's updates still go on.- What a package update alone does not reach,
/usr/local/lib/simpleos/editiondoes (data in/usr/share/simpleos/edition, log/var/log/simpleos-edition.logand~/.cache/simpleos-edition.log):- Settings in the homes (
--user, at every sign-in via/etc/X11/Xsession.d/80simpleos-edition, before the desktop starts): each copy of an/etc/skelfile is replaced by the new version only if nobody changed it – its content is a version Simple OS once shipped (skel.history, every version from git,tools/managed_history.py) or the one the tool put there last time. Changed copies – by the user, or at every sign-in by Simple OS tools (taskbar: battery/layout lines intint2rc, theme: accent colors, wallpaper schedule) – get a 3-way merge (diff3, like git): the changes between the skel version the copy is based on (~/.local/state/simpleos/base/) and the new one are worked in, the user's/tools' lines stay; if both changed the same place the copy stays as it is ("kept" in the log). Deleted copies stay deleted, new files are added. - System (
--system, from the package's postinst):/etcfiles dpkg kept although they are an unchanged older Simple OS version (system.history); files of Debian packages that dpkg would refuse in our package (/etc/issue,/etc/motd,zramswap, LightDM greeter, xfce4-power-manager – copies inedition/system, same rule); the build hooks marked "Re-run on Simple OS updates" (00, 07, 09, 10, 11, 14, 17 – derived settings, must stay idempotent; never 12, it would switch a firewall turned off by the user back on); a new boot splash → initramfs. - New packages in
config/package-lists(except installer/bootloader): installed once after the upgrade (--todo-packages,--mark-packages); what the user removes later is not installed again, a package that could only be installed by removing something is left out (otherwise every update would fail on it). - One-time steps for changes that need more than replacing a file: executable scripts in
config/includes.chroot/usr/share/simpleos/edition/migrations/system/(root, from the postinst) or…/user/(each account at sign-in), namedNNN-name, run once in order; exit ≠ 0 = again next time. A fresh system or account counts the existing ones as done. Example:system/010-skel-office-menu(1.0.1) takes the office entries that the 1.0 Setup Wizard wrote into/etc/skel/.config/openbox/menu.xmlout again – with them the file counted as changed, and no later menu change would have reached those systems.system/020-browser-defaults(1.0.2) gives the shipped browser (firefox-esr) back to/etc/xdg/mimeapps.listanddefaults.list, which the Setup Wizard's Firefox removal used to rewrite. 1.0.4:030-grub-pc-devices(BIOS: tell grub-pc which disk holds GRUB),040-locale-gen(generate the system language that up to 1.0.3 was never generated),050-os-prober(rebuild the GRUB menu once with other systems in it). 1.0.5:060-bluetooth-restart(ask for a restart so headphone battery levels show). 1.0.6:user/070-whats-new-existing-account(an account from before 1.0.5 whose Setup Wizard was closed with the window's X is not taken for a new one – "What's new" shows). 1.0.7:080-power-key(start the power button service right away instead of after the next restart),090-python-bytecode(remove the build test's Python bytecode from/usr/local/bin). - Files the system changes itself: tools never write into package files under
/etc/skel(or other conffiles) for everyday settings – a changed conffile is kept by dpkg and the edition tool forever. Per-account changes go into the home copies (merged by the edition tool), seeoffice-menubelow.
- Settings in the homes (
/usr/lib/os-releasebelongs to base-files: the package diverts Debian's copy (dpkg-divert --package simpleos, Debian's goes toos-release.debian); hook 13 only checks it.- Releasing an edition:
./tools/release.sh version X.Y.Z, commit and push,./build_iso.sh, test (TESTING.md),./tools/release.sh sign,./tools/release.sh publish(draft first, checks that all repository files are attached and the signature matches the key in the image, only then "latest"; never an older or equal version). The tagvX.Y.Zis set on exactly the local commit (--target);publishrefuses a commit that is not on GitHub yet – without that, GitHub tagged the newest commit of its default branch, and the release's source code could differ from the ISO. Every release must carry the repository –publishrefuses otherwise, also with uncommitted changes inconfig//tools/(the next edition only recognizes file versions that are in git) or anoutput/repothat is not from the ISO build (markeroutput/repo/.in-iso, written bybuild_iso.sh).build_iso.shalso records the commit it built and whetherconfig/andtools/were clean (output/repo/.build-state);publishrefuses a build from uncommitted files and any change inconfig//tools/after the build (the ISO and the update package would not contain what the tag's source code does). Back up the signing key (~/.local/share/simpleos-release/gnupg): installed systems only trust that key. - A new Debian base (Debian 13) is a bigger step than an edition update and is not covered by this.
- Work is committed locally, pushed with a release. Normally nothing goes to GitHub between releases, so
mainmatches the newest published edition; an earlier push happens only when asked for. The release tags (v1.0.3…) always match exactly what was published. Release day:git push, then build, test,sign,publish. - Website (freakysneaky787.github.io, its own repository): updated after every release – version, download, roadmap.
- Issues and the project board follow the work, not the push: when something is done and tested without hardware, its issue is closed (comment: "done, ships in X.Y.Z") and its board item set to Done – even before the release. What still needs a real computer stays open as a "Verify …" issue.
- Plan and cadence:
ROADMAP.md; what to test before a release:TESTING.md; the whole release and maintenance work (signing key, issues, website) in one place:docs/MAINTAINING.md.
simple-os/
├── build_iso.sh, test_vm.sh, test_installed_vm.sh entry points
├── LICENSE, RELEASE_NOTES.md, TESTING.md GPL-3.0, download text, release checklist
├── Containerfile build environment (Debian bookworm + live-build)
├── docs/sos-banner.png README banner (tools/gen_branding.py --readme docs)
├── tools/
│ ├── lb_config.sh lb config + build-time parts (branding, fastfetch download, edition package)
│ ├── build_deb.sh edition package "simpleos" + APT repository files in output/repo
│ ├── managed_history.py every git version of the managed files (edition tool: "unchanged?")
│ ├── release.sh signing key, sign output/repo, GitHub release
│ └── gen_branding.py generates wallpapers, logos, Calamares and Plymouth graphics, the ISO boot menu image
├── config/ source of the live-build configuration (own files only)
│ ├── package-lists/ 10-base, 12-userdirs, 15-system, 20-desktop, 30-apps, 40-hardware, 45-printing, 50-installer, 55-bootloader
│ ├── hooks/live/ chroot hooks (00–14), 98_update_channel, 99_verify_simpleos (aborts the build on errors),
│ │ binary hook 90_boot_menu (GRUB entries "Simple OS Live")
│ ├── bootloaders/ boot menu (isolinux; background splash.png/splash800x600.png generated by gen_branding.py)
│ └── includes.chroot/ files in the image, 1:1 as in the target system
├── build/ live-build working directory (refilled on every build)
└── output/ Simple-OS.iso (+ .sha256, .packages.txt), repo/ (update repository), VM disks
git: build/ and output/ are excluded (.gitignore). git does not store empty folders – folders that must be
empty in the image are created by a hook (e.g. the standard folders in 00_skel_bashrc).
config/ is never modified by a build: build_iso.sh copies it to build/config, where tools/lb_config.sh adds
the lb default files, the generated graphics and the fastfetch package.
| Path | Contents |
|---|---|
etc/skel/.config/ |
Openbox (autostart, menu.xml, rc.xml), tint2, rofi, picom, dunst, kitty, fastfetch, GTK 2/3/4, pcmanfm/libfm |
etc/fonts/local.conf |
system-wide fonts: Inter (also for "sans-serif"/"system-ui"), JetBrains Mono, Cantarell as fallback |
etc/NetworkManager/conf.d/20-simpleos-route-metric.conf |
route priority: cable metric 100 before Wi-Fi 600 (also before simulated/virtual networks) |
etc/NetworkManager/conf.d/30-simpleos-wifi-powersave.conf |
Wi-Fi power saving off (drops to a few kB/s) |
etc/modprobe.d/simpleos-wifi.conf |
Realtek rtw89/rtw88, MediaTek mt7921e: PCIe/firmware power saving off (only when that driver is loaded) |
usr/local/lib/simpleos/welcome-viewer |
own Welcome window (GTK3 + WebKit2GTK 4.1), independent of the default browser |
usr/local/bin/simpleos-* |
helper programs: Setup Wizard, theme, browser choice, Software Store, screenshot, sound (simpleos-volume), display (simpleos-display), clipboard (simpleos-clipboard), dunst launcher with battery filter (simpleos-dunst), Control Center (simpleos-control-center, Super+I), Software Center (simpleos-software-center), Bluetooth (simpleos-bluetooth), night light (simpleos-nightlight), power (simpleos-power), Thunar actions (simpleos-wallpaper, simpleos-copy-file, simpleos-admin-open), keybindings, Welcome, network info, taskbar designer |
usr/local/bin/simpleos-powermenu |
power menu (Super+X, red button in the taskbar): Lock, Sleep, Restart, Shut Down, Log Out |
usr/local/bin/simpleos-help |
keyboard shortcut overview (Super+H); simpleos-keybindings forwards to it |
usr/local/bin/simpleos-update |
system updates: check after login and every 12 hours (--watch), "Install" notification, Rofi window, pkexec helper --upgrade/--refresh (checking without a password), restart only after asking |
usr/local/lib/simpleos/office-menu |
office entries (LibreOffice, ONLYOFFICE) in the account's Openbox menu for exactly what is installed; at every sign-in (etc/X11/Xsession.d/81simpleos-office-menu), after the Setup Wizard and the Software Center |
usr/local/bin/simpleos-usb-notify |
USB notifications for udiskie ("'STICK' is ready" – a click opens the file manager) |
usr/local/lib/simpleos/common.sh |
shared helpers of the Rofi tools: log, notifications, Rofi with grab retry, menu with actions |
etc/apt/apt.conf.d/20simpleos-periodic |
refresh package lists daily (check only, never install automatically) |
usr/local/sbin/simpleos-efi-refresh |
keeps shim + signed GRUB in EFI/Simple_OS on the EFI partition at the installed packages' version (Debian's postinst only refreshes EFI/<GRUB_DISTRIBUTOR>) and creates the fallback loader EFI/BOOT/BOOTX64.EFI if none exists; called by the package's postinst/dpkg trigger (/usr/lib/shim, /usr/lib/grub/x86_64-efi-signed) and by simpleos-post-install |
usr/sbin/bootloader-config |
replaces Debian's Calamares script: installs GRUB (BIOS/UEFI) offline from usr/share/simpleos/bootloader-debs (hook 08) |
usr/local/sbin/simpleos-post-install |
runs after the installation (Calamares): removes the installer and live leftovers, language packs |
usr/local/lib/simpleos/sfdisk-installer |
live session only (put in front of /usr/sbin/sfdisk by simpleos-live-tune): "Install alongside" inside an extended partition – moves the new logical partition's start past its EBR; keeps the active primary partition when Calamares marks a logical one |
etc/default/grub.d/simpleos-os-prober.cfg |
os-prober on (other systems in the GRUB menu); here because grub-pc/grub-efi switch a line in /etc/default/grub off at every update |
usr/local/lib/simpleos/open-as-user |
live image only: links in the installer (runs as root) open in the live user's browser – browsers refuse to run as root; root's http(s) default from hook 15 |
usr/local/sbin/simpleos-system-setup |
root helper of the Setup Wizard (browser, Firefox removal, office, gaming) |
usr/share/polkit-1/actions/ |
Polkit action for the root helper (pkexec with a graphical password dialog) |
etc/sysctl.d/99-simpleos-perf.conf |
kernel tuning for desktop and gaming |
etc/systemd/system.conf.d/ |
fast shutdown (DefaultTimeoutStopSec=5s) |
usr/share/simpleos/ |
Welcome page, fastfetch logo (the wizard logo is generated) |
usr/share/themes/SimpleOS/ |
Openbox theme (Catppuccin Mocha) |
etc/lightdm/ |
login manager: greeter theme, Openbox as default session, live autologin |
etc/calamares/ |
installer branding (links to GitHub: project, issues, known issues, releases) and extra modules |
usr/lib/os-release |
name, version (= version of the package simpleos), VERSION_CODENAME, HOME_URL, BUG_REPORT_URL – source of the issue address for simpleos-report (the installer links must match it, checked by 99_verify). The package simpleos protects the file from base-files updates with dpkg-divert (otherwise "Debian GNU/Linux 12" after every point release); /etc/os-release stays a link to it |
usr/share/doc/simpleos/copyright |
license notice (GPL-3.0-or-later) with the source code address |
etc/X11/ |
libinput profiles, session environment (Flatpak, smooth scrolling, NO_PROXY for localhost) |
simpleos-welcome-wizard– setup on first login (internet/Wi-Fi, browser, dark/light, accent color, office, gaming, Software Store). Run it again: Menu → Help → Setup Wizard. Done marker:~/.config/simpleos/wizard-done(not set if an installation failed).- Browser Chromium/Mullvad → Firefox ESR is removed completely afterwards (only once the new browser is installed).
- Office: LibreOffice (apt), ONLYOFFICE (Flathub) or Minimal. Gaming: Ultimate (i386 + Steam, Lutris, MangoHud) or none.
With an NVIDIA driver from Debian, Gaming also installs its 32-bit libraries:
nvidia-driver-libs:i386, ornvidia-tesla-470-driver-libs:i386for the legacy driver 470 (Kepler) – chosen by the installed package. - Menu entries for the office apps (Openbox → Apps) come from
/usr/local/lib/simpleos/office-menu, as the user, into~/.config/openbox/menu.xmlonly: after the marker<!-- simpleos-office: … -->one block per app, for exactly what is installed (also from the Software Center or a terminal; removed apps lose their entries). The root helper no longer touches any menu (up to 1.0 it also changed/etc/skel, a file of the package). - Step 2 "Internet" (before any download, like Windows): the status at the top ("Connected to Home"), below it
always the full Wi-Fi list – even when the PC is already online. Connected network → "Disconnect", any other
→ password field → "Connect" (= switch networks); nmcli runs in a background thread. Without Wi-Fi hardware a
hint about the network cable, Wi-Fi off → "Turn on Wi-Fi". Can be skipped. The display logic is in
network_view()(testable without a screen). - All installations run in one call
pkexec /usr/local/sbin/simpleos-system-setup …(graphical password dialog via lxpolkit, Polkit actionorg.simpleos.system-setup), progress in the wizard.
- APT sources:
contrib non-free non-free-firmwareare enabled in the image (lb_config.sh). During installation Calamares writes onlymain non-free-firmware;simpleos-post-installadds the components withsimpleos-system-setup --repos(the helper also checks them before every installation). - Window rules (
rc.xml,<applications>): Chromium, Firefox, ONLYOFFICE, Lutris maximized; Mullvad and the Steam main window 1100x750 centered; Setup Wizard centered. Onlytype="normal", dialogs stay unchanged. - Software Store (
simpleos-software, Bazaar from Flathub): checks free space and whether Flathub is reachable before installing, installs with a progress window and names errors correctly (space / internet / other, with log). In live modesimpleos-live-tune(service only withboot=live) enlarges the RAM overlay to 85 % and lowers Flatpak's space reserve to 100 MB – before that, installations failed there "despite internet" because the overlay was full. - Real progress everywhere (
/usr/local/lib/simpleos/progress-filter: flatpak/apt/timeshift → PROGRESS/STAGE, streams immediately): Setup Wizard (bar with percent and time left, e.g. ONLYOFFICE ~1 GB), Software Center, Software Store, system updates (progress window), drivers, backups. Flatpak runs without--noninteractivefor this. Errors are reported by cause (space / internet / details in the log) instead of always "internet". - Refresh rate: without a saved setting,
simpleos-display --restorepicks the highest rate of the current resolution at login (e.g. 144 instead of 60 Hz); if a saved monitor is unplugged it does the same. Choose it in Control Center → Display or with Super+P. - Keyboard layout (
simpleos-keyboard-setup, Control Center → Keyboard, Menu → Settings → Keyboard): common layouts including variants (Swiss German/French, German without dead keys, US international …), applied at once withsetxkbmap, for the account and system-wide vialocalectl(/etc/default/keyboard, also the login screen). - Monitor plugged in later (
simpleos-display --watch, Openbox autostart): Xorg only reports a new screen, it stays dark until someone configures it. The watcher waits for udev's DRM events (no polling), switches the new screen on to the right of the existing ones with a hint (Super+P changes the layout), releases unplugged ones and turns all screens on again if none is left. It remembers the connected outputs in$XDG_RUNTIME_DIR/simpleos-display.outputs. - Mouse & touchpad (
simpleos-input, Control Center → Mouse & Touchpad): natural scrolling, tap to click and pointer speed through libinput properties (xinput), saved in~/.config/simpleos/input; the Xorg defaults (40-simpleos-input.conf) stay untouched until a value is saved.--watchre-applies when a device is plugged in. - Wi-Fi band (Control Center → Wi-Fi, shown while connected): Automatic / 5 GHz only / 2.4 GHz only per connection
(
nmcli connection modify … 802-11-wireless.band a|bg, then reconnect). Found on a Sunrise router whose wide DFS channel on 5 GHz (160 MHz, ch. 124) made downloads drop to a few kB/s with a perfect signal; 2.4 GHz was steady. - Date & time (Control Center → Date & Time): automatic time (
timedatectl set-ntp) and time zone (region + city,timedatectl set-timezone; polkit asks for the password); "Password" openspasswdin a terminal. - Fonts: Inter, JetBrains Mono, Noto Color Emoji, Liberation 2; fontconfig with RGB subpixel and slight hinting.
Noto Sans (
fonts-noto-core, all writing systems) and WenQuanYi Micro Hei (small CJK font) fill the gaps so web pages in Arabic, Thai, Hindi, Chinese … show letters instead of empty boxes; Chinese/Japanese/Korean systems get Noto CJK. - Language packs (
simpleos-system-setup --language): the image is English; for the system language chosen in the installer the dictionary (hunspell), Firefox and LibreOffice language packs are installed – after the installation (simpleos-post-install, needs the internet; only the download has a time limit, dpkg is never interrupted), by the Setup Wizard and by Software Updates. The language itself: hook 04 lists every locale in/etc/locale.gen(commented out, only en_US generated) – Calamares can only switch on a locale that is listed there. Names are resolved withapt-cache(<prefix>-<language>-<country>, then<prefix>-<language>). Firefox'spolicies.jsonno longer forcesen-US. - Everyday tools in the image: curl, wget, unzip, zip, openssh-client, git (tutorials and install scripts expect them),
alsa-ucm-conf (audio profiles of current laptops) and alsa-utils (alsamixer), OpenVPN for NetworkManager.
journald keeps at most 200 MB of logs (
/etc/systemd/journald.conf.d/10-simpleos.conf). - picom: short fades (~50 ms) for windows only, menus/Rofi/tooltips instant; on real hardware full-screen unredirect
(games/videos without compositor latency). GLX with
use-damage,glx-no-stencil,glx-no-rebind-pixmap. Software OpenGL only (llvmpipe, e.g. a VM without 3D; detected withglxinfo):simpleos-picomstarts/usr/share/simpleos/picom-software.conf(xrender without shadows/fades/rounded corners) – otherwise ~55 % CPU.simpleos-picom --modeshows the decision. - Flatpak progress: the speed is shown in the subtitle ("Downloading part 2 of 8 · 80 kB/s") – a slow Flathub download no longer looks stuck. No extrapolated time left (the speed varies too much between parts).
- Software Updates: if there are neither system nor app updates, the helper is done after checking ("Already up to date") instead of running everything with a progress bar.
- Fn keys (
simpleos-osd): volume ±5 % (at most 100 %; a volume already above 100 % is kept), mute, brightness ±5 % (via logind, never below 5 %) with a short OSD bar in dunst (Catppuccin Mocha, replaces itself, not in the history). - Audio: newly connected devices (Bluetooth, HDMI, USB) are used automatically (
module-switch-on-connect,/etc/pipewire/pipewire-pulse.conf.d/),rtkitfor real-time priority; advanced settings: pavucontrol. - Kernel, firmware and microcode from
bookworm-backports(pinning:config/archives/backports.pref.chroot, in the system/etc/apt/preferences.d/simpleos-backports.pref): kernel 6.12 knows newer graphics (e.g. Intel Raptor Lake 0xA7AA in the Core 5 210H – with 6.1 the screen stayed at 800x600), firmware 2025 (Intel graphics infirmware-intel-graphics, MediaTek, SOF audio …). NVIDIA 535 stays with Bookworm (newer via bookworm-security). A fixed firmware list instead of live-build's automatic selection (--firmware-chroot false).broadcom-sta-dkmsbuilds with 6.12 via/etc/dkms/broadcom-sta.conf. - Secure Boot: the live ISO boots via shim; the installed system gets shim + signed GRUB
(
simpleos-grub-install, called by Calamares with--uefi-secure-boot). - Performance (built into the image):
gamemode(gamemoderun %command%in Steam),/etc/sysctl.d/99-simpleos-perf.conf(among othersvm.swappiness=100+vm.page-cluster=0for zram swap,vm.max_map_countfor Proton). simpleos-theme --mode dark|light --accent blue|mauve|pink|green|peach|teal(--pick: Rofi selection; Control Center → Appearance)simpleos-browser-select(Rofi) orsimpleos-browser-select --set chromium.desktopsimpleos-netinfo(Super+N): LAN IP, interface, gateway, hostname, VPN status, public IP (Rofi;--textfor the terminal). tint2 always shows the LAN IP (--panel, tooltip with details, click = info window); fastfetch lists it as well.- Menu (right-click, 1.0.5): Search, Files, Browser, Software Center, Terminal, Apps, Settings (All Settings, then Wi-Fi & Network, Bluetooth, Sound, Display, Appearance & Wallpaper, Keyboard, Printers & Scanners, Default & Startup Apps – each opens its Control Center page – plus Night Light and Do Not Disturb), Tools (Software Updates, Task Manager, Backups, Storage Cleaner, Disks & USB Sticks, Network Info), Help (Welcome, What's New, Keyboard Shortcuts, Setup Wizard, Report a Problem), Power. Raw or duplicate tools (arandr, lxappearance, obconf, tint2conf, pcmanfm, nm-connection-editor, blueman-manager, htop …) are hidden from the launcher by hook 07.
- Control Center pages (1.0.5): Wi-Fi, Bluetooth (with the battery level of headphones:
bluetoothd --experimentaldrop-in), Sound, Display, Appearance, Notifications, Mouse & Touchpad, Keyboard, Printers & Scanners, Power, Apps (default apps →~/.config/mimeapps.list+~/.local/share/applications/defaults.list; startup apps →~/.config/autostart, switched off withHidden=true), Date & Time, Storage & Backups, Password & Security, System & Updates.simpleos-control-center PAGEopens a page; old names (e.g.systemfor the printers) still work. - Calendar (
simpleos-calendar, 1.0.5): click on the taskbar clock (tint2clock_lclick_command) – a GTK month view next to the clock inside the work area, week numbers, "Date & Time settings"; click again / Esc closes it. - Dual boot with Windows (1.0.5): with Windows in the GRUB menu (
--class windows) simpleos-post-install sets the hardware clock to local time like Ubuntu (hwclock --systohc --localtime); Control Center → Date & Time shows a switch (timedatectl set-local-rtc) and the fast-startup hint whenever Windows is in the boot menu. - What's new (
simpleos-whats-new): once at the first sign-in after an update to a new version (not on a fresh install), Menu → Help → What's New. Notes:usr/share/simpleos/whats-new, written by hand for every release – the build stops if its first line is not# Simple OS <version>. - Snappiness: picom with short fades for windows only (GLX + VSync; llvmpipe only: xrender without effects), Openbox submenus without delay, double-click 200 ms, no minimize animation.
- Taskbar (tint2): floating, rounded bar (12/10 px from the edge, 14 px radius, fine border, 40 px):
app button · windows · LAN IP · tray · [battery] · clock (two lines) · power button (right,
simpleos-powermenu).simpleos-taskbar-select --applyadds the battery at login only ifsimpleos-battery --presentfinds a real battery (/sys/class/power_supply/BAT*withtype= Battery andpresent= 1; VMs/PCs without a battery: no icon; never in VMs). tint2 reports "Battery low" viasimpleos-battery --low-alert, which also checks for the status Discharging. xfce4-power-manager only starts with a real battery and stays quiet (Xfconf default/etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-power-manager.xml: no tray icon, no notifications); UPower does not run in VMs (upower.service.d/10-simpleos-no-vm.conf). - Design: Inter everywhere (GTK 2/3/4, Openbox, tint2, Rofi, dunst, fontconfig), Papirus-Dark, Catppuccin Mocha.
Rofi flyouts: rounded card (16 px) with a fine border, a heading instead of a search field, an accent marker on
the selected entry; Network and Power open above the taskbar on the right, like Windows 11. picom: soft shadows
and rounded corners for windows; Rofi without picom shadow (picom 9.1 draws it square, it would show through the
rounded corners). Wallpaper: layered dunes in Mocha tones with a fine lavender edge, no logo (
gen_branding.py). Logo: a lifebuoy (white, four stripes in Catppuccin Red); the wordmark "SOS" uses the ring as the "O" and the two "S" in a blue → pink gradient, slogan "Keep it Simple" – Calamares, boot menu, Plymouth, wizard, Welcome page. Tooltips in German/English; tray icons (nm-applet, blueman, volumeicon, power) bring their own tooltips. simpleos-taskbar-select(Control Center → Appearance → Taskbar): position top/bottom, layout (Full/Compact, Icons + text/Icons only), look (Dark, Dark transparent, Match theme), network/clock display on/off. State in~/.config/simpleos/taskbar; changes only the affected lines intint2rcand reloads tint2 with SIGUSR1. Directly:--set position=top,--apply(callssimpleos-themeitself for "Match theme").- Keyboard shortcut overview:
simpleos-help, Super+H or Super+Shift+? (grouped, typing filters). - USB:
udiskie(autostart) mounts sticks and drives automatically;simpleos-usb-notifyreports "'STICK' is ready – Click to see your files" (left click = Open → Thunar), "can now be removed safely" and errors in plain language. A tray icon for ejecting is shown only while a drive is plugged in. pcmanfm autorun is off; dunst: a left click triggers a notification's action (hook 09, dunst 1.9 has no drop-ins). - Power menu:
simpleos-powermenu(Super+X, taskbar button, Menu → Power); Sleep locks the screen first. The power button opens it too (XF86PowerOffinrc.xml; the Openbox autostart holds a logind inhibitorhandle-power-keyfor the session). On the lock screen and the login screensimpleos-power-key(root, onesimpleos-power-key@eventN.serviceper ACPI "Power Button", started by udev rule 62) decides: somebody signed in → sleep, nobody → shut down (#97; before, logind shut a locked laptop down at once). Some laptops (ThinkBook E16) only report the button when it is held for about a second – the firmware drops a quick tap. - Keyring: hook 17 masks
gnome-keyring-daemon.socket(globally) sopam_gnome_keyringstarts the daemon at login – with the systemd socket the login keyring created at the first login was unusable for that whole session. - Screen blanking and lock (
simpleos-power --screen-off MIN | --lock on|off|status | --suspend | --apply, Control Center → Power): with a battery xfce4-power-manager owns the X screensaver time and the DPMS times (it sets them again at every plug/unplug and keeps the screen on while a browser plays a video; sourcexfpm-power.c/xfpm-dpms.c), so the setting is written to its xfconf channel; without a batteryxsetis used andsimpleos-screensaver(D-Bus-activated,org.freedesktop.ScreenSaver, quits 30 s after the last video) answers the browsers' inhibit request.xss-locklocks withdm-tool lock(simpleos-power --lock-now) when the screensaver starts – not in the live session and not while the lock screen is already in front (#88) or a lock was started in the last 4 s (#96: the time is in$XDG_RUNTIME_DIR/simpleos-lock; power menu, Control Center and search lock through it too); LightDM'sdisplay-setup-script(greeter-screen) darkens the lock screen after 2 minutes and writes the greeter's clock format in the order of the system language (/etc/xdg/lightdm/lightdm-gtk-greeter.conf.d/50-simpleos-clock.conf, #81). Brightness:simpleos-osd brightness get|set PCT(Control Center → Display). Wi-Fi regulatory country from the time zone:simpleos-regdom(service, path unit on/etc/localtime, udev rule onieee80211). - Live mode (
simpleos-live, detected byboot=liveor/run/live/medium): desktop icon "Install Simple OS", Welcome window with a banner and the button "Install Simple OS Now", an entry at the top of the right-click menu and a mauve badge in the taskbar – all startsimpleos-install(Calamares via pkexec). After the installation all of it disappears (simpleos-post-install, plussimpleos-live --setupat login). - Search (tap Super / Super+Space,
simpleos-search): apps, system commands (restart/shut down with confirmation), calculations (42*12+ Enter, Enter copies; also×and÷), file search in the home folder – one Rofi window (script mode). Tapping Super sends its own key via xcape (XF86Search) instead of a synthetic Super+Space; tapping again closes it. In all Rofi windows a single click opens (desktop icons: double-click); an Openbox rule keeps Rofi in front. - Window snapping (
simpleos-snap): Super+arrows (halves, maximize, restore/minimize, a second press moves to the next monitor), Super+Alt+arrows (quarters); respects the taskbar, window borders and monitors. - Task Manager (
simpleos-taskmanager, Ctrl+Shift+Esc): "End task" sends SIGTERM, then SIGKILL automatically after 1.5 s; processes of other users viapkexec simpleos-taskmanager-helper(password), protection against reused PIDs (start time), the list updates immediately. - Hardware & Drivers (
simpleos-drivers, Control Center → System & Updates): detects graphics (NVIDIA Maxwell+ →nvidia-driver, Kepler →nvidia-tesla-470-driver), Wi-Fi firmware (Intel/Realtek/Atheros/MediaTek/Broadcom, also USB) and CPU microcode; "Install Recommended Drivers" installs viasimpleos-system-setup --drivers(fixed package list) with a progress window. - Laptop: tap to click and natural scrolling for the touchpad (mouse unchanged), closing the lid = sleep (logind,
also on AC power; not when docked), battery display only with a real battery. Before every sleep (lid, power
menu,
systemctl suspend)/usr/lib/systemd/system-sleep/simpleos-locklocks the session (LightDM via D-Bus) and waits until the lock screen is in front – after opening the lid the session is locked. It does not lock a second time (#96: each extra lock restarts LightDM's login screen): not when the lock screen is in front already, a lock was just started, or xss-lock locks on the sleep signal – then it only waits, and locks only if the lock screen never comes. - Do Not Disturb (
simpleos-dnd, Control Center → Notifications, Menu → Settings, click on the icon in the taskbar): notifications paused (dunstctl set-paused), optionally without window effects (--no-effects on: picom off); a bell icon in the taskbar while it is on. - Battery protection (
simpleos-power --charge-limit on|off|status, Control Center → Power, switch only if the laptop supports it): charges only up to ~80 %. Lenovo IdeaPad/ThinkBook viaconservation_mode(ideapad_acpi, stored in the laptop), others viacharge_control_end_threshold(80/100, start below it if needed, or 0). No password needed thanks to/etc/udev/rules.d/60-simpleos-charge-limit.rules(group sudo); your choice is stored in~/.config/simpleos/powerand set again at login (without your own choice the laptop is left alone). - Firewall (ufw,
15-system, hook 12): on from the first boot – incoming blocked, outgoing open; mDNS (printer discovery), UPnP and DHCP pass through ufw's default rules (/etc/ufw/before*.rules).ENABLED=yesin/etc/ufw/ufw.confinstead ofufw enable(does not work in the chroot). Switch: Control Center → Password & Security (pkexec simpleos-system-setup --firewall on|off); the Control Center reads the state fromufw.conf. - Memory full (earlyoom, hook 12 writes
/etc/default/earlyoom): only when RAM < 5 % AND swap/zram < 10 % are free is the program using the most memory ended; never Xorg, LightDM, Openbox, tint2, PipeWire or NetworkManager. Patterns without spaces/quotes – systemd splits$EARLYOOM_ARGSonly at spaces. - Power profiles (power-profiles-daemon,
simpleos-power --profile [power-saver|balanced|performance], Control Center → Power → Power mode): only the offered profiles (VMs have no Performance), the service remembers the choice. thermald only on Intel (ExecConditionin/etc/systemd/system/thermald.service.d/, it does not start in VMs anyway). - Firmware/BIOS (fwupd + fwupd-amd64-signed, LVFS):
fwupd-refresh.timerdownloads the metadata,simpleos-updatecounts firmware updates too ("System Firmware (firmware)"), the helper installs them last during--upgrade(not in VMs) and reportsFIRMWARE: installed|needs-power|failed. BIOS capsules are applied at the next restart (restart notice); without a charger fwupd refuses → hint "plug in the charger"; a firmware error does not invalidate the rest of the update. - Disks (gnome-disk-utility, Control Center → Storage & Backups, Menu → Tools → Disks & USB Sticks): format USB sticks, write ISO images, SMART values.
- Report a problem (
simpleos-report, Menu → Help → Report a Problem, Control Center → System & Updates): Rofi window → report as~/Desktop/simpleos-report-YYYYMMDD-HHMM.txt(system, hardware, graphics, network, sound, storage, battery, failed services, Simple OS logs, session errors; with a password also the system log of this and the previous boot, kernel warnings and the apt history viapkexec simpleos-report-helper). Before saving,redact()replaces user, real and host names, saved connections (Wi-Fi names), IPv4/IPv6, MAC addresses, serial numbers and email addresses. ThenBUG_REPORT_URLopens (GitHub:…/issues/newwith a template); without an address the report is only saved.--collect [--system]/--redact/--urlwork without a window (tests in the verify hook). - Printing & scanning (
45-printing, Control Center → Printers & Scanners, Menu → Settings → Printers & Scanners): CUPS + Avahi/libnss-mdns (network printers without drivers, IPP Everywhere/AirPrint), ipp-usb (USB), printer-driver-all and Foomatic PPDs for older devices, system-config-printer (+ -udev, cups-pk-helper: password dialog instead of a terminal); sane-airscan + simple-scan. Users are inlpadminandscanner(Calamares default, the live user via hook 01). - Standard folders (
12-userdirs,/etc/skel): Desktop, Documents, Downloads, Music, Pictures (+ Screenshots), Videos, Templates (with "Text Document.txt" for Thunar → Create Document).~/.config/user-dirs.dirssets fixed English names, "Public" is disabled; browsers save to ~/Downloads. The Openbox autostart fills the sidebar on first login (GTK bookmarks, needs the real home path); deliberately noxdg-user-dirs-updatethere – it points deleted folders to ~ instead of creating them again. - Backups (
simpleos-backup+simpleos-backup-helper, timeshift): create, check, restore and delete restore points; optionally automatically before every system update (the 3 newest are kept). timeshift sets itself up the first time it is opened (RSYNC on the partition of/, home excluded). Blocked in live mode; errors are told apart (live system / no target device / not enough space) – exactly one message per action. Free space viashutil.disk_usageat timeshift's target (fallbacks on error/0 bytes); at least 5 GB before the first point, 1 GB before further ones; the space check runs before creating. Note: timeshift 22.11 rejects--tags Oand exits with 0 even on errors – so the helper checks success against the snapshot list. - Storage Cleaner (
simpleos-cleaner): package cache, old packages, orphaned Flatpak runtimes, thumbnails, logs older than 7 days – sizes beforehand (scan without root,--dry-run), cleaning with one password; "Disk usage" shows the largest folders. - Dynamic wallpaper (
simpleos-wallpaper-schedule, Control Center → Appearance): Latte light during the day, Mocha dark in the evening and while night light is on (wallpaper-day.pngis generated bytools/gen_branding.py); optionally it switches light/dark mode too. - Light/dark (
simpleos-theme --mode light|dark) takes effect immediately: GTK3 via XSETTINGS (xsettingsd, SIGHUP), gsettings/settings.ini, Openbox (--reconfigure), wallpaper (pcmanfm --set-wallpaper), Rofi colors Latte/Mocha, taskbar with "Match theme".gtk-application-prefer-dark-themestays 0 – GTK reads the value only at program start, dark comes from the theme name Arc-Dark. - Right-click menu: Catppuccin Mocha, Inter 11, monochrome icons (
/usr/share/simpleos/menu-icons, hook11_menu_icons), rounded corners and shadows via picom. - Updates:
simpleos-update --watch(Openbox autostart) runs--check2 minutes after login and then every 12 hours while the session runs – it looks at the clock every minute, so after waking up from sleep a due check runs 2 minutes later (before 1.0.1 there was only the check after login). Not in the live session; it only shows up when there are updates. Counted: Debian packages, a new Simple OS edition, firmware, and apps from the Software Store (Flatpak, system installation,flatpak remote-ls --updates, listed as "… (app)" – before 1.0.1 an update of only e.g. the Mullvad Browser was never offered). Click → Rofi window ("5 updates available · firefox-esr, …") → "Install now" → one password dialog →simpleos-system-setup --upgrade(repair dpkg, apt-get update,full-upgrade --no-removeif the simulation removes nothing – otherwiseupgrade --with-new-pkgs; never removes packages –, then Flatpak apps and firmware). Exactly what the helper installs is counted (apt-get -s), so the same updates are not offered again after updating; what would only work by removing something is reported by the helper asHELD: nand the window says so honestly. Kernel, microcode, firmware, libc, systemd →/run/reboot-required(Debian does not create the marker itself without unattended-upgrades). Never a restart straight from the notification: "Restart…" asks first ("Restart now" / "Later"). Opening Software Updates checks by itself (--refreshif the lists are older than 30 minutes; without a password via the Polkit rule from hook14_update_refresh) and shows "Install now" right away – without updates only a notification. If the installation fails, the apt error line is in the notification (with a pending restart: "Restart … first"). If an installed BIOS update is still pending after the restart, a notification says it was not applied. Also via Menu → Tools → Software Updates. - All Rofi tools use
usr/local/lib/simpleos/common.sh: noset -e, exit 0 on every path, details in~/.cache/<tool>.log. The verify hook simulates all click paths under dash. - Network:
/usr/local/bin/simpleos-wifi(click on the IP in the taskbar; registered with its absolute path everywhere) – a Rofi flyout like on Windows, without terminals, nmtui or interface names: first row the active network ("Connected: Home" / "Connected: Ethernet" / "Not connected"; click → Disconnect, Network Details, Back), below it the other Wi-Fi networks by signal (Strong/Good/Weak, lock = password; a click connects or switches, password viarofi -dmenu -password, saved networks without asking), at the bottom "Turn Off/On Wi-Fi" and "Network Details" (simpleos-netinfo). Hint line via-mesg(Rofi theme with amessageelement). Without a Wi-Fi adapter only the cable status + details. Errors are reported vianotify-sendin plain language; if Rofi does not start,nm-connection-editor(GTK) opens, and if that is missing too, a notification with the network data appears. Rofi grab errors right after the taskbar click → up to 3 attempts. Noset -e, every path ends with exit 0; technical details in~/.cache/simpleos-wifi.log. The verify hook simulates all click paths (cable, Wi-Fi, offline, missing GUI tools) under dash. Additionallynm-appletin the tray (left click = Wi-Fi list). simpleos-setup– short name for the Setup Wizard (simpleos-welcome-wizard).- Welcome page
usr/share/simpleos/welcome.html(offline, calm cards, Catppuccin Mocha, Inter):simpleos-welcomeopens it in its own WebKit window – never in the default browser ($BROWSER,xdg-open), because hardened browsers like the Mullvad Browser (Flatpak) cannot see/usr/shareand a VPN can block localhost. No proxy, no JavaScript, an ephemeral profile; web links go to the default browser. If WebKit fails: Firefox ESR, then Chromium, otherwise a notification with the path of the page.




