Recommendations (.github/workflows/recs.yml)

Runs nightly at 04:15 UTC, plus workflow_dispatch. concurrency: recs means an overlapping run queues behind the current one. Three scripts run in order against the service-role Supabase client:
1

pnpm recs:stats — scripts/build-channel-stats.ts

Rolls up reactions, saves, and a 7-day watch-history window into channel_stats, including trending_score (watches_7d + 3×likes_7d + 5×hearts_7d, computed over the same 7-day window as the watch count so a channel’s long-dead popularity can’t keep it “trending” forever).
2

pnpm recs:similar — scripts/build-channel-similar.ts

Computes each channel’s top-24 nearest neighbors (src/recs/similar.ts) into channel_similar, and prunes rows left over from a prior build.
3

pnpm recs:users — scripts/build-user-recs.ts

Builds every signed-in viewer’s user_recs rows (Top picks, Because you liked/saved …, trending-by-language), one Jev call per viewer when TYPESAFE_API_KEY is set. See Recommendations for what happens when it isn’t.

Secrets

RECS_DRY_RUN

Triggering the workflow manually with its dry_run input sets RECS_DRY_RUN=1, which computes everything and logs what each script would have written without touching any table — a way to verify a change on a branch before it can affect production data.
Cost, if TYPESAFE_API_KEY is set: roughly 10k input tokens per user at 0.042/Mtok,about0.042/Mtok, about **0.0004 per user per night**. A 1,000-user nightly run costs under half a cent.

Catalog slices (.github/workflows/catalog-slices.yml)

Runs every 3 hours, plus workflow_dispatch. Builds the per-platform catalog slices and publishes them to the catalog bucket in Supabase Storage; see Catalog pipeline. Read-only checkout, no deploy.

Refresh EPG (.github/workflows/epg.yml)

Runs every 3 hours, plus workflow_dispatch. Covered in full in Catalog pipeline — the short version is a credential-free grab job (checks out the third-party iptv-org/epg grabber, pinned to a fixed commit) feeding a separate publish job that holds the Supabase service role and never touches that third-party code. It publishes the guide to Supabase Storage; it does not commit or deploy.