diff --git a/services/booth/booth/app.py b/services/booth/booth/app.py
index d807d71..b7af84f 100644
--- a/services/booth/booth/app.py
+++ b/services/booth/booth/app.py
@@ -19,6 +19,7 @@ from __future__ import annotations
import asyncio
import io
import os
+import re
import secrets
import shutil
import time
@@ -230,6 +231,96 @@ def _zip_filename(name: str) -> str:
return f"{safe or 'booth'}.zip"
+# ---- verbatim-index.html wrapper -------------------------------------------
+
+# Mirror of base.html's favicon (the app templates set it there; this is the copy
+# injected into a booth's *verbatim* index.html so a raw page inherits the same
+# icon). Keep the two in sync if the Booth's icon ever changes.
+FAVICON_HREF = (
+ "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'"
+ "%3E%3Crect width='32' height='32' rx='7' fill='%23171a23'/%3E%3Ccircle cx='16' "
+ "cy='16' r='6' fill='none' stroke='%2342dcd1' stroke-width='2.5'/%3E%3Ccircle "
+ "cx='16' cy='16' r='2.2' fill='%2342dcd1'/%3E%3C/svg%3E"
+)
+FAVICON_LINK = f''
+
+# A self-contained floating "back to all booths" chip injected into verbatim
+# booths. Scoped class + fixed positioning + max z-index so it overlays the raw
+# page without touching its layout; hidden in print so downloaded reports stay clean.
+_BACK_CHIP = (
+ '‹ all booths'
+ # top-right: empty on left-aligned report layouts (a top-left chip clips the
+ # page title), and consistent with the zoom view's top-right back affordance.
+ ""
+)
+
+WRAP_MAX_BYTES = 8 * 1024 * 1024 # above this, serve the verbatim page raw (unwrapped)
+
+_ICON_RE = re.compile(r"]*\brel\s*=\s*[\"']?[^\"'>]*icon", re.IGNORECASE)
+_HEAD_CLOSE_RE = re.compile(r"", re.IGNORECASE)
+_HTML_OPEN_RE = re.compile(r"]*>", re.IGNORECASE)
+_DOCTYPE_RE = re.compile(r"]*>", re.IGNORECASE)
+_BODY_CLOSE_RE = re.compile(r"", re.IGNORECASE)
+_HTML_CLOSE_RE = re.compile(r"