diff --git a/docs/guides/FORUM_SETUP_CHECKLIST.md b/docs/guides/FORUM_SETUP_CHECKLIST.md new file mode 100644 index 0000000..9b818a1 --- /dev/null +++ b/docs/guides/FORUM_SETUP_CHECKLIST.md @@ -0,0 +1,32 @@ +# Forum Setup Checklist (By Property) + +Use this for each new property setup. + +## [ ] Property: ________________ + +### Parameters +- [ ] Property name: _______________ +- [ ] Forum URL: /forum +- [ ] Display name: "The ______ Lounge" +- [ ] Categories: ___ (count) +- [ ] Initial personas: ___ (recommend 150-200) +- [ ] Target posts/day: ___ (recommend 250-400) + +### Setup Steps +- [ ] Phase 1: Create logo (SVG) +- [ ] Phase 2: Create credits schema (SQL) +- [ ] Phase 3: Add React components +- [ ] Phase 4: Update page titles +- [ ] Phase 5: Insert categories +- [ ] Phase 6: Generate personas +- [ ] Phase 7: Generate posts +- [ ] Phase 8: Award credits +- [ ] Phase 9: Set up cron +- [ ] Phase 10: Add to monitoring + +### Verification +- [ ] `SELECT COUNT(*) FROM bb.forum_categories;` +- [ ] `SELECT COUNT(*) FROM bb.user_profiles;` +- [ ] `SELECT COUNT(*) FROM bb.forum_threads;` +- [ ] First post generated at: _______ +- [ ] Posts generating every 30 min: YES / NO diff --git a/docs/guides/FORUM_SETUP_COMPLETE.md b/docs/guides/FORUM_SETUP_COMPLETE.md new file mode 100644 index 0000000..2874f5c --- /dev/null +++ b/docs/guides/FORUM_SETUP_COMPLETE.md @@ -0,0 +1,53 @@ +# Community Forum Setup Guide (From Scratch) + +**Complete replicable guide for deploying forums with credits system across RMP properties.** + +> Updated: May 16, 2026 +> Template: The Crew Lounge (BroadcastBeat) +> Replicable to: AV Beat, BroadcastEngineering, SportsMediaIntel, etc. + +## Quick Summary + +- **Database**: 4 new tables for credits system (bb.user_credits, totals, badges, monthly) +- **UI**: CreditsDisplay component + CrewLoungeLogo +- **Schema**: Forum categories, user profiles, threads, credits tracking +- **Generation**: 200 personas, 1,500+ posts via Ollama, continuous generation +- **Timeline**: ~2 hours per property + +## Database Schema + +```sql +bb.user_credits -- Track earned credits per user/category +bb.user_credits_totals -- Cache totals for leaderboards +bb.crew_leader_badges -- 10+ credits = category expert +bb.credits_monthly_snapshot -- Monthly leaderboard snapshots +``` + +## Setup Phases + +1. **Logo** — Create property-specific SVG +2. **Schema** — New credits tables in Supabase +3. **Components** — CreditsDisplay, CrewLoungeLogo React components +4. **Forum Pages** — Update title text (keep code structure) +5. **Categories** — Insert your 35-50 domain-specific categories +6. **Personas** — Generate 150-200 realistic user profiles +7. **Posts** — Generate 1,000-1,500 seed posts via Ollama +8. **Credits** — Award 1 credit per post, calculate badges +9. **Cron** — Set up continuous generation (every 30 min) +10. **Monitoring** — Add to control panel watchdog + +## For Other Properties + +Copy this guide and customize: + +- **Category list** - Use domain-specific categories +- **Logo colors** - Match property branding +- **Persona archetypes** - Specialize for your community +- **Post generation prompt** - Domain vocabulary +- **Target velocity** - Adjust posts/day based on community size + +## Files in This Directory + +- `FORUM_SETUP_COMPLETE.md` — Full guide +- `FORUM_SETUP_CHECKLIST.md` — Per-property checklist +- Scripts for category/persona generation available diff --git a/public/logos/crew-lounge-logo.svg b/public/logos/crew-lounge-logo.svg new file mode 100644 index 0000000..bb11717 --- /dev/null +++ b/public/logos/crew-lounge-logo.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + CREW + + + + + + diff --git a/src/app/forum/layout.tsx b/src/app/forum/layout.tsx index 35591e7..07bdfb3 100644 --- a/src/app/forum/layout.tsx +++ b/src/app/forum/layout.tsx @@ -1,19 +1,19 @@ import type { Metadata } from 'next'; export const metadata: Metadata = { - title: 'Industry Forum — Broadcast Beat', - description: 'Connect with broadcast, motion picture and post production professionals worldwide. Discuss live production, IP workflows, streaming, audio, cameras, AI automation, and more.', + title: 'The Crew Lounge — Broadcast Beat', + description: 'The Crew Lounge: connect with broadcast, motion picture and post production professionals worldwide. Discuss live production, IP workflows, streaming, audio, cameras, AI automation, and more.', alternates: { canonical: '/forum' }, openGraph: { - title: 'Industry Forum — Broadcast Beat', - description: 'Connect with broadcast, motion picture and post production professionals worldwide. Ask questions, share expertise, and discuss broadcast technology.', + title: 'The Crew Lounge — Broadcast Beat', + description: 'The Crew Lounge: connect with broadcast, motion picture and post production professionals worldwide. Ask questions, share expertise, and discuss broadcast technology.', url: '/forum', type: 'website', }, twitter: { card: 'summary', - title: 'Industry Forum — Broadcast Beat', - description: 'Connect with broadcast, motion picture and post production professionals worldwide on Broadcast Beat.', + title: 'The Crew Lounge — Broadcast Beat', + description: 'The Crew Lounge: connect with broadcast, motion picture and post production professionals worldwide on Broadcast Beat.', }, }; @@ -21,8 +21,8 @@ export default function ForumLayout({ children }: { children: React.ReactNode }) const schema = { '@context': 'https://schema.org', '@type': 'WebPage', - name: 'Broadcast Beat Industry Forum', - description: 'Industry forum for broadcast, motion picture and post production professionals worldwide.', + name: 'Broadcast Beat — The Crew Lounge', + description: 'The Crew Lounge: an industry community for broadcast, motion picture and post production professionals worldwide.', url: 'https://broadcastb5322.builtwithrocket.new/forum', isPartOf: { '@type': 'WebSite', @@ -33,7 +33,7 @@ export default function ForumLayout({ children }: { children: React.ReactNode }) '@type': 'BreadcrumbList', itemListElement: [ { '@type': 'ListItem', position: 1, name: 'Home', item: 'https://broadcastb5322.builtwithrocket.new' }, - { '@type': 'ListItem', position: 2, name: 'Forum', item: 'https://broadcastb5322.builtwithrocket.new/forum' }, + { '@type': 'ListItem', position: 2, name: 'The Crew Lounge', item: 'https://broadcastb5322.builtwithrocket.new/forum' }, ], }, }; diff --git a/src/app/forum/page.tsx b/src/app/forum/page.tsx index 27162e3..b37f1bb 100644 --- a/src/app/forum/page.tsx +++ b/src/app/forum/page.tsx @@ -262,11 +262,11 @@ export default function ForumIndexPage() {
- 💬 -

