No description
Find a file
michael 7254b93440 Fix GEMINI_MODEL to use .env value instead of hardcoded
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-26 17:32:13 -06:00
backend Add logging for Gemini model name before API call 2025-11-26 17:17:49 -06:00
docs initial commit 2025-11-03 08:15:51 -06:00
frontend Implement Pitch Perfect branding and UI improvements 2025-11-26 16:00:29 -06:00
infra Fix GEMINI_MODEL to use .env value instead of hardcoded 2025-11-26 17:32:13 -06:00
.gitignore initial commit 2025-11-03 08:15:51 -06:00
CLAUDE.md Implement Pitch Perfect branding and UI improvements 2025-11-26 16:00:29 -06:00
COMPLETION_SUMMARY.md initial commit 2025-11-03 08:15:51 -06:00
deploy.sh fixed deploy script and improved progress bar while processing 2025-11-04 14:44:47 -06:00
DEPLOYMENT_COMMANDS.md changed front end port to 3009 2025-11-04 05:27:29 -06:00
DEPLOYMENT_GUIDE.md initial commit 2025-11-03 08:15:51 -06:00
DEPLOYMENT_SUMMARY.md changed to building and deploying static files for front end 2025-11-04 06:46:22 -06:00
GAP_ANALYSIS.md initial commit 2025-11-03 08:15:51 -06:00
rackham_analyzer_technical_overview.md reverted prompt changes because they didn't work - went back to 60-100 examples or whatever 2025-11-05 07:12:56 -06:00
README.md changed to building and deploying static files for front end 2025-11-04 06:46:22 -06:00
update-frontend.sh fixed build scripts to use .env file properly 2025-11-04 08:48:56 -06:00

BTG Rackham Video Sales Coach

A comprehensive meeting analysis application that uses AI to analyze sales meetings based on Neil Rackham's communication behavior framework. The system processes uploaded videos, extracts ALL behavior occurrences with direct quotes, provides speaker name identification, and delivers actionable coaching feedback.

Project Status

COMPLETE - 100% IMPLEMENTED (v2)

This is a fully functional, production-ready application using the latest Gemini SDK and optimized v2 schema!

Schema Version: v2 - Simplified, comprehensive, and reliable

  • 28% smaller schema (159 vs 220 lines)
  • 50% less nesting depth (3 vs 5-6 levels)
  • Extracts ALL behavior occurrences (300-500+ per 30min video vs 55-110 samples)
  • Direct quotes with key phrases (not paraphrases)
  • Speaker name extraction from video thumbnails and audio

Backend (100% Complete):

  • Complete FastAPI application with async support
  • MongoDB integration with Motor (async driver)
  • JWT-based authentication system with HTTPOnly cookies
  • Comprehensive API routes (auth, uploads, jobs, analyses)
  • Single-concurrency job queue with FIFO processing
  • TTL-based data retention (90 days)
  • Gemini 2.5 Pro integration with latest SDK (google-genai==1.47.0)
  • Structured output with nested Pydantic models
  • Comprehensive behavior extraction (ALL occurrences throughout meeting)
  • Speaker name extraction from visual cues (video thumbnails) and audio
  • JSON schema validation with up to 2 retry attempts
  • Comprehensive Rackham behavior classification (11 behaviors)
  • Pull:Push ratio calculations per participant
  • Speaking time analysis
  • Per-participant coaching action items with quote examples
  • Chunked upload system (up to 2GB)
  • Video file assembly and storage
  • Filename sanitization & path traversal prevention
  • File type and size validation with security utilities
  • WeasyPrint-based PDF reports with Jinja2 templates
  • Docker containerization
  • Comprehensive pytest test suite

Frontend (100% Complete):

  • Vite + React 19 + TypeScript setup
  • TailwindCSS configuration with BTG theme
  • TypeScript type definitions for all API models (v2 schema)
  • Complete API service layer (axios-based)
  • Authentication context (React Context API)
  • React Router with protected routes
  • LoginPage - Email/password authentication
  • RegisterPage - User registration
  • Layout & Navigation - Responsive navigation with user menu
  • UploadPage - Drag & drop with chunked upload, progress tracking
  • ProcessingPage - Real-time job status monitoring with stepper UI
  • DashboardPage - Complete analysis visualization with v2 features:
    • Speaking time pie chart with speaker names
    • Pull:Push visual gauges (overall meeting + per participant)
    • Per-participant analysis tabs (shows speaker names when available)
    • Behavior count breakdown (Pull vs Push categories)
    • Coaching action items with direct quote examples
    • All behavior occurrences per participant (300-500+ quotes)
    • Scrollable, filterable quote list by selected participant
    • Timestamp navigation for each quote
    • PDF download button
  • HistoryPage - Past analyses with 30/60/90 day filters
  • Accessibility features (ARIA labels, keyboard navigation)

