diff --git a/README.md b/README.md
index f41edb3..7cfcfeb 100644
--- a/README.md
+++ b/README.md
@@ -84,6 +84,22 @@ can use the permanent channel and playlist links. Requests use 10-second timeout
and a 2 MiB response limit. Titles are rendered as text, and watch/thumbnail URLs
are restricted to the PeerTube origin. No descriptions, HTML, or players are embedded.
+### Theme music
+
+The homepage plays the eom.dev theme (composed in Strudel) as a seamless 16-bar
+loop: `htdocs/static/theme-player.mjs` with `htdocs/static/audio/eom-theme-loop.ogg`
+(Opus) and an AAC `.m4a` fallback. Web Audio loops it without a gap. Browsers
+block sound until the first click or key press, so it starts then unless the
+visitor switched it off with the "Theme" button (remembered in localStorage).
+
+While it plays, links between the homepage and `/members/` pages are fetched
+and swapped into the same document, so the music does not restart on the
+membership page. Forms, sign-in, checkout, billing and other sites stay normal
+navigations (`HARD_NAV` in the module), and with the music off every link is a
+normal navigation. The membership templates do not load the player; a visitor
+who opens `/members/` directly gets no music. Sources and longer versions are
+kept outside this repository (`eom-theme.strudel.js`).
+
### Local preview and content checks
With Node.js 24 or later, run `node scripts/preview.mjs` from this repository
diff --git a/htdocs/index.html b/htdocs/index.html
index 858a0d8..a00ad36 100644
--- a/htdocs/index.html
+++ b/htdocs/index.html
@@ -323,6 +323,7 @@
+