2026In productionWork

FAST Channel Operations

For a European media company I built the operations center of its FAST channel, on air across 12 markets: catalog, scheduling, asset delivery to the distributor and multi-source analytics in one platform, with automated daily ingestion and playout publishing from the product itself.

My contribution
I designed and built the channel operations platform, with automated ingestion and playout publishing.
Who it serves
Programming and operations teams at a European media company.
Scope
Channel on air across 12 markets. Three daily pipelines connect catalog, scheduling and analytics.

Interactive replica

A navigable replica of the platform's modes with fictional data: same layout, same logic, no real data.

Platform pillars (replica)

By Channel · channel aggregates · consumption by hour of day

The programming question is at what hour the channel gets watched. Each bar is an hour; the line is the channel average. Anything above it is a slot that performs; anything below is filler time.

HOV (h)
1,994
Sessions
1,568
Ad imp.
4,210
Airings
255
MUH · peak hour: 20h. channel average: 38.40003060912151820MUH · peak hour21channel average

The peak sits in primetime and the average leaves out almost the whole overnight. The same title performs differently at 3am and at 9pm.

Hour × day map

The same signal crossed by weekday shows where and when consumption happens.

Hour × day map: HOV0003060912151821MonMon · 00:00 · HOV 7Mon · 01:00 · HOV 5Mon · 02:00 · HOV 4Mon · 03:00 · HOV 3Mon · 04:00 · HOV 3Mon · 05:00 · HOV 5Mon · 06:00 · HOV 8Mon · 07:00 · HOV 14Mon · 08:00 · HOV 22Mon · 09:00 · HOV 28Mon · 10:00 · HOV 32Mon · 11:00 · HOV 37Mon · 12:00 · HOV 40Mon · 13:00 · HOV 38Mon · 14:00 · HOV 35Mon · 15:00 · HOV 40Mon · 16:00 · HOV 47Mon · 17:00 · HOV 57Mon · 18:00 · HOV 69Mon · 19:00 · HOV 83Mon · 20:00 · HOV 90Mon · 21:00 · HOV 86Mon · 22:00 · HOV 55Mon · 23:00 · HOV 24TueTue · 00:00 · HOV 7Tue · 01:00 · HOV 4Tue · 02:00 · HOV 3Tue · 03:00 · HOV 3Tue · 04:00 · HOV 3Tue · 05:00 · HOV 4Tue · 06:00 · HOV 8Tue · 07:00 · HOV 14Tue · 08:00 · HOV 21Tue · 09:00 · HOV 27Tue · 10:00 · HOV 31Tue · 11:00 · HOV 35Tue · 12:00 · HOV 38Tue · 13:00 · HOV 36Tue · 14:00 · HOV 34Tue · 15:00 · HOV 38Tue · 16:00 · HOV 45Tue · 17:00 · HOV 54Tue · 18:00 · HOV 66Tue · 19:00 · HOV 79Tue · 20:00 · HOV 86Tue · 21:00 · HOV 82Tue · 22:00 · HOV 52Tue · 23:00 · HOV 23WedWed · 00:00 · HOV 7Wed · 01:00 · HOV 5Wed · 02:00 · HOV 4Wed · 03:00 · HOV 3Wed · 04:00 · HOV 3Wed · 05:00 · HOV 5Wed · 06:00 · HOV 8Wed · 07:00 · HOV 14Wed · 08:00 · HOV 22Wed · 09:00 · HOV 28Wed · 10:00 · HOV 32Wed · 11:00 · HOV 37Wed · 12:00 · HOV 40Wed · 13:00 · HOV 38Wed · 14:00 · HOV 35Wed · 15:00 · HOV 40Wed · 16:00 · HOV 47Wed · 17:00 · HOV 57Wed · 18:00 · HOV 69Wed · 19:00 · HOV 83Wed · 20:00 · HOV 90Wed · 21:00 · HOV 86Wed · 22:00 · HOV 55Wed · 23:00 · HOV 24ThuThu · 00:00 · HOV 8Thu · 01:00 · HOV 5Thu · 02:00 · HOV 4Thu · 03:00 · HOV 3Thu · 04:00 · HOV 3Thu · 05:00 · HOV 5Thu · 06:00 · HOV 9Thu · 07:00 · HOV 15Thu · 08:00 · HOV 23Thu · 09:00 · HOV 29Thu · 10:00 · HOV 34Thu · 11:00 · HOV 39Thu · 12:00 · HOV 42Thu · 13:00 · HOV 40Thu · 14:00 · HOV 37Thu · 15:00 · HOV 42Thu · 16:00 · HOV 49Thu · 17:00 · HOV 60Thu · 18:00 · HOV 73Thu · 19:00 · HOV 87Thu · 20:00 · HOV 95Thu · 21:00 · HOV 90Thu · 22:00 · HOV 58Thu · 23:00 · HOV 26FriFri · 00:00 · HOV 8Fri · 01:00 · HOV 5Fri · 02:00 · HOV 4Fri · 03:00 · HOV 3Fri · 04:00 · HOV 3Fri · 05:00 · HOV 5Fri · 06:00 · HOV 9Fri · 07:00 · HOV 17Fri · 08:00 · HOV 25Fri · 09:00 · HOV 33Fri · 10:00 · HOV 38Fri · 11:00 · HOV 43Fri · 12:00 · HOV 46Fri · 13:00 · HOV 44Fri · 14:00 · HOV 41Fri · 15:00 · HOV 46Fri · 16:00 · HOV 55Fri · 17:00 · HOV 66Fri · 18:00 · HOV 81Fri · 19:00 · HOV 97Fri · 20:00 · HOV 105Fri · 21:00 · HOV 100Fri · 22:00 · HOV 64Fri · 23:00 · HOV 28SatSat · 00:00 · HOV 9Sat · 01:00 · HOV 6Sat · 02:00 · HOV 5Sat · 03:00 · HOV 4Sat · 04:00 · HOV 4Sat · 05:00 · HOV 6Sat · 06:00 · HOV 11Sat · 07:00 · HOV 19Sat · 08:00 · HOV 28Sat · 09:00 · HOV 37Sat · 10:00 · HOV 42Sat · 11:00 · HOV 48Sat · 12:00 · HOV 52Sat · 13:00 · HOV 50Sat · 14:00 · HOV 46Sat · 15:00 · HOV 52Sat · 16:00 · HOV 61Sat · 17:00 · HOV 74Sat · 18:00 · HOV 91Sat · 19:00 · HOV 109Sat · 20:00 · HOV 118Sat · 21:00 · HOV 112Sat · 22:00 · HOV 72Sat · 23:00 · HOV 32SunSun · 00:00 · HOV 9Sun · 01:00 · HOV 6Sun · 02:00 · HOV 4Sun · 03:00 · HOV 3Sun · 04:00 · HOV 3Sun · 05:00 · HOV 6Sun · 06:00 · HOV 10Sun · 07:00 · HOV 18Sun · 08:00 · HOV 27Sun · 09:00 · HOV 35Sun · 10:00 · HOV 40Sun · 11:00 · HOV 46Sun · 12:00 · HOV 49Sun · 13:00 · HOV 47Sun · 14:00 · HOV 44Sun · 15:00 · HOV 49Sun · 16:00 · HOV 58Sun · 17:00 · HOV 71Sun · 18:00 · HOV 86Sun · 19:00 · HOV 103Sun · 20:00 · HOV 112Sun · 21:00 · HOV 106Sun · 22:00 · HOV 68Sun · 23:00 · HOV 30
More case contextCase overview, data architecture and product decisions.

