Initial implementation of Sahsa Clock

Pygame framebuffer clock for Le Potato (ARM Debian) with aiohttp webhook server.
Renders 12-hour clock directly to /dev/fb0 (no X11/Wayland). Supports full-screen
message overlays pushed via a browser dashboard or Bearer-token API. Includes
first-run setup wizard, session-based dashboard auth, bcrypt password storage,
per-IP rate limiting, and systemd service unit.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-24 16:22:10 -06:00
commit 0c2392b2b3
13 changed files with 1587 additions and 0 deletions

35
config.toml Normal file
View File

@@ -0,0 +1,35 @@
[display]
# Screen resolution. Leave commented to auto-detect from the framebuffer.
# width = 1920
# height = 1080
# Display refresh rate in frames per second. 10 is plenty for a clock.
fps = 10
# Paths to TTF font files. Leave blank to auto-detect from system fonts.
# The clock uses a monospace font; messages use a sans-serif bold font.
clock_font_path = ""
message_font_path = ""
[server]
port = 8080
# Default message duration in seconds when the caller doesn't specify one.
default_duration_seconds = 20
[api]
# Bearer token for /api/* routes.
# Leave blank — a token is auto-generated on first run and saved here.
token = ""
[rate_limit]
# Maximum API requests per minute per source IP.
requests_per_minute = 20
[dashboard]
# Bcrypt hash of the dashboard password.
# Leave blank — a setup wizard runs on the first browser visit to set the password.
password_hash = ""
# How many hours of inactivity before a dashboard session expires.
session_timeout_hours = 8