diff --git a/PLAN.md b/PLAN.md
index 071fed4..5f0e4ef 100644
--- a/PLAN.md
+++ b/PLAN.md
@@ -361,6 +361,48 @@ modes the reverted features did.
real drifted second device (only one browser session available this
round, same recurring constraint as everything else that needs two real
logins).
+- **In-player overlay added 2026-07-09.** User-requested (correctly pushing
+ back on an earlier "not possible without patching jellyfin-web" claim --
+ plugins like InPlayerEpisodePreview prove the pattern exists): the stats
+ panel + sync button now also appear *inside the video player page*, not
+ just on the standalone stats page.
+ - Mechanism: an `IStartupFilter` registered from plugin DI adds
+ `SyncPlusIndexInjectionMiddleware` to the front of the pipeline, which
+ intercepts responses for `/web/` and `/web/index.html` and injects a
+ `";
+
+ private readonly RequestDelegate _next;
+ private readonly ILogger _logger;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The next middleware in the pipeline.
+ /// Instance of the interface.
+ public SyncPlusIndexInjectionMiddleware(RequestDelegate next, ILogger logger)
+ {
+ _next = next;
+ _logger = logger;
+ }
+
+ ///
+ /// Intercepts index.html responses and injects the overlay script tag.
+ ///
+ /// The HTTP context.
+ /// A task.
+ public async Task InvokeAsync(HttpContext context)
+ {
+ var path = context.Request.Path.Value ?? string.Empty;
+ var isIndex = path.Equals("/web/", StringComparison.OrdinalIgnoreCase)
+ || path.Equals("/web/index.html", StringComparison.OrdinalIgnoreCase);
+
+ if (!isIndex)
+ {
+ await _next(context).ConfigureAwait(false);
+ return;
+ }
+
+ // Downstream middleware would otherwise gzip/brotli the body before it gets back
+ // to us, making the