HDM is a production display manager for Linux, built with:
- Rust daemon (
hdm) — manages PAM auth, sessions, VT switching - Tauri + React greeter (
hdm-greeter) — the login UI - Unix socket IPC — secure daemon↔greeter communication
HDM is a rival to SDDM, GDM, and LightDM, designed for the Blue Environment Wayland desktop but works with any session.
- 🔐 Real PAM authentication via
/etc/shadow+ crypt(3) - 🖼️ Aurora glassmorphism UI — animated background, user avatars
- 🖥️ Session management — Wayland & X11 sessions from
.desktopfiles - 👥 Multi-user — lists system users (UID ≥ 1000), user avatars from
~/.face - ⚡ Autologin support with configurable delay
- 🔌 Power menu — shutdown, reboot, suspend, hibernate with countdown
- 🔒 Brute-force protection — 5 attempt limit per session
- 📋 systemd integration — replaces
display-manager.service - 🎨 Wallpaper support — reads
/etc/hdm/wallpaper.png
┌─────────────────────────────────────────────────┐
│ TTY1 / VT1 │
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ hdm (daemon, root) │ │
│ │ PAM authentication │ │
│ │ Session launching (drop privs to user) │ │
│ │ VT management │ │
│ │ IPC: /run/hdm/hdm.sock │ │
│ └───────────────┬─────────────────────────────┘ │
│ │ Unix socket (JSON) │
│ ┌───────────────▼─────────────────────────────┐ │
│ │ hdm-greeter (Tauri, runs as _hdm user) │ │
│ │ Solid.js UI (TypeScript + Tailwind) │ │
│ │ Clock, user list, password input │ │
│ │ Session picker, power menu │ │
│ └─────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
# Clone / extract HDM
cd HDM
# Build and install (requires Rust + Node.js)
sudo bash install.sh
# With autologin:
sudo bash install.sh --autologin myusername# Install build dependencies (Debian/Ubuntu)
apt install cargo nodejs npm libpam-dev
# Enable
sudo systemctl enable --now hdmRust toolchain requirement: HDM's config parser depends on
hk-parser(crates.io,hk-parser = "0.3.2"), which pulls inindexmap 2.14.x→hashbrown 0.17.x, a dependency that declares Rust's 2024 edition. That means buildingdaemon/andgreeter/now requires Rust 1.85 or newer (rustup update stableif you're on an older toolchain — therustc/cargoshipped by some LTS distro repos, e.g. Ubuntu 24.04'sapt install cargo, is only 1.75 and is too old for this). This is a requirement of the.hk-parsing dependency itself, not something HDM's own code opts into.
Edit /etc/hdm/hdm.hk — HDM's config is in HackerOS's own
.hk format,
not TOML:
[general]
-> greeter_path => "/usr/bin/hdm-greeter"
-> vt => 1
-> theme => blue
-> show_user_list => true
-> allow_root => false
-> minimum_uid => 1000
! Autologin (optional) — uncomment and fill in to enable:
! [autologin]
! -> user => username
! -> session => blue-environment
[power]
-> shutdown => "shutdown -h now"
-> reboot => reboot
-> suspend => "systemctl suspend"
-> hibernate => "systemctl hibernate"
HDM reads user avatars from (in priority order):
~/.face~/.face.icon~/.config/hdm/avatar.png/var/lib/AccountsService/icons/<username>
# View HDM logs
journalctl -u hdm -f
# Or from file
tail -f /var/log/hdm/hdm.logContent 安全 Policy. greeter/tauri.conf.json sets a CSP rather
than leaving it null. style-src includes 'unsafe-inline' — this is a
deliberate, known tradeoff, not an oversight: the greeter UI sets style="..."
attributes at runtime throughout (a carry-over from the original Svelte
template's inline style bindings, kept for readability of long conditional
style strings as template literals rather than large object literals).
Runtime-set inline styles aren't covered by Tauri's automatic build-time
script/style hashing, so 'unsafe-inline' is required for the UI to render
at all under a strict CSP. Everything else (script-src, font-src,
default-src) is locked to 'self' with no external origins. If this
codebase migrates from string styles to style={{...}} objects or CSS
classes/custom properties in the future, 'unsafe-inline' can be dropped
from style-src entirely.
Fonts are self-hosted, not loaded from Google's CDN — see
ui/src/fonts.css. A login screen has to render before networking is
necessarily up (fresh install, wifi still associating, airgapped
machines), so HDM ships its fonts (@fontsource/oxanium,
@fontsource/dm-sans, @fontsource/jetbrains-mono) as part of the built
UI bundle instead of fetching them at runtime.
Authentication rate limiting is enforced server-side, in
daemon/src/pam_auth.rs::RateLimiter, keyed by username and shared across
every IPC connection — not just in the greeter UI's own countdown display.
A client that skips the UI and calls the daemon's IPC commands directly
still hits the same lockout.
| Feature | HDM | SDDM | GDM | LightDM |
|---|---|---|---|---|
| Wayland native | ✅ | ✅ | ✅ | |
| X11 support | ✅ | ✅ | ✅ | ✅ |
| PAM auth | ✅ | ✅ | ✅ | ✅ |
| Autologin | ✅ | ✅ | ✅ | ✅ |
| Custom themes | ✅ | ✅ | ❌ | ✅ |
| User avatars | ✅ | ✅ | ✅ | ✅ |
| Blue Environment | ✅ | ❌ | ❌ | ❌ |
| Aurora UI | ✅ | ❌ | ❌ | ❌ |
| Glassmorphism | ✅ | ❌ | ❌ | ❌ |
| Rust backend | ✅ | ✅ | ❌ | ❌ |
| Solid.js frontend | ✅ | ❌ | ❌ | ❌ |
GPL-3.0 — © 2026 HackerOS Team