thomascassidyzm/ssi-dashboard-v7

1

stars

5,670

commits

JavaScript

primary language

Sep 11, 2026

updated

ssi-dashboard-v7.vercel.app

README

SSi Course Production Dashboard v14.0.0 (Popty)

APML v14.0: Course Builder Consolidation

Overview

Course production dashboard for SSi language learning system. Content lives in Supabase, audio files in S3.

v14.0 Features:

  • Course Builder API: Single endpoint replaces Phases 0-3
  • Methodology by example: Agent learns from Welsh/Spanish patterns
  • Atomic validation: Tiling, ZUT, vocabulary, phrase counts in one call
  • Database-first: All content in Supabase, no JSON files
  • Audio pipeline: Phase 8 (TTS) + Phase 9 (manifest) unchanged
  • QA workflow with sample flagging and real-time status
  • Support for TTS (primary) and human recordings (edge-case languages)

Quick Start

npm install
cp .env.example .env   # Configure environment variables
npm run dev            # Frontend (port 5173)

Environment Variables

# .env
SUPABASE_URL=https://xxxxx.supabase.co
SUPABASE_SERVICE_KEY=sb_secret_xxxxx

# AWS S3 (for course files and audio storage)
AWS_ACCESS_KEY_ID=xxxxx
AWS_SECRET_ACCESS_KEY=xxxxx
AWS_REGION=eu-west-1

Architecture

Data Flow (APML v14.0)

┌─────────────────────────────────────────────────────────────────┐
│                    v14 COURSE PRODUCTION PIPELINE                │
└─────────────────────────────────────────────────────────────────┘

Content Creation: Course Builder API (Port 3471)
────────────────────────────────────────────────
Agent reads brief → POST /api/seed/complete for each seed → Supabase

┌──────────────────────────────────────┐
│  For each seed:                      │
│    1. Translate seed to target lang  │
│    2. Decompose into LEGOs (peda-    │
│       gogical order, not sentence)   │
│    3. Generate practice phrases      │
│    4. POST to /api/seed/complete     │
│                                      │
│  API validates atomically:           │
│    - Tiling (seed = LEGO assembly)   │
│    - ZUT conflicts                   │
│    - Vocabulary constraints          │
│    - Phrase progression              │
└──────────────────────────────────────┘
       ↓
   Supabase (course_seeds, course_legos, course_practice_phrases)

Audio Generation: Phase 8 (Port 3465)
─────────────────────────────────────
Supabase content → TTS generation → S3 upload → course_audio table

Manifest Compilation: Phase 9 (Port 3466)
─────────────────────────────────────────
course_audio → 100% coverage check → course_manifest.json

S3 Storage

S3 (ssi-audio-stage)
    └── courses/{course_code}/
         ├── lego_pairs.json      (Phase 2 output - SSoT)
         ├── lego_baskets.json    (Phase 3 output - SSoT)
         └── course_manifest.json (Phase 9 output)

S3 (ssiborg-assets)
    └── mastered/{uuid}.mp3       (all audio files)

Supabase Schema

Tables:
├── voices              # TTS and human voice registry
├── audio_samples       # Master Audio Registry (MAR)
├── course_audio_usage  # Which courses use which audio
├── sample_flags        # QA workflow state
├── recording_provenance # Human recording metadata
└── courses             # Course configuration

Pipeline (APML v14.0)

ServicePortDescription
Course Builder3471Content creation (replaces Phase 1-3)
Audio Generator3465TTS generation → Supabase + S3
Manifest Compiler3466Compile manifest from Supabase
Production API3470QA workflow + WebSocket
Orchestrator3456Proxy hub for all services

Course Builder handles:

  • Translation (seed → target language)
  • LEGO extraction (pedagogical order)
  • Conflict resolution (ZUT validation)
  • Basket generation (phrase build-up)

Deprecated (v13): Phase 1 (3457), Phase 2 (3458), Phase 3 (3459)

API Endpoints

MethodEndpointDescription
GET/api/coursesList all courses (from S3)
GET/api/courses/:code/files/:filenameGet course file (proxy to S3)
POST/api/courses/:code/outputsSave phase outputs to S3

Phase 8 Audio Generator (port 3465)

MethodEndpointDescription
POST/generateStart audio generation
GET/status/:courseCodeCheck job status
GET/healthHealth check

Phase 9 Manifest Compiler (port 3466)

