MoonLightOS

Ubuntu's base, without Ubuntu's desktop

Ubuntu has the widest package repository and the broadest hardware support of any Linux base. The linux-firmware package alone covers the large majority of Wi-Fi, Bluetooth, GPU and chipset hardware in use, and ubuntu-drivers-common handles NVIDIA cards properly. Secure Boot works out of the box because Canonical's signed shim and GRUB are in the repository and the kernel is signed. The base also receives twelve years of security maintenance.

The Ubuntu desktop is the part that was worth replacing: it is heavy, and it has no Start button, no desktop icons and no taskbar. Cinnamon has all three. MoonLightOS therefore starts from a minimal base and builds the desktop on top of it. None of Ubuntu's own desktop is installed, and nothing the user sees mentions the base.

One thing is deliberately left unchanged: the release codename that apt sees stays “resolute”, because PPAs and anything that calls lsb_release depend on it. The branding people actually see comes from /etc/os-release.

Screenshot of MoonLightOS
The logo stays still while the light around it pulses. Two halo images with cycles of 2.6 and 3.1 seconds drift in and out of phase, so the glow never looks mechanical. Both are generated from the source artwork at build time, and the same logo and halo appear on the GRUB menu, the login screen, the installer, the About page and the Welcome tour.

The look

A single panel at the bottom, 52 pixels tall. The Start button and the search box are on the left, the running applications are in the centre with the largest icons on the panel, and the status area is on the right. The menu shows your picture, your name and whether you can administer the computer, and its search box finds applications, settings, files and web results.

Screenshot of MoonLightOS
Screenshot taken from a real start of the installed image, not a mock-up.

Three layouts

  • MoonLight

    A single panel at the bottom. The dock also holds your favourite applications, so there is no second row of launchers.

  • Two panels

    A thin bar at the top for the clock and the status icons, and a dock at the bottom that hides automatically.

  • Compact

    A single thin bar at the top. It takes the least screen space and is the lightest option on old graphics hardware.

Light and dark

Both themes are generated by one script from one colour palette, covering GTK 2, 3 and 4, the Cinnamon shell and the window borders. The GTK themes import Adwaita and change its colours, so new widgets and upstream fixes arrive automatically. The icon theme is based on Papirus and replaces only the icons that identify the distribution. The accent colour can be changed in Desktop & Dock.

Scheduled switching

Light from 07:00 and dark from 19:00 by default. A small background service keeps the theme in step with the schedule.

Desktop widgets

A large clock and a processor, memory and disk monitor are shown by default. A calendar and sticky notes, saved as plain text as you type, can be added with a right-click.

The startup animation

The logo stays still while the light around it pulses. Two halo images with cycles of 2.6 and 3.1 seconds drift in and out of phase, so the glow never looks mechanical. Both are generated from the source artwork at build time, and the same logo and halo appear on the GRUB menu, the login screen, the installer, the About page and the Welcome tour.

Typography

Inter for the interface, JetBrains Mono for code, and Noto for everything else, including Chinese, Japanese, Korean and colour emoji.

Seven wallpapers

Five photographic scenes with a penguin, a lake and a crescent moon, plus a generated day and night pair. The release ships with “Sunset over the lake”.

Shortcuts you already know

Windows and macOS use different keyboard shortcuts for almost everything. Since the two sets hardly ever conflict, MoonLightOS supports both: the Super key follows the Windows conventions and the Control key follows the Mac conventions.

ActionComing from WindowsComing from macOS
Open the menuSuperSuper
SearchSuper+SpaceSuper+Space
FilesSuper+E—
Lock the screenSuper+LCtrl+Super+Q
Show the desktopSuper+DCtrl+Super+D
Snap a window to a halfSuper+Left / Right—
Maximise / restoreSuper+Up / Super+DownAlt+F10 / Alt+F5
MinimiseSuper+HAlt+F9
Close a windowAlt+F4Super+Q
Full screenSuper+FCtrl+Super+F
Cycle windowsAlt+Tab, Super+TabAlt+Tab
Next window of this appAlt+`Super+`
All windowsSuper+WCtrl+Up
All desktopsSuper+SCtrl+Down
Switch desktopCtrl+Alt+Left / RightCtrl+Left / Right
Move a window to another desktopCtrl+Shift+Alt+Left / RightCtrl+Shift+Left / Right
SettingsSuper+ISuper+,
System monitorCtrl+Shift+Esc—
Run a commandSuper+R, Alt+F2—
TerminalCtrl+Alt+TCtrl+Alt+T
BrowserSuper+BSuper+B
CalculatorSuper+CSuper+C
Sound mixer and equaliserSuper+ASuper+A
Clipboard historySuper+VSuper+V
NotesSuper+NSuper+N
Convert filesSuper+Shift+CSuper+Shift+C
Screenshot of the whole screenPrintShift+Super+3
Screenshot of a regionShift+PrintShift+Super+4
Screenshot of a windowAlt+Print—
Capture and recording panelCtrl+Shift+PrintShift+Super+5
Log outCtrl+Alt+Delete—

