Development Architecture
This document describes the architecture and design of sysc-greet.
This document describes the architecture and design of sysc-greet.
Overview
sysc-greet is a graphical greeter for greetd, written in Go using the Bubble Tea TUI framework (v2).
Project Structure
sysc-greet/
├── cmd/
│ ├── installer/ # Interactive installation wizard
│ └── sysc-greet/ # Main greeter binary
│ ├── main.go # Application entry point, model, update loop
│ ├── theme.go # Theme application and wallpaper management
│ ├── ascii.go # ASCII art loading and parsing
│ ├── wallpaper.go # Wallpaper menu and gSlapper/swww handling
│ ├── menu.go # Menu system and navigation
│ ├── screensaver.go # Screensaver mode and idle detection
│ ├── ui_components.go # Reusable UI components
│ ├── utils.go # Helper functions
│ └── views.go # View rendering for different modes
├── internal/
│ ├── animations/ # Background and text effects
│ │ ├── fire.go # DOOM PSX fire effect
│ │ ├── rain.go # ASCII rain effect
│ │ ├── matrix.go # Matrix rain effect
│ │ ├── fireworks.go # Firework particle system
│ │ ├── aquarium.go # Animated aquarium scene
│ │ ├── ticker.go # Typewriter and scrolling ticker
│ │ ├── print_effect.go # Print animation for ASCII
│ │ ├── beams_text.go # Beams text effect
│ │ └── pour.go # Pour text effect
│ ├── cache/ # User preferences persistence
│ ├── ipc/ # greetd IPC client
│ ├── sessions/ # XDG session detection
│ ├── themes/ # Theme definitions (colors.go, themes.go)
│ └── wallpaper/ # gSlapper IPC client
├── ascii_configs/ # Session ASCII art configurations
├── config/ # Compositor configuration templates
└── fonts/ # Figlet font filesCore Components
Model-View-Update Pattern
sysc-greet follows Bubble Tea's Elm architecture:
- Model - Holds all application state
- View - Renders the UI based on model state
- Update - Handles messages and transitions state
- Init - Returns initial commands
State Management
The model struct in cmd/sysc-greet/main.go maintains:
- User inputs (username, password)
- Selected session and preferences
- Current mode (login, password, menu, screensaver, etc.)
- Animation state and timers
- IPC client connection
View Modes
sysc-greet operates in different view modes:
| Mode | Description |
|---|---|
| ModeLogin | Initial login screen with username input |
| ModePassword | Password entry screen |
| ModeMenu | Main settings menu |
| ModeThemesSubmenu | Theme selection |
| ModeBordersSubmenu | Border style selection |
| ModeBackgroundsSubmenu | Background effects selection |
| ModeWallpaperSubmenu | Wallpaper selection |
| ModeASCIIEffectsSubmenu | ASCII text effects selection |
| ModePower | Power menu (shutdown/reboot) |
| ModeReleaseNotes | Release notes display |
| ModeScreensaver | Idle screensaver |
TTY Compatibility
sysc-greet uses colorprofile library to detect terminal capabilities and provide appropriate fallback colors:
- TrueColor terminals - Full 24-bit RGB color support
- ANSI256 terminals - 256-color palette support
- Basic TTY - Falls back to 16 ANSI colors
Color rendering uses lipgloss.Complete() function which selects the best available color depth.
IPC Communication
greetd Client
sysc-greet communicates with greetd via Unix socket for authentication:
- Create session with greetd
- Send create session request with username and session
- Receive success/failure response
- On success, start the selected session
gSlapper IPC
Wallpaper management uses gSlapper IPC protocol via Unix socket at /tmp/sysc-greet-wallpaper.sock:
IsGSlapperRunning()- Check if gSlapper socket existsChangeWallpaper(path)- Change wallpaper with fade transitionPauseVideo()- Pause video playbackResumeVideo()- Resume video playback
Fallback Behavior
If gSlapper is not available, sysc-greet falls back to swww for wallpaper management.
Configuration System
User Preferences
Stored in /var/cache/sysc-greet/:
- Selected theme
- Selected background effect
- Selected wallpaper
- Selected border style
- Last session and username (if
--remember-usernameenabled) - ASCII variant index
Session Detection
sysc-greet reads XDG session files from standard paths:
/usr/share/xsessions/usr/share/wayland-sessions/run/current-system/sw/share/xsessions/run/current-system/sw/share/wayland-sessions
Each session is parsed for:
- Name (from
Name=field) - Exec command (from
Exec=field) - Type (X11 or Wayland, based on path)
ASCII Config System
Each session can have a .conf file in /usr/share/sysc-greet/ascii_configs/:
Parsed fields:
name- Display nameascii_1,ascii_2, etc. - Multiple ASCII art variantscolors- Hex colors for rainbow effectroasts- Custom roast messages separated by│
Animation System
Background Effects
All background effects implement a common interface:
Update(frame)- Advance animation by one frame- Initialized with width and height
- Use theme colors for rendering
Effects:
- Fire - PSX DOOM algorithm with particle system
- Matrix - Falling characters with trail effect
- ASCII Rain - Falling ASCII using theme colors
- Fireworks - Particle explosion system
- Aquarium - Swimming fish with bubble particles
ASCII Effects
- Typewriter - Character-by-character text display
- Print - Line-by-line ASCII rendering
- Beams - Horizontal color beam scanning
- Pour - Character cascade with gradient
Key Bindings
sysc-greet handles key input centrally:
| Key | Action |
|---|---|
| F1 | Settings menu |
| F2 | Session selection |
| F3 | Release notes |
| F4 | Power menu |
| Page Up/Down | Cycle ASCII variants |
| Tab | Focus navigation |
| Enter | Submit/Select |
| Esc | Cancel/Back |
| Ctrl+C | Blocked in production mode (security) |
Security Features
CAPS LOCK Detection
sysc-greet uses Kitty keyboard protocol to detect CAPS LOCK state:
- Requests
RequestUniformKeyLayouton init - Checks
tea.ModCapsLockin key messages - Displays warning when CAPS LOCK is on
Failed Attempt Tracking
Tracks consecutive failed authentication attempts:
- Displays warning message after failed login
- Resets counter on successful authentication
- Returns to username field on failure (not password)
Test Mode
The --test flag bypasses greetd IPC for safe testing:
- Uses mock sessions if none found
- Does not execute user sessions
- Allows Ctrl+C to exit
- Disables wallpaper changes in production
Performance Considerations
Non-blocking Operations
Wallpaper changes and IPC calls run in goroutines to avoid blocking the UI:
go func() {
if err := wallpaper.ChangeWallpaper(path); err != nil {
logDebug("gSlapper wallpaper change failed: %v", err)
}
}()Lazy Initialization
Effects are initialized on first use when terminal dimensions are known:
- Aquarium effect created when first selected with valid dimensions
- gSlapper launched when first needed, not at startup
Dependencies
- charmbracelet/bubbletea/v2 - TUI framework
- charmbracelet/lipgloss/v2 - Terminal styling
- charmbracelet/colorprofile - Terminal capability detection
- mbndr/figlet4go - ASCII art generation
Build System
- Go 1.25.1 toolchain
- Build tags and commit info injected via ldflags
- Version info available at runtime for debugging
