Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.2.0] - 2026-05-26
Added
Generalized Configuration Pattern: Unified configuration system for all client settings
Configdataclass with auto-discovery from multiple sourcesResolution order: explicit config → config_path → prefixed env vars → unprefixed env vars → ./roomz.toml → ~/.roomz.toml
Environment variable prefix system:
ROOMZ_PREFIX=DEV→DEV_ROOMZ_SERVER_URLTOML config file support with
[client]sectionConfig.auto_discover()returns discovered path for debuggingStructured logging for config discovery
ConfigurationErrorexception for clear error messages
Changed
Breaking:
AsyncClientandSyncClientconstructors now acceptconfig: Configinstead of individualserver_urlanddisplay_nameparametersOld:
AsyncClient(server_url="http://localhost:5000", display_name="Alice")New:
AsyncClient(config=Config(server_url="http://localhost:5000", display_name="Alice"))Or use auto-discovery:
AsyncClient()withROOMZ_SERVER_URLenv var or~/.roomz.toml
Fixed
Session cache security: Session files now created with 0600 permissions (atomic creation with
os.open()+O_EXCL)Server URL validation: URLs validated to be http/https only, no credentials allowed
Email sender: ResendEmailSender now correctly handles quoted
EMAIL_FROMvalues
Security
Session cache files created with 0600 permissions (JWT tokens protected)
Config files loaded with explicit error handling (raises
ConfigurationErroron invalid files)Server URL validation prevents credential injection
[0.1.2] - 2026-05-18
Added
Per-device display names: Users can set custom display names per device/session
/name <name>command to set display name in chat/name(no argument) to clear display nameDisplay format:
"{name} ({email})"or justemailWeb client: persisted in localStorage
Python client:
ROOMZ_DISPLAY_NAMEenv var or~/.roomz/config.tomlStateless server-side storage (per-connection in memory)
Input validation: max 50 chars, no newlines/control chars, XSS prevention
Fixed
System message visibility: Presence messages (user joined/left) now visible on dark themes
Changed from
text-medium-emphasistotext-primaryclassSubtle primary background for better contrast
Mobile title truncation: Title “Roomz” no longer truncates on narrow screens
User dropdown shows icon-only on mobile (< 600px)
Full text visible on tablet/desktop
Changed
Presence events now include
display_namefieldNew
display_name_changedWebSocket event for multi-device awareness
[0.1.0] - 2024-05-15
Added
Initial release
Magic link authentication with email delivery
JWT-based session management with httpOnly cookies
Real-time WebSocket chat using Socket.IO
User-owned private channels for isolated messaging
Python client library (AsyncClient and SyncClient)
CLI interface (roomz-cli) with Textual TUI
Session caching for automatic reconnection
Rate limiting for magic link requests
ALLOWED_EMAILS access control
Resend email integration
Comprehensive test suite
Security
HS256 JWT signing (algorithm hardcoded)
Single-use magic links with 15-minute expiration
Rate limiting (5 requests per email per hour)
httpOnly, SameSite=Strict cookies
Server-side ALLOWED_EMAILS validation on every request
XSS prevention through message sanitization
Version History
Version |
Date |
Description |
|---|---|---|
0.2.0 |
2026-05-26 |
Configuration pattern, session security fixes |
0.1.2 |
2026-05-18 |
Display names, mobile UX fixes |
0.1.1 |
2026-05-15 |
Package restructuring |
0.1.0 |
2024-05-15 |
Initial release |