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
$VARIABLEsubstitution - 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 —
.desktopfiles now parse theDesktopNamesfield. the first semicolon-delimited entry becomesXDG_SESSION_DESKTOP, and the full list with:separators becomesXDG_CURRENT_DESKTOP. fixes GNOME/KDE sessions not getting proper environment variables -
utmpx accounting wired —
AddUtmpxandCloseare now called fromspawnSessionso user logins appear inwho/w/last -
fixed hardcoded shell —
Credentials.Shellnow reads from/etc/passwdinstead of always returning/bin/sh. removes duplicateuserShelllogic in exec.go -
automata background wired —
Automata.Frame()is now rendered inView()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_tcasts with a C helper function (auth/utmpx_time.h) that lets the compiler handle type conversion. fixes build failure on systems whereut_tvusesstruct timevalinstead of the 32/64 compat struct -
cgo pointer safety for pam — replaced
unsafe.Pointer(&h)(Go stack pointer passed to C) withstoreHandle/loadHandlehelpers that keep thecgo.Handlein C-heap memory. fixescgo argument has Go pointer to unpinned Go pointerpanic on Go 1.22+ -
pam conversation callback — fixed
unsafe.Sliceusing&r(pointer-to-pointer) as the backing array instead ofr(the calloc'd response array), which wrote password bytes into random stack memory. also now only responds toPAM_PROMPT_ECHO_OFF/PAM_PROMPT_ECHO_ONmessages — info and error messages get nil. fixespam_unix: auth could not identify password -
cgo handle lifecycle — moved
cgo.Handleand its C-heap backing fromValidate(where they weredefer-freed on return) into theCredentialsstruct so they stay alive throughOpenSessionand untilCloseSession. fixesmisuse of an invalid Handlepanic -
session spawning — replaced the broken
ForkExec(which relaunched the same binary with made-up flags) with a directsession.Spawncall that drops privileges and runs the desktop in-process. fixesflag 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
enableandupdatetargets —make enablestops any running DM, disables the aliased display-manager, and enables latchd.make updateruns uninstall → git pull → reinstall in one command -
missing
extra/directory — addedextra/config.toml,extra/xsetup.sh,extra/lemurs.pam, andextra/lemurs.servicesomake installcan find them -
makefile
depstarget — addedmake depsto automatically installlibpam0g-devandbuild-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()(theFrame()was never called, and the black-space placeholder causedEEEEgarbage characters on some terminals). also removed a hardcoded 80-char width on the top bar so it adapts to the terminal -
session environment setup —
spawnSessionnow callsSetBasicVariables,SetDisplay,SetSessionParams,SetSeatVars,SetSessionVars, andSetXDGCommonPathsbefore spawning the desktop. fixessetupXfailing immediately withmissing DISPLAY/XDG_VTNR/HOME env varsbecause none were set -
pam session error made non-fatal —
pam_open_sessionfailure (e.g.pam_systemdrejecting the DM process as session leader) is now logged as a warning instead of blocking the entire session spawn. also removedsession include loginfromlatchd.pamsince 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