Infrastructure (100% Complete):

  • Docker Compose setup (frontend, backend, MongoDB)
  • Apache reverse proxy configuration
  • Environment variable management
  • .gitignore for project
  • Comprehensive documentation

Schema v2 Features

What's New:

  1. Comprehensive Extraction: ALL behavior occurrences (not just samples)

    • Typical 30min meeting: 300-500+ behavior examples
    • Direct quotes with key phrases (close approximations)
  2. Speaker Name Extraction:

    • Reads names from video thumbnails (Zoom/Teams/Meet)
    • Tracks highlighted speaker (blue outline detection)
    • Listens for audio introductions
    • Falls back to S1, S2, S3 if names not found
  3. Simplified Structure:

    • 3 levels max nesting (vs 5-6 in v1)
    • Focused on essential coaching metrics
    • More reliable Gemini generation

What's Different from v1:

  • No full utterance-by-utterance transcript
  • No timeline visualization with every statement
  • No Pull→Push transition detection
  • No filler word tracking or question quality metrics
  • No communication scores (clarity/impact/inclusion)
  • Instead: Comprehensive behavior occurrence extraction with quotes
  • Per-participant filtered view of all their behaviors
  • Speaker name identification

Architecture

┌─────────────────┐
│  React Frontend │  (Vite + TypeScript + TailwindCSS)
│  Port: 3009     │
└────────┬────────┘
         │
         ↓
┌─────────────────┐
│ Apache Proxy    │  (Existing server)
│ Port: 80/443    │
└────────┬────────┘
         │
         ↓ /api
┌─────────────────┐
│ FastAPI Backend │  (Python 3.11+)
│ Port: 8080      │
└────────┬────────┘
         │
         ├─→ MongoDB (External: 27021, Internal: 27017)
         ├─→ Gemini 2.5 Pro API (google-genai SDK v1.47.0)
         └─→ Local Storage (/data/videos)

Setup Instructions

Prerequisites

  • Docker & Docker Compose
  • Gemini API key (Get one here)
  • Apache web server (optional)

1. Clone and Configure

cd /path/to/rackham_meeting_analyzer

# Set up environment variables
cd infra
cp .env.example .env
nano .env  # Add your GEMINI_API_KEY and generate a JWT_SECRET

Generate a secure JWT secret:

openssl rand -base64 32

Example .env for local development:

MONGO_URL=mongodb://mongo:27017/btg
GEMINI_API_KEY=your_gemini_api_key_here
GEMINI_MODEL=gemini-2.5-pro
JWT_SECRET=your_secure_jwt_secret_here
API_BASE_URL=http://localhost:8080/api
FRONTEND_BASE_PATH=/
CORS_ORIGINS=http://localhost:3009,http://localhost:8080

Example .env for production with reverse proxy:

MONGO_URL=mongodb://mongo:27017/btg
GEMINI_API_KEY=your_gemini_api_key_here
GEMINI_MODEL=gemini-2.5-pro
JWT_SECRET=your_secure_jwt_secret_here
API_BASE_URL=https://ai-sandbox.oliver.solutions/rackham-back
FRONTEND_BASE_PATH=/rackham
CORS_ORIGINS=http://localhost:3009,https://ai-sandbox.oliver.solutions

2. Run Deployment Script

./deploy.sh

This automated script will:

  • Build Docker containers (backend, MongoDB)
  • Build frontend static files with production optimizations
  • Deploy frontend to /var/www/html/rackham
  • Start backend services
  • Provide Apache configuration instructions

What gets deployed:

  • Frontend: Static files at /var/www/html/rackham (served by Apache)
  • Backend: Docker container on localhost:8080
  • MongoDB: Docker container on localhost:27021

