Files
latchd/CHANGELOG.md
Zane Walker faf5b27328 feat: ship Rust login manager and GitLab release pipeline
Replace the legacy Go implementation as the production path, quarantine the reference tree, add deterministic release packaging and version metadata, and run verification through GitLab CI.
2026-09-25 21:33:46 +05:30

6.6 KiB

Changelog

0.3.0 — Rust workspace release preparation

  • Rust is the supported login manager; the Go/cgo prototype is quarantined at legacy/go/ and excluded from normal builds and release archives.
  • Added workspace crates for PAM authentication, session/config/account management, and the TUI, including account switching and advisory faillock.
  • Added optional terminal-cell wallpapers, cellular automata effects, and accessible motion/background controls.
  • Added GitLab CI verification, version-checked tag releases, optimized single-version Cargo builds, deterministic installation archives, SHA-256 checksums, and embedded build metadata.
  • Live VT, logind, PAM-policy, X11, and Wayland validation remains a deployment requirement on an isolated VM or target host.

Legacy Go history (not the Rust release)

0.1.0 — Unreleased

first public release

What's In

  • tui login screen with username/password fields, session switcher, and status messages
  • supports x11, wayland, and tty sessions
  • pam authentication via cgo (thread-locked for safety)
  • faillock integration — detects lockouts, shows remaining attempts, admin bypass via ctrl+u
  • conway's game of life background rendered at 30 fps with unicode half-block characters
  • spring animation on switcher transitions
  • shake animation on failed login
  • caps lock indicator via ioctl
  • configurable power controls (shutdown/reboot on f1/f2 by default)
  • toml configuration with $VARIABLE substitution
  • preview mode (--preview) to test the login screen without leaving your session
  • utmpx user accounting (glibc only)
  • x11 session setup — xauthority cookies, sigusr1 handshake, server timeout
  • privilege dropping for child processes
  • log piping with 64 mb cap

Recent Fixes

  • DesktopNames parsing — .desktop files now parse the DesktopNames field. the first semicolon-delimited entry becomes XDG_SESSION_DESKTOP, and the full list with : separators becomes XDG_CURRENT_DESKTOP. fixes GNOME/KDE sessions not getting proper environment variables

  • utmpx accounting wired — AddUtmpx and Close are now called from spawnSession so user logins appear in who/w/last

  • fixed hardcoded shell — Credentials.Shell now reads from /etc/passwd instead of always returning /bin/sh. removes duplicate userShell logic in exec.go

  • automata background wired — Automata.Frame() is now rendered in View() as the base layer with the login form card overlaid using ANSI cursor positioning. the form has a dark card background for readability

  • clock widget — added a datetime display (Mon Jan 02 15:04:05) to the top bar, updated every tick

  • session specifier label — the environment switcher now shows the session type (x11, wayland) above the session name, like ly's specifier

  • form card background — login content is rendered inside a padded card with a dark background so it reads cleanly over the animated automata

  • utmpx time field portability — replaced hardcoded C.__uint32_t / C.__int32_t casts with a C helper function (auth/utmpx_time.h) that lets the compiler handle type conversion. fixes build failure on systems where ut_tv uses struct timeval instead of the 32/64 compat struct

  • cgo pointer safety for pam — replaced unsafe.Pointer(&h) (Go stack pointer passed to C) with storeHandle/loadHandle helpers that keep the cgo.Handle in C-heap memory. fixes cgo argument has Go pointer to unpinned Go pointer panic on Go 1.22+

  • pam conversation callback — fixed unsafe.Slice using &r (pointer-to-pointer) as the backing array instead of r (the calloc'd response array), which wrote password bytes into random stack memory. also now only responds to PAM_PROMPT_ECHO_OFF/PAM_PROMPT_ECHO_ON messages — info and error messages get nil. fixes pam_unix: auth could not identify password

  • cgo handle lifecycle — moved cgo.Handle and its C-heap backing from Validate (where they were defer-freed on return) into the Credentials struct so they stay alive through OpenSession and until CloseSession. fixes misuse of an invalid Handle panic

  • session spawning — replaced the broken ForkExec (which relaunched the same binary with made-up flags) with a direct session.Spawn call that drops privileges and runs the desktop in-process. fixes flag provided but not defined: -user

  • renamed extra/ files — lemurs.pam → latchd.pam, lemurs.service → latchd.service

  • readme credits — added a credits section acknowledging lemurs for the extra/ directory structure and session scanning approach

  • makefile enable and update targets — make enable stops any running DM, disables the aliased display-manager, and enables latchd. make update runs uninstall → git pull → reinstall in one command

  • missing extra/ directory — added extra/config.toml, extra/xsetup.sh, extra/lemurs.pam, and extra/lemurs.service so make install can find them

  • makefile deps target — added make deps to automatically install libpam0g-dev and build-essential, and verify go is present

  • readme overhaul — rewrote for clarity: added "what problem does this solve", "how it works", known issues, simpler install instructions, and proper dependency listing

  • view cleanup — removed the non-functional automata background overlay from View() (the Frame() was never called, and the black-space placeholder caused EEEE garbage characters on some terminals). also removed a hardcoded 80-char width on the top bar so it adapts to the terminal

  • session environment setup — spawnSession now calls SetBasicVariables, SetDisplay, SetSessionParams, SetSeatVars, SetSessionVars, and SetXDGCommonPaths before spawning the desktop. fixes setupX failing immediately with missing DISPLAY/XDG_VTNR/HOME env vars because none were set

  • pam session error made non-fatal — pam_open_session failure (e.g. pam_systemd rejecting the DM process as session leader) is now logged as a warning instead of blocking the entire session spawn. also removed session include login from latchd.pam since the DM process can't register user sessions with systemd-logind

  • global session switching with , and . — sessions can now be switched from any mode (not just when the switcher is focused). arrows still work when switcher is focused

What's Missing

  • no tests
  • session leader is the latchd process, not the desktop — pam session tracking via systemd-logind may be imperfect
  • not all config options affect the rendering yet
  • occasional terminal state corruption on abrupt exit
  • automata background visible at screen edges; form card covers the center