Files
latchd/CHANGELOG.md
Zane Walker 1723ab53b8
Some checks failed
Integration Check CI / check (push) Has been cancelled
Continuous integration / Check (push) Has been cancelled
Continuous integration / Rustfmt (push) Has been cancelled
Continuous integration / Clippy (push) Has been cancelled
docs: update CHANGELOG, README keybindings, gitignore ly/
2026-07-19 01:54:45 +05:30

5.8 KiB

Changelog

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 wiredAddUtmpx and Close are now called from spawnSession so user logins appear in who/w/last

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

  • automata background wiredAutomata.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/ fileslemurs.pamlatchd.pam, lemurs.servicelatchd.service

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

  • makefile enable and update targetsmake 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 setupspawnSession 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-fatalpam_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