Skip to content
diegodella1Public

About

Fullscreen web broadcast for independent music, open visual culture and source-led world news.

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SIGNAL

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

What ships

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

Architecture

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
Loading

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.

Stack

  • 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

Local development

Requirements: Node.js 22+ and pnpm 10.

cp .env.example .env.local
pnpm install
pnpm demo

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

Production-backed mode

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.

Owner workflow

  1. Import or discover Jamendo tracks in Admin → Music.
  2. Review attribution and license data before activation.
  3. Approve visually available, rights-safe imagery in Visuals.
  4. Arrange upcoming tracks in Schedule.
  5. Review scripts and sources in Editorial before generating speech or publishing.
  6. 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.

Useful commands

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 backup

Deployment

The current production target uses Docker Compose, local Supabase and a Cloudflare Tunnel.

pnpm deploy:release

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

Editorial and rights policy

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

License

No open-source license has been granted yet. Copyright © 2026 Diego Dell’Agostino. All rights reserved.

About

Fullscreen web broadcast for independent music, open visual culture and source-led world news.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages