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.
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.