Moving the pointer into the top-left corner opens the window overview. The Super key alone opens the menu, and Super+Space opens it with the cursor already in the search box.

Three package formats, one store

apt, snap and Flatpak are all installed, and GNOME Software lists all three: snaps first, then packages from the Ubuntu repository, then Flathub. A .deb package is always the lightest option, and Flathub covers everything else.

The Snap Store application is itself a snap whose dependencies amount to about a gigabyte, too much to include in an image intended for computers with 2 GB of RAM. The store can therefore list and install snaps from the first start, and a service downloads the Snap Store application itself once a connection is available.

The Applications settings page shows what is installed, which of the three formats each application came from, and whether anything is installed twice.

Applications on the image

Chosen so that a general-purpose desktop works from the first start, even without an internet connection.

Internet

Firefox (Mozilla's own build, with uBlock Origin bundled as a local extension so it is available even offline), Thunderbird, Geary, Transmission

Office and documents

LibreOffice Writer, Calc, Impress and Draw; Evince; GNOME Text Editor; Xournal++; PDF Arranger; MoonLight PDF; Calendar; Clocks; Weather; Maps; Calculator

Media

VLC; Celluloid; Rhythmbox; GStreamer with libav, the “bad” and “ugly” plugin sets and VA-API, so H.264, H.265 and AAC play in every application

Graphics and scanning

GIMP; Drawing; Eye of GNOME; MoonLight Export; Simple Scan; Font Viewer; Screenshot

System

GNOME Software; System Monitor; Disks; GParted; Disk Usage Analyzer; Timeshift; Redshift; File Roller; Seahorse; Blueman; Printers; MoonLight Tweaks

Networking and VPN

NetworkManager with OpenVPN, OpenConnect (Cisco AnyConnect, GlobalProtect, Fortinet), L2TP, PPTP, SSH and built-in WireGuard support

Development

Visual Studio Code; gcc, g++, make, gdb; git, git-lfs; cmake, meson, ninja; Python 3 with pip, venv, NumPy and OpenCV; Node.js and npm; Rust and Cargo; Go; OpenJDK 21 with Maven and Gradle; Docker Engine, Compose v2 and Buildx; SQLite

Terminal

GNOME Terminal; bash, zsh and fish; tmux, screen; Neovim, nano; ripgrep, fd, jq, yq, htop, btop, ncdu, tree; nmap, dig, whois, traceroute, httpie, socat; rsync, rclone, aria2; shellcheck; inxi, fastfetch

Windows compatibility

Wine with 32-bit support, winetricks, DXVK (Direct3D 9 to 11) and VKD3D (Direct3D 12)

Hardware and drivers

Firmware

The complete linux-firmware set, Intel and AMD microcode, and fwupd for firmware updates.

Graphics

Mesa with Vulkan, VA-API and VDPAU for Intel and AMD. The NVIDIA driver is included on the ISO, so it can be enabled from the Drivers page even without an internet connection.

Wi-Fi and Ethernet

More than fifty wireless drivers in the kernel, plus the broadcom-sta and r8168 drivers built with DKMS for the chips the standard drivers handle poorly.

Printers and scanners

CUPS with the full driver set, printing to PDF, SANE and Simple Scan.

Bluetooth

BlueZ, Blueman and the PipeWire Bluetooth codecs, with a settings page that clearly says when the computer has no Bluetooth hardware.

Audio

PipeWire with WirePlumber, PulseAudio compatibility and a built-in ten-band equaliser.

Laptops

power-profiles-daemon, thermald, the battery percentage in the panel, tap-to-click and natural scrolling enabled by default, Wacom and Synaptics input support.

Virtual machines

Guest tools for VirtualBox, QEMU/SPICE and VMware are included, so the display resizes and the clipboard is shared.

Fingerprint readers

fprintd, libfprint and the TOD loader are installed and integrated with PAM. MoonLight Fingerprint identifies the sensor and guides you through enrolment.

Face unlock

Face unlock based on OpenCV for the login screen, the lock screen and sudo. Disabled until you turn it on.

Security

Everything below is enabled by default on an installed MoonLightOS system.

  • Secure Boot

    Firmware → Canonical shim → signed GRUB → signed kernel. Settings → About shows whether it is enabled on your computer.

  • Disk encryption

    LUKS2 full-disk encryption is a single checkbox in the installer.

  • Firewall

    ufw is enabled: incoming connections are blocked and outgoing connections are allowed.

  • AppArmor

    Enforcing mode, including for snaps.

  • Automatic security updates

    From Ubuntu's security repository and packages.mozilla.org, every day. Unused kernels and dependencies are removed, and the computer never restarts on its own.

  • Locked root account, traceable sudo

    The first user account administers the computer through sudo. No root password is ever set.

  • Password quality and lockout

    At least eight characters from two character classes. After eight wrong attempts the account is locked for fifteen minutes.

  • Kernel hardening

    The kernel is configured to limit what unprivileged programs can learn about the system and about each other: kernel pointers and boot messages are hidden, debugging another process is blocked, and loading a replacement kernel at runtime is disabled. The network stack is hardened against spoofed routes and connection floods, and IPv6 addresses are rotated.

  • Reduced attack surface

    FireWire and a set of rarely needed file system and network protocol modules cannot be loaded automatically, so a device that is plugged in or a packet that arrives cannot pull in code this computer never uses.

  • Unique on the first start

    The machine ID and the SSH host keys are generated on the installed computer. A host key shared by every installation would make host verification pointless.

  • No telemetry

    The crash and usage reporting services are not on the image at all. Firefox telemetry, studies, Pocket and sponsored content are disabled by policy, and tracking protection is enabled.

  • USB protection

    USBGuard is installed, so a device plugged in while the screen is locked is not trusted. Disabled by default; one button on the Security page enables it.

  • Emergency password

    A second password that does something other than log you in. Wipe mode destroys the disk's LUKS keys and powers the computer off; decoy mode opens an empty session and freezes it after five minutes. Disabled by default, requires your real password to set up, and cannot be the same as the real one.

  • Boot menu password

    Offered on the Security page, because anyone who can restart the computer could otherwise edit the boot menu and start a root shell.

  • Clear authentication prompts

    Every MoonLight helper has a named polkit action, so a password prompt says what you are agreeing to.

Screenshot of MoonLightOS
Screenshot taken from a real start of the installed image, not a mock-up.

Running on computers with little memory

Compressed memory (zram)Half of the RAM, up to 8 GB, zstd compression, priority 100. Roughly 3:1 compression on desktop memory pages.
Swap tuningThe kernel's default of 60 assumes that swapping means a disk access. With zram it means a memory copy.
Out-of-memory protectionActs at 4 % free memory and sends SIGKILL at 2 %. Never stops Cinnamon, Xorg, LightDM or Nemo; stops Firefox, Thunderbird, Code, LibreOffice and compilers first.
No indexerNo tracker and no background scanning of the disk.
Automatic graphics tuningAt login the system checks the OpenGL renderer. If it is llvmpipe or another software renderer, animations are turned off. A later choice of yours is never overridden.
GRUBRequests a modest graphics mode with fallbacks, so the menu still appears in a virtual machine with little video memory.
SquashfsCompressed with zstd, so the live session loads quickly from a USB stick.

Languages

The first-run wizard offers English (US and UK), Italian, French, German, Spanish, Brazilian Portuguese, Dutch, Polish and Russian in a short list, and every other locale under “More languages”. The keyboard layout follows the chosen language, so the second step usually only needs a click on Next.

All MoonTools, 774 strings in total, are translated into those eight languages in addition to English, and the build fails if a program contains a visible string that is not translated. The Italian language pack and LibreOffice dictionaries are included on the image, so an offline installation in Italy is fully localised; other language packs can be downloaded with one click.

The command-line tools deliberately stay in English: their output is read next to documentation and pasted into bug reports, and that is easier in one language.

Screenshot of MoonLightOS

Design decisions worth knowing about

  • The GTK themes import Adwaita and recolour it.

    A theme written by hand breaks every time GTK adds a widget. This one inherits upstream's fixes.

  • Cinnamon's System Info page is diverted, not deleted.

    A Cinnamon update cannot silently restore it next to ours, and removing the MoonLightOS packages would bring it back cleanly.

  • The squashfs keeps its own copy of the kernel.

    The same squashfs is what the installer copies to the disk. Removing /boot from it would install a system that cannot start.

  • The startup theme is called moonlightos, not moonlight.

    Debian's desktop-base package already ships a Plymouth theme named moonlight, and an update would silently replace the animation.

  • uBlock Origin is bundled, not downloaded.

    A policy pointing at addons.mozilla.org installs the extension only the first time Firefox runs with a working connection. The extension is included in the image, and you can still remove it.

  • Docker Engine rather than Docker Desktop.

    On Linux, Docker Desktop runs the engine inside its own virtual machine, which means a second kernel and a second memory budget on a laptop.

  • The heavy development stacks are optional.

    Virtual machines, PHP with databases and LaTeX are one click away in Welcome, instead of a gigabyte that every installation would carry.