Industry Forum

+ The Crew Lounge +

The Crew Lounge

- Connect with broadcast, motion picture and post production professionals worldwide. Ask questions, share expertise, and discuss the technology shaping the industry. + The Crew Lounge: connect with broadcast, motion picture and post production professionals worldwide. Ask questions, share expertise, and discuss the technology shaping the industry.

diff --git a/src/components/crew-lounge/CreditsDisplay.tsx b/src/components/crew-lounge/CreditsDisplay.tsx new file mode 100644 index 0000000..9b283ef --- /dev/null +++ b/src/components/crew-lounge/CreditsDisplay.tsx @@ -0,0 +1,56 @@ +'use client'; + +interface CreditsDisplayProps { + userName: string; + totalCredits: number; + categoryCredits: Record; + isLeader: boolean; +} + +export default function CreditsDisplay({ + userName, + totalCredits, + categoryCredits, + isLeader, +}: CreditsDisplayProps) { + return ( +
+
+
+

{userName}

+ {isLeader && ( + + ⭐ Crew Leader + + )} +
+
+

Total Credits

+

{totalCredits}

+
+
+ + {Object.keys(categoryCredits).length > 0 && ( +
+

By Category

+
+ {Object.entries(categoryCredits) + .sort(([, a], [, b]) => b - a) + .slice(0, 6) + .map(([category, credits]) => ( +
+

{category}

+

{credits}

+
+ ))} +
+
+ )} + +
+

💡 Earn 1 credit per post in each category

+

⭐ Earn "Crew Leader" badge at 10+ credits

+
+
+ ); +} diff --git a/src/components/crew-lounge/CrewLoungeLogo.tsx b/src/components/crew-lounge/CrewLoungeLogo.tsx new file mode 100644 index 0000000..c1510b1 --- /dev/null +++ b/src/components/crew-lounge/CrewLoungeLogo.tsx @@ -0,0 +1,10 @@ +export default function CrewLoungeLogo({ size = 40 }: { size?: number }) { + return ( + The Crew Lounge + ); +}