Thumbnail statistics
+An overview about the number of thumbnails tracked by hollo.
+ +| Type | +Number of thumbnails | +
|---|---|
| {entry.caption} | ++ {entry.count.toLocaleString("en")} + | +
From 4c3a4907b1e835510c4411cdde28861f16d2d248 Mon Sep 17 00:00:00 2001 From: aliceif <7098860+aliceif@users.noreply.github.com> Date: Sat, 18 Apr 2026 20:11:54 +0200 Subject: [PATCH 01/16] add thumbnail_cleanup page --- src/components/DashboardLayout.tsx | 16 +- src/pages/index.tsx | 2 + src/pages/thumbnail_cleanup.tsx | 745 +++++++++++++++++++++++++++++ 3 files changed, 762 insertions(+), 1 deletion(-) create mode 100644 src/pages/thumbnail_cleanup.tsx diff --git a/src/components/DashboardLayout.tsx b/src/components/DashboardLayout.tsx index b315fbd1..4aea2660 100644 --- a/src/components/DashboardLayout.tsx +++ b/src/components/DashboardLayout.tsx @@ -3,7 +3,12 @@ import type { PropsWithChildren } from "hono/jsx"; import metadata from "../../package.json"; import { Layout, type LayoutProps } from "./Layout"; -export type Menu = "accounts" | "emojis" | "federation" | "auth"; +export type Menu = + | "accounts" + | "emojis" + | "federation" + | "thumbnail_cleanup" + | "auth"; export interface DashboardLayoutProps extends LayoutProps { selectedMenu?: Menu; @@ -61,6 +66,15 @@ export function DashboardLayout( Federation )} +
This control panel allows you to clean up thumbnails.
+ + +An overview about the number of thumbnails tracked by hollo.
+ +| Type | +Number of thumbnails | +
|---|---|
| {entry.caption} | ++ {entry.count.toLocaleString("en")} + | +
Preview done.
+ ) : ( +Use this to preview the cleanup.
+ )} + +
+ Number of Items: {fileCount}
+
+ First: {firstFile}
+
+ Last: {lastFile}
+
+
Thumbnails have been cleaned up.
+ ) : ( ++ Use this when you want to free up storage by deleting old + thumbnails. +
+ )} + +
+ Number of Items in Range: {todo}
+
+ Processed: {processed}
+
+ Actually deleted: {deleted}
+
+
+ Cleanup + {activeJob.status === "pending" && " waiting to start"} + {activeJob.status === "processing" && " processing..."} +
+ ++ {activeJob.processedItems.toLocaleString("en-US")}{" "} + / {activeJob.totalItems.toLocaleString("en-US")} items processed + {activeJob.processedItems > 0 && ( + <> + {" "} + ( + + {activeJob.successfulItems.toLocaleString("en-US")} + {" "} + successful + {activeJob.failedItems > 0 && ( + <> + ,{" "} + + {activeJob.failedItems.toLocaleString("en-US")} + {" "} + failed + > + )} + ) + > + )} +
+ + {shouldAutoRefresh && ( + <> + + + This page refreshes automatically every 5 seconds. You can + navigate away safely — the cleanup will continue in the + background. + +