Case overview

The operations center of a live linear TV channel: one product covers the full cycle (catalog, grid planning, asset delivery to the distributor and multi-source analytics), with automated daily ingestion and playout publishing from the platform itself.

Modes
Assets DB, Scheduler, MAM and Analytics (+Admin)
Sources
FAST distributor, YouTube/BigQuery, FAST TV platform measurement and CRM
Ingestion
3 daily n8n pipelines over authorized read-only access
Status
Channel on air since Jul 2026 across 12 markets

Data architecture

Three daily n8n pipelines ingest the sources over authorized read-only access. Supabase is the canonical database: versioned SQL scoring lives there. The platform reads server-side and publishes to the playout via the Executor.

Data architectureSOURCESFAST distributorreportsYouTube · BigQueryFAST TV platformmeasurementCRM (editorial catalog)n8n3 daily pipelinesauthorizedaccessdaily snapshotSupabasecanonical DB + SQL scoringidempotentupsertsread-only syncNext.js platform(Railway)server-side reads(RBAC)Executor(assisted publishing)Distributorplayoutsavedplansupervisedpublishing

Case decisions

Model

The platform follows the channel's factory flow: the catalog feeds the Scheduler, the MAM delivers assets to the distributor and Analytics closes the loop by measuring real performance. All of it runs on a shared layer of roles, security and versioned configuration.

On-air execution

The Executor takes the saved plan and publishes it to the distributor's playout in an assisted, supervised way, as one continuous chain with no gaps or overlaps. It adds a prior simulation and read-only verification of what actually aired.

From the spreadsheet to the platform

The scheduler started as a Google Sheets workflow, with a live content base in a spreadsheet and an Apps Script (auto_grid) that built the grid. When the platform centralized the channel it absorbed that workflow as one more mode, and today the saved plan is the grid's source of truth.

Privacy

The public case shows architecture, logic and product decisions with anonymized data: no company or vendor names, no real titles, credentials or financial metrics. Scale figures are real.

Facets

Tools

Next.js + TypeScript
the web platform: mode rail, server-side RBAC and every view's rendering
Supabase (Postgres)
canonical database: catalog, grid, versioned SQL scoring, matviews and audited RLS
n8n
3 daily pipelines ingesting distributor reports, YouTube/BigQuery and FAST TV platform measurement over authorized access
BigQuery
the channel's YouTube universe and perpetuity metrics feeding the tiers
Executor
assisted, supervised publishing of the grid to the distributor's playout, with prior simulation
Python
imports/exports CLI, syncs (CRM, BigQuery) and the database loading engine
Railway
production deploy with auto-deploy from main
Google Sheets + Apps Script
the Scheduler's genesis with a live spreadsheet base and automatic grid (auto_grid) before being absorbed as a mode