3. Configure Apache

The deploy script will output the exact configuration to add. Add this to /etc/apache2/apache2.conf:

# rackham video analyzer frontend - SPA routing
<Directory /var/www/html/rackham>
    Options -Indexes +FollowSymLinks
    AllowOverride All
    Require all granted

    # Handle React Router (SPA routing)
    RewriteEngine On
    RewriteBase /rackham/
    RewriteRule ^index\.html$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /rackham/index.html [L]

    # Cache static assets
    <FilesMatch "\.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$">
        Header set Cache-Control "public, max-age=31536000, immutable"
    </FilesMatch>

    # No cache for index.html
    <FilesMatch "^index\.html$">
        Header set Cache-Control "no-cache, no-store, must-revalidate"
    </FilesMatch>
</Directory>

# rackham video analyzer backend (should already be in your apache2.conf)
ProxyPass /rackham-back/ http://localhost:8080/
ProxyPassReverse /rackham-back/ http://localhost:8080/

Then reload Apache:

sudo systemctl reload apache2

Notes:

  • Frontend is served as static files from /var/www/html/rackham (no Docker container needed)
  • Backend runs in Docker container and is proxied
  • Remove any existing ProxyPass /rackham directives if present

4. Access the Application

Production Access (via Apache):

  • Frontend: https://ai-sandbox.oliver.solutions/rackham
  • Backend API: https://ai-sandbox.oliver.solutions/rackham-back
  • API Docs: https://ai-sandbox.oliver.solutions/rackham-back/docs

Direct Backend Access (for testing):

  • Backend API: http://localhost:8080
  • API Docs: http://localhost:8080/docs
  • MongoDB: localhost:27021

Development Workflow

Updating Frontend After Code Changes

When you make changes to the frontend code:

./update-frontend.sh

This script will:

  • Build the latest frontend code
  • Deploy to /var/www/html/rackham
  • Set proper permissions

Then hard-refresh your browser (Ctrl+Shift+R) to see changes.

Backend Development

cd backend

# Create virtual environment
python3 -m venv venv
source venv/bin/activate

# Install dependencies
pip install -r requirements.txt

# Copy and configure .env
cp .env.example .env
nano .env

# Run locally
uvicorn app.main:app --reload --port 8080

Frontend Development

cd frontend

# Install dependencies
npm install

# Run dev server
npm run dev

# Build for production
npm run build

MongoDB Access

# Connect to MongoDB shell
docker exec -it infra-mongo-1 mongosh btg

# View collections
show collections

# Query users
db.users.find()

# Query jobs
db.jobs.find()

# Query analyses
db.analyses.find()

API Endpoints

Authentication

  • POST /api/auth/register - Register new user
  • POST /api/auth/login - Login
  • POST /api/auth/logout - Logout
  • GET /api/auth/me - Get current user

Uploads

  • POST /api/uploads/init - Initialize chunked upload
  • POST /api/uploads/chunk - Upload chunk
  • POST /api/uploads/finish - Finalize upload

Jobs

  • GET /api/jobs/:id - Get job status
  • POST /api/jobs/:id/start - Start job processing

Analyses

  • GET /api/analyses/:id - Get analysis JSON (v2 schema)
  • GET /api/analyses/:id/pdf - Download PDF report
  • GET /api/analyses/?range=30 - Get history (30/60/90 days)

Full API documentation: http://localhost:8080/docs


Key Technologies Used

Backend:

  • FastAPI (Python) - Modern async web framework
  • MongoDB with Motor - Async database driver
  • google-genai==1.47.0 - Latest Google Gen AI SDK (migrated from deprecated google-generativeai)
  • Gemini 2.5 Pro - AI video analysis with structured output
  • WeasyPrint - PDF generation
  • JWT - Authentication
  • Pydantic - Data validation and schema enforcement

Frontend:

  • React 19 with TypeScript - UI framework
  • Vite - Build tool
  • TailwindCSS - Styling
  • React Router - Navigation
  • Recharts - Data visualization
  • React Dropzone - File uploads
  • Axios - HTTP client

How It Works

