From 8578d83f1965129ad9225f3f83da8bf31059bd76 Mon Sep 17 00:00:00 2001 From: ChuckBuilds Date: Thu, 16 Jul 2026 10:46:50 -0400 Subject: [PATCH] perf(web): gzip response compression via flask-compress MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The interface ships a ~5,000-line HTML shell and >20k lines of JS uncompressed; on phone/WiFi that dominates load time. Flask-Compress gzips/brotlis compressible responses transparently. - Optional dependency, same graceful pattern as flask-limiter: missing package = uncompressed responses, no crash. - SSE safety verified empirically against the real package (1.24): an actual streamed text/event-stream response comes back with no Content-Encoding while a large HTML response gzips — the display preview / stats / logs streams are unaffected. - Added flask-compress>=1.14 to web_interface/requirements.txt. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01KEZK1P1Q1fu5pcuVrkrCFZ --- web_interface/app.py | 10 ++++++++++ web_interface/requirements.txt | 1 + 2 files changed, 11 insertions(+) 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