Replace 'BroadcastBeat' with 'Broadcast Beat' in all user-visible text (133 occurrences across 40+ files)
This commit is contained in:
@@ -1,11 +1,11 @@
|
||||
export const metadata = { title: "Advertise — BroadcastBeat" };
|
||||
export const metadata = { title: "Advertise — Broadcast Beat" };
|
||||
|
||||
export default function AdvertisePage() {
|
||||
return (
|
||||
<main className="mx-auto max-w-3xl px-6 py-12 text-[#e5e7eb]">
|
||||
<h1 className="font-serif text-4xl font-bold tracking-tight mb-2">Advertise on BroadcastBeat</h1>
|
||||
<h1 className="font-serif text-4xl font-bold tracking-tight mb-2">Advertise on Broadcast Beat</h1>
|
||||
<p className="text-sm text-[#9ca3af] mb-10">
|
||||
BroadcastBeat reaches broadcast engineers, post supervisors, streaming
|
||||
Broadcast Beat reaches broadcast engineers, post supervisors, streaming
|
||||
architects, and live-event professionals across the industry.
|
||||
</p>
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
export const metadata = { title: "Contact — BroadcastBeat" };
|
||||
export const metadata = { title: "Contact — Broadcast Beat" };
|
||||
|
||||
export default function ContactPage() {
|
||||
return (
|
||||
|
||||
@@ -2,8 +2,8 @@ import Header from "@/components/Header";
|
||||
import Footer from "@/components/Footer";
|
||||
|
||||
export const metadata = {
|
||||
title: "About BroadcastBeat",
|
||||
description: "BroadcastBeat is an independent industry publication covering broadcast, production, and post-production technology.",
|
||||
title: "About Broadcast Beat",
|
||||
description: "Broadcast Beat is an independent industry publication covering broadcast, production, and post-production technology.",
|
||||
};
|
||||
|
||||
export default function AboutPage() {
|
||||
@@ -11,10 +11,10 @@ export default function AboutPage() {
|
||||
<div className="min-h-screen bg-background">
|
||||
<Header />
|
||||
<main className="mx-auto max-w-3xl px-6 py-12 text-[#e5e7eb]">
|
||||
<h1 className="font-serif text-4xl font-bold tracking-tight mb-6">About BroadcastBeat</h1>
|
||||
<h1 className="font-serif text-4xl font-bold tracking-tight mb-6">About Broadcast Beat</h1>
|
||||
<div className="space-y-5 text-[#d1d5db] text-[15px] leading-relaxed">
|
||||
<p>
|
||||
BroadcastBeat is an independent trade publication covering broadcast,
|
||||
Broadcast Beat is an independent trade publication covering broadcast,
|
||||
live production, streaming, and post-production technology. We
|
||||
report on the equipment, services, and people that move the
|
||||
professional video industry forward.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import Header from "@/components/Header";
|
||||
import Footer from "@/components/Footer";
|
||||
|
||||
export const metadata = { title: "Press kit — BroadcastBeat" };
|
||||
export const metadata = { title: "Press kit — Broadcast Beat" };
|
||||
|
||||
export default function PressKitPage() {
|
||||
return (
|
||||
@@ -13,15 +13,15 @@ export default function PressKitPage() {
|
||||
<section>
|
||||
<h2 className="font-mono text-xs uppercase tracking-wider text-[#6b7280] mb-2">Logos</h2>
|
||||
<ul className="space-y-1">
|
||||
<li><a className="text-[var(--color-text-info,#60a5fa)] hover:underline" href="/assets/images/logo.png" download>BroadcastBeat logo (PNG)</a></li>
|
||||
<li><a className="text-[var(--color-text-info,#60a5fa)] hover:underline" href="/assets/images/logo.png" download>Broadcast Beat logo (PNG)</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
<section>
|
||||
<h2 className="font-mono text-xs uppercase tracking-wider text-[#6b7280] mb-2">Boilerplate</h2>
|
||||
<p className="text-[#d1d5db] leading-relaxed">
|
||||
BroadcastBeat is an independent trade publication covering broadcast,
|
||||
Broadcast Beat is an independent trade publication covering broadcast,
|
||||
live production, streaming, and post-production technology. Founded
|
||||
to bring engineering-rigor reporting to industry coverage, BroadcastBeat
|
||||
to bring engineering-rigor reporting to industry coverage, Broadcast Beat
|
||||
publishes daily on the equipment, services, and people that move
|
||||
professional video forward.
|
||||
</p>
|
||||
|
||||
@@ -6,8 +6,8 @@ export const dynamic = "force-dynamic";
|
||||
export const revalidate = 600;
|
||||
|
||||
export const metadata = {
|
||||
title: "Editorial team — BroadcastBeat",
|
||||
description: "Meet the BroadcastBeat editorial team — staff journalists covering broadcast, streaming, and post-production beats.",
|
||||
title: "Editorial team — Broadcast Beat",
|
||||
description: "Meet the Broadcast Beat editorial team — staff journalists covering broadcast, streaming, and post-production beats.",
|
||||
};
|
||||
|
||||
interface Persona {
|
||||
|
||||
@@ -632,7 +632,7 @@ export default function CampaignEditorPage() {
|
||||
</div>
|
||||
<div className="flex-1 min-w-0">
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="text-xs font-medium text-white">BroadcastBeat</span>
|
||||
<span className="text-xs font-medium text-white">Broadcast Beat</span>
|
||||
<span className="text-[10px] text-[#444]">now</span>
|
||||
</div>
|
||||
<p className="text-xs text-[#888] truncate">{campaign.subject || 'Your subject line…'}</p>
|
||||
@@ -645,7 +645,7 @@ export default function CampaignEditorPage() {
|
||||
<div className="p-4 space-y-3 max-h-[400px] overflow-y-auto">
|
||||
{/* Header */}
|
||||
<div className="bg-[#0a0a0a] rounded-lg p-3 text-center border border-[#1a1a1a]">
|
||||
<p className="text-xs font-bold text-white tracking-widest uppercase">BroadcastBeat</p>
|
||||
<p className="text-xs font-bold text-white tracking-widest uppercase">Broadcast Beat</p>
|
||||
{campaign.previewText && (
|
||||
<p className="text-[10px] text-[#555] mt-1">{campaign.previewText}</p>
|
||||
)}
|
||||
@@ -680,7 +680,7 @@ export default function CampaignEditorPage() {
|
||||
|
||||
{/* Footer */}
|
||||
<div className="text-center pt-2 border-t border-[#1a1a1a]">
|
||||
<p className="text-[9px] text-[#333]">BroadcastBeat · Unsubscribe · View in browser</p>
|
||||
<p className="text-[9px] text-[#333]">Broadcast Beat · Unsubscribe · View in browser</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -689,7 +689,7 @@ export default function AdminNewsletterPage() {
|
||||
type="text"
|
||||
value={digestSubject}
|
||||
onChange={(e) => setDigestSubject(e.target.value)}
|
||||
placeholder="e.g. BroadcastBeat Weekly — NAB Show Highlights"
|
||||
placeholder="e.g. Broadcast Beat Weekly — NAB Show Highlights"
|
||||
className="search-input w-full py-2.5 px-3 text-sm"
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -435,7 +435,7 @@ export default function NewsletterTemplatesPage() {
|
||||
type="text"
|
||||
value={form.subject_prefix}
|
||||
onChange={(e) => setForm((f) => ({ ...f, subject_prefix: e.target.value }))}
|
||||
placeholder="e.g. BroadcastBeat Weekly —"
|
||||
placeholder="e.g. Broadcast Beat Weekly —"
|
||||
className="search-input w-full py-2.5 px-3 text-sm"
|
||||
/>
|
||||
<p className="text-xs text-[#555] font-body mt-1">Prepended to the digest subject line when using this template</p>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import type { Metadata } from 'next';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: 'Advertise With BroadcastBeat — Reach Broadcast Engineering Professionals',
|
||||
description: 'Advertise with BroadcastBeat to reach broadcast engineers, production professionals, and media technology decision-makers. Display ads, sponsored content, and newsletter placements.',
|
||||
title: 'Advertise With Broadcast Beat — Reach Broadcast Engineering Professionals',
|
||||
description: 'Advertise with Broadcast Beat to reach broadcast engineers, production professionals, and media technology decision-makers. Display ads, sponsored content, and newsletter placements.',
|
||||
alternates: { canonical: '/advertise' },
|
||||
openGraph: {
|
||||
title: 'Advertise With BroadcastBeat',
|
||||
title: 'Advertise With Broadcast Beat',
|
||||
description: 'Reach broadcast engineers, production professionals, and media technology decision-makers.',
|
||||
url: '/advertise',
|
||||
type: 'website',
|
||||
|
||||
@@ -49,7 +49,7 @@ export default function AdvertisePage() {
|
||||
<span className="section-label mb-3 inline-block">Advertise</span>
|
||||
<h1 className="font-heading text-white text-4xl font-bold mb-4">Reach Broadcast Engineering Professionals</h1>
|
||||
<p className="text-[#aaa] font-body text-lg max-w-2xl mx-auto mb-6">
|
||||
BroadcastBeat is the leading digital platform for broadcast engineering professionals. Connect your brand with decision-makers, engineers, and executives across the broadcast industry.
|
||||
Broadcast Beat is the leading digital platform for broadcast engineering professionals. Connect your brand with decision-makers, engineers, and executives across the broadcast industry.
|
||||
</p>
|
||||
<a
|
||||
href="#contact"
|
||||
@@ -131,7 +131,7 @@ export default function AdvertisePage() {
|
||||
</div>
|
||||
<div className="border-t border-[#222] pt-4">
|
||||
<p className="font-body text-[#3b82f6] text-xs font-bold uppercase tracking-wider mb-1">Publication</p>
|
||||
<p className="font-body text-[#777] text-sm">BroadcastBeat</p>
|
||||
<p className="font-body text-[#777] text-sm">Broadcast Beat</p>
|
||||
<p className="font-body text-[#777] text-sm">Relevant Media Properties</p>
|
||||
</div>
|
||||
<div className="border-t border-[#222] pt-4">
|
||||
|
||||
@@ -13,9 +13,9 @@ export async function POST(request: NextRequest) {
|
||||
});
|
||||
|
||||
await transport.sendMail({
|
||||
from: `"${process.env.SMTP_FROM_NAME || 'BroadcastBeat'}" <${process.env.SMTP_FROM_EMAIL}>`,
|
||||
from: `"${process.env.SMTP_FROM_NAME || 'Broadcast Beat'}" <${process.env.SMTP_FROM_EMAIL}>`,
|
||||
to: 'editor@broadcastbeat.com',
|
||||
subject: `[BroadcastBeat] Blocked post attempt — banned term triggered`,
|
||||
subject: `[Broadcast Beat] Blocked post attempt — banned term triggered`,
|
||||
html: `
|
||||
<div style="font-family:Arial,sans-serif;max-width:600px;background:#0a0a0a;color:#e5e5e5;padding:32px;border-radius:8px;">
|
||||
<h2 style="color:#ef4444;margin:0 0 16px;">Blocked Post Attempt</h2>
|
||||
|
||||
@@ -13,7 +13,7 @@ export async function POST(request: NextRequest) {
|
||||
const companyList = (companies || []).slice(0, 10).map((c: string) => `<li>${c}</li>`).join('');
|
||||
const moreText = companies?.length > 10 ? `<p style="color:#888;font-size:13px;">...and ${companies.length - 10} more</p>` : '';
|
||||
await transport.sendMail({
|
||||
from: `"${process.env.SMTP_FROM_NAME || 'BroadcastBeat'}" <${process.env.SMTP_FROM_EMAIL}>`,
|
||||
from: `"${process.env.SMTP_FROM_NAME || 'Broadcast Beat'}" <${process.env.SMTP_FROM_EMAIL}>`,
|
||||
to: email || 'ryan.salazar@relevantmediaproperties.com',
|
||||
subject: `[Relevant Media Properties] ${count} new company story suggestion${count !== 1 ? 's' : ''} queued`,
|
||||
html: `
|
||||
|
||||
@@ -35,8 +35,8 @@ async function sendSuspensionEmail(
|
||||
: '';
|
||||
|
||||
const subject = isBanned
|
||||
? `Your BroadcastBeat account has been banned`
|
||||
: `Your BroadcastBeat account has been suspended`;
|
||||
? `Your Broadcast Beat account has been banned`
|
||||
: `Your Broadcast Beat account has been suspended`;
|
||||
|
||||
const html = `
|
||||
<!DOCTYPE html>
|
||||
@@ -45,7 +45,7 @@ async function sendSuspensionEmail(
|
||||
<body style="background:#0d1117;color:#e5e7eb;font-family:system-ui,sans-serif;margin:0;padding:0;">
|
||||
<div style="max-width:560px;margin:40px auto;padding:32px;background:#111827;border:1px solid #1f2937;border-radius:12px;">
|
||||
<div style="margin-bottom:24px;">
|
||||
<span style="font-size:24px;font-weight:800;color:#fff;">BroadcastBeat</span>
|
||||
<span style="font-size:24px;font-weight:800;color:#fff;">Broadcast Beat</span>
|
||||
</div>
|
||||
<div style="background:${isBanned ? '#7f1d1d' : '#78350f'};border:1px solid ${isBanned ? '#991b1b' : '#92400e'};border-radius:8px;padding:16px;margin-bottom:24px;">
|
||||
<p style="margin:0;font-size:14px;font-weight:700;color:${isBanned ? '#fca5a5' : '#fcd34d'};">
|
||||
@@ -54,7 +54,7 @@ async function sendSuspensionEmail(
|
||||
</div>
|
||||
<p style="color:#d1d5db;font-size:15px;line-height:1.6;">Hi ${fullName || 'there'},</p>
|
||||
<p style="color:#d1d5db;font-size:15px;line-height:1.6;">
|
||||
Your BroadcastBeat account has been <strong style="color:#fff;">${isBanned ? 'permanently banned' : `suspended ${durationText}`}</strong>.
|
||||
Your Broadcast Beat account has been <strong style="color:#fff;">${isBanned ? 'permanently banned' : `suspended ${durationText}`}</strong>.
|
||||
</p>
|
||||
<div style="background:#0d1117;border:1px solid #1f2937;border-radius:8px;padding:16px;margin:20px 0;">
|
||||
<p style="margin:0 0 8px;color:#888;font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;">Reason</p>
|
||||
@@ -65,7 +65,7 @@ async function sendSuspensionEmail(
|
||||
${isBanned ? 'This decision is final. If you believe this is an error, please contact our support team.' : 'During this period, you will not be able to post threads or replies. If you believe this is an error, please contact our support team.'}
|
||||
</p>
|
||||
<div style="margin-top:24px;padding-top:24px;border-top:1px solid #1f2937;">
|
||||
<p style="margin:0;color:#555;font-size:12px;">BroadcastBeat — ${siteUrl}</p>
|
||||
<p style="margin:0;color:#555;font-size:12px;">Broadcast Beat — ${siteUrl}</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
@@ -73,7 +73,7 @@ async function sendSuspensionEmail(
|
||||
`;
|
||||
|
||||
await transporter.sendMail({
|
||||
from: `"${process.env.SMTP_FROM_NAME || 'BroadcastBeat'}" <${process.env.SMTP_FROM_EMAIL}>`,
|
||||
from: `"${process.env.SMTP_FROM_NAME || 'Broadcast Beat'}" <${process.env.SMTP_FROM_EMAIL}>`,
|
||||
to: email,
|
||||
subject,
|
||||
html,
|
||||
|
||||
@@ -118,7 +118,7 @@ export async function POST(req: NextRequest) {
|
||||
},
|
||||
body: JSON.stringify({
|
||||
email,
|
||||
inviterName: inviterProfile?.full_name || inviterProfile?.email || 'BroadcastBeat Admin',
|
||||
inviterName: inviterProfile?.full_name || inviterProfile?.email || 'Broadcast Beat Admin',
|
||||
role: role || 'contributor',
|
||||
token,
|
||||
message,
|
||||
|
||||
@@ -22,7 +22,7 @@ export async function POST(request: NextRequest) {
|
||||
date: a.date,
|
||||
}));
|
||||
|
||||
const systemPrompt = `You are a personalized content recommendation engine for BroadcastBeat, a broadcast engineering news platform.
|
||||
const systemPrompt = `You are a personalized content recommendation engine for Broadcast Beat, a broadcast engineering news platform.
|
||||
Given a reader's topic interests and reading history, select the 4 most relevant articles from the provided article list.
|
||||
Return ONLY a valid JSON array of slugs in order of relevance. Example: ["slug-1","slug-2","slug-3","slug-4"]
|
||||
Do not include any explanation or markdown — only the raw JSON array.`;
|
||||
|
||||
@@ -38,7 +38,7 @@ export async function POST(request: NextRequest) {
|
||||
try {
|
||||
response = await fetch(url, {
|
||||
headers: {
|
||||
'User-Agent': 'Mozilla/5.0 (compatible; BroadcastBeat/1.0; +https://broadcastbeat.com)',
|
||||
'User-Agent': 'Mozilla/5.0 (compatible; Broadcast Beat/1.0; +https://broadcastbeat.com)',
|
||||
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
||||
},
|
||||
signal: controller.signal,
|
||||
|
||||
@@ -23,11 +23,11 @@ function rateLimit(key: string): { ok: boolean; remaining: number } {
|
||||
return { ok: true, remaining: RATE_LIMIT_MAX - b.count };
|
||||
}
|
||||
|
||||
const SYSTEM_PROMPT = `You are BB AI, BroadcastBeat's intelligent research assistant.
|
||||
const SYSTEM_PROMPT = `You are BB AI, Broadcast Beat's intelligent research assistant.
|
||||
|
||||
You help readers — broadcast engineers, post-production supervisors,
|
||||
streaming architects, and broadcast executives — find information from the
|
||||
BroadcastBeat archive.
|
||||
Broadcast Beat archive.
|
||||
|
||||
Tone: trade-press, factual, lightly conversational. Plain English.
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ export async function POST(req: NextRequest) {
|
||||
[
|
||||
{
|
||||
role: 'system',
|
||||
content: `You are the BroadcastBeat AI Assistant — a knowledgeable, helpful assistant for broadcast engineering professionals. You have deep expertise in broadcast technology including live production, IP workflows, SMPTE ST 2110, audio engineering, cameras, streaming, post-production, MAM systems, and broadcast industry trends.
|
||||
content: `You are the Broadcast Beat AI Assistant — a knowledgeable, helpful assistant for broadcast engineering professionals. You have deep expertise in broadcast technology including live production, IP workflows, SMPTE ST 2110, audio engineering, cameras, streaming, post-production, MAM systems, and broadcast industry trends.
|
||||
|
||||
You are responding in a community forum. Be helpful, technically accurate, and conversational. Acknowledge when a question is complex or when professional consultation is advisable. Keep responses focused and practical — broadcast engineers value concise, actionable information.
|
||||
|
||||
@@ -51,7 +51,7 @@ Please provide a helpful, technically accurate response for this broadcast engin
|
||||
.insert({
|
||||
thread_id,
|
||||
body: aiResponseText,
|
||||
author_name: 'BroadcastBeat AI',
|
||||
author_name: 'Broadcast Beat AI',
|
||||
is_ai_response: true,
|
||||
})
|
||||
.select()
|
||||
|
||||
@@ -20,7 +20,7 @@ export async function POST(req: NextRequest) {
|
||||
});
|
||||
|
||||
await transporter.sendMail({
|
||||
from: `"${process.env.SMTP_FROM_NAME || 'BroadcastBeat'}" <${process.env.SMTP_FROM_EMAIL}>`,
|
||||
from: `"${process.env.SMTP_FROM_NAME || 'Broadcast Beat'}" <${process.env.SMTP_FROM_EMAIL}>`,
|
||||
to,
|
||||
subject,
|
||||
html,
|
||||
|
||||
@@ -35,7 +35,7 @@ export async function POST(req: NextRequest) {
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Article shared with you — BroadcastBeat</title>
|
||||
<title>Article shared with you — Broadcast Beat</title>
|
||||
</head>
|
||||
<body style="margin:0;padding:0;background:#0d0d0d;font-family:Arial,sans-serif;">
|
||||
<table width="100%" cellpadding="0" cellspacing="0" style="background:#0d0d0d;padding:32px 16px;">
|
||||
@@ -45,7 +45,7 @@ export async function POST(req: NextRequest) {
|
||||
<!-- Header -->
|
||||
<tr>
|
||||
<td style="background:#0a0a0a;border-bottom:1px solid #1a1a1a;padding:20px 28px;">
|
||||
<p style="margin:0;color:#3b82f6;font-size:11px;font-weight:700;letter-spacing:3px;text-transform:uppercase;">BroadcastBeat</p>
|
||||
<p style="margin:0;color:#3b82f6;font-size:11px;font-weight:700;letter-spacing:3px;text-transform:uppercase;">Broadcast Beat</p>
|
||||
</td>
|
||||
</tr>
|
||||
<!-- Body -->
|
||||
@@ -62,8 +62,8 @@ export async function POST(req: NextRequest) {
|
||||
<!-- Footer -->
|
||||
<tr>
|
||||
<td style="background:#0a0a0a;border-top:1px solid #1a1a1a;padding:16px 28px;">
|
||||
<p style="margin:0;color:#444;font-size:11px;">You received this because someone shared a BroadcastBeat article with you.</p>
|
||||
<p style="margin:6px 0 0;color:#333;font-size:11px;">© ${new Date().getFullYear()} BroadcastBeat. All rights reserved.</p>
|
||||
<p style="margin:0;color:#444;font-size:11px;">You received this because someone shared a Broadcast Beat article with you.</p>
|
||||
<p style="margin:6px 0 0;color:#333;font-size:11px;">© ${new Date().getFullYear()} Broadcast Beat. All rights reserved.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -74,7 +74,7 @@ export async function POST(req: NextRequest) {
|
||||
</html>`;
|
||||
|
||||
await transporter.sendMail({
|
||||
from: `"${process.env.SMTP_FROM_NAME || "BroadcastBeat"}" <${process.env.SMTP_FROM_EMAIL}>`,
|
||||
from: `"${process.env.SMTP_FROM_NAME || "Broadcast Beat"}" <${process.env.SMTP_FROM_EMAIL}>`,
|
||||
to,
|
||||
subject: `Shared article: ${articleTitle}`,
|
||||
html,
|
||||
|
||||
@@ -37,7 +37,7 @@ export async function POST(req: NextRequest) {
|
||||
const smtpUser = process.env.SMTP_USER;
|
||||
const smtpPass = process.env.SMTP_PASS;
|
||||
const fromEmail = process.env.SMTP_FROM_EMAIL || smtpUser;
|
||||
const fromName = process.env.SMTP_FROM_NAME || 'BroadcastBeat';
|
||||
const fromName = process.env.SMTP_FROM_NAME || 'Broadcast Beat';
|
||||
|
||||
if (smtpHost && smtpUser && smtpPass) {
|
||||
const transporter = nodemailer.createTransport({
|
||||
@@ -54,11 +54,11 @@ export async function POST(req: NextRequest) {
|
||||
await transporter.sendMail({
|
||||
from: `"${fromName}" <${fromEmail}>`,
|
||||
to: email,
|
||||
subject: `Welcome to BroadcastBeat — You're subscribed!`,
|
||||
subject: `Welcome to Broadcast Beat — You're subscribed!`,
|
||||
html: `
|
||||
<div style="background:#0d1520;padding:40px 20px;font-family:sans-serif;max-width:600px;margin:0 auto;">
|
||||
<h1 style="color:#3b82f6;font-size:24px;margin-bottom:8px;">You're in!</h1>
|
||||
<p style="color:#e0e0e0;font-size:16px;">Thanks for subscribing to <strong>BroadcastBeat</strong> — the digital platform for broadcast engineering.</p>
|
||||
<p style="color:#e0e0e0;font-size:16px;">Thanks for subscribing to <strong>Broadcast Beat</strong> — the digital platform for broadcast engineering.</p>
|
||||
${topicsList}
|
||||
<p style="color:#aaa;font-size:14px;margin-top:24px;">You'll be the first to know about the latest news, product launches, and industry insights.</p>
|
||||
<hr style="border:none;border-top:1px solid #1e3a5f;margin:32px 0;" />
|
||||
|
||||
@@ -95,7 +95,7 @@ export async function POST(req: NextRequest) {
|
||||
const smtpUser = process.env.SMTP_USER;
|
||||
const smtpPass = process.env.SMTP_PASS;
|
||||
const fromEmail = process.env.SMTP_FROM_EMAIL || smtpUser;
|
||||
const fromName = process.env.SMTP_FROM_NAME || 'BroadcastBeat';
|
||||
const fromName = process.env.SMTP_FROM_NAME || 'Broadcast Beat';
|
||||
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://broadcastbeat.com';
|
||||
|
||||
if (!smtpHost || !smtpUser || !smtpPass) {
|
||||
@@ -140,7 +140,7 @@ export async function POST(req: NextRequest) {
|
||||
<div style="background:#0d1520;padding:0;font-family:sans-serif;max-width:600px;margin:0 auto;">
|
||||
<!-- Header -->
|
||||
<div style="background:#111;border-bottom:2px solid #3b82f6;padding:24px 32px;">
|
||||
<h1 style="color:#3b82f6;font-size:22px;margin:0;font-weight:bold;">BroadcastBeat</h1>
|
||||
<h1 style="color:#3b82f6;font-size:22px;margin:0;font-weight:bold;">Broadcast Beat</h1>
|
||||
<p style="color:#555;font-size:12px;margin:4px 0 0;">News & Intelligence for Broadcast, Post-Production & Streaming Technology</p>
|
||||
</div>
|
||||
<!-- Body -->
|
||||
@@ -153,7 +153,7 @@ export async function POST(req: NextRequest) {
|
||||
<div style="background:#0a0f1a;padding:24px 32px;border-top:1px solid #1e3a5f;">
|
||||
<p style="color:#555;font-size:12px;margin:0;">You're receiving this because you subscribed at broadcastbeat.com.</p>
|
||||
<p style="color:#555;font-size:12px;margin:8px 0 0;">
|
||||
<a href="${siteUrl}" style="color:#3b82f6;">Visit BroadcastBeat</a> ·
|
||||
<a href="${siteUrl}" style="color:#3b82f6;">Visit Broadcast Beat</a> ·
|
||||
<a href="${siteUrl}/unsubscribe?email={{email}}" style="color:#3b82f6;">Unsubscribe</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -29,7 +29,7 @@ function stripHtml(html: string): string {
|
||||
async function fetchWPPosts(page: number): Promise<{ posts: WPPost[]; totalPages: number }> {
|
||||
const url = `${WP_BASE_URL}/posts?page=${page}&per_page=${PER_PAGE}&_embed=1&status=publish`;
|
||||
const res = await fetch(url, {
|
||||
headers: { 'User-Agent': 'BroadcastBeat-Importer/1.0' },
|
||||
headers: { 'User-Agent': 'Broadcast Beat-Importer/1.0' },
|
||||
next: { revalidate: 0 },
|
||||
});
|
||||
|
||||
@@ -54,7 +54,7 @@ async function downloadAndStoreImage(
|
||||
try {
|
||||
// Fetch the image
|
||||
const response = await fetch(imageUrl, {
|
||||
headers: { 'User-Agent': 'BroadcastBeat-Importer/1.0' },
|
||||
headers: { 'User-Agent': 'Broadcast Beat-Importer/1.0' },
|
||||
signal: AbortSignal.timeout(15000),
|
||||
});
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ export async function generateMetadata({ params }: PageProps): Promise<Metadata>
|
||||
title: article.title,
|
||||
description: article.excerpt,
|
||||
images: [article.image],
|
||||
creator: "@BroadcastBeat",
|
||||
creator: "@Broadcast Beat",
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -93,7 +93,7 @@ export default async function ArticlePage({ params }: PageProps) {
|
||||
author: { "@type": "Person", name: article.author },
|
||||
publisher: {
|
||||
"@type": "Organization",
|
||||
name: "BroadcastBeat",
|
||||
name: "Broadcast Beat",
|
||||
logo: { "@type": "ImageObject", url: `${SITE_URL}/assets/images/logo.png` },
|
||||
},
|
||||
datePublished: toIso(article.date),
|
||||
|
||||
@@ -39,10 +39,10 @@ const authors: Record<string, AuthorProfile> = {
|
||||
"staff-reporter": {
|
||||
slug: "staff-reporter",
|
||||
name: "Staff Reporter",
|
||||
title: "BroadcastBeat Editorial Team",
|
||||
title: "Broadcast Beat Editorial Team",
|
||||
avatar: "https://img.rocket.new/generatedImages/rocket_gen_img_1aa16f5c7-1766559876206.png",
|
||||
coverImage: "https://img.rocket.new/generatedImages/rocket_gen_img_1aa16f5c7-1766559876206.png",
|
||||
bio: "The BroadcastBeat editorial team covers breaking news and product announcements from across the broadcast technology industry. Our team of experienced journalists and industry insiders brings you the latest developments from NAB, IBC, and beyond.",
|
||||
bio: "The Broadcast Beat editorial team covers breaking news and product announcements from across the broadcast technology industry. Our team of experienced journalists and industry insiders brings you the latest developments from NAB, IBC, and beyond.",
|
||||
location: "Global",
|
||||
joinedDate: "January 2020",
|
||||
articleCount: 847,
|
||||
@@ -76,7 +76,7 @@ const authors: Record<string, AuthorProfile> = {
|
||||
title: "Audio Technology Editor",
|
||||
avatar: "https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=200&h=200&fit=crop&crop=face",
|
||||
coverImage: "https://images.unsplash.com/photo-1598488035139-bdbb2231ce04?w=1200&h=400&fit=crop",
|
||||
bio: "Sarah Chen is BroadcastBeat's audio technology editor, bringing deep expertise in professional audio systems, live sound, and broadcast audio workflows. With a background in audio engineering and a decade of industry journalism, Sarah provides authoritative coverage of the audio technology landscape.",
|
||||
bio: "Sarah Chen is Broadcast Beat's audio technology editor, bringing deep expertise in professional audio systems, live sound, and broadcast audio workflows. With a background in audio engineering and a decade of industry journalism, Sarah provides authoritative coverage of the audio technology landscape.",
|
||||
location: "Los Angeles, CA",
|
||||
joinedDate: "June 2019",
|
||||
articleCount: 198,
|
||||
@@ -93,7 +93,7 @@ const authors: Record<string, AuthorProfile> = {
|
||||
title: "Features Editor",
|
||||
avatar: "https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=200&h=200&fit=crop&crop=face",
|
||||
coverImage: "https://images.unsplash.com/photo-1551288049-bebda4e38f71?w=1200&h=400&fit=crop",
|
||||
bio: "Elena Vasquez is BroadcastBeat's features editor, specializing in long-form analysis of industry trends, emerging technologies, and the strategic challenges facing media organizations. Her work explores the intersection of technology, business, and creativity in the broadcast industry.",
|
||||
bio: "Elena Vasquez is Broadcast Beat's features editor, specializing in long-form analysis of industry trends, emerging technologies, and the strategic challenges facing media organizations. Her work explores the intersection of technology, business, and creativity in the broadcast industry.",
|
||||
location: "London, UK",
|
||||
joinedDate: "September 2017",
|
||||
articleCount: 156,
|
||||
@@ -110,7 +110,7 @@ const authors: Record<string, AuthorProfile> = {
|
||||
title: "Technology Analyst",
|
||||
avatar: "https://images.unsplash.com/photo-1487412720507-e7ab37603c6f?w=200&h=200&fit=crop&crop=face",
|
||||
coverImage: "https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=1200&h=400&fit=crop",
|
||||
bio: "Rachel Kim is a technology analyst at BroadcastBeat, focusing on data-driven coverage of storage technologies, media asset management, and cloud infrastructure. Her analytical approach brings quantitative rigor to technology coverage, helping readers understand the business implications of technical decisions.",
|
||||
bio: "Rachel Kim is a technology analyst at Broadcast Beat, focusing on data-driven coverage of storage technologies, media asset management, and cloud infrastructure. Her analytical approach brings quantitative rigor to technology coverage, helping readers understand the business implications of technical decisions.",
|
||||
location: "San Francisco, CA",
|
||||
joinedDate: "February 2021",
|
||||
articleCount: 89,
|
||||
@@ -127,7 +127,7 @@ const authors: Record<string, AuthorProfile> = {
|
||||
title: "Sports Broadcasting Correspondent",
|
||||
avatar: "https://img.rocket.new/generatedImages/rocket_gen_img_14648a787-1772373242232.png",
|
||||
coverImage: "https://img.rocket.new/generatedImages/rocket_gen_img_14648a787-1772373242232.png",
|
||||
bio: "Marcus Rivera covers sports broadcasting technology for BroadcastBeat, with a particular focus on live production, fan engagement, and the evolving landscape of sports media rights. He brings a unique perspective that combines technical knowledge with an understanding of the sports media business.",
|
||||
bio: "Marcus Rivera covers sports broadcasting technology for Broadcast Beat, with a particular focus on live production, fan engagement, and the evolving landscape of sports media rights. He brings a unique perspective that combines technical knowledge with an understanding of the sports media business.",
|
||||
location: "Miami, FL",
|
||||
joinedDate: "April 2020",
|
||||
articleCount: 134,
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
import type { Metadata } from 'next';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: 'Community Forum — BroadcastBeat',
|
||||
title: 'Community Forum — Broadcast Beat',
|
||||
description: 'Connect with broadcast engineering professionals. Discuss live production, IP workflows, streaming, audio, cameras, AI automation, and more.',
|
||||
alternates: { canonical: '/forum' },
|
||||
openGraph: {
|
||||
title: 'Community Forum — BroadcastBeat',
|
||||
title: 'Community Forum — Broadcast Beat',
|
||||
description: 'Connect with broadcast engineering professionals. Ask questions, share expertise, and discuss broadcast technology.',
|
||||
url: '/forum',
|
||||
type: 'website',
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary',
|
||||
title: 'Community Forum — BroadcastBeat',
|
||||
description: 'Connect with broadcast engineering professionals on BroadcastBeat.',
|
||||
title: 'Community Forum — Broadcast Beat',
|
||||
description: 'Connect with broadcast engineering professionals on Broadcast Beat.',
|
||||
},
|
||||
};
|
||||
|
||||
@@ -21,12 +21,12 @@ export default function ForumLayout({ children }: { children: React.ReactNode })
|
||||
const schema = {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'WebPage',
|
||||
name: 'BroadcastBeat Community Forum',
|
||||
name: 'Broadcast Beat Community Forum',
|
||||
description: 'Community forum for broadcast engineering professionals.',
|
||||
url: 'https://broadcastb5322.builtwithrocket.new/forum',
|
||||
isPartOf: {
|
||||
'@type': 'WebSite',
|
||||
name: 'BroadcastBeat',
|
||||
name: 'Broadcast Beat',
|
||||
url: 'https://broadcastb5322.builtwithrocket.new',
|
||||
},
|
||||
breadcrumb: {
|
||||
|
||||
@@ -563,7 +563,7 @@ export default function ForumIndexPage() {
|
||||
<ul className="text-[#aab4c4] font-body text-sm space-y-1">
|
||||
<li>• Be respectful and professional — this is a community of peers</li>
|
||||
<li>• Share real-world experience and cite sources when possible</li>
|
||||
<li>• The <span className="text-[#3b82f6]">BroadcastBeat AI</span> assistant is available in threads to help answer questions — it is clearly labeled</li>
|
||||
<li>• The <span className="text-[#3b82f6]">Broadcast Beat AI</span> assistant is available in threads to help answer questions — it is clearly labeled</li>
|
||||
<li>• No spam, self-promotion, or vendor pitches without disclosure</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -410,7 +410,7 @@ export default function ForumThreadPage() {
|
||||
<span className="text-[#3b82f6] text-xs font-bold">AI</span>
|
||||
</div>
|
||||
<div>
|
||||
<span className="text-white font-body font-semibold text-sm">BroadcastBeat AI Assistant</span>
|
||||
<span className="text-white font-body font-semibold text-sm">Broadcast Beat AI Assistant</span>
|
||||
<span className="ml-2 text-xs bg-[#3b82f6]/20 text-[#3b82f6] border border-[#3b82f6]/30 px-2 py-0.5 rounded font-body">AI — Not a human</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -9,11 +9,11 @@ import { getLegacyArticlesBySection } from "@/lib/articles/legacy-source";
|
||||
export const revalidate = 1800;
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Broadcast Gear & Reviews — BroadcastBeat",
|
||||
title: "Broadcast Gear & Reviews — Broadcast Beat",
|
||||
description: "In-depth reviews and coverage of broadcast cameras, audio gear, production equipment, and professional media technology.",
|
||||
alternates: { canonical: "/gear" },
|
||||
openGraph: {
|
||||
title: "Broadcast Gear & Reviews — BroadcastBeat",
|
||||
title: "Broadcast Gear & Reviews — Broadcast Beat",
|
||||
description: "In-depth reviews and coverage of broadcast cameras, audio gear, production equipment, and professional media technology.",
|
||||
url: "/gear",
|
||||
type: "website",
|
||||
|
||||
@@ -16,7 +16,7 @@ export default function GlobalError({
|
||||
<body style={{ background: "#0d0d0d", color: "#e0e0e0", fontFamily: "system-ui", padding: 24, minHeight: "100vh" }}>
|
||||
<div style={{ maxWidth: 480, margin: "10vh auto", textAlign: "center" }}>
|
||||
<h2 style={{ fontSize: 22, marginBottom: 12 }}>Something went wrong</h2>
|
||||
<p style={{ marginBottom: 12, color: "#888" }}>BroadcastBeat hit an unexpected error.</p>
|
||||
<p style={{ marginBottom: 12, color: "#888" }}>Broadcast Beat hit an unexpected error.</p>
|
||||
{error?.digest && (
|
||||
<p style={{ fontSize: 12, opacity: 0.5, marginBottom: 16, fontFamily: "monospace" }}>ref: {error.digest}</p>
|
||||
)}
|
||||
|
||||
@@ -16,13 +16,13 @@ import NewsletterSignup from "./components/NewsletterSignup";
|
||||
import AISuggestedArticles from "@/components/AISuggestedArticles";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: 'BroadcastBeat — Broadcast Engineering News & Insights',
|
||||
title: 'Broadcast Beat — Broadcast Engineering News & Insights',
|
||||
description: 'The digital platform for broadcast engineering professionals. Breaking news, deep-dive features, and industry spotlights from NAB to IBC and beyond.',
|
||||
alternates: {
|
||||
canonical: '/home-page',
|
||||
},
|
||||
openGraph: {
|
||||
title: 'BroadcastBeat — Broadcast News',
|
||||
title: 'Broadcast Beat — Broadcast News',
|
||||
description: 'Breaking news and insights for broadcast engineering professionals.',
|
||||
url: '/home-page',
|
||||
type: 'website',
|
||||
@@ -31,13 +31,13 @@ export const metadata: Metadata = {
|
||||
url: '/assets/images/og-image.png',
|
||||
width: 1200,
|
||||
height: 630,
|
||||
alt: 'BroadcastBeat — Broadcast Engineering News & Insights',
|
||||
alt: 'Broadcast Beat — Broadcast Engineering News & Insights',
|
||||
},
|
||||
],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: 'BroadcastBeat — Broadcast News',
|
||||
title: 'Broadcast Beat — Broadcast News',
|
||||
description: 'Breaking news and insights for broadcast engineering professionals.',
|
||||
images: ['/assets/images/og-image.png'],
|
||||
},
|
||||
@@ -147,7 +147,7 @@ export default function HomePage() {
|
||||
|
||||
{/* H1 Hero Heading */}
|
||||
<div className="sr-only">
|
||||
<h1>BroadcastBeat — Broadcast Engineering News & Insights</h1>
|
||||
<h1>Broadcast Beat — Broadcast Engineering News & Insights</h1>
|
||||
</div>
|
||||
|
||||
{/* Scrolling news ticker */}
|
||||
|
||||
@@ -13,7 +13,7 @@ export const viewport: Viewport = {
|
||||
|
||||
export const metadata: Metadata = {
|
||||
metadataBase: new URL(process.env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3000'),
|
||||
title: 'BroadcastBeat — Broadcast Engineering News & Insights',
|
||||
title: 'Broadcast Beat — Broadcast Engineering News & Insights',
|
||||
description: 'The digital platform for broadcast engineering professionals. Breaking news, deep-dive features, and industry spotlights from NAB to IBC and beyond.',
|
||||
icons: {
|
||||
icon: [
|
||||
@@ -30,24 +30,24 @@ export const metadata: Metadata = {
|
||||
type: 'website',
|
||||
locale: 'en_US',
|
||||
url: '/',
|
||||
siteName: 'BroadcastBeat',
|
||||
title: 'BroadcastBeat — Broadcast News',
|
||||
siteName: 'Broadcast Beat',
|
||||
title: 'Broadcast Beat — Broadcast News',
|
||||
description: 'Breaking news and insights for broadcast engineering professionals.',
|
||||
images: [
|
||||
{
|
||||
url: '/assets/images/og-image.png',
|
||||
width: 1200,
|
||||
height: 630,
|
||||
alt: 'BroadcastBeat — Broadcast Engineering News & Insights',
|
||||
alt: 'Broadcast Beat — Broadcast Engineering News & Insights',
|
||||
type: 'image/png'
|
||||
}]
|
||||
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
site: '@BroadcastBeat',
|
||||
creator: '@BroadcastBeat',
|
||||
title: 'BroadcastBeat — Broadcast News',
|
||||
site: '@Broadcast Beat',
|
||||
creator: '@Broadcast Beat',
|
||||
title: 'Broadcast Beat — Broadcast News',
|
||||
description: 'Breaking news and insights for broadcast engineering professionals.',
|
||||
images: ['/assets/images/og-image.png']
|
||||
},
|
||||
@@ -82,7 +82,7 @@ export default function RootLayout({
|
||||
__html: JSON.stringify({
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'Organization',
|
||||
name: 'BroadcastBeat',
|
||||
name: 'Broadcast Beat',
|
||||
url: 'https://broadcastbeat.com',
|
||||
logo: "https://img.rocket.new/generatedImages/rocket_gen_img_1ab0c6b82-1768715893826.png",
|
||||
description: 'The digital platform for broadcast engineering professionals. Breaking news, deep-dive features, and industry spotlights from NAB to IBC and beyond.',
|
||||
|
||||
@@ -260,7 +260,7 @@ export default function NewsPage({ articles }: { articles: Article[] }) {
|
||||
<div className="flex-shrink-0 w-[160px] h-[105px] relative overflow-hidden rounded-sm">
|
||||
<AppImage
|
||||
src={article.image || "/assets/images/article-placeholder.jpg"}
|
||||
alt={article.alt || article.title || "BroadcastBeat article"}
|
||||
alt={article.alt || article.title || "Broadcast Beat article"}
|
||||
fill
|
||||
className="object-cover group-hover:scale-105 transition-transform duration-300"
|
||||
sizes="160px"
|
||||
|
||||
@@ -51,7 +51,7 @@ export async function generateMetadata({ params }: PageProps): Promise<Metadata>
|
||||
return { title: "Article Not Found", description: "The article you are looking for does not exist." };
|
||||
}
|
||||
return {
|
||||
title: `${article.title} — BroadcastBeat`,
|
||||
title: `${article.title} — Broadcast Beat`,
|
||||
description: article.excerpt,
|
||||
alternates: { canonical: `/news/${article.slug}` },
|
||||
openGraph: {
|
||||
@@ -69,7 +69,7 @@ export async function generateMetadata({ params }: PageProps): Promise<Metadata>
|
||||
title: article.title,
|
||||
description: article.excerpt,
|
||||
images: [article.image],
|
||||
creator: "@BroadcastBeat",
|
||||
creator: "@Broadcast Beat",
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -98,7 +98,7 @@ export default async function NewsArticlePage({ params }: PageProps) {
|
||||
author: { "@type": "Person", name: article.author },
|
||||
publisher: {
|
||||
"@type": "Organization",
|
||||
name: "BroadcastBeat",
|
||||
name: "Broadcast Beat",
|
||||
logo: { "@type": "ImageObject", url: `${SITE_URL}/assets/images/logo.png` },
|
||||
},
|
||||
datePublished: toIso(article.date),
|
||||
|
||||
@@ -6,7 +6,7 @@ import { getLegacyArticlesBySection } from "@/lib/articles/legacy-source";
|
||||
export const revalidate = 1800;
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Latest Broadcast News — BroadcastBeat",
|
||||
title: "Latest Broadcast News — Broadcast Beat",
|
||||
description:
|
||||
"Breaking news and industry updates from the world of broadcast engineering, IP/cloud workflows, streaming, AI, and live production.",
|
||||
alternates: { canonical: "/news" },
|
||||
|
||||
@@ -378,7 +378,7 @@ export default function NewsletterArchivePage() {
|
||||
</div>
|
||||
<h1 className="font-heading text-white text-3xl font-bold">Newsletter Archive</h1>
|
||||
<p className="text-[#777] font-body text-sm mt-2">
|
||||
Browse past issues of the BroadcastBeat newsletter — searchable by date and topic.
|
||||
Browse past issues of the Broadcast Beat newsletter — searchable by date and topic.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { redirect } from "next/navigation";
|
||||
|
||||
export const metadata = {
|
||||
title: "Newsletter — BroadcastBeat",
|
||||
description: "BroadcastBeat newsletter archive.",
|
||||
title: "Newsletter — Broadcast Beat",
|
||||
description: "Broadcast Beat newsletter archive.",
|
||||
alternates: { canonical: "/newsletter/archive" },
|
||||
};
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ import Header from "@/components/Header";
|
||||
import Footer from "@/components/Footer";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Privacy Policy — BroadcastBeat",
|
||||
description: "BroadcastBeat Privacy Policy — how we collect, use, and protect your personal information. GDPR and CCPA compliant.",
|
||||
title: "Privacy Policy — Broadcast Beat",
|
||||
description: "Broadcast Beat Privacy Policy — how we collect, use, and protect your personal information. GDPR and CCPA compliant.",
|
||||
alternates: {
|
||||
canonical: "/privacy",
|
||||
},
|
||||
@@ -26,7 +26,7 @@ export default function PrivacyPage() {
|
||||
|
||||
<section aria-labelledby="section-intro">
|
||||
<p id="section-intro">
|
||||
This Privacy Policy describes how <strong className="text-[#e0e0e0]">Relevant Media Properties, LLC</strong> ("we," "us," or "our"), publisher of BroadcastBeat, AV Beat, Backlot Beat, and BroadcastEngineering.com, collects, uses, and shares information about you when you use our websites and services. We are committed to protecting your privacy and complying with applicable data protection laws including GDPR and CCPA.
|
||||
This Privacy Policy describes how <strong className="text-[#e0e0e0]">Relevant Media Properties, LLC</strong> ("we," "us," or "our"), publisher of Broadcast Beat, AV Beat, Backlot Beat, and BroadcastEngineering.com, collects, uses, and shares information about you when you use our websites and services. We are committed to protecting your privacy and complying with applicable data protection laws including GDPR and CCPA.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
|
||||
@@ -112,7 +112,7 @@ export default function RegisterPage() {
|
||||
Create Account
|
||||
</h1>
|
||||
<p className="font-body text-sm text-[#666]">
|
||||
Join BroadcastBeat to save articles, track your reading history, and get personalized content.
|
||||
Join Broadcast Beat to save articles, track your reading history, and get personalized content.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ export async function GET() {
|
||||
const body = `<?xml version="1.0" encoding="UTF-8"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>BroadcastBeat</title>
|
||||
<title>Broadcast Beat</title>
|
||||
<link>${SITE_URL}</link>
|
||||
<atom:link href="${SITE_URL}/rss" rel="self" type="application/rss+xml" />
|
||||
<description>News & Intelligence for Broadcast, Post-Production & Streaming Technology</description>
|
||||
|
||||
@@ -8,9 +8,9 @@ import { searchLegacyArticles } from "@/lib/articles/legacy-source";
|
||||
export const revalidate = 60;
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Search — BroadcastBeat",
|
||||
title: "Search — Broadcast Beat",
|
||||
description:
|
||||
"Search BroadcastBeat for broadcast engineering news, gear reviews, show coverage, and technology insights.",
|
||||
"Search Broadcast Beat for broadcast engineering news, gear reviews, show coverage, and technology insights.",
|
||||
alternates: { canonical: "/search" },
|
||||
};
|
||||
|
||||
@@ -33,7 +33,7 @@ export default async function SearchPage({ searchParams }: SearchPageProps) {
|
||||
<div className="flex-1 h-px bg-[#2a2a2a]" />
|
||||
</div>
|
||||
<h1 className="font-heading text-white text-3xl font-bold">
|
||||
{query ? `Results for "${query}"` : "Search BroadcastBeat"}
|
||||
{query ? `Results for "${query}"` : "Search Broadcast Beat"}
|
||||
</h1>
|
||||
<p className="text-[#777] font-body text-sm mt-2">
|
||||
{query
|
||||
@@ -65,7 +65,7 @@ export default async function SearchPage({ searchParams }: SearchPageProps) {
|
||||
<div className="flex-shrink-0 w-[160px] h-[105px] relative overflow-hidden rounded-sm">
|
||||
<AppImage
|
||||
src={article.image || "/assets/images/article-placeholder.jpg"}
|
||||
alt={article.alt || article.title || "BroadcastBeat article"}
|
||||
alt={article.alt || article.title || "Broadcast Beat article"}
|
||||
fill
|
||||
className="object-cover group-hover:scale-105 transition-transform duration-300"
|
||||
sizes="160px"
|
||||
|
||||
@@ -130,6 +130,6 @@ function EventCard({ e }: { e: Row }) {
|
||||
}
|
||||
|
||||
export const metadata = {
|
||||
title: "Show coverage — industry events tracked by BroadcastBeat",
|
||||
description: "All upcoming and past broadcast / production industry events tracked by BroadcastBeat, with linked coverage.",
|
||||
title: "Show coverage — industry events tracked by Broadcast Beat",
|
||||
description: "All upcoming and past broadcast / production industry events tracked by Broadcast Beat, with linked coverage.",
|
||||
};
|
||||
|
||||
@@ -9,12 +9,12 @@ import { getLegacyArticlesBySection } from "@/lib/articles/legacy-source";
|
||||
export const revalidate = 1800;
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Broadcast Technology Deep Dives — BroadcastBeat",
|
||||
title: "Broadcast Technology Deep Dives — Broadcast Beat",
|
||||
description:
|
||||
"Deep-dive analysis of broadcast technology trends: IP workflows, cloud production, AI automation, streaming infrastructure, and ATSC 3.0.",
|
||||
alternates: { canonical: "/technology" },
|
||||
openGraph: {
|
||||
title: "Broadcast Technology Deep Dives — BroadcastBeat",
|
||||
title: "Broadcast Technology Deep Dives — Broadcast Beat",
|
||||
description:
|
||||
"Deep-dive analysis of broadcast technology trends: IP workflows, cloud production, AI automation, streaming infrastructure, and ATSC 3.0.",
|
||||
url: "/technology",
|
||||
|
||||
@@ -4,8 +4,8 @@ import Header from "@/components/Header";
|
||||
import Footer from "@/components/Footer";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Terms of Service — BroadcastBeat",
|
||||
description: "BroadcastBeat Terms of Service — the rules governing use of our platform.",
|
||||
title: "Terms of Service — Broadcast Beat",
|
||||
description: "Broadcast Beat Terms of Service — the rules governing use of our platform.",
|
||||
};
|
||||
|
||||
export default function TermsPage() {
|
||||
@@ -22,15 +22,15 @@ export default function TermsPage() {
|
||||
<div className="max-w-3xl space-y-8 font-body text-[#aaa] leading-relaxed">
|
||||
<section>
|
||||
<h2 className="font-heading text-[#e0e0e0] text-xl font-bold mb-3">1. Acceptance of Terms</h2>
|
||||
<p>By accessing and using BroadcastBeat, you accept and agree to be bound by the terms and provisions of this agreement. If you do not agree to these terms, please do not use our service.</p>
|
||||
<p>By accessing and using Broadcast Beat, you accept and agree to be bound by the terms and provisions of this agreement. If you do not agree to these terms, please do not use our service.</p>
|
||||
</section>
|
||||
<section>
|
||||
<h2 className="font-heading text-[#e0e0e0] text-xl font-bold mb-3">2. Use of Content</h2>
|
||||
<p>All content on BroadcastBeat is the property of Relevant Media Properties or its content suppliers and is protected by applicable intellectual property laws. You may not reproduce, distribute, or create derivative works from our content without express written permission.</p>
|
||||
<p>All content on Broadcast Beat is the property of Relevant Media Properties or its content suppliers and is protected by applicable intellectual property laws. You may not reproduce, distribute, or create derivative works from our content without express written permission.</p>
|
||||
</section>
|
||||
<section>
|
||||
<h2 className="font-heading text-[#e0e0e0] text-xl font-bold mb-3">3. User Accounts</h2>
|
||||
<p>If you create an account on BroadcastBeat, you are responsible for maintaining the confidentiality of your account credentials and for all activities that occur under your account. You agree to notify us immediately of any unauthorized use of your account.</p>
|
||||
<p>If you create an account on Broadcast Beat, you are responsible for maintaining the confidentiality of your account credentials and for all activities that occur under your account. You agree to notify us immediately of any unauthorized use of your account.</p>
|
||||
</section>
|
||||
<section>
|
||||
<h2 className="font-heading text-[#e0e0e0] text-xl font-bold mb-3">4. Community Standards</h2>
|
||||
@@ -38,7 +38,7 @@ export default function TermsPage() {
|
||||
</section>
|
||||
<section>
|
||||
<h2 className="font-heading text-[#e0e0e0] text-xl font-bold mb-3">5. Disclaimer of Warranties</h2>
|
||||
<p>BroadcastBeat is provided "as is" without warranty of any kind. We do not warrant that the service will be uninterrupted or error-free. We make no warranties regarding the accuracy or completeness of any content on the site.</p>
|
||||
<p>Broadcast Beat is provided "as is" without warranty of any kind. We do not warrant that the service will be uninterrupted or error-free. We make no warranties regarding the accuracy or completeness of any content on the site.</p>
|
||||
</section>
|
||||
<section>
|
||||
<h2 className="font-heading text-[#e0e0e0] text-xl font-bold mb-3">6. Limitation of Liability</h2>
|
||||
|
||||
@@ -15,7 +15,7 @@ export default function AskBBAI() {
|
||||
{
|
||||
role: "assistant",
|
||||
content:
|
||||
"Hi — I'm BB AI. Ask me anything about broadcast, production, or post technology. I'll cite sources from the BroadcastBeat archive.",
|
||||
"Hi — I'm BB AI. Ask me anything about broadcast, production, or post technology. I'll cite sources from the Broadcast Beat archive.",
|
||||
},
|
||||
]);
|
||||
const [err, setErr] = useState<string | null>(null);
|
||||
@@ -145,7 +145,7 @@ export default function AskBBAI() {
|
||||
</button>
|
||||
</div>
|
||||
<p className="text-[10px] font-mono text-[#6b7280] mt-2">
|
||||
30 messages/hour · cites BroadcastBeat archive
|
||||
30 messages/hour · cites Broadcast Beat archive
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -56,7 +56,7 @@ export default function CookieConsent() {
|
||||
id="cookie-consent-desc"
|
||||
className="text-[#aaa] text-sm font-body leading-relaxed"
|
||||
>
|
||||
<span className="font-bold text-white">BroadcastBeat</span> uses cookies and similar technologies to improve your experience, analyze site traffic, and serve relevant advertising. By clicking{" "}
|
||||
<span className="font-bold text-white">Broadcast Beat</span> uses cookies and similar technologies to improve your experience, analyze site traffic, and serve relevant advertising. By clicking{" "}
|
||||
<strong className="text-white">Accept All</strong>, you consent to our use of cookies.{" "}
|
||||
<Link
|
||||
href="/privacy"
|
||||
|
||||
@@ -15,7 +15,7 @@ const footerColumns = [
|
||||
{
|
||||
heading: "About",
|
||||
links: [
|
||||
{ label: "About BroadcastBeat", href: "/about" },
|
||||
{ label: "About Broadcast Beat", href: "/about" },
|
||||
{ label: "Our Mission", href: "/about#mission" },
|
||||
{ label: "Editorial Team", href: "/about#team" },
|
||||
{ label: "Advertise With Us", href: "/advertise" },
|
||||
@@ -109,7 +109,7 @@ export default function Footer() {
|
||||
<Link href="/home-page">
|
||||
<AppImage
|
||||
src="https://img.rocket.new/generatedImages/rocket_gen_img_171722b35-1771356128623.png"
|
||||
alt="BroadcastBeat — Broadcast Engineering News"
|
||||
alt="Broadcast Beat — Broadcast Engineering News"
|
||||
width={150}
|
||||
height={20}
|
||||
className="h-5 w-auto object-contain brightness-0 invert opacity-50" />
|
||||
@@ -117,19 +117,19 @@ export default function Footer() {
|
||||
</Link>
|
||||
|
||||
<div className="flex items-center gap-4">
|
||||
<a href="https://linkedin.com/company/broadcastbeat" target="_blank" rel="noopener noreferrer" aria-label="BroadcastBeat on LinkedIn"
|
||||
<a href="https://linkedin.com/company/broadcastbeat" target="_blank" rel="noopener noreferrer" aria-label="Broadcast Beat on LinkedIn"
|
||||
className="text-[#555] hover:text-[#3b82f6] transition-colors social-icon">
|
||||
<LinkedInIcon size={17} />
|
||||
</a>
|
||||
<a href="https://instagram.com/broadcastbeat" target="_blank" rel="noopener noreferrer" aria-label="BroadcastBeat on Instagram"
|
||||
<a href="https://instagram.com/broadcastbeat" target="_blank" rel="noopener noreferrer" aria-label="Broadcast Beat on Instagram"
|
||||
className="text-[#555] hover:text-[#3b82f6] transition-colors social-icon">
|
||||
<InstagramIcon size={17} />
|
||||
</a>
|
||||
<a href="https://twitter.com/broadcastbeat" target="_blank" rel="noopener noreferrer" aria-label="BroadcastBeat on Twitter/X"
|
||||
<a href="https://twitter.com/broadcastbeat" target="_blank" rel="noopener noreferrer" aria-label="Broadcast Beat on Twitter/X"
|
||||
className="text-[#555] hover:text-[#3b82f6] transition-colors social-icon">
|
||||
<TwitterXIcon size={17} />
|
||||
</a>
|
||||
<a href="https://facebook.com/broadcastbeat" target="_blank" rel="noopener noreferrer" aria-label="BroadcastBeat on Facebook"
|
||||
<a href="https://facebook.com/broadcastbeat" target="_blank" rel="noopener noreferrer" aria-label="Broadcast Beat on Facebook"
|
||||
className="text-[#555] hover:text-[#3b82f6] transition-colors social-icon">
|
||||
<FacebookIcon size={17} />
|
||||
</a>
|
||||
|
||||
@@ -214,19 +214,19 @@ export default function Header() {
|
||||
News & Intelligence for Broadcast, Post-Production & Streaming Technology
|
||||
</p>
|
||||
<div className="flex items-center gap-3 ml-auto">
|
||||
<a href="https://linkedin.com/company/broadcastbeat" target="_blank" rel="noopener noreferrer" aria-label="BroadcastBeat on LinkedIn"
|
||||
<a href="https://linkedin.com/company/broadcastbeat" target="_blank" rel="noopener noreferrer" aria-label="Broadcast Beat on LinkedIn"
|
||||
className="text-[#999] hover:text-[#3b82f6] focus:text-[#3b82f6] focus:outline-none focus-visible:ring-1 focus-visible:ring-[#3b82f6] transition-colors social-icon">
|
||||
<LinkedInIcon size={14} />
|
||||
</a>
|
||||
<a href="https://instagram.com/broadcastbeat" target="_blank" rel="noopener noreferrer" aria-label="BroadcastBeat on Instagram"
|
||||
<a href="https://instagram.com/broadcastbeat" target="_blank" rel="noopener noreferrer" aria-label="Broadcast Beat on Instagram"
|
||||
className="text-[#999] hover:text-[#3b82f6] focus:text-[#3b82f6] focus:outline-none focus-visible:ring-1 focus-visible:ring-[#3b82f6] transition-colors social-icon">
|
||||
<InstagramIcon size={14} />
|
||||
</a>
|
||||
<a href="https://facebook.com/broadcastbeat" target="_blank" rel="noopener noreferrer" aria-label="BroadcastBeat on Facebook"
|
||||
<a href="https://facebook.com/broadcastbeat" target="_blank" rel="noopener noreferrer" aria-label="Broadcast Beat on Facebook"
|
||||
className="text-[#999] hover:text-[#3b82f6] focus:text-[#3b82f6] focus:outline-none focus-visible:ring-1 focus-visible:ring-[#3b82f6] transition-colors social-icon">
|
||||
<FacebookIcon size={14} />
|
||||
</a>
|
||||
<a href="/rss" aria-label="BroadcastBeat RSS Feed" className="text-[#999] hover:text-[#3b82f6] focus:text-[#3b82f6] focus:outline-none focus-visible:ring-1 focus-visible:ring-[#3b82f6] transition-colors social-icon">
|
||||
<a href="/rss" aria-label="Broadcast Beat RSS Feed" className="text-[#999] hover:text-[#3b82f6] focus:text-[#3b82f6] focus:outline-none focus-visible:ring-1 focus-visible:ring-[#3b82f6] transition-colors social-icon">
|
||||
<RssIcon size={14} />
|
||||
</a>
|
||||
<div className="w-px h-3.5 bg-[#333] mx-1" />
|
||||
@@ -326,7 +326,7 @@ export default function Header() {
|
||||
<Link href="/home-page" className="flex-shrink-0 focus:outline-none focus-visible:ring-2 focus-visible:ring-[#3b82f6] focus-visible:ring-offset-1 focus-visible:ring-offset-[#111]">
|
||||
<AppImage
|
||||
src="/assets/images/logo.png"
|
||||
alt="BroadcastBeat logo"
|
||||
alt="Broadcast Beat logo"
|
||||
width={200}
|
||||
height={26}
|
||||
priority={true}
|
||||
|
||||
@@ -55,7 +55,7 @@ const FALLBACK: Ad[] = [
|
||||
src: "/legacy/ads/Zixi_Ads_300x250.png",
|
||||
alt: "Zixi", click_url: "https://zixi.com/" },
|
||||
{ slug: "telycam-300x250", label: "Telycam MixOne / ExploreXE", size: "300x250",
|
||||
src: "/legacy/ads/Telycam_BroadcastBeat_300x250_MixOne-ExploreXE_with_NAB2026_2f30157f.gif",
|
||||
src: "/legacy/ads/Telycam_Broadcast Beat_300x250_MixOne-ExploreXE_with_NAB2026_2f30157f.gif",
|
||||
alt: "Telycam MixOne / ExploreXE — NAB 2026", click_url: "https://telycam.com/" },
|
||||
{ slug: "lectrosonics-300x250", label: "Lectrosonics", size: "300x250",
|
||||
src: "/legacy/ads/300x250-banner-Our-Story-film_resize.jpg",
|
||||
|
||||
@@ -75,16 +75,16 @@ Length:
|
||||
|
||||
export function buildSystemPrompt(p: Persona): string {
|
||||
const writingStyle = p.writing_style || "Trade-press, plain English, AP style.";
|
||||
const bio = p.bio || "BroadcastBeat staff writer.";
|
||||
const bio = p.bio || "Broadcast Beat staff writer.";
|
||||
const beat = p.beat || "broadcast technology";
|
||||
|
||||
return `You are ${p.name}, a staff journalist for BroadcastBeat covering ${beat}.
|
||||
return `You are ${p.name}, a staff journalist for Broadcast Beat covering ${beat}.
|
||||
|
||||
Bio: ${bio}
|
||||
|
||||
Writing style: ${writingStyle}
|
||||
|
||||
You are rewriting a vendor-supplied press release into an independent journalism piece for the BroadcastBeat newsroom. You are NOT copywriting for the vendor; you are reporting on their announcement. The BroadcastBeat audience are broadcast engineers, post-production supervisors, streaming architects, and broadcast executives — they read trade press to find out what is true, not to be sold to.
|
||||
You are rewriting a vendor-supplied press release into an independent journalism piece for the Broadcast Beat newsroom. You are NOT copywriting for the vendor; you are reporting on their announcement. The Broadcast Beat audience are broadcast engineers, post-production supervisors, streaming architects, and broadcast executives — they read trade press to find out what is true, not to be sold to.
|
||||
|
||||
Hard rules:
|
||||
- Never use the literal text from the source as the lede. Rewrite the lede.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Role-based permission utilities for BroadcastBeat
|
||||
* Role-based permission utilities for Broadcast Beat
|
||||
* Mirrors the WordPress role structure exactly.
|
||||
*/
|
||||
|
||||
|
||||
@@ -3835,7 +3835,7 @@
|
||||
"https://www.broadcastbeat.com/wp-content/uploads/Broadcast-Beat-Banner-March-2024-300x250-1.jpg": "/legacy/ads/Broadcast-Beat-Banner-March-2024-300x250-1_6dda0fb9.jpg",
|
||||
"https://www.broadcastbeat.com/wp-content/uploads/728-x-90-pxEN.gif": "/legacy/ads/728-x-90-pxEN_3ce6f379.gif",
|
||||
"https://www.broadcastbeat.com/wp-content/uploads/GIF3_07_10fps_03.gif": "/legacy/ads/GIF3_07_10fps_03_71177a21.gif",
|
||||
"https://www.broadcastbeat.com/wp-content/uploads/Telycam_BroadcastBeat_300x250_MixOne-ExploreXE_with_NAB2026.gif": "/legacy/ads/Telycam_BroadcastBeat_300x250_MixOne-ExploreXE_with_NAB2026_2f30157f.gif",
|
||||
"https://www.broadcastbeat.com/wp-content/uploads/Telycam_Broadcast Beat_300x250_MixOne-ExploreXE_with_NAB2026.gif": "/legacy/ads/Telycam_Broadcast Beat_300x250_MixOne-ExploreXE_with_NAB2026_2f30157f.gif",
|
||||
"https://www.broadcastbeat.com/wp-content/uploads/300x250_Matrox_Monarch_EDGE_Series_Flex_Your_Workflow_0924.jpg": "/legacy/ads/300x250_Matrox_Monarch_EDGE_Series_Flex_Your_Workflow_0924_caf31161.jpg",
|
||||
"https://www.broadcastbeat.com/wp-content/uploads/quantum-webinar.jpg": "/legacy/ads/quantum-webinar_8db637f8.jpg",
|
||||
"https://www.broadcastbeat.com/wp-content/uploads/openGear-guide-2026-300x250-1.png": "/legacy/ads/openGear-guide-2026-300x250-1_a5c4b515.png",
|
||||
|
||||
Reference in New Issue
Block a user