diff --git a/web_interface/app.py b/web_interface/app.py index e61c5cec..e40fac9a 100644 --- a/web_interface/app.py +++ b/web_interface/app.py @@ -59,6 +59,16 @@ except ImportError: # flask-limiter not installed, rate limiting disabled limiter = None +# Enable gzip/brotli response compression (Flask-Compress skips streaming +# responses, so the SSE endpoints are unaffected). Optional, like limiter: +# missing package just means uncompressed responses. +try: + from flask_compress import Compress + + Compress(app) +except ImportError: + pass + # Import cache functions from separate module to avoid circular imports # Initialize plugin managers - read plugins directory from config diff --git a/web_interface/requirements.txt b/web_interface/requirements.txt index dd4a4548..6b1a98e0 100644 --- a/web_interface/requirements.txt +++ b/web_interface/requirements.txt @@ -7,6 +7,7 @@ flask>=3.1.3,<4.0.0 werkzeug>=3.1.6,<4.0.0 flask-wtf>=1.2.0 # CSRF protection (optional for local-only, but recommended) flask-limiter>=3.5.0 # Rate limiting (prevent accidental abuse) +flask-compress>=1.14 # gzip/brotli response compression (big win for the large JS/HTML over WiFi) # WebSocket support for plugins # Note: Web interface uses Server-Sent Events (SSE) for real-time updates, not WebSockets