diff --git a/Dockerfile b/Dockerfile index 43615b2..50a9927 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,11 +14,7 @@ ENV NEXT_PUBLIC_SITE_URL=$NEXT_PUBLIC_SITE_URL ENV NEXT_PUBLIC_GA_MEASUREMENT_ID=$NEXT_PUBLIC_GA_MEASUREMENT_ID COPY package*.json ./ -# Force dev-deps even if NODE_ENV=production was supplied as a Coolify -# build arg — autoprefixer/postcss/tailwindcss live in devDependencies and -# Next.js needs them at build time. Same fix that landed for RMP cold-build -# on 2026-05-30. -RUN npm install --include=dev +RUN npm install COPY . . RUN npm run build ENV NODE_ENV=production diff --git a/PENDING_ads.md b/PENDING_ads.md index 3381977..74aa7cf 100644 --- a/PENDING_ads.md +++ b/PENDING_ads.md @@ -1,4 +1,4 @@ -# Pending — broadcastbeat.com tonight's deferred work +# Pending — avbeat.com tonight's deferred work ## Featured-image backfill (P0-1, deferred) @@ -12,7 +12,7 @@ in Supabase storage) is **NOT done**. The smoke-test attempt `/tmp/bb-image-backfill.py` ran on coolify01: - Matrox+Amagi smoke article (`matrox-video-and-amagi-collaborate-...`): - Wayback returned no archived snapshot of `https://www.broadcastbeat.com//`, + Wayback returned no archived snapshot of `https://www.avbeat.com//`, so the og:image extraction path didn't apply. Many of the broken-image articles are recent NAB 2026 posts that have never been crawled by Wayback. @@ -22,7 +22,7 @@ in Supabase storage) is **NOT done**. The smoke-test attempt **What needs to happen next session:** 1. For each broken article, try multiple sources in order: - - Wayback Machine snapshot of `broadcastbeat.com//` (skip if 404). + - Wayback Machine snapshot of `avbeat.com//` (skip if 404). - Manufacturer press-kit page based on title keywords (Matrox, Amagi, Telestream, Calrec, AJA, etc. — keep a per-vendor mapping of press kit URLs). diff --git a/image-hosts.config.js b/image-hosts.config.js index 54b96ca..d999664 100644 --- a/image-hosts.config.js +++ b/image-hosts.config.js @@ -29,6 +29,6 @@ export const imageHosts = [ }, { protocol: 'https', - hostname: 'www.broadcastbeat.com', + hostname: 'www.avbeat.com', }, ]; diff --git a/next.config.mjs b/next.config.mjs index 5520f9f..ec42522 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -70,7 +70,7 @@ const nextConfig = { destination: 'https://relevantmediaproperties.com/broadcast-beat---media-kit', permanent: true, }, - // WordPress admin redirects for broadcastbeat.com (301 permanent) + // WordPress admin redirects for avbeat.com (301 permanent) { source: '/wp-admin', destination: '/admin', diff --git a/public/assets/images/logo.png b/public/assets/images/logo.png index 5058d45..c83e18b 100644 Binary files a/public/assets/images/logo.png and b/public/assets/images/logo.png differ diff --git a/public/assets/images/personas/ryan-salazar.jpg b/public/assets/images/personas/ryan-salazar.jpg new file mode 100644 index 0000000..c0f4331 Binary files /dev/null and b/public/assets/images/personas/ryan-salazar.jpg differ diff --git a/public/assets/logos/av.svg b/public/assets/logos/av.svg new file mode 100644 index 0000000..85cc5b3 --- /dev/null +++ b/public/assets/logos/av.svg @@ -0,0 +1,13 @@ + + + + + + + + + + AVB + AV Beat + + diff --git a/public/assets/logos/avbeat.png b/public/assets/logos/avbeat.png deleted file mode 100644 index 5058d45..0000000 Binary files a/public/assets/logos/avbeat.png and /dev/null differ diff --git a/public/brand/logo-sm.png b/public/brand/logo-sm.png index 5058d45..cf98b3b 100644 Binary files a/public/brand/logo-sm.png and b/public/brand/logo-sm.png differ diff --git a/public/brand/logo.png b/public/brand/logo.png index 5058d45..30e4de8 100644 Binary files a/public/brand/logo.png and b/public/brand/logo.png differ diff --git a/public/brand/logo@2x.png b/public/brand/logo@2x.png index 5058d45..7f9964e 100644 Binary files a/public/brand/logo@2x.png and b/public/brand/logo@2x.png differ diff --git a/src/app/about/contact/page.tsx b/src/app/about/contact/page.tsx index 92f7a6b..5172e90 100644 --- a/src/app/about/contact/page.tsx +++ b/src/app/about/contact/page.tsx @@ -52,8 +52,8 @@ export default function ContactPage() {
-
- AV Beat · Where AV Meets IT +
+ AV Beat

Contact

diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx index 863e38f..8614ee7 100644 --- a/src/app/about/page.tsx +++ b/src/app/about/page.tsx @@ -4,7 +4,7 @@ import SidebarAdStack from "@/components/SidebarAdStack"; export const metadata = { title: "About AV Beat", - description: "AV Beat is an independent industry publication covering the convergence of pro AV and IT — broadcast, live production, streaming, and post-production technology.", + description: "AV Beat is an independent industry publication covering broadcast, production, and post-production technology.", }; export default function AboutPage() { @@ -15,12 +15,12 @@ export default function AboutPage() {

-
- AV Beat · Where AV Meets IT +
+ AV Beat

About

- An independent trade publication covering the convergence of pro AV and IT — broadcast, live production, streaming, and post-production technology. + An independent trade publication covering broadcast, live production, streaming, and post-production technology.

@@ -32,11 +32,11 @@ export default function AboutPage() {
- AV Beat reports on the equipment, services, and people that - move the professional AV and IT-converged video industry - forward. We follow product launches, executive moves, - acquisitions, and the live production / IP / cloud workflows - reshaping how content gets made and delivered. + AV Beat reports on the equipment, services, and people + that move the professional video industry forward. We follow + product launches, executive moves, acquisitions, and the live + production / IP / cloud workflows reshaping how content gets + made and delivered. @@ -57,9 +57,9 @@ export default function AboutPage() { - For editorial pitches: editor@avbeat.com. - {" "}For advertising: see the media kit. - {" "}For our team: meet the editorial team. + For editorial pitches: editor@avbeat.com. + {" "}For advertising: see the media kit. + {" "}For our team: meet the editorial team.
diff --git a/src/app/about/press-kit/page.tsx b/src/app/about/press-kit/page.tsx index ef2dcc3..ba385d7 100644 --- a/src/app/about/press-kit/page.tsx +++ b/src/app/about/press-kit/page.tsx @@ -13,23 +13,23 @@ export default function PressKitPage() {

Logos

Boilerplate

- AV Beat is an independent trade publication covering the convergence - of pro AV and IT — broadcast, live production, streaming, and - post-production technology. Founded to bring engineering-rigor - reporting to industry coverage, AV Beat publishes daily on the - equipment, services, and people moving professional video forward. + AV Beat is an independent trade publication covering broadcast, + live production, streaming, and post-production technology. Founded + to bring engineering-rigor reporting to industry coverage, AV Beat + publishes daily on the equipment, services, and people that move + professional video forward.

Media contact

- ryan.salazar@relevantmediaproperties.com + ryan.salazar@relevantmediaproperties.com

diff --git a/src/app/about/team/page.tsx b/src/app/about/team/page.tsx index adb6932..9a51154 100644 --- a/src/app/about/team/page.tsx +++ b/src/app/about/team/page.tsx @@ -9,7 +9,7 @@ export const revalidate = 600; export const metadata = { title: "Our team — AV Beat", - description: "Meet the AV Beat team — editorial staff plus accounts and support, covering the convergence of pro AV and IT.", + description: "Meet the AV Beat team — editorial staff plus accounts and support, covering broadcast, streaming, and post-production.", }; interface Persona { @@ -63,7 +63,7 @@ export default async function TeamPage() { .from("personas") .select("id, display_name, role, email, phone, extension, avatar_url") .eq("active", true) - .in("id", ["chloe", "jeff", "riley"]); + .in("id", ["chloe", "jeff", "riley", "brian", "avery"]); const ops = (opsData || []) as OpsPersona[]; const displayBeat = (p: Persona) => @@ -98,10 +98,10 @@ export default async function TeamPage() {
{/* Hero */}
-
+
-
- +
+ AV Beat · editorial

@@ -129,10 +129,10 @@ export default async function TeamPage() { return (
  • {/* Top accent */} -
    +
    {p.avatar_url ? ( @@ -142,7 +142,7 @@ export default async function TeamPage() { alt={p.name} width={96} height={96} - className="w-24 h-24 rounded-full border-2 border-[#1a1f2a] group-hover:border-[#E67E22]/40 transition-colors object-cover" + className="w-24 h-24 rounded-full border-2 border-[#1a1f2a] group-hover:border-[#d60701]/40 transition-colors object-cover" /> ) : ( @@ -155,7 +155,7 @@ export default async function TeamPage() {

    {p.name}

    {(p.beat || p.slug === "ryan-salazar") && ( -
    +
    {displayBeat(p)}
    )} @@ -173,11 +173,11 @@ export default async function TeamPage() { View → @@ -209,7 +209,7 @@ export default async function TeamPage() { {ops.map((p) => (
  • {p.avatar_url ? ( - +
  • ); })()} {p.phone && ( diff --git a/src/app/admin/accounting/orders/page.tsx b/src/app/admin/accounting/orders/page.tsx index f79e542..d5d87ad 100644 --- a/src/app/admin/accounting/orders/page.tsx +++ b/src/app/admin/accounting/orders/page.tsx @@ -4,7 +4,7 @@ import Link from 'next/link'; import { useAuth } from '@/contexts/AuthContext'; import { useRouter, useSearchParams } from 'next/navigation'; -const SITES = ['broadcastbeat','avbeat','backlotbeat','broadcastengineering']; +const SITES = ['avbeat','avbeat','backlotbeat','broadcastengineering']; const STATUSES = ['active','completed','cancelled']; const SCHEDULES = ['single','monthly','quarterly']; diff --git a/src/app/admin/accounting/reports/page.tsx b/src/app/admin/accounting/reports/page.tsx index 2d12c99..a7b5ca3 100644 --- a/src/app/admin/accounting/reports/page.tsx +++ b/src/app/admin/accounting/reports/page.tsx @@ -6,7 +6,7 @@ import { useRouter } from 'next/navigation'; function fmt(cents: number) { return '$' + (cents / 100).toLocaleString('en-US', { minimumFractionDigits: 2 }); } -const SITES = ['broadcastbeat','avbeat','backlotbeat','broadcastengineering']; +const SITES = ['avbeat','avbeat','backlotbeat','broadcastengineering']; export default function ReportsPage() { const { user, loading } = useAuth(); diff --git a/src/app/admin/adops/ios/page.tsx b/src/app/admin/adops/ios/page.tsx index 69ae287..d9030d6 100644 --- a/src/app/admin/adops/ios/page.tsx +++ b/src/app/admin/adops/ios/page.tsx @@ -98,7 +98,7 @@ export default function AdOpsIOsPage() {
    diff --git a/src/app/admin/adops/page.tsx b/src/app/admin/adops/page.tsx index c9ff599..20a16ff 100644 --- a/src/app/admin/adops/page.tsx +++ b/src/app/admin/adops/page.tsx @@ -75,7 +75,7 @@ export default function AdOpsDashboardPage() {
    setForm(f => ({ ...f, site_scope: e.target.value as any }))} className="w-full bg-[#0a0a0a] border border-[#333] rounded-lg px-3 py-2.5 text-white text-sm font-body focus:outline-none focus:border-[#3b82f6]"> - +
    @@ -291,7 +291,7 @@ export default function BannedTermsPage() { @@ -336,7 +336,7 @@ export default function BannedTermsPage() { - {term.site_scope === 'both' ? 'Both Sites' : term.site_scope === 'broadcastbeat' ? 'Broadcast Beat' : 'AV Beat'} + {term.site_scope === 'both' ? 'Both Sites' : term.site_scope === 'avbeat' ? 'AV Beat' : 'AV Beat'} @@ -379,7 +379,7 @@ export default function BannedTermsPage() {
    Hard Ban
    -

    Submission is blocked. Post saved as draft automatically. Contributor sees only: "This post could not be submitted. Please contact the editorial team at editor@broadcastbeat.com for assistance." Admin receives email notification.

    +

    Submission is blocked. Post saved as draft automatically. Contributor sees only: "This post could not be submitted. Please contact the editorial team at editor@avbeat.com for assistance." Admin receives email notification.

    diff --git a/src/app/admin/company-tracker/page.tsx b/src/app/admin/company-tracker/page.tsx index de2542b..c64f5a2 100644 --- a/src/app/admin/company-tracker/page.tsx +++ b/src/app/admin/company-tracker/page.tsx @@ -68,7 +68,7 @@ type TabType = 'queue' | 'companies' | 'crawl-log' | 'settings'; type QueueStatus = 'generated' | 'pending' | 'approved' | 'published' | 'rejected'; const SITE_CONFIG = { - 1: { name: 'Broadcast Beat', badge: 'BB', bgClass: 'bg-[#0ea5e9]/10', textClass: 'text-[#0ea5e9]' }, + 1: { name: 'AV Beat', badge: 'BB', bgClass: 'bg-[#0ea5e9]/10', textClass: 'text-[#0ea5e9]' }, 2: { name: 'AV Beat', badge: 'AV', bgClass: 'bg-[#f97316]/10', textClass: 'text-[#f97316]' }, }; @@ -275,7 +275,7 @@ export default function CompanyTrackerPage() { Company Tracker

    Company Story Engine

    -

    Automated story generation from company mentions across Broadcast Beat & AV Beat

    +

    Automated story generation from company mentions across AV Beat & AV Beat

    {/* Auto-Pilot toggle */} @@ -344,7 +344,7 @@ export default function CompanyTrackerPage() {
    @@ -412,7 +412,7 @@ export default function CompanyTrackerPage() { @@ -455,7 +455,7 @@ export default function CompanyTrackerPage() { @@ -494,7 +494,7 @@ export default function CompanyTrackerPage() { {company.company_name} {company.company_website ? {company.company_website} : '—'} {company.mention_count} - {company.site_scope === 'both' ? 'Both' : company.site_scope === 'broadcastbeat' ? 'BB' : 'AV'} + {company.site_scope === 'both' ? 'Both' : company.site_scope === 'avbeat' ? 'BB' : 'AV'}