✨ What's New in 0.9.3
🚀 New Features
- SSH command-level audit logging with timestamps
- Replace emoji favicon with PNG file
- Drag-and-drop tab reordering with animated insertion indicator
- File browser activity recording for SFTP, SMB, FTP
- SSH terminal copy on select, paste on right-click
- Persistent insecure-key warning with Never/Remind buttons
- Post-login warning banner when ALTERM_ENCRYPTION_KEY is not set
- ALTERM_ENCRYPTION_KEY env var, recording encryption at rest, full system backup/restore
- Idle timeout enforcement, port-forward tunnel status, remove max concurrent sessions
- Auto-close disconnected session tab after 15s countdown
- LDAP authentication, OpenID Connect SSO, and authentication providers settings
- Remove yellow health dot; add health monitor toggle to settings
- File size column in recordings; narrow protocol filter to SSH & RDP
- RDP session recording via canvas MediaRecorder + storage bar
- Sftp context menu for ssh, protocol icons in modal
🐛 Bug Fixes
- Default SSH commands panel to open on recording playback
- Persist sidebar folder expand state to localStorage so toggling sidebar doesn't collapse folders
- Remove duplicate TabBar content causing TS2451/TS2393 errors
- Tab drag-drop no-entry icon; feat: drop tab onto tab to split view
- Use plain-object wrapper for noVNC to pass attach() prototype chain check
- Cast WebSocket to satisfy noVNC RFB type definition
- Pre-create WebSocket for noVNC to avoid 'raw channel missing property: send' error
- File browser checkboxes always visible with border-border/60
- SFTP 'No such file' on folder navigation + clearer selection UI
- SFTP session disconnects on any folder navigation error
- RDP recording cut short — finalize was racing last chunk upload
- Clear entire sessionStorage on logout instead of individual keys
- Remind-me-later banner persists after re-login
- Migration v2 crashes on fresh install with duplicate column error
- Insecure key warning banner missing for admin users
- Resolve TS2345 build errors in sessions.ts
- Health monitor dots no longer flash gray on every re-poll
- Show clear error when backup import password is wrong
- Encrypt RDP recordings from first chunk, not just at session end
- Pass WS ticket as authToken to IronRDP SessionBuilder
- Sessions stuck as active - close via WS disconnect and on startup
- Health check was blocking private IPs - only block loopback and metadata endpoints
- Compact new connection dialog - reduce spacing, inline fields
- Use gosu entrypoint to chown bind-mount data dir before dropping to node user
- Pre-create /app/data before VOLUME so node user has write access
- Resolve code inconsistencies and remove redundant code
- Initialize RDP recording cursor to fallback arrow from frame 1
- RDP recording cursor disappears - use fallback arrow for default cursor
- SFTP private key auth - fetch and use private_key for SSH key connections
- Show cursor in RDP recordings via software cursor compositing
- Auto-focus SSH terminal when switching tabs
- RDP video progress bar using duration probe seek
- Add media-src blob: to CSP - browser was blocking video blob URL
- RDP player - dismiss loading on blob ready, add onCanPlay and onError
- Serve WebM recordings with HTTP Range support for browser playback
- RDP recording blank video; add download button for recordings
- SSH terminal width - capture resize before shell opens
- Build error - hoist rafId to useEffect scope
- SSH terminal width and RDP recording video playback
- Ssh recording time jumps, rdp video chunk upload, rdp player UI
- Drag-drop highlight flicker and health check on move
- Allow SFTP session to open from SSH connection
🔧 Other Changes
- Refactor: collapse 13 DB migrations into a single clean v1
- Security: fix critical and high severity vulnerabilities
- Security fixes
- Version fix
- Fix in README
- Version fix
- Revert "chore: use registry image in docker-compose instead of local build"
🐳 Container Image
docker run -d -p 7443:7443 ghcr.io/kotoxie/alterm:0.9.3