MethodEndpointDescription
POST/compileCompile manifest from Supabase
GET/validate/:courseCodeValidate audio coverage
GET/healthHealth check

Services (systemd)

PM2 is gone (2026-07-30 to 2026-08-07 migration, docs/DECISIONS.md "orchestrator off pm2, onto systemd" — ecosystem.config.cjs no longer exists and pm2 manages nothing). Services run as per-user systemd units, prefixed popty-, watched by a cron watchdog:

systemctl --user list-units 'popty-*'
systemctl --user status popty-orchestrator.service
ServicePortDescriptionStatus
orchestrator3456Main proxy hubActive
course-builder3471Content creation APIActive
phase8-audio3465Audio generation (Supabase)Active
phase9-manifest3466Manifest compilation (Supabase)Active
production-api3470QA workflow + WebSocketActive
phase1-translation3457Translation serverDeprecated
phase2-conflict3458Conflict resolutionDeprecated
phase3-baskets3459Basket generationDeprecated

Build & Deploy

npm run build
vercel --prod

Data Sources

DataOwnerLocation
SeedsCourse BuilderSupabase: course_seeds
LEGOsCourse BuilderSupabase: course_legos
PhrasesCourse BuilderSupabase: course_practice_phrases
Audio metadataPhase 8Supabase: course_audio
Audio filesPhase 8S3: mastered/{uuid}.mp3
ManifestPhase 9S3: courses/{code}/course_manifest.json
QA flagsProduction APISupabase: sample_flags

Deprecated (JSON files): lego_pairs.json, lego_baskets.json - data now in Supabase

Tech Stack

  • Vue 3 (Composition API)
  • Vite
  • Tailwind CSS 4
  • Express (API)
  • Supabase (audio registry, QA workflow)
  • AWS SDK v3 (S3)

Version: 14.0.0 APML: v14.0 (Course Builder Consolidation) Pipeline: v3.0 (Course Builder + Supabase) S3 Bucket: ssi-audio-stage (eu-west-1) Date: 2026-01-15

Contributors

thomascassidyzm

5,069 commits

claude

407 commits

kai-saraceno

170 commits

thomascassidyzm/ssi-dashboard-v7

1

stars

5,670

commits

JavaScript

primary language

Sep 11, 2026

updated

ssi-dashboard-v7.vercel.app

README

SSi Course Production Dashboard v14.0.0 (Popty)

APML v14.0: Course Builder Consolidation

Overview

Course production dashboard for SSi language learning system. Content lives in Supabase, audio files in S3.

v14.0 Features:

  • Course Builder API: Single endpoint replaces Phases 0-3
  • Methodology by example: Agent learns from Welsh/Spanish patterns
  • Atomic validation: Tiling, ZUT, vocabulary, phrase counts in one call
  • Database-first: All content in Supabase, no JSON files
  • Audio pipeline: Phase 8 (TTS) + Phase 9 (manifest) unchanged
  • QA workflow with sample flagging and real-time status
  • Support for TTS (primary) and human recordings (edge-case languages)

Quick Start

npm install
cp .env.example .env   # Configure environment variables
npm run dev            # Frontend (port 5173)

Environment Variables

# .env
SUPABASE_URL=https://xxxxx.supabase.co
SUPABASE_SERVICE_KEY=sb_secret_xxxxx

# AWS S3 (for course files and audio storage)
AWS_ACCESS_KEY_ID=xxxxx
AWS_SECRET_ACCESS_KEY=xxxxx
AWS_REGION=eu-west-1

Architecture

Data Flow (APML v14.0)

┌─────────────────────────────────────────────────────────────────┐
│                    v14 COURSE PRODUCTION PIPELINE                │
└─────────────────────────────────────────────────────────────────┘

Content Creation: Course Builder API (Port 3471)
────────────────────────────────────────────────
Agent reads brief → POST /api/seed/complete for each seed → Supabase

┌──────────────────────────────────────┐
│  For each seed:                      │
│    1. Translate seed to target lang  │
│    2. Decompose into LEGOs (peda-    │
│       gogical order, not sentence)   │
│    3. Generate practice phrases      │
│    4. POST to /api/seed/complete     │
│                                      │
│  API validates atomically:           │
│    - Tiling (seed = LEGO assembly)   │
│    - ZUT conflicts                   │
│    - Vocabulary constraints          │
│    - Phrase progression              │
└──────────────────────────────────────┘
       ↓
   Supabase (course_seeds, course_legos, course_practice_phrases)

