diff --git a/apps/admin-ui/src/app/streams/page.tsx b/apps/admin-ui/src/app/streams/page.tsx
index 78afead..a908b30 100644
--- a/apps/admin-ui/src/app/streams/page.tsx
+++ b/apps/admin-ui/src/app/streams/page.tsx
@@ -85,7 +85,7 @@ export default function StreamsPage() {
Eén rij per kijker + titel. Alleen echte streams (>512 KB). Stopt iemand → verdwijnt
- binnen ~3 minuten. Voortgang is een schatting op range-positie.
+ binnen ~3 minuten. Voortgang ≈ gestreamde bytes / bestandsgrootte.
diff --git a/apps/master-api/src/admin/routes.ts b/apps/master-api/src/admin/routes.ts
index 2c9ec92..f1ee1c1 100644
--- a/apps/master-api/src/admin/routes.ts
+++ b/apps/master-api/src/admin/routes.ts
@@ -298,9 +298,10 @@ export async function registerAdminRoutes(app: FastifyInstance, config: Config)
.sort((a, b) => b.lastActivity.getTime() - a.lastActivity.getTime())
.map((s) => {
const fileSize = Number(s.fileSizeBytes || s.mediaFile.sizeBytes || 0);
- const offset = Number(s.lastByteOffset || 0);
+ const sent = Number(s.bytesSent || 0);
+ // bytesSent loopt netjes op; lastByteOffset springt vaak naar EOF door player Range-probes.
const progressPercent =
- fileSize > 0 ? Math.min(100, Math.max(0, (offset / fileSize) * 100)) : null;
+ fileSize > 0 ? Math.min(100, Math.max(0, (sent / fileSize) * 100)) : null;
const title =
s.mediaFile.movie?.title ??
(s.mediaFile.episode