Skip to content

Conversation

@denbec
Copy link
Collaborator

@denbec denbec commented Jan 30, 2026

Code Review Summary - Podcast Automation (2026-01-30)

Overview
Implemented Phase 3.6, 3.7 (Content Review & Approval) and Phase 4 (Social Media Publishing) for the programmier.bar podcast automation system.

Changes Made

  1. Content Approval Workflow (src/content-approval/index.ts)

Directus hook triggered when podcast_generated_content status changes to approved
Copies approved shownotes to podcast description field
Updates podcast publishing_status to approved when all content items are approved
2. Social Media Publishing (src/social-media-publish/)

New hook with implementations for Bluesky and Mastodon
bluesky.ts: AT Protocol auth with app passwords, post creation with facets (URLs, hashtags, mentions via DIDs)
mastodon.ts: Standard REST API with access token auth
Triggered by setting social_media_posts status to publishing
Updates platform_post_id, platform_post_url, published_at on success
3. New Collection: social_media_posts

Setup script: utils/setup-social-media-posts.mjs
Fields: platform, status, post_text, scheduled_for, published_at, platform_post_id, platform_post_url, error_message, tags
Relations to podcasts and podcast_generated_content
O2M field added to podcasts collection
4. Configuration

Added social media credentials to .env.example (Bluesky, Mastodon, LinkedIn, Instagram placeholders)
Registered new hooks in package.json

denbec and others added 10 commits January 30, 2026 11:09
Creates a convenient `npm run setup-local` command that configures public
permissions, generates placeholder media, and populates the local Directus
database with sample data for testing. The website now renders properly
with local Directus instead of requiring production credentials.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- Replace yarn with npm in all instructions
- Add comprehensive local Directus setup steps
- Document the new `npm run setup-local` command
- Remove accidentally committed yarn.lock file
- Update Node.js version requirements to v20/v22

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add planning fields to podcasts: recording_date, planned_publish_date, publishing_status
- Add speaker portal fields: portal_token, portal_token_expires, portal_submission_status, portal_submission_deadline
- Create podcast_generated_content collection for AI-generated shownotes and social posts
- Add Heise.de integration fields to podcasts: heise_eligible, heise_document_status, heise_sent_at, heise_document
- Add migration scripts for API and schema.json updates

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Speaker Portal (Phase 5):
- Add /speaker-portal page for guests to submit their info
- Add API endpoints for token validation and form submission
- Add token generation flow in Directus
- Add runtime config for Directus admin token

Content Generation (Phase 3):
- Add shownotes generation prompt template
- Add social media post prompts (LinkedIn, Instagram, Bluesky, Mastodon)

Calendar Views (Phase 1):
- Add setup-flows script for Directus presets and flows
- Create Recording Calendar view preset
- Create Publishing Calendar view preset
- Create Ready to Publish filter preset

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace text-gray-300 and text-gray-400 (not in theme) with
text-white/70 and text-white/60 (opacity modifiers).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix API endpoints to use correct Directus field names (event_image instead of action_image, remove non-existent mastodon_url)
- Translate all error messages and UI text to German
- Add generate-speaker-tokens.mjs utility script for generating tokens for existing speakers
- Add npm script for token generation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add transcript_text, transcript_file, and transcript_uploaded_at fields to podcasts
- Create Directus Flow that triggers when transcript is uploaded
- Automatically sets publishing_status to 'transcript_ready'
- Add 'Transcript Ready' preset view for episodes awaiting content generation

This adapts Phase 2 to use Riverside's existing transcripts instead of
automated transcription, allowing manual .txt upload to trigger the AI
content generation workflow.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add /api/generate-content endpoint that calls Gemini API
- Generate shownotes from transcript using designed prompts
- Generate social media posts for LinkedIn, Instagram, Bluesky, Mastodon
- Store generated content in podcast_generated_content collection
- Update Directus Flow to trigger content generation after transcript upload
- Add NUXT_GEMINI_API_KEY config for API authentication

