Training Videos System

Two-repo product for delivering branded training-video libraries to G&M clients. WordPress plugin (the product) phones home daily to a registry tab on the G&M Maintenance Portal (the operator side).

Repos

Plugin ericdowns/gm-training-videos~/Projects/gm-training-videos/
Portal (registry tab + license endpoints) ericdowns/gm-maintenance~/Projects/gm-maintenance/
Plugin master CLAUDE.md ~/Projects/gm-training-videos/CLAUDE.md
Plugin architecture (canonical system overview) ~/Projects/gm-training-videos/docs/ARCHITECTURE.md
Portal CLAUDE.md ~/Projects/gm-maintenance/CLAUDE.md
Portal Training Videos integration doc ~/Projects/gm-maintenance/docs/TRAINING-VIDEOS.md

Production URLs

Service URL
Plugin GitHub https://github.com/ericdowns/gm-training-videos
Plugin Releases https://github.com/ericdowns/gm-training-videos/releases
Portal admin tab https://maintenance.grainandmortar.com/admin/training-videos
Heartbeat endpoint POST https://maintenance.grainandmortar.com/api/training-videos/heartbeat
License validate endpoint POST https://maintenance.grainandmortar.com/api/training-videos/license/validate

Local dev site (plugin)

Local Path /Users/edowns/Local Sites/gm-training-videos-dev/app/public/wp-content/plugins/training-videos (symlink → master repo)
Local URL http://gm-training-videos-dev.local
WP admin admin / admin

Project Status

2026-04-28 — v1.4.x stack shipped: onboarding wizard, auto-updates, license + heartbeat, central registry

Major release wave. Five point-releases tonight closed the major architectural cards:

Portal side (gm-maintenance PR #3, merged): TrainingVideosSite + TrainingVideosHeartbeat Prisma models, POST /api/training-videos/heartbeat, POST /api/training-videos/license/validate, /admin/training-videos tab with license management UI. Schema applied via prisma db push. Endpoints verified live in prod.

End-to-end smoke-tested: heartbeats from 3 test sites land in the registry, license validate returns the right {valid, tier, expires_at} for active / wrong-key / unknown-site / expired / revoked paths. Admin dashboard renders correctly.

Cards closed: plugin #4 (brand theming), plugin #5 (Loom paste-list — deferred folder enum to #29), plugin #9 (license/heartbeat plugin side), plugin #10 (moved to portal as #2), plugin #11 (releases + update flow), portal #2 (registry server side).

Open: plugin #29 (folder enum, blocked needs-decision on cookie-vs-proxy), plugin #26 (Flywheel prod for demo site, blocked needs-credential).

Status: Live and operational. Plugin auto-updates pull from GitHub Releases. Heartbeat + license live at maintenance.grainandmortar.com/api/training-videos/*. Existing client installs (older versions in docs/SITES.md) will need a one-time cp -r to ≥v1.4.4 before they self-update from there.


2026-04-27 — v1.3.x stack: theme-independent CSS + Loom integration

Pre-license-system polish. Self-contained styles so plugin renders correctly on any client theme. Loom oEmbed integration for descriptions + thumbnails. Header/footer redesigns.

Status: Foundation ready for v1.4 architecture work.


Open Cards (across both repos)

Repo # Title State
gm-training-videos #26 Spin up Flywheel production for demo site blocked, needs-credential
gm-training-videos #29 Loom folder-URL enumeration (deferred from v1.4.0) blocked, needs-decision

Docs

File Purpose
(this file) Status timeline + cross-repo index

(For implementation docs see the two repos' docs/ folders — paths above.)