Audissey — Modelo de Negócio
Visão Geral
A Audissey é uma plataforma agregadora de conteúdo áudio que unifica rádios online e podcasts numa experiência única e inteligente. Posiciona-se como o hub central de consumo de áudio digital, inicialmente focado no mercado Português, com expansão planeada para Espanha e Brasil.
Diagrama do Modelo de Negócio
graph TB
%% ═══════════════════════════════════════════
%% UTILIZADORES & SEGMENTOS
%% ═══════════════════════════════════════════
subgraph USERS["👥 Segmentos de Utilizadores"]
direction LR
FREE["🆓 Utilizador Free
100 req/15min
Com publicidade"] PREMIUM["⭐ Utilizador Premium
€4.99/mês
Sem publicidade
Offline + Analytics"] RADIO_ST["📻 Estações de Rádio
Submissão de programação
Dashboard de analytics"] PODCASTER["🎙️ Podcasters
Distribuição
Métricas de audiência"] end %% ═══════════════════════════════════════════ %% PROPOSTA DE VALOR %% ═══════════════════════════════════════════ subgraph VALUE["💎 Proposta de Valor"] direction TB V1["🎯 Única app para Rádio + Podcasts"] V2["📡 5000+ rádios online
com EPG e ICY metadata"] V3["🤖 Recomendações ML
personalizadas"] V4["🔍 Pesquisa unificada
cross-content"] V5["📍 Conteúdo localizado
por geolocalização"] V6["📊 Normalização de 38
géneros e 300+ variantes"] end %% ═══════════════════════════════════════════ %% JORNADA DO UTILIZADOR %% ═══════════════════════════════════════════ subgraph JOURNEY["🗺️ Jornada do Utilizador"] direction LR J1["📱 Registo
Email / Google /
Facebook / Apple /
Magic Link"] J2["🏠 Home
Highlights
personalizados"] J3["🔍 Descoberta
Pesquisa unificada
Género / Local"] J4["▶️ Escuta
Rádio ao vivo
Episódios podcast"] J5["📋 EPG
Guia de programação
7 dias"] J6["📚 Biblioteca
Favoritos
Histórico"] J1 --> J2 --> J3 --> J4 J4 --> J5 J4 --> J6 end %% ═══════════════════════════════════════════ %% FONTES DE RECEITA %% ═══════════════════════════════════════════ subgraph REVENUE["💰 Fontes de Receita"] direction TB R1["⭐ Subscrição Premium
€4.99/mês
~€50K MRR @10K subs"] R2["📢 Publicidade Contextual
CPM €3-8
~€3-8K/mês @1M impressões"] R3["🤝 B2B / White-label
API para telcos/broadcasters
€500-2K/mês × 20 clientes"] R4["🎫 Comissões / Afiliados
Eventos, merch, hosting
10-15% sobre €50K vendas"] end %% ═══════════════════════════════════════════ %% CONTEÚDO (O QUE AGREGAMOS) %% ═══════════════════════════════════════════ subgraph CONTENT["📦 Conteúdo Agregado"] direction TB C1["📻 Rádios Online
5000+ estações
Streams ao vivo
Fallback automático"] C2["🎙️ Podcasts
Descoberta via Podcast Index
Sync RSS automático"] C3["📅 Programação EPG
Grades de 7 dias
Manual / Scraped / API"] C4["🎵 Metadados ICY
Now Playing em tempo real
Padrões de programação"] end %% ═══════════════════════════════════════════ %% INTELIGÊNCIA (ML/AI) %% ═══════════════════════════════════════════ subgraph ML["🧠 Inteligência (ML/AI)"] direction TB ML1["🏷️ Classificação de Géneros
BERT/RoBERTa
25+ géneros normalizados"] ML2["🎯 Recomendações
Collaborative filtering
Personalizado por utilizador"] ML3["📐 Embeddings
Texto: MiniLM 384-dim
Áudio: wav2vec2 768-dim"] ML4["📊 Content Features
38 géneros × 300+ variantes
ISO línguas & países"] end %% ═══════════════════════════════════════════ %% CANAIS DE DISTRIBUIÇÃO %% ═══════════════════════════════════════════ subgraph CHANNELS["📲 Canais de Distribuição"] direction LR CH1["📱 App Mobile
Flutter (Android + iOS)
3 flavors: dev/staging/prod"] CH2["🌐 API REST
NestJS Backend
Swagger documentation"] CH3["🏪 App Stores
Google Play + App Store"] CH4["🔥 Firebase
App Distribution
Testes internos"] end %% ═══════════════════════════════════════════ %% PARCEIROS CHAVE %% ═══════════════════════════════════════════ subgraph PARTNERS["🤝 Parceiros & Integrações"] direction TB P1["🔍 Podcast Index API
Descoberta de podcasts"] P2["📻 Radio Browser API
Catálogo de 5000+ rádios"] P3["📅 MyTuner API
EPG e programação"] P4["📧 SendGrid
Magic links & alertas"] P5["🔐 OAuth Providers
Google / Facebook / Apple"] P6["☁️ Azure Cloud
Infrastrutura completa"] end %% ═══════════════════════════════════════════ %% ESTRUTURA DE CUSTOS %% ═══════════════════════════════════════════ subgraph COSTS["📊 Estrutura de Custos"] direction TB COST1["☁️ Azure Infrastructure
App Services × 3 envs
Cosmos DB + Redis
Key Vault + ACR"] COST2["📧 SendGrid
Emails transacionais"] COST3["👨💻 Desenvolvimento
Equipa técnica"] COST4["📱 App Stores
Licenças developer
€25 Google + $99 Apple"] COST5["🔄 APIs Externas
Podcast Index (grátis)
Radio Browser (grátis)"] end %% ═══════════════════════════════════════════ %% MÉTRICAS CHAVE %% ═══════════════════════════════════════════ subgraph METRICS["📈 Métricas Chave (KPIs)"] direction LR M1["👥 MAU / DAU
Utilizadores ativos"] M2["⏱️ Tempo de escuta
Minutos por sessão"] M3["⭐ Conversão Premium
Free → Paid rate"] M4["📻 Catálogo
Rádios + Podcasts
indexados"] M5["🎯 Retenção
D1 / D7 / D30"] end %% ═══════════════════════════════════════════ %% CONEXÕES PRINCIPAIS %% ═══════════════════════════════════════════ USERS -->|"Usam"| VALUE VALUE -->|"Entregue via"| CHANNELS JOURNEY -->|"Monetizada"| REVENUE CONTENT -->|"Alimenta"| VALUE ML -->|"Enriquece"| VALUE PARTNERS -->|"Fornecem"| CONTENT COSTS -->|"Sustenta"| VALUE METRICS -->|"Medem"| REVENUE FREE -->|"Converte"| PREMIUM RADIO_ST -->|"Submete programação"| CONTENT PODCASTER -->|"Distribuição via"| CONTENT %% ═══════════════════════════════════════════ %% ESTILOS %% ═══════════════════════════════════════════ classDef userStyle fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,color:#1b5e20 classDef valueStyle fill:#e3f2fd,stroke:#1565c0,stroke-width:2px,color:#0d47a1 classDef revenueStyle fill:#fff3e0,stroke:#ef6c00,stroke-width:2px,color:#e65100 classDef contentStyle fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px,color:#4a148c classDef mlStyle fill:#fce4ec,stroke:#c62828,stroke-width:2px,color:#b71c1c classDef channelStyle fill:#e0f7fa,stroke:#00838f,stroke-width:2px,color:#006064 classDef partnerStyle fill:#f1f8e9,stroke:#558b2f,stroke-width:2px,color:#33691e classDef costStyle fill:#fafafa,stroke:#616161,stroke-width:2px,color:#424242 classDef metricStyle fill:#fffde7,stroke:#f9a825,stroke-width:2px,color:#f57f17 classDef journeyStyle fill:#ede7f6,stroke:#4527a0,stroke-width:2px,color:#311b92 class FREE,PREMIUM,RADIO_ST,PODCASTER userStyle class V1,V2,V3,V4,V5,V6 valueStyle class R1,R2,R3,R4 revenueStyle class C1,C2,C3,C4 contentStyle class ML1,ML2,ML3,ML4 mlStyle class CH1,CH2,CH3,CH4 channelStyle class P1,P2,P3,P4,P5,P6 partnerStyle class COST1,COST2,COST3,COST4,COST5 costStyle class M1,M2,M3,M4,M5 metricStyle class J1,J2,J3,J4,J5,J6 journeyStyle
100 req/15min
Com publicidade"] PREMIUM["⭐ Utilizador Premium
€4.99/mês
Sem publicidade
Offline + Analytics"] RADIO_ST["📻 Estações de Rádio
Submissão de programação
Dashboard de analytics"] PODCASTER["🎙️ Podcasters
Distribuição
Métricas de audiência"] end %% ═══════════════════════════════════════════ %% PROPOSTA DE VALOR %% ═══════════════════════════════════════════ subgraph VALUE["💎 Proposta de Valor"] direction TB V1["🎯 Única app para Rádio + Podcasts"] V2["📡 5000+ rádios online
com EPG e ICY metadata"] V3["🤖 Recomendações ML
personalizadas"] V4["🔍 Pesquisa unificada
cross-content"] V5["📍 Conteúdo localizado
por geolocalização"] V6["📊 Normalização de 38
géneros e 300+ variantes"] end %% ═══════════════════════════════════════════ %% JORNADA DO UTILIZADOR %% ═══════════════════════════════════════════ subgraph JOURNEY["🗺️ Jornada do Utilizador"] direction LR J1["📱 Registo
Email / Google /
Facebook / Apple /
Magic Link"] J2["🏠 Home
Highlights
personalizados"] J3["🔍 Descoberta
Pesquisa unificada
Género / Local"] J4["▶️ Escuta
Rádio ao vivo
Episódios podcast"] J5["📋 EPG
Guia de programação
7 dias"] J6["📚 Biblioteca
Favoritos
Histórico"] J1 --> J2 --> J3 --> J4 J4 --> J5 J4 --> J6 end %% ═══════════════════════════════════════════ %% FONTES DE RECEITA %% ═══════════════════════════════════════════ subgraph REVENUE["💰 Fontes de Receita"] direction TB R1["⭐ Subscrição Premium
€4.99/mês
~€50K MRR @10K subs"] R2["📢 Publicidade Contextual
CPM €3-8
~€3-8K/mês @1M impressões"] R3["🤝 B2B / White-label
API para telcos/broadcasters
€500-2K/mês × 20 clientes"] R4["🎫 Comissões / Afiliados
Eventos, merch, hosting
10-15% sobre €50K vendas"] end %% ═══════════════════════════════════════════ %% CONTEÚDO (O QUE AGREGAMOS) %% ═══════════════════════════════════════════ subgraph CONTENT["📦 Conteúdo Agregado"] direction TB C1["📻 Rádios Online
5000+ estações
Streams ao vivo
Fallback automático"] C2["🎙️ Podcasts
Descoberta via Podcast Index
Sync RSS automático"] C3["📅 Programação EPG
Grades de 7 dias
Manual / Scraped / API"] C4["🎵 Metadados ICY
Now Playing em tempo real
Padrões de programação"] end %% ═══════════════════════════════════════════ %% INTELIGÊNCIA (ML/AI) %% ═══════════════════════════════════════════ subgraph ML["🧠 Inteligência (ML/AI)"] direction TB ML1["🏷️ Classificação de Géneros
BERT/RoBERTa
25+ géneros normalizados"] ML2["🎯 Recomendações
Collaborative filtering
Personalizado por utilizador"] ML3["📐 Embeddings
Texto: MiniLM 384-dim
Áudio: wav2vec2 768-dim"] ML4["📊 Content Features
38 géneros × 300+ variantes
ISO línguas & países"] end %% ═══════════════════════════════════════════ %% CANAIS DE DISTRIBUIÇÃO %% ═══════════════════════════════════════════ subgraph CHANNELS["📲 Canais de Distribuição"] direction LR CH1["📱 App Mobile
Flutter (Android + iOS)
3 flavors: dev/staging/prod"] CH2["🌐 API REST
NestJS Backend
Swagger documentation"] CH3["🏪 App Stores
Google Play + App Store"] CH4["🔥 Firebase
App Distribution
Testes internos"] end %% ═══════════════════════════════════════════ %% PARCEIROS CHAVE %% ═══════════════════════════════════════════ subgraph PARTNERS["🤝 Parceiros & Integrações"] direction TB P1["🔍 Podcast Index API
Descoberta de podcasts"] P2["📻 Radio Browser API
Catálogo de 5000+ rádios"] P3["📅 MyTuner API
EPG e programação"] P4["📧 SendGrid
Magic links & alertas"] P5["🔐 OAuth Providers
Google / Facebook / Apple"] P6["☁️ Azure Cloud
Infrastrutura completa"] end %% ═══════════════════════════════════════════ %% ESTRUTURA DE CUSTOS %% ═══════════════════════════════════════════ subgraph COSTS["📊 Estrutura de Custos"] direction TB COST1["☁️ Azure Infrastructure
App Services × 3 envs
Cosmos DB + Redis
Key Vault + ACR"] COST2["📧 SendGrid
Emails transacionais"] COST3["👨💻 Desenvolvimento
Equipa técnica"] COST4["📱 App Stores
Licenças developer
€25 Google + $99 Apple"] COST5["🔄 APIs Externas
Podcast Index (grátis)
Radio Browser (grátis)"] end %% ═══════════════════════════════════════════ %% MÉTRICAS CHAVE %% ═══════════════════════════════════════════ subgraph METRICS["📈 Métricas Chave (KPIs)"] direction LR M1["👥 MAU / DAU
Utilizadores ativos"] M2["⏱️ Tempo de escuta
Minutos por sessão"] M3["⭐ Conversão Premium
Free → Paid rate"] M4["📻 Catálogo
Rádios + Podcasts
indexados"] M5["🎯 Retenção
D1 / D7 / D30"] end %% ═══════════════════════════════════════════ %% CONEXÕES PRINCIPAIS %% ═══════════════════════════════════════════ USERS -->|"Usam"| VALUE VALUE -->|"Entregue via"| CHANNELS JOURNEY -->|"Monetizada"| REVENUE CONTENT -->|"Alimenta"| VALUE ML -->|"Enriquece"| VALUE PARTNERS -->|"Fornecem"| CONTENT COSTS -->|"Sustenta"| VALUE METRICS -->|"Medem"| REVENUE FREE -->|"Converte"| PREMIUM RADIO_ST -->|"Submete programação"| CONTENT PODCASTER -->|"Distribuição via"| CONTENT %% ═══════════════════════════════════════════ %% ESTILOS %% ═══════════════════════════════════════════ classDef userStyle fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,color:#1b5e20 classDef valueStyle fill:#e3f2fd,stroke:#1565c0,stroke-width:2px,color:#0d47a1 classDef revenueStyle fill:#fff3e0,stroke:#ef6c00,stroke-width:2px,color:#e65100 classDef contentStyle fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px,color:#4a148c classDef mlStyle fill:#fce4ec,stroke:#c62828,stroke-width:2px,color:#b71c1c classDef channelStyle fill:#e0f7fa,stroke:#00838f,stroke-width:2px,color:#006064 classDef partnerStyle fill:#f1f8e9,stroke:#558b2f,stroke-width:2px,color:#33691e classDef costStyle fill:#fafafa,stroke:#616161,stroke-width:2px,color:#424242 classDef metricStyle fill:#fffde7,stroke:#f9a825,stroke-width:2px,color:#f57f17 classDef journeyStyle fill:#ede7f6,stroke:#4527a0,stroke-width:2px,color:#311b92 class FREE,PREMIUM,RADIO_ST,PODCASTER userStyle class V1,V2,V3,V4,V5,V6 valueStyle class R1,R2,R3,R4 revenueStyle class C1,C2,C3,C4 contentStyle class ML1,ML2,ML3,ML4 mlStyle class CH1,CH2,CH3,CH4 channelStyle class P1,P2,P3,P4,P5,P6 partnerStyle class COST1,COST2,COST3,COST4,COST5 costStyle class M1,M2,M3,M4,M5 metricStyle class J1,J2,J3,J4,J5,J6 journeyStyle
Segmentos de Utilizadores
Consumidores (B2C)
| Segmento | Descrição | Necessidade |
|---|---|---|
| Ouvinte Casual | Quer uma app única para rádio e podcasts | Simplicidade e conveniência |
| Entusiasta de Podcasts | Consumidor regular que quer descobrir novos conteúdos | Descoberta inteligente |
| Fã de Rádio | Ouvinte habitual que quer EPG e metadata | Informação em tempo real |
| Commuter | Ouve durante deslocações | Offline + streaming fiável |
Produtores de Conteúdo (B2B2C)
| Segmento | Descrição | Necessidade |
|---|---|---|
| Estações de Rádio | Querem aumentar audiência digital | Distribuição e analytics |
| Podcasters | Querem alcançar novos ouvintes | Descoberta e métricas |
Empresas (B2B)
| Segmento | Descrição | Necessidade |
|---|---|---|
| Telcos/Operadores | Querem oferecer áudio como valor acrescentado | API white-label |
| Broadcasters | Querem dados de audiência digital | Analytics e insights |
Proposta de Valor
Diferenciação Competitiva
graph LR
subgraph COMPETITORS["Concorrência Atual"]
direction TB
TUNEIN["TuneIn
Rádio focado
Sem EPG PT"] SPOTIFY["Spotify
Podcasts + Música
Sem rádio ao vivo"] APPLE_P["Apple Podcasts
Só podcasts
Sem rádio"] RADIO_PT["Rádio apps PT
Rádios individuais
Fragmentado"] end subgraph AUDISSEY_V["🎯 Audissey"] direction TB A1["✅ Rádio + Podcasts
numa só app"] A2["✅ EPG completo 7 dias
para rádios PT"] A3["✅ ICY metadata
em tempo real"] A4["✅ Pesquisa unificada
cross-content"] A5["✅ ML personalization
géneros normalizados"] A6["✅ Foco no mercado PT
conteúdo localizado"] end COMPETITORS -->|"Lacunas
de mercado"| AUDISSEY_V classDef compStyle fill:#ffcdd2,stroke:#c62828,color:#b71c1c classDef audStyle fill:#c8e6c9,stroke:#2e7d32,color:#1b5e20 class TUNEIN,SPOTIFY,APPLE_P,RADIO_PT compStyle class A1,A2,A3,A4,A5,A6 audStyle
Rádio focado
Sem EPG PT"] SPOTIFY["Spotify
Podcasts + Música
Sem rádio ao vivo"] APPLE_P["Apple Podcasts
Só podcasts
Sem rádio"] RADIO_PT["Rádio apps PT
Rádios individuais
Fragmentado"] end subgraph AUDISSEY_V["🎯 Audissey"] direction TB A1["✅ Rádio + Podcasts
numa só app"] A2["✅ EPG completo 7 dias
para rádios PT"] A3["✅ ICY metadata
em tempo real"] A4["✅ Pesquisa unificada
cross-content"] A5["✅ ML personalization
géneros normalizados"] A6["✅ Foco no mercado PT
conteúdo localizado"] end COMPETITORS -->|"Lacunas
de mercado"| AUDISSEY_V classDef compStyle fill:#ffcdd2,stroke:#c62828,color:#b71c1c classDef audStyle fill:#c8e6c9,stroke:#2e7d32,color:#1b5e20 class TUNEIN,SPOTIFY,APPLE_P,RADIO_PT compStyle class A1,A2,A3,A4,A5,A6 audStyle
A Audissey é a única plataforma que combina:
- Rádio ao vivo com EPG real para Portugal
- Podcasts com descoberta inteligente
- Metadados ICY em tempo real (now playing)
- Pesquisa unificada em todo o tipo de conteúdo áudio
- Recomendações personalizadas por ML
- Normalização de conteúdo (38 géneros, 300+ variantes, ISO)
Modelo de Receitas
Fontes de Receita Planeadas
graph TB
subgraph REVENUE_MODEL["💰 Modelo de Receitas"]
direction TB
subgraph TIER1["Subscrição Premium — €4.99/mês"]
P_FEATURES["Sem publicidade
Bitrate superior
Downloads offline
Analytics pessoais"] P_TARGET["Target: 10.000 subscribers
MRR: €50.000"] end subgraph TIER2["Publicidade Contextual"] AD_TYPES["Contextual (conteúdo)
Comportamental (histórico)
Geolocalizado
Temporal (hora do dia)"] AD_TARGET["CPM: €3-8
Target: 1M impressões/mês
Receita: €3-8K/mês"] end subgraph TIER3["B2B / White-label"] B2B_TYPES["API licensing para telcos
Dados de audiência
para broadcasters"] B2B_TARGET["€500-2K/mês × 20 clientes
MRR: €10-40K"] end subgraph TIER4["Comissões / Afiliados"] AFF_TYPES["Bilhetes de eventos
Merchandising
Podcast hosting"] AFF_TARGET["10-15% comissão
sobre €50K vendas"] end end subgraph BREAKEVEN["📊 Break-even"] BE["~200 assinantes Premium
cobrem infraestrutura Azure"] end TIER1 --> BREAKEVEN TIER2 --> BREAKEVEN TIER3 --> BREAKEVEN TIER4 --> BREAKEVEN classDef premiumStyle fill:#fff9c4,stroke:#f9a825,stroke-width:2px,color:#f57f17 classDef adStyle fill:#e1f5fe,stroke:#0288d1,color:#01579b classDef b2bStyle fill:#e8f5e9,stroke:#388e3c,color:#1b5e20 classDef affStyle fill:#fce4ec,stroke:#c62828,color:#b71c1c classDef beStyle fill:#e8eaf6,stroke:#3f51b5,stroke-width:3px,color:#1a237e class P_FEATURES,P_TARGET premiumStyle class AD_TYPES,AD_TARGET adStyle class B2B_TYPES,B2B_TARGET b2bStyle class AFF_TYPES,AFF_TARGET affStyle class BE beStyle
Bitrate superior
Downloads offline
Analytics pessoais"] P_TARGET["Target: 10.000 subscribers
MRR: €50.000"] end subgraph TIER2["Publicidade Contextual"] AD_TYPES["Contextual (conteúdo)
Comportamental (histórico)
Geolocalizado
Temporal (hora do dia)"] AD_TARGET["CPM: €3-8
Target: 1M impressões/mês
Receita: €3-8K/mês"] end subgraph TIER3["B2B / White-label"] B2B_TYPES["API licensing para telcos
Dados de audiência
para broadcasters"] B2B_TARGET["€500-2K/mês × 20 clientes
MRR: €10-40K"] end subgraph TIER4["Comissões / Afiliados"] AFF_TYPES["Bilhetes de eventos
Merchandising
Podcast hosting"] AFF_TARGET["10-15% comissão
sobre €50K vendas"] end end subgraph BREAKEVEN["📊 Break-even"] BE["~200 assinantes Premium
cobrem infraestrutura Azure"] end TIER1 --> BREAKEVEN TIER2 --> BREAKEVEN TIER3 --> BREAKEVEN TIER4 --> BREAKEVEN classDef premiumStyle fill:#fff9c4,stroke:#f9a825,stroke-width:2px,color:#f57f17 classDef adStyle fill:#e1f5fe,stroke:#0288d1,color:#01579b classDef b2bStyle fill:#e8f5e9,stroke:#388e3c,color:#1b5e20 classDef affStyle fill:#fce4ec,stroke:#c62828,color:#b71c1c classDef beStyle fill:#e8eaf6,stroke:#3f51b5,stroke-width:3px,color:#1a237e class P_FEATURES,P_TARGET premiumStyle class AD_TYPES,AD_TARGET adStyle class B2B_TYPES,B2B_TARGET b2bStyle class AFF_TYPES,AFF_TARGET affStyle class BE beStyle
Estado Atual de Implementação
| Receita | Estado | Detalhe |
|---|---|---|
| Premium | 🟡 Schema preparado | isPremium e subscriptionExpiry no User model, rate limiting diferenciado |
| Publicidade | 🔴 Não iniciado | Sem integração de ads |
| B2B API | 🟡 Parcialmente pronto | API REST pública com Swagger, falta licensing |
| Comissões | 🔴 Não iniciado | Sem integração de afiliados |
Conteúdo Agregado
Pipeline de Ingestão
graph LR
subgraph SOURCES["🌐 Fontes Externas"]
RB["Radio Browser API
5000+ estações"] PI["Podcast Index API
Milhões de podcasts"] MT["MyTuner API
Programação EPG"] ICY["ICY Streams
Metadata real-time"] end subgraph WORKER["⚙️ Worker (BullMQ)"] direction TB W1["03:00 — Sync Rádios
1 job, rate 1/min"] W2["04:00 — Sync EPG
1 job, rate 1/min"] W3["05:00 — Sync Podcasts
1 job, rate 1/min"] W4["06:00 — Sync Episódios
2 jobs, rate 5/min"] W5["Contínuo — ICY Collector
Metadata streams ao vivo"] W6["Diário — Stream Validator
Testa URLs e fallback"] end subgraph STORAGE["💾 Base de Dados"] DB_R["📻 Rádios
5000+ registos"] DB_P["🎙️ Podcasts
Catálogo indexado"] DB_E["📋 Episódios
RSS sincronizado"] DB_S["📅 Programação
EPG 7 dias"] DB_I["🎵 ICY History
Now playing logs"] DB_CF["📊 Content Features
Metadata normalizada"] end RB --> W1 --> DB_R PI --> W3 --> DB_P PI --> W4 --> DB_E MT --> W2 --> DB_S ICY --> W5 --> DB_I DB_R --> DB_CF DB_P --> DB_CF DB_E --> DB_CF classDef sourceStyle fill:#e3f2fd,stroke:#1565c0,color:#0d47a1 classDef workerStyle fill:#fff3e0,stroke:#ef6c00,color:#e65100 classDef dbStyle fill:#e8f5e9,stroke:#2e7d32,color:#1b5e20 class RB,PI,MT,ICY sourceStyle class W1,W2,W3,W4,W5,W6 workerStyle class DB_R,DB_P,DB_E,DB_S,DB_I,DB_CF dbStyle
5000+ estações"] PI["Podcast Index API
Milhões de podcasts"] MT["MyTuner API
Programação EPG"] ICY["ICY Streams
Metadata real-time"] end subgraph WORKER["⚙️ Worker (BullMQ)"] direction TB W1["03:00 — Sync Rádios
1 job, rate 1/min"] W2["04:00 — Sync EPG
1 job, rate 1/min"] W3["05:00 — Sync Podcasts
1 job, rate 1/min"] W4["06:00 — Sync Episódios
2 jobs, rate 5/min"] W5["Contínuo — ICY Collector
Metadata streams ao vivo"] W6["Diário — Stream Validator
Testa URLs e fallback"] end subgraph STORAGE["💾 Base de Dados"] DB_R["📻 Rádios
5000+ registos"] DB_P["🎙️ Podcasts
Catálogo indexado"] DB_E["📋 Episódios
RSS sincronizado"] DB_S["📅 Programação
EPG 7 dias"] DB_I["🎵 ICY History
Now playing logs"] DB_CF["📊 Content Features
Metadata normalizada"] end RB --> W1 --> DB_R PI --> W3 --> DB_P PI --> W4 --> DB_E MT --> W2 --> DB_S ICY --> W5 --> DB_I DB_R --> DB_CF DB_P --> DB_CF DB_E --> DB_CF classDef sourceStyle fill:#e3f2fd,stroke:#1565c0,color:#0d47a1 classDef workerStyle fill:#fff3e0,stroke:#ef6c00,color:#e65100 classDef dbStyle fill:#e8f5e9,stroke:#2e7d32,color:#1b5e20 class RB,PI,MT,ICY sourceStyle class W1,W2,W3,W4,W5,W6 workerStyle class DB_R,DB_P,DB_E,DB_S,DB_I,DB_CF dbStyle
Inteligência (ML/AI)
Componentes ML
| Componente | Tecnologia | Função | Estado |
|---|---|---|---|
| Genre Classifier | BERT/RoBERTa | Classificação multi-label em 25+ géneros | 🟡 Scaffolded |
| Recommendation Model | Collaborative filtering | Recomendações personalizadas | 🟡 Scaffolded |
| Embedding Model | MiniLM (texto) + wav2vec2 (áudio) | Similaridade 384/768-dim | 🟡 Scaffolded |
| Content Features | NestJS normalizer | 38 géneros, ISO línguas/países | ✅ Implementado |
Pipeline ML (Planeado)
graph LR
RAW["📦 Raw Content
Rádios + Podcasts
+ Episódios"] CF["📊 Content Features
38 géneros normalizados
ISO metadata"] EMB["📐 Embeddings
Texto: 384-dim
Áudio: 768-dim"] CLASS["🏷️ Genre Classifier
BERT multi-label"] REC["🎯 Recommendations
Collaborative filtering
Per-user"] API_OUT["📱 App
Highlights personalizados
Pesquisa inteligente"] RAW --> CF --> EMB --> CLASS EMB --> REC CLASS --> API_OUT REC --> API_OUT classDef rawStyle fill:#ffccbc,stroke:#bf360c,color:#bf360c classDef processStyle fill:#e1bee7,stroke:#7b1fa2,color:#4a148c classDef outStyle fill:#c8e6c9,stroke:#2e7d32,color:#1b5e20 class RAW rawStyle class CF,EMB,CLASS,REC processStyle class API_OUT outStyle
Rádios + Podcasts
+ Episódios"] CF["📊 Content Features
38 géneros normalizados
ISO metadata"] EMB["📐 Embeddings
Texto: 384-dim
Áudio: 768-dim"] CLASS["🏷️ Genre Classifier
BERT multi-label"] REC["🎯 Recommendations
Collaborative filtering
Per-user"] API_OUT["📱 App
Highlights personalizados
Pesquisa inteligente"] RAW --> CF --> EMB --> CLASS EMB --> REC CLASS --> API_OUT REC --> API_OUT classDef rawStyle fill:#ffccbc,stroke:#bf360c,color:#bf360c classDef processStyle fill:#e1bee7,stroke:#7b1fa2,color:#4a148c classDef outStyle fill:#c8e6c9,stroke:#2e7d32,color:#1b5e20 class RAW rawStyle class CF,EMB,CLASS,REC processStyle class API_OUT outStyle
Jornada Completa do Utilizador
graph TB
subgraph ACQUISITION["📲 Aquisição"]
ACQ1["App Store / Google Play"]
ACQ2["Firebase App Distribution
(testes internos)"] ACQ3["Referrals / Word-of-mouth"] end subgraph ONBOARDING["🎯 Onboarding"] ON1["Registo / Login"] ON2["Email + Password"] ON3["Google OAuth"] ON4["Facebook Login"] ON5["Apple Sign-In"] ON6["Magic Link
(passwordless via SendGrid)"] ON1 --> ON2 & ON3 & ON4 & ON5 & ON6 end subgraph ENGAGEMENT["▶️ Engagement"] ENG1["🏠 Home Highlights
Personalizado por:
• Hora do dia
• Localização
• Histórico"] ENG2["📻 Rádio ao Vivo
Stream + Fallback
ICY Now Playing"] ENG3["🎙️ Podcasts
Descoberta + Escuta
Episódios + RSS"] ENG4["📅 EPG
Guia 7 dias
Ao vivo agora"] ENG5["🔍 Pesquisa
Unificada cross-content
Rádios + Podcasts + Episódios"] end subgraph RETENTION["📚 Retenção"] RET1["⭐ Favoritos
Rádios guardadas"] RET2["📖 Histórico
Escutas recentes"] RET3["🔔 Notificações
Programas favoritos"] RET4["📊 Analytics Pessoais
(Premium)"] end subgraph MONETIZATION["💰 Monetização"] MON1["🆓 Free Tier
Com publicidade
100 req/15min"] MON2["⭐ Premium
€4.99/mês
Sem ads + Offline"] end ACQUISITION --> ONBOARDING --> ENGAGEMENT ENGAGEMENT --> RETENTION RETENTION --> MONETIZATION MON1 -->|"Upgrade"| MON2 classDef acqStyle fill:#e3f2fd,stroke:#1565c0,color:#0d47a1 classDef onbStyle fill:#ede7f6,stroke:#4527a0,color:#311b92 classDef engStyle fill:#e8f5e9,stroke:#2e7d32,color:#1b5e20 classDef retStyle fill:#fff3e0,stroke:#ef6c00,color:#e65100 classDef monStyle fill:#fff9c4,stroke:#f9a825,color:#f57f17 class ACQ1,ACQ2,ACQ3 acqStyle class ON1,ON2,ON3,ON4,ON5,ON6 onbStyle class ENG1,ENG2,ENG3,ENG4,ENG5 engStyle class RET1,RET2,RET3,RET4 retStyle class MON1,MON2 monStyle
(testes internos)"] ACQ3["Referrals / Word-of-mouth"] end subgraph ONBOARDING["🎯 Onboarding"] ON1["Registo / Login"] ON2["Email + Password"] ON3["Google OAuth"] ON4["Facebook Login"] ON5["Apple Sign-In"] ON6["Magic Link
(passwordless via SendGrid)"] ON1 --> ON2 & ON3 & ON4 & ON5 & ON6 end subgraph ENGAGEMENT["▶️ Engagement"] ENG1["🏠 Home Highlights
Personalizado por:
• Hora do dia
• Localização
• Histórico"] ENG2["📻 Rádio ao Vivo
Stream + Fallback
ICY Now Playing"] ENG3["🎙️ Podcasts
Descoberta + Escuta
Episódios + RSS"] ENG4["📅 EPG
Guia 7 dias
Ao vivo agora"] ENG5["🔍 Pesquisa
Unificada cross-content
Rádios + Podcasts + Episódios"] end subgraph RETENTION["📚 Retenção"] RET1["⭐ Favoritos
Rádios guardadas"] RET2["📖 Histórico
Escutas recentes"] RET3["🔔 Notificações
Programas favoritos"] RET4["📊 Analytics Pessoais
(Premium)"] end subgraph MONETIZATION["💰 Monetização"] MON1["🆓 Free Tier
Com publicidade
100 req/15min"] MON2["⭐ Premium
€4.99/mês
Sem ads + Offline"] end ACQUISITION --> ONBOARDING --> ENGAGEMENT ENGAGEMENT --> RETENTION RETENTION --> MONETIZATION MON1 -->|"Upgrade"| MON2 classDef acqStyle fill:#e3f2fd,stroke:#1565c0,color:#0d47a1 classDef onbStyle fill:#ede7f6,stroke:#4527a0,color:#311b92 classDef engStyle fill:#e8f5e9,stroke:#2e7d32,color:#1b5e20 classDef retStyle fill:#fff3e0,stroke:#ef6c00,color:#e65100 classDef monStyle fill:#fff9c4,stroke:#f9a825,color:#f57f17 class ACQ1,ACQ2,ACQ3 acqStyle class ON1,ON2,ON3,ON4,ON5,ON6 onbStyle class ENG1,ENG2,ENG3,ENG4,ENG5 engStyle class RET1,RET2,RET3,RET4 retStyle class MON1,MON2 monStyle
Modelo de Dados (Entidades Chave)
erDiagram
USER ||--o{ FAVORITE : "tem favoritos"
USER ||--o{ LISTENING_HISTORY : "histórico"
USER }|--|| SUBSCRIPTION : "subscrição"
RADIO ||--o{ RADIO_SCHEDULE : "programação"
RADIO ||--o{ RADIO_PROGRAM : "programas"
RADIO ||--o{ ICY_HISTORY : "now playing"
RADIO ||--o{ CONTENT_FEATURES : "metadata ML"
PODCAST ||--o{ EPISODE : "episódios"
PODCAST ||--o{ CONTENT_FEATURES : "metadata ML"
EPISODE ||--o{ CONTENT_FEATURES : "metadata ML"
USER {
string email
string name
int age
string preferredLanguage
string timezone
boolean isPremium
date subscriptionExpiry
string googleSub
string facebookId
string appleSub
array favoriteRadioIds
int tokenVersion
}
RADIO {
string radioId
string name
string url
string urlResolved
array alternativeUrls
string country
array genres
string codec
int bitrate
float geoLat
float geoLong
string nowPlaying
int clickCount
}
PODCAST {
string podcastIndexId
string title
string author
string feedUrl
string artwork
array categories
string language
int episodeCount
float rating
float trendingScore
boolean featured
}
EPISODE {
string podcastId
string title
int duration
string enclosureUrl
int episodeNumber
int seasonNumber
int plays
int likes
}
RADIO_SCHEDULE {
string radioId
json programs
string timezone
enum source
}
CONTENT_FEATURES {
enum contentType
string contentId
array normalizedGenres
string isoLanguage
string isoCountry
array textEmbedding
array audioEmbedding
json popularityMetrics
}
Mercado & Expansão
Roadmap Geográfico
| Fase | Mercado | Timeline | Estratégia |
|---|---|---|---|
| 1 — Lançamento | 🇵🇹 Portugal | MVP | Rádios PT + Podcasts PT/EN |
| 2 — Expansão Ibérica | 🇪🇸 Espanha | Q3 2026 | Rádios ES + conteúdo espanhol |
| 3 — Lusofonia | 🇧🇷 Brasil | Q4 2026+ | Maior mercado lusófono |
Vantagem Competitiva por Mercado
- Portugal: Nenhum agregador combina rádio + podcast com EPG real
- Espanha: Mercado fragmentado entre TuneIn, iVoox, e apps individuais
- Brasil: Mercado enorme (215M) com poucos agregadores focados em rádio local
Estrutura de Custos
Custos Fixos Mensais (Estimativa)
| Item | Custo Estimado | Notas |
|---|---|---|
| Azure App Services (3 envs) | ~€100-300/mês | B1/B2 plans |
| Azure Cosmos DB | ~€50-200/mês | Serverless/autoscale |
| Azure Cache for Redis | ~€30-80/mês | C0/C1 tiers |
| Azure Key Vault | ~€5/mês | Per-operation |
| Azure Container Registry | ~€5/mês | Basic tier |
| SendGrid | ~€0-15/mês | Free/Essentials |
| Apple Developer Program | $99/ano (~€8/mês) | Obrigatório para iOS |
| Google Play Developer | €25 (único) | One-time fee |
| Total Estimado | ~€200-600/mês | Depende do tier |
Break-even
~200 assinantes Premium a €4.99/mês ≈ €998/mês — cobre toda a infraestrutura com margem.
Resumo Executivo
| Dimensão | Detalhe |
|---|---|
| Produto | Plataforma unificada de rádio online + podcasts |
| Mercado Inicial | Portugal (5M+ ouvintes de rádio, 2M+ de podcasts) |
| Diferenciação | Única app que combina rádio ao vivo + podcasts + EPG + ML |
| Modelo de Receita | Freemium (€4.99/mês) + Ads + B2B + Afiliados |
| Break-even | ~200 subs Premium |
| Tecnologia | Flutter + NestJS + Python ML + Azure Cloud |
| Estado | MVP com API funcional, ingestão automática, auth completo, app mobile em desenvolvimento |
| Próximos Passos | ML models training, Premium billing, Beta launch PT |