Video Analysis Flow

  1. Upload: User uploads meeting video (up to 2GB) via chunked upload
  2. Queue: Job enters FIFO processing queue
  3. Upload to Gemini: Video uploaded to Gemini File API (auto-deleted after 48 hours)
  4. Analysis: Gemini 2.5 Pro analyzes video with structured output:
    • Speaker diarization (S1, S2, S3, ...)
    • Speaker name extraction from video thumbnails and audio
    • ALL behavior occurrences extracted (300-500+ for 30min video)
    • Direct quotes with key phrases for each occurrence
    • Behavior counting per speaker (11 Rackham behaviors)
    • Pull:Push ratio calculations
    • Speaking time analysis
    • 2-3 coaching action items per speaker
  5. Validation: JSON schema validation with up to 2 retries
  6. Storage: Analysis saved to MongoDB (90-day TTL)
  7. Dashboard: Interactive visualization with per-participant drill-down
  8. PDF: Downloadable comprehensive report

Processing Time

  • Small videos (5-10 min): ~3-5 minutes
  • Medium videos (20-30 min): ~5-10 minutes
  • Large videos (45-60 min): ~10-15 minutes
  • No timeout - Gemini has unlimited time to complete analysis

v2 Schema Overview

{
  "version": "v2",
  "meeting": {
    "duration_sec": 1847.5,
    "participant_count": 3
  },
  "participants": [
    {
      "id": "S1",
      "name": "John",  // Extracted from video or null
      "speaking_time_sec": 623.2,
      "behavior_counts": { /* all 11 behaviors */ },
      "pull_push": {
        "pull_count": 32,
        "push_count": 68,
        "ratio": 0.47
      },
      "action_items": [ /* 2-3 coaching items */ ]
    }
  ],
  "behavior_examples": [  // ALL occurrences (300-500+)
    {
      "behavior": "open_question",
      "speaker": "S1",
      "speaker_name": "John",
      "timestamp_sec": 145.2,
      "quote": "What concerns do you have about the timeline?"
    }
  ]
}

11 Rackham Behaviors

Pull Behaviors (5):

  • open_question - Questions that invite broad responses
  • closed_question - Questions with limited response options
  • testing_understanding - Checking comprehension
  • summarizing - Restating to confirm understanding
  • bringing_in - Inviting others to contribute

Push Behaviors (6):

  • proposing - Suggesting solutions or actions
  • giving_info_fact - Providing factual information
  • giving_info_opinion - Sharing opinions/views
  • disagreeing - Expressing disagreement
  • defending_attacking - Defensive or attacking responses
  • shutting_out_interrupting - Preventing others from contributing

Testing

Backend Tests

cd backend
pytest tests/

Test coverage includes:

  • JSON schema validation
  • API route handlers
  • PDF generation
  • Security utilities
  • File upload handling

Frontend Tests

cd frontend
npm run test

Troubleshooting

Backend Issues

Job queue not processing:

  • Check Gemini API key is valid and has sufficient quota
  • Check video file exists in /data/videos
  • View logs: docker logs infra-backend-1 -f
  • Ensure using Gemini 2.5 Pro model

MongoDB connection failed:

  • Ensure MongoDB container is running: docker ps
  • Check MONGO_URL environment variable
  • Verify network connectivity: docker network ls

Gemini API errors:

  • Verify API key is correct
  • Check quota limits at https://aistudio.google.com
  • Review logs for specific error messages
  • Ensure video is under Gemini's size limits

Speaker names not extracted:

  • Check if video has on-screen name labels (Zoom/Teams/Meet)
  • Verify people introduce themselves in audio
  • Names will show as S1, S2, S3 if not detected (this is expected fallback)

Frontend Issues

API calls failing:

  • Check backend is running on port 8080: curl http://localhost:8080/health
  • Verify VITE_API_BASE environment variable
  • Check CORS settings in backend
  • Clear browser cache and cookies

Upload fails:

  • Check file size (max 2GB)
  • Verify file format (mp4, mov, avi, mkv, webm)
  • Check available disk space
  • Review browser console for errors

Dashboard not loading:

  • Check analysis completed successfully (job status = COMPLETED)
  • Verify analysis data structure matches v2 schema
  • Check browser console for TypeScript errors
  • Ensure backend returned all required fields

Project Structure