Audio Generation: Phase 8 (Port 3465)
─────────────────────────────────────
Supabase content → TTS generation → S3 upload → course_audio table

Manifest Compilation: Phase 9 (Port 3466)
─────────────────────────────────────────
course_audio → 100% coverage check → course_manifest.json

S3 Storage

S3 (ssi-audio-stage)
    └── courses/{course_code}/
         ├── lego_pairs.json      (Phase 2 output - SSoT)
         ├── lego_baskets.json    (Phase 3 output - SSoT)
         └── course_manifest.json (Phase 9 output)

S3 (ssiborg-assets)
    └── mastered/{uuid}.mp3       (all audio files)

Supabase Schema

Tables:
├── voices              # TTS and human voice registry
├── audio_samples       # Master Audio Registry (MAR)
├── course_audio_usage  # Which courses use which audio
├── sample_flags        # QA workflow state
├── recording_provenance # Human recording metadata
└── courses             # Course configuration

Pipeline (APML v14.0)

ServicePortDescription
Course Builder3471Content creation (replaces Phase 1-3)
Audio Generator3465TTS generation → Supabase + S3
Manifest Compiler3466Compile manifest from Supabase
Production API3470QA workflow + WebSocket
Orchestrator3456Proxy hub for all services

Course Builder handles:

  • Translation (seed → target language)
  • LEGO extraction (pedagogical order)
  • Conflict resolution (ZUT validation)
  • Basket generation (phrase build-up)

Deprecated (v13): Phase 1 (3457), Phase 2 (3458), Phase 3 (3459)

API Endpoints

MethodEndpointDescription
GET/api/coursesList all courses (from S3)
GET/api/courses/:code/files/:filenameGet course file (proxy to S3)
POST/api/courses/:code/outputsSave phase outputs to S3

Phase 8 Audio Generator (port 3465)

MethodEndpointDescription
POST/generateStart audio generation
GET/status/:courseCodeCheck job status
GET/healthHealth check

Phase 9 Manifest Compiler (port 3466)

MethodEndpointDescription
POST/compileCompile manifest from Supabase
GET/validate/:courseCodeValidate audio coverage
GET/healthHealth check

Services (systemd)

PM2 is gone (2026-07-30 to 2026-08-07 migration, docs/DECISIONS.md "orchestrator off pm2, onto systemd" — ecosystem.config.cjs no longer exists and pm2 manages nothing). Services run as per-user systemd units, prefixed popty-, watched by a cron watchdog:

systemctl --user list-units 'popty-*'
systemctl --user status popty-orchestrator.service
ServicePortDescriptionStatus
orchestrator3456Main proxy hubActive
course-builder3471Content creation APIActive
phase8-audio3465Audio generation (Supabase)Active
phase9-manifest3466Manifest compilation (Supabase)Active
production-api3470QA workflow + WebSocketActive
phase1-translation3457Translation serverDeprecated
phase2-conflict3458Conflict resolutionDeprecated
phase3-baskets3459Basket generationDeprecated

Build & Deploy

npm run build
vercel --prod

Data Sources

DataOwnerLocation
SeedsCourse BuilderSupabase: course_seeds
LEGOsCourse BuilderSupabase: course_legos
PhrasesCourse BuilderSupabase: course_practice_phrases
Audio metadataPhase 8Supabase: course_audio
Audio filesPhase 8S3: mastered/{uuid}.mp3
ManifestPhase 9S3: courses/{code}/course_manifest.json
QA flagsProduction APISupabase: sample_flags

Deprecated (JSON files): lego_pairs.json, lego_baskets.json - data now in Supabase

Tech Stack

  • Vue 3 (Composition API)
  • Vite
  • Tailwind CSS 4
  • Express (API)
  • Supabase (audio registry, QA workflow)
  • AWS SDK v3 (S3)

Version: 14.0.0 APML: v14.0 (Course Builder Consolidation) Pipeline: v3.0 (Course Builder + Supabase) S3 Bucket: ssi-audio-stage (eu-west-1) Date: 2026-01-15

Contributors

thomascassidyzm

5,069 commits

claude

407 commits

kai-saraceno

170 commits

Languages

JavaScript

76.4%

Vue

18.2%

HTML

1.7%

TypeScript

1.6%