Two compounding bugs caused 0 clicks since May 22:
1. lib/ads.ts exported ADS_728X90 / ADS_300X250 / FIXED_300X600 as
IIFE-evaluated module constants. They captured the FALLBACK array
at module-load time, before the centralized RMP banner cache
populates. Every render that referenced them got FALLBACK banners
whose click_url was the direct advertiser URL — bypassing the
centralized click logger entirely. 300x250s escaped because every
page reads them via rotateAll() at render time.
2. Even when the new RMP-cache banners did render, click_url pointed
at www.RMP.com/<property>/<slug>, which logs to adv.banner_clicks.
The RMP analytics dashboard reads bb.ad_clicks. Repointed click
URLs at advertising.RMP.com/r/<campaign_id> so all clicks land in
the single table the dashboard queries.
Files: lib/ads.ts (remove broken IIFE exports + repoint click_url),
SidebarAdStack, Header, Footer, and 9 pages (reading-list, forum,
forum/thread, search, gear, technology, authors, show-coverage x2).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- /manufacturers index + DirectoryClient: convert white/light-ink theme
to BB dark theme so it stops standing out against the rest of the site
- /manufacturers/[slug]: same conversion, includes the new executives
card grid and Headquarters block
- /nab-2026: same conversion, including hero gradient and sponsor tile
borders (amber on dark instead of amber on white)
- Forum: remove "Top Performing Threads" widget from both /forum and
/forum/[slug] (display only — TopThreadsWidget component preserved
in case admins want to re-enable later)
- Forum hero: vertical padding py-10 → py-5, tagline reduced from
three sentences to one. Adds a "Sign in to post" or "Start a thread"
CTA in the hero's top-right depending on auth state.
- Recent Forum Posts ticker: drop replies entirely, surface only thread
titles so breadth of conversation shows instead of the loudest
threads dominating with reply chatter.
Feature 3 — forum auto-linking
Thread + reply bodies in /forum/thread/[id] now wrap company-name
mentions with /manufacturers/<slug> links via a new client-side
LinkifyPlainText component. Loads the directory list once per page
(module-level promise cache), regex-scans each body, preserves
whitespace, caps at 10 links per body to avoid clutter.
CompanyMentionsHover mounted on the page so the same preview card
pops on hover.
Adds /api/public/companies/list — minimal { name, slug } directory
feed, cached 10min.
Feature 4 — /nab-2026 live coverage hub
New page aggregating every directory company with exhibits_nab=true.
Three sections:
- Coverage Partners — active advertisers exhibiting at NAB, larger
tiles with emerald Sponsor border
- Latest from the show floor — last 60 days of articles with NAB
in the title, cinematic grid
- All NAB 2026 exhibitors — alphabetical, capped at 200 with link
to full /manufacturers directory
Every company tile carries data-company-slug for hover previews.
Feature 5b — Sponsor logo strip on homepage
New SponsorLogoStrip server component renders just above the footer
on the homepage, showing logos of every current banner advertiser
with a directory entry + logo. Each links to the manufacturer
profile with the hover-card slug attribute.
Feature 5c — Recent coverage on manufacturer profiles
/manufacturers/[slug] now includes a grid of the 6 most recent
articles matching the company name in the title, with thumbnails.
Renames the existing manufacturer_id-linked block to "Press
releases" since it's a separate data source.
gear, technology, search, reading-list, show-coverage, authors/[slug],
forum/thread/[id] all now render the 300x600 + 300x250 stack as a
floating right column at the top of the content area. Existing
single-column page structure preserved (content wraps).
Maximizes impression count: every pageview across these pages now
counts 300x600 + every 300x250 in the stack, on top of the existing
728x90 in Header.
- API: require auth on thread+reply POST (401 if !user); lazy-create
forum_user_profile via service-role; author_name = display_name
- UI: surface API errors (kill silent catch); auto-redirect to login
on 401; gate new-thread + reply forms with "Sign in to post" CTA
- /forum/login + /forum/register: forum-themed Supabase Auth pages
with ?next= redirect support
- /forum/profile/edit + /api/forum/profile/me: edit own forum profile
(username, display_name, bio, role, company, location, avatar)
- Header: logout button + sign-in/join links when not authed
- forum/user/[username]: show Edit Profile button when viewing own
Fixes posting bug: RLS rejected anon inserts with cryptic message
that the UI silently swallowed; now blocked with friendly 401 + redirect.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bug: the index page only fetched threads when user was actively
searching, filtering by category, or sorting non-default. Default
load → setThreads([]) → forum looked empty even though 50+
threads existed in the DB.
Fix: always fetch on mount + filter changes (drop the
isSearchMode gate on the effect), and add a Recent Threads
section in the default view above the Browse Categories list,
showing the 12 most recent threads with author + reply count.
API + DB unchanged.
USER PROFILES (/forum/user/[username]):
- New API at /api/forum/user-by-username/[username] resolves by
username OR display_name (URL-encoded), since forum threads/replies
store author_name = display_name. Returns the persona's profile,
thread history (up to 50), and recent replies (up to 20).
- New page renders the persona card with archetype badge
(Audio Engineer / Colorist / etc.) + expertise level badge
(beginner/intermediate/senior) + role title, company, location,
years_experience, join date, and an expertise-tags chip row.
- Two columns underneath: "Threads started" and "Recent replies"
with proper deep-links into each thread.
- Author names in /forum, /forum/[slug], and /forum/thread/[id] are
now <Link> elements pointing to /forum/user/<displayname>, with
onClick=stopPropagation so the card-level click handler doesn't
also fire.
FAVICON:
- Hand-built neon pulse waveform — emerald→cyan→purple gradient on
dark navy background, designed to read at 16×16 to 256×256.
- Multi-resolution favicon.ico (16/32/48/64) + SVG + PNGs at
16/32/48/64/96/192/256 under /static/favicons/.
- layout.tsx icons block now references all sizes including the
apple-touch sizes (192, 256).
No env / DB changes here — pure deploy.
The schema has upvotes / downvotes / vote_score; API + UI were
querying/reading upvote_count / downvote_count (non-existent
columns). Threads existed in the DB but didn't render.
- /api/forum/threads route.ts:
- 'top-voted' sort: order by vote_score (was upvote_count)
- 'newest' default sort: forum_threads has no 'status' column,
so order pinned-first via is_pinned, then last_reply_at desc
- UI ForumThread interface + components: rename
upvote_count → upvotes, add downvotes + vote_score so the
vote display in the thread cards and the admin moderation
list pulls live data from the existing columns.
After this lands and the deploy completes, the 50 seeded
threads + the 9 ai-seeded new threads + 253 backfilled replies
already in the DB will all render at /forum.
- Replace img.rocket.new mock URLs in authors/[slug] + FeaturedBento
with /assets/images/article-placeholder.svg (live DB data drives
these pages now; the static maps are fallback only).
- Replace broadcastb5322.builtwithrocket.new with broadcastbeat.com
in admin API routes, news detail, forum layout, and the 4 Supabase
edge functions that build outbound email links.
- Swap rocket-hosted JSON-LD logo URL in root layout for the local
/assets/images/logo.png we already ship.
- Drop img.rocket.new from the Next.js image-hosts allowlist;
add supabase.onsethost.com so storage proxy URLs can render.
The DB has had zero rocket.new image refs for weeks; this finishes
the job in the codebase so no page on broadcastbeat.com can render
a rocket-hosted asset anymore.
Forum:
- /forum landing: switch to 2-col layout, add SidebarAdStack
(300x600 + every 300x250) on the right.
- /forum/thread/[id]: insert one 300x250 "Sponsored" tile after
every 4 replies (idx 3, 7, 11 …). Trailing-ad guard so the last
reply isn't followed by an ad with no replies after it. Cycles
through the full ADS_300X250 pool by index so every banner gets
impressions across long threads.
Newsletter:
- /newsletter/archive: drop SidebarAdStack into the existing
right rail above the signup CTA + topic browser.
LanguageSwitcher autodetect (US default for US users was failing):
1. Timezone override: if the user is in America/*, Pacific/Honolulu,
Pacific/Auckland|Wellington, Australia/*, Europe/London|Dublin,
or Atlantic/Reykjavik — always return 'en'. Fixes US-based
users whose OS locale happened to be set to a non-English value.
2. Otherwise walk navigator.languages (the full preference list,
not just navigator.language[0]) and pick the first base code we
support (en/es/pt/fr/de/zh/ja/ar/hi).
3. Fallback to 'en'.
All non-en selections still route through Google Translate's hosted
proxy on the .translate.goog subdomain — search engines and US
visitors continue to only ever see English on broadcastbeat.com.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
These four landing pages already had the site-wide header leaderboard
via <Header />, but no additional in-content banner. Add one 728x90
slot at the bottom of the main column on each, gated on
ADS_728X90.length > 0 and hidden on mobile to match the header
banner's display rules.
- /gear — category landing
- /technology — category landing
- /forum — community landing
- /authors/[slug] — author profile
Brings these pages in line with /show-coverage and /about/* which got
the same treatment earlier.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Updates the forum's <head> SEO/social metadata to match the visible header.
Old "Community Forum" / "broadcast engineering professionals" copy was
leaking into Google + LinkedIn / Twitter Card previews after yesterday's
visible-text rebrand.
- metadata.title, openGraph.title, twitter.title: Community → Industry Forum
- All four description strings broadened to "broadcast, motion picture and
post production professionals worldwide"
- Schema.org WebPage name + description aligned
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- "Community Forum" → "Industry Forum"
- "Connect with broadcast engineering professionals" → "Connect with broadcast, motion picture and post production professionals worldwide"
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace the four accent-family hex codes site-wide with the teal palette
(keeps the dark theme; only swaps the accent family, not the dark base):
#3b82f6 (accent primary CTA) → #5B7C8D (teal) [839×]
#2563eb (accent-dark / hover) → #4A6473 (darker teal) [44×]
#60a5fa (info link, lighter) → #8FB0C3 (mid teal) [68×]
#1e3a5f (accent-muted bg) → #2F4F5F (navy) [44×]
tailwind.config.js tokens updated to match (accent/accent-dark/accent-muted).
Sweep also covers tailwind.css. 108 files touched. The dark base (#0d0d0d,
#111, #161616, #1a1a1a etc.) is intentionally untouched.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>