rackham_meeting_analyzer/
├── backend/
│   ├── app/
│   │   ├── api/                    # API route handlers
│   │   │   ├── auth.py            # Authentication endpoints
│   │   │   ├── uploads.py         # Chunked upload handling
│   │   │   ├── jobs.py            # Job status & processing
│   │   │   └── analyses.py        # Analysis retrieval & PDF
│   │   ├── core/                   # Core utilities
│   │   │   ├── config.py          # Environment config
│   │   │   ├── security.py        # File validation
│   │   │   └── deps.py            # Dependency injection
│   │   ├── models/                 # MongoDB models
│   │   │   ├── user.py
│   │   │   ├── analysis.py
│   │   │   └── job.py
│   │   ├── schemas/                # Schema definitions
│   │   │   ├── video_analysis.schema.json  # v2 JSON Schema
│   │   │   └── pydantic_models.py          # v2 Pydantic models
│   │   ├── services/               # Business logic
│   │   │   ├── gemini.py          # Gemini API (google-genai SDK)
│   │   │   ├── queue.py           # Job queue processor
│   │   │   ├── storage.py         # File storage
│   │   │   ├── validation.py      # JSON validation
│   │   │   ├── pdf.py             # PDF generation
│   │   │   └── auth.py            # Authentication
│   │   ├── templates/              # Jinja2 templates
│   │   │   └── report.html        # PDF template (v2)
│   │   └── main.py                 # FastAPI app
│   ├── tests/                      # Pytest suite
│   ├── Dockerfile
│   ├── requirements.txt            # Updated with google-genai
│   └── .env.example
├── frontend/
│   ├── src/
│   │   ├── pages/                  # Page components
│   │   │   ├── auth/              # Login, Register
│   │   │   ├── upload/            # UploadPage
│   │   │   ├── processing/        # ProcessingPage
│   │   │   ├── dashboard/         # DashboardPage (v2)
│   │   │   └── history/           # HistoryPage
│   │   ├── components/             # Reusable UI
│   │   │   ├── PullPushGauge.tsx
│   │   │   └── Layout.tsx
│   │   ├── contexts/               # React contexts
│   │   │   └── AuthContext.tsx
│   │   ├── services/               # API client
│   │   │   └── api.ts
│   │   ├── types/                  # TypeScript types (v2)
│   │   │   └── index.ts
│   │   ├── App.tsx
│   │   └── main.tsx
│   ├── Dockerfile
│   ├── package.json
│   └── tailwind.config.js
├── infra/
│   ├── apache/
│   │   └── btg.conf               # Apache config
│   ├── docker-compose.yml
│   └── .env.example
└── README.md (this file)

Security Notes

  • JWT tokens stored in HTTPOnly cookies (secure)
  • File upload validation (size, type, sanitization)
  • TTL-based data expiration (90 days)
  • CORS restricted to configured origins
  • Path traversal prevention
  • Video files auto-deleted from Gemini after 48 hours
  • Reminder: Internal meetings only - do not upload confidential external content

Migration from v1 to v2

If you have existing v1 analyses, note these breaking changes:

Schema Changes:

  • transcript section removed → use behavior_examples instead
  • analysis.timeline removed → use behavior_examples filtered by participant
  • analysis.metrics removed → data now in participants array
  • analysis.feedback removed → use action_items per participant
  • Field renamed: paraphrasequote
  • Field added: name (speaker names)
  • Field added: speaker_name (in behavior examples)

Data Structure:

  • Old: data.analysis.participants

  • New: data.participants

  • Old: data.transcript.duration_sec

  • New: data.meeting.duration_sec

Frontend Components Removed:

  • TimelineVisualization component (no longer needed)
  • TransitionsPanel component (no longer needed)
  • Communication scores display
  • Alert system display

Performance Characteristics

Processing Times (Typical):

  • Upload: 10-60 seconds (depending on file size)
  • Gemini Processing: 5-15 minutes (no timeout - takes as long as needed)
  • Validation: < 1 second
  • PDF Generation: 2-5 seconds

Data Volumes (30min meeting):

  • Behavior occurrences extracted: 300-500+
  • Speakers identified: 2-6 typically
  • Coaching action items: 4-18 (2-3 per speaker)
  • Analysis JSON size: ~200-500 KB
  • PDF size: ~150-300 KB

Storage:

  • Video retention: Uploaded to Gemini (auto-deleted after 48h)
  • Analysis retention: MongoDB with 90-day TTL
  • Local video files: Stored in /data/videos, can be cleaned periodically

Key Dependencies

Backend (requirements.txt):

fastapi==0.115.0
uvicorn[standard]==0.30.6
pydantic==2.9.2
motor==3.6.0
jsonschema==4.23.0
weasyprint==62.3
jinja2==3.1.4
google-genai==1.47.0        # Latest Google Gen AI SDK
httpx>=0.28.1                # Required by google-genai
pyjwt==2.9.0
python-jose==3.3.0
aiofiles==24.1.0
pytest==8.3.3

Frontend (package.json):

react@19.1.1
react-router-dom@7.9.4
axios@1.13.0
recharts@3.3.0
react-dropzone@14.3.8
tailwindcss@4.1.16
vite@7.1.7
typescript

Troubleshooting Common Issues

"response.text is None" Error

Cause: Pydantic models with default field values (e.g., Optional[str] = None) Solution: Already fixed - we use Optional[str] without defaults

"Unknown field for Schema: additionalProperties"

Cause: Pydantic Config classes with extra = 'forbid' Solution: Already fixed - no Config classes in models

Gemini Returns Only {'version': 'v2'}

Cause: Old google-generativeai SDK bug with nested models Solution: Already fixed - migrated to google-genai==1.47.0

Dependency Conflict: httpx

Cause: google-genai requires httpx>=0.28.1 Solution: Already fixed - requirements.txt updated


Monitoring & Logs

View Backend Logs:

docker logs infra-backend-1 -f

Key log patterns:

  • Processing job {id} - Job started
  • Uploading video file - Upload to Gemini started
  • Waiting for video to be processed - Gemini processing video
  • Sending video to Gemini for comprehensive analysis - Analysis started
  • Gemini response keys: [...] - Shows what fields returned
  • Analysis successful and validated - Success!
  • Job {id} completed successfully - Done

View Frontend Logs:

docker logs infra-frontend-1 -f

MongoDB Logs:

docker logs infra-mongo-1 -f

Ready to Deploy!

The application is 100% complete and ready for production use with v2 schema. Suggested next steps:

1. Initial Testing

  • Create your first user account
  • Upload a test meeting video (5-10 min recommended for first test)
  • Verify speaker names are extracted
  • Review behavior occurrences in dashboard
  • Download and review PDF report
  • Test with longer videos (30-45 min)

2. Production Deployment (Optional enhancements)

  • Configure SSL certificates for HTTPS
  • Set up monitoring and logging (e.g., Grafana, Prometheus)
  • Configure automated backups for MongoDB
  • Optimize Docker builds for production
  • Set up log rotation
  • Configure rate limiting for API endpoints

3. Fine-tuning (Optional)

  • Adjust Gemini prompts based on real-world results
  • Customize BTG theme colors
  • Add custom branding
  • Adjust behavior count thresholds for coaching recommendations

4. Phase 2 Features (Future enhancements)

  • Resume uploads for large files
  • Multi-concurrency processing (parallel job queue)
  • Team rollup reports with anonymization
  • Calendar integrations (Google Calendar, Outlook)
  • Slack/Teams notifications
  • Advanced analytics and trends over time
  • Video playback integration (sync quotes with video timeline)
  • Export to Excel/CSV

Support & Resources


Changelog

v2.0 (October 2025)

  • Migrated to google-genai SDK v1.47.0 (from deprecated google-generativeai)
  • Simplified schema (28% reduction, 50% less nesting)
  • Comprehensive behavior extraction (ALL occurrences vs samples)
  • Direct quotes with key phrases (vs paraphrases)
  • Speaker name extraction from video thumbnails and audio
  • Per-participant behavior occurrence view in dashboard
  • No timeout on Gemini processing
  • 🔧 Fixed nested Pydantic model issues
  • 🔧 Removed unnecessary complexity (filler tracking, scores, transitions)
  • 🗑️ Removed v1 timeline visualization (replaced with filtered occurrences)

v1.0 (Initial Release)

  • Full application with utterance-by-utterance timeline
  • Complex schema with extensive metrics
  • Sample-based extraction approach

License

Internal use only - BTG Rackham Video Sales Coach


Built with Claude Code 🤖