SIGNAL is a full-screen web broadcast for independent music, open visual culture and short, source-led world news. It behaves like a television channel: one continuous schedule, no navigation inside the player, no links over the image, and no speech over music.
Live: signal.diegodella.ar
- Continuous, boundary-safe music playback with recovery and Media Session support.
- A 16:9 visual layer that shows the complete artwork, with a soft extended backdrop when the source ratio differs.
- Permanent music and image credits in a restrained television HUD.
- Relevant world-news ranking, deduplication, publisher diversity and explicit source labels.
- Rotating live weather for eight major cities and seven USD reference FX rates.
- An authenticated owner console for music, schedule, visuals, editorial review, news cadence, voice, prompts and delivery style.
- OpenAI-generated editorial scripts and speech with structured-output validation, verbatim checks, cached audio and human publishing gates.
- Durable background jobs, audit logs, rights gates, rate limits and graceful demo fallbacks.
flowchart LR
J[Jamendo] --> I[Provider ingestion]
M[The Met / AIC / NASA] --> I
N[UN / BBC / France 24 / Al Jazeera] --> I
I --> P[(PostgreSQL)]
P --> S[Scheduler + editorial jobs]
O[OpenAI] --> S
S --> B[(Supabase Storage)]
P --> A[Next.js App Router]
B --> A
A --> TV[Fullscreen player]
A --> ADM[Owner console]
W[Open-Meteo + Frankfurter] --> A
The application is a Next.js modular monolith. Server components render the initial station state; route handlers expose a narrow JSON API; Prisma owns transactional scheduling and editorial state; a separate cron container invokes idempotent internal jobs.
- Next.js 16, React 19 and TypeScript
- PostgreSQL and Prisma 7
- Supabase Storage
- OpenAI Responses, Chat Completions audio and Speech APIs
- Docker Compose
- Vitest and Playwright
Requirements: Node.js 22+ and pnpm 10.
cp .env.example .env.local
pnpm install
pnpm demoOpen http://localhost:3000. Demo mode is fully offline: it uses synthetic tones, original vector visuals and an in-memory admin catalog. It never labels fixtures as provider content.
Populate .env.local from .env.production.example, then configure:
| Setting | Purpose |
|---|---|
DATABASE_URL |
PostgreSQL connection using the signal schema |
SUPABASE_* |
Cached editorial audio storage |
JAMENDO_CLIENT_ID |
Licensed music discovery and import |
OPENAI_API_KEY |
Editorial generation and speech |
NEWS_FEEDS_JSON |
Reviewed RSS/Atom world-news sources |
ADMIN_PASSWORD_HASH |
Argon2id owner credential; never plaintext |
CRON_SECRET |
Internal job authentication |
Never commit .env.local, .env.production or .signal-admin-password; all are ignored.
- Import or discover Jamendo tracks in Admin → Music.
- Review attribution and license data before activation.
- Approve visually available, rights-safe imagery in Visuals.
- Arrange upcoming tracks in Schedule.
- Review scripts and sources in Editorial before generating speech or publishing.
- Tune the global news cadence and configure model, prompts, voices and delivery instructions in Voice & style.
Changing a prompt or voice creates a new configuration revision. Existing reviewed scripts and cached audio stay immutable; the new settings apply to later generations.
pnpm verify # lint, types, unit/integration tests, production build
pnpm test:e2e # phone, tablet and desktop browser flows
pnpm prisma:validate
pnpm music:discover
pnpm music:import -- 12345,67890
pnpm visuals:import -- MET "photography" 25
pnpm schedule:refresh
pnpm providers:smoke
pnpm backupThe current production target uses Docker Compose, local Supabase and a Cloudflare Tunnel.
pnpm deploy:releaseThe release script builds immutable app/migration images, applies Prisma migrations, seeds idempotent fixtures, prepares storage, refreshes the schedule, recreates app and cron containers, and runs a production smoke test. Operational details live in docs/operations.md.
- Music does not activate without source, license and credit metadata.
- Visuals do not air without an allowed rights status, review and a verified image response.
- High-sensitivity editorial items require stronger corroboration.
- AI speech is disclosed and cannot bypass the verbatim transcript guard.
- The public player uses no account, microphone, precise location, fingerprint or cross-site identity.
Provider terms and individual asset rights still require human review. Code-level gates are not legal advice.
No open-source license has been granted yet. Copyright © 2026 Diego Dell’Agostino. All rights reserved.