diff --git a/entrypoint.sh b/entrypoint.sh
index 57a3d62..841b6e0 100644
--- a/entrypoint.sh
+++ b/entrypoint.sh
@@ -23,4 +23,83 @@ if [ -d "$SEED_DIR" ]; then
done
fi
+# Merge newly added seeded platform links into existing admin content on upgrades
+# without overwriting user-edited values already present in the live volume.
+merge_seed_platform_links() {
+ target_file="$1"
+ seed_file="$2"
+
+ [ -f "$target_file" ] || return 0
+ [ -f "$seed_file" ] || return 0
+
+ node - "$target_file" "$seed_file" <<'NODE'
+const fs = require('fs')
+
+const [targetFile, seedFile] = process.argv.slice(2)
+
+function readJson(file) {
+ return JSON.parse(fs.readFileSync(file, 'utf8'))
+}
+
+function normalizeLinks(value) {
+ return Array.isArray(value) ? value.filter(item => item && typeof item === 'object') : []
+}
+
+const target = readJson(targetFile)
+const seed = readJson(seedFile)
+
+if (!target.siteContent || !seed.siteContent) process.exit(0)
+
+const targetLinks = normalizeLinks(target.siteContent.customLinks)
+const seedLinks = normalizeLinks(seed.siteContent.customLinks)
+
+let changed = false
+
+for (const seedLink of seedLinks) {
+ if (seedLink.placement !== 'platforms' || !seedLink.id || !seedLink.label || !seedLink.url) continue
+
+ const existingIndex = targetLinks.findIndex(link => link.id === seedLink.id)
+ if (existingIndex === -1) {
+ targetLinks.push(seedLink)
+ changed = true
+ continue
+ }
+
+ const existing = targetLinks[existingIndex]
+ const merged = { ...existing }
+
+ if (!merged.imageUrl && seedLink.imageUrl) {
+ merged.imageUrl = seedLink.imageUrl
+ changed = true
+ }
+
+ if (!merged.placement && seedLink.placement) {
+ merged.placement = seedLink.placement
+ changed = true
+ }
+
+ if (!merged.label && seedLink.label) {
+ merged.label = seedLink.label
+ changed = true
+ }
+
+ if (!merged.url && seedLink.url) {
+ merged.url = seedLink.url
+ changed = true
+ }
+
+ targetLinks[existingIndex] = merged
+}
+
+if (!changed) process.exit(0)
+
+target.siteContent.customLinks = targetLinks
+fs.writeFileSync(targetFile, `${JSON.stringify(target, null, 2)}\n`)
+console.log(`[siteforge] Merged seeded platform links into ${targetFile}`)
+NODE
+}
+
+merge_seed_platform_links "$DATA_DIR/admin-content.json" "$SEED_DIR/admin-content.json"
+merge_seed_platform_links "$DATA_DIR/admin-content-draft.json" "$SEED_DIR/admin-content-draft.json"
+
exec node server.js
diff --git a/public/images/follow-on-facebook.svg b/public/images/follow-on-facebook.svg
new file mode 100644
index 0000000..1076da4
--- /dev/null
+++ b/public/images/follow-on-facebook.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/App.tsx b/src/App.tsx
index 23e7150..2724420 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -3,7 +3,6 @@ import { Link, NavLink, Routes, Route, useLocation, useNavigate, useParams } fro
import AdminPage from './AdminPage'
import QASection from './components/QASection'
import ContactForm from './components/ContactForm'
-import { FacebookIcon, SpotifyIcon } from './icons'
import type { SiteContent, ArchivedSeries } from './content'
import { DEFAULTS } from './content'
import './App.css'
@@ -496,9 +495,8 @@ function PlatformButtons({ content }: { content: SiteContent }) {
-
-
- Facebook
+
+
{(content.customLinks ?? []).filter(l => l.placement === 'platforms').map(l => (