Flow: Upload transcript → Status becomes 'transcript_ready' →
      Content generation triggered → Status becomes 'content_review'

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add content-approval hook to copy approved shownotes to podcast description
- Update podcast status to 'approved' when all content is approved
- Add setup script for O2M relation (generated_content on podcasts)
- Add cleanup utility for removing old flow data
- Remove Nuxt generate-content endpoint (moved to Directus hook)
- Simplify status to just 'generated' and 'approved' states

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Zod schema validation for speaker form data
- Add missing mastodon_url to speaker update payload
- Add proper error handling for image upload failures
- Remove unused runtimeConfig variable
- Fix memory leak by revoking object URLs on replacement and unmount

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@denbec denbec requested a review from Copilot January 30, 2026 16:13
@vercel
Copy link

vercel bot commented Jan 30, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
programmierbar-website Ready Ready Preview, Comment Jan 30, 2026 4:40pm

Request Review

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request implements Phase 3.6, 3.7 (Content Review & Approval) and Phase 4 (Social Media Publishing) for the programmier.bar podcast automation system. The changes include new Directus hooks for content approval workflow, social media publishing to Bluesky and Mastodon, a speaker self-service portal, member matching from transcripts, and various code quality improvements.

Changes:

  • Content approval workflow that copies approved shownotes to podcast description and updates publishing status
  • Social media publishing hooks with implementations for Bluesky (AT Protocol) and Mastodon (REST API)
  • Speaker portal for self-service speaker information submission with token-based authentication
  • Member matching logic to automatically identify podcast hosts from transcripts
  • Code quality improvements: const/let fixes, Vue directive updates, component organization

Reviewed changes

Copilot reviewed 47 out of 47 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
tasks.md Updated implementation progress tracking for completed automation phases
README.md Updated setup instructions for Node.js v20/22 and local development workflow
nuxt-app/server/middleware/rating.ts Changed let to const for immutable variables
nuxt-app/server/api/speaker-portal/*.ts New API endpoints for speaker portal validation and submission
nuxt-app/pages/speaker-portal.vue New speaker portal page with form validation and image upload
nuxt-app/plugins/vue-json-pretty.js Fixed component name casing
nuxt-app/components/*.vue Vue style guide compliance: v-if placement, @click shorthand
directus-cms/schema.json Added podcast automation fields and podcast_generated_content collection
directus-cms/utils/*.mjs New utility scripts for schema management and local setup
directus-cms/extensions/.../content-approval/index.ts Hook for content approval workflow
directus-cms/extensions/.../content-generation/*.ts AI content generation with Gemini API
directus-cms/extensions/.../social-media-publish/*.ts Bluesky and Mastodon publishing implementations
directus-cms/extensions/.../member-matching/*.ts Automatic member matching from transcripts with tests
directus-cms/prompts/*.md Prompt templates for shownotes and social media posts
directus-cms/package.json Added npm scripts for automation setup
directus-cms/.env.example Added environment variables for Gemini API and social media platforms

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

import ConferenceTickets from '~/components/ConferenceTickets.vue';
import TestimonialSlider from '~/components/TestimonialSlider.vue';
import type { TalkItem, DirectusFileItem } from '~/types';
import { TalkItem} from '~/types';
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shoud this be also a import type?

denbec and others added 4 commits January 30, 2026 17:31
Validates that uploaded images meet the minimum 800x800 pixel
requirement before accepting them, showing a helpful error message
with the actual dimensions if validation fails.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add detailed progress section documenting completed phases:
- Phase 1: CMS schema and calendar views
- Phase 3: AI content generation and approval workflow
- Phase 5: Speaker portal (partial)
- Phase 7: Heise fields (partial)

Includes key files created and remaining work overview.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create social_media_posts collection with setup script
- Add social-media-publish hook for Bluesky and Mastodon
- Bluesky: AT Protocol auth with app passwords, facets for rich text
- Mastodon: Standard API with access token authentication
- Add platform credentials to .env.example
- Posts support scheduled publishing via status workflow

Platforms not yet implemented: LinkedIn (requires OAuth), Instagram (requires Meta review)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When transcript_text is updated on a podcast, this hook extracts
speaker names and fuzzy matches them to members in the database.
Supports timestamp format (Name (00:12.534)) and colon format (Name:).
Handles hyphen/space normalization for names like "Jan-Gregor".

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@denbec denbec changed the title Denbec/podcast automation Podcast automation ground work Jan 30, 2026
@denbec denbec merged commit 0be02f4 into main Jan 30, 2026
2 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants