Faça upload do seu podcast ou cole um link do YouTube. Receba conteúdo otimizado para 6 redes sociais automaticamente.
Criadores de podcast afogados em trabalho de pós-produção
Você passou horas gravando, editando e produzindo seu podcast. Agora precisa:
- Escrever posts para 6 plataformas diferentes
- Criar títulos e descrições atraentes
- Gerar timestamps para YouTube
- Encontrar os melhores momentos para clips
- Escrever legendas e hashtags
Este app faz tudo isso em segundos.
Workflow completo de IA do upload ao conteúdo multi-plataforma
Não é apenas transcrição. Não é apenas resumos. É um sistema completo de distribuição de conteúdo alimentado por IA que entende seu podcast e cria conteúdo personalizado para cada plataforma.
Processamento paralelo de IA com Inngest (5x mais rápido que sequencial)
Em vez de esperar 5 minutos para tarefas de IA rodarem uma por uma, executamos 6 jobs de geração simultaneamente. Seu conteúdo fica pronto em ~90 segundos.
Pense nele como sua redação de IA para conteúdo de podcast.
Explicação simples:
- Você faz upload de um arquivo de áudio (seu episódio de podcast) ou cola um link do YouTube
- A IA analisa seu conteúdo, entendendo speakers, tópicos e momentos-chave
- Você recebe um pacote completo de distribuição:
- Resumo com insights principais
- Posts para Twitter, LinkedIn, Instagram, TikTok, YouTube e Facebook
- Sugestões de títulos (curtos, longos, otimizados para SEO)
- Hashtags específicas por plataforma
- Timestamps de capítulos para YouTube
- Momentos-chave para clips virais
- Transcrição completa com identificação de speakers
O workflow: Gravar → Upload (ou YouTube) → IA Analisa → Receber Conteúdo
Sem escrita manual. Sem copiar e colar entre plataformas. Sem adivinhar quais hashtags funcionam.
- Next.js 16 - Server actions, app router, API routes e streaming
- Bancos Real-time - Convex para atualizações instantâneas sem polling
- Integrações de IA - OpenAI, AssemblyAI e prompt engineering
- Background Jobs - Inngest para workflows duráveis e observáveis
- Auth & Billing Modernos - Clerk com gestão de assinaturas
- Deploy em Produção - Vercel, variáveis de ambiente e monitoramento
- 🎬 Suporte a YouTube - Cole um link do YouTube e extraia transcrição automaticamente (sem precisar de áudio!)
- 📝 Resumo com IA - Visão geral completa com bullets, insights principais e TL;DR
- 📱 Posts para Redes Sociais - Conteúdo otimizado para 6 plataformas:
- Twitter - 280 caracteres, direto e engajador
- LinkedIn - Tom profissional, thought leadership
- Instagram - Ganchos visuais com perguntas de engajamento
- TikTok - Casual, trend-aware, Gen-Z friendly
- YouTube - Descrição com CTAs e timestamps
- Facebook - Focado em comunidade, iniciadores de conversa
- 🎯 Sugestões de Títulos - 4 estilos diferentes para cada uso:
- YouTube Curto (chamativo, menos de 60 chars)
- YouTube Longo (descritivo, SEO-friendly)
- Títulos de Podcast (focado no episódio)
- Keywords SEO (descobribilidade)
- #️⃣ Hashtags - Tags específicas por plataforma otimizadas para alcance
- ⏱️ Timestamps YouTube - Marcadores de capítulo gerados automaticamente
- 🎤 Momentos-Chave - IA identifica oportunidades de clips virais com timestamps
- 👥 Diarização de Speakers - "Quem disse o quê" com labels e scores de confiança
- ⚡ Processamento Paralelo - 6 jobs de IA rodam simultaneamente (60s total vs 300s sequencial)
- 🔄 Atualizações Real-time - Veja progresso ao vivo com Convex subscriptions (sem polling)
- 🛡️ Workflows Duráveis - Inngest faz retry automático de steps falhos (sem perda de trabalho)
- 📊 Feature Gating por Plano - Features desbloqueiam baseado no tier (Free/Pro/Ultra)
- 🎨 Suporte Dark Mode - UI bonita que adapta à sua preferência
- 📦 Type-safe End-to-End - TypeScript completo com validação Zod
- 🔐 Seguro por Padrão - Autenticação Clerk com segurança row-level
| Feature | FREE | PRO ($29/mês) | ULTRA ($69/mês) |
|---|---|---|---|
| Projetos | 3 lifetime | 30/mês | Ilimitado |
| Tamanho Arquivo | 10 MB | 200 MB | 3 GB |
| Duração Máxima | 10 min | 2 horas | Ilimitado |
| Resumo IA | ✓ | ✓ | ✓ |
| Posts Sociais | ✗ | ✓ | ✓ |
| Títulos & Hashtags | ✗ | ✓ | ✓ |
| Timestamps YouTube | ✗ | ✗ | ✓ |
| Momentos-Chave | ✗ | ✗ | ✓ |
| Transcrição Completa | ✗ | ✗ | ✓ |
| Diarização de Speakers | ✗ | ✗ | ✓ |
Este projeto usa LLM Features (não agentes). Cada função faz uma chamada única ao GPT-5-mini com prompt especializado e retorna dados estruturados.
flowchart TB
subgraph Input["📥 Entrada"]
TRANSCRIPT[Transcrição do Podcast<br/>YouTube ou AssemblyAI]
end
subgraph Orchestrator["⚙️ Orquestrador Inngest"]
PROCESSOR[podcast-processor.ts<br/>Promise.allSettled]
end
subgraph LLMFeatures["🤖 LLM Features - GPT-5-mini"]
direction TB
subgraph Free["🆓 Plano Free"]
SUMMARY[summary.ts<br/>Resumo Completo]
end
subgraph Pro["⭐ Plano Pro"]
SOCIAL[social-posts.ts<br/>Posts 6 Redes]
TITLES[titles.ts<br/>Sugestões de Títulos]
HASHTAGS[hashtags.ts<br/>Hashtags por Plataforma]
end
subgraph Ultra["👑 Plano Ultra"]
MOMENTS[key-moments.ts<br/>Momentos Virais]
TIMESTAMPS[youtube-timestamps.ts<br/>Capítulos YouTube]
end
end
subgraph Output["💾 Saída"]
CONVEX[(Convex Database)]
UI[Dashboard Real-time]
end
TRANSCRIPT --> PROCESSOR
PROCESSOR --> SUMMARY
PROCESSOR --> SOCIAL
PROCESSOR --> TITLES
PROCESSOR --> HASHTAGS
PROCESSOR --> MOMENTS
PROCESSOR --> TIMESTAMPS
SUMMARY --> CONVEX
SOCIAL --> CONVEX
TITLES --> CONVEX
HASHTAGS --> CONVEX
MOMENTS --> CONVEX
TIMESTAMPS --> CONVEX
CONVEX --> UI
style Free fill:#10b981,stroke:#059669,color:#fff
style Pro fill:#3b82f6,stroke:#2563eb,color:#fff
style Ultra fill:#8b5cf6,stroke:#7c3aed,color:#fff
flowchart LR
subgraph summary["📝 summary.ts"]
S_IN[Transcrição + Capítulos] --> S_PROMPT[System: Especialista em resumos<br/>User: Texto + contexto]
S_PROMPT --> S_LLM[GPT-5-mini<br/>zodResponseFormat]
S_LLM --> S_OUT[full, bullets, insights, tldr]
end
subgraph social["📱 social-posts.ts"]
SO_IN[Transcrição] --> SO_PROMPT[System: Social media expert<br/>User: Conteúdo + plataformas]
SO_PROMPT --> SO_LLM[GPT-5-mini<br/>zodResponseFormat]
SO_LLM --> SO_OUT[twitter, linkedin, instagram<br/>tiktok, youtube, facebook]
end
subgraph titles["🎯 titles.ts"]
T_IN[Transcrição] --> T_PROMPT[System: Copywriter expert<br/>User: Conteúdo + estilos]
T_PROMPT --> T_LLM[GPT-5-mini<br/>zodResponseFormat]
T_LLM --> T_OUT[youtube_short, youtube_long<br/>podcast, seo_keywords]
end
subgraph hashtags["#️⃣ hashtags.ts"]
H_IN[Transcrição + Tópicos] --> H_PROMPT[System: Growth expert<br/>User: Tópicos + plataformas]
H_PROMPT --> H_LLM[GPT-5-mini<br/>zodResponseFormat]
H_LLM --> H_OUT[twitter, linkedin, instagram<br/>tiktok, youtube]
end
subgraph moments["⚡ key-moments.ts"]
M_IN[Transcrição + Timestamps] --> M_PROMPT[System: Video editor<br/>User: Conteúdo + timing]
M_PROMPT --> M_LLM[GPT-5-mini<br/>zodResponseFormat]
M_LLM --> M_OUT[timestamp, title, description<br/>viral_potential]
end
subgraph timestamps["⏱️ youtube-timestamps.ts"]
YT_IN[Transcrição + Capítulos] --> YT_PROMPT[System: YouTube expert<br/>User: Capítulos + timing]
YT_PROMPT --> YT_LLM[GPT-5-mini<br/>zodResponseFormat]
YT_LLM --> YT_OUT[time, title, description]
end
| Aspecto | LLM Feature (usado aqui) | Agente |
|---|---|---|
| Chamadas | 1 chamada por feature | Múltiplas chamadas iterativas |
| Decisões | Nenhuma - prompt fixo | Decide próximos passos |
| Ferramentas | Não usa | Usa ferramentas externas |
| Custo | Baixo e previsível | Alto e variável |
| Latência | ~5-10s por feature | Minutos |
| Controle | Total - output estruturado | Menos previsível |
Vantagem: Execução paralela de 6 features em ~60 segundos total.
flowchart TB
subgraph Frontend["🖥️ Frontend"]
NEXTJS[Next.js 16<br/>App Router + Server Actions]
REACT[React 19<br/>Components + Hooks]
TAILWIND[Tailwind CSS<br/>Styling + Dark Theme]
end
subgraph Auth["🔐 Autenticação"]
CLERK[Clerk<br/>Auth + Billing + Plans]
end
subgraph Database["💾 Banco de Dados"]
CONVEX[Convex<br/>Real-time Database]
BLOB[Vercel Blob<br/>File Storage]
end
subgraph Orchestration["⚙️ Orquestração"]
INNGEST[Inngest<br/>Durable Workflows]
end
subgraph AI["🤖 Inteligência Artificial"]
OPENAI[OpenAI GPT-5<br/>Content Generation]
ASSEMBLYAI[AssemblyAI<br/>Audio Transcription]
end
subgraph YouTube["🎬 YouTube"]
PYTHON[Python Service<br/>Flask + youtube-transcript-api]
end
subgraph Deploy["🚀 Deploy"]
VERCEL[Vercel<br/>Hosting + Edge]
end
%% Conexões
NEXTJS --> CLERK
NEXTJS --> CONVEX
NEXTJS --> BLOB
NEXTJS --> INNGEST
NEXTJS --> PYTHON
CLERK --> |"JWT Token"| NEXTJS
CONVEX --> |"Real-time Updates"| REACT
INNGEST --> ASSEMBLYAI
INNGEST --> OPENAI
INNGEST --> CONVEX
PYTHON --> |"Transcript"| INNGEST
NEXTJS --> VERCEL
style Frontend fill:#1e293b,stroke:#10b981,color:#fff
style Auth fill:#1e293b,stroke:#3b82f6,color:#fff
style Database fill:#1e293b,stroke:#f97316,color:#fff
style Orchestration fill:#1e293b,stroke:#a855f7,color:#fff
style AI fill:#1e293b,stroke:#14b8a6,color:#fff
style YouTube fill:#1e293b,stroke:#ef4444,color:#fff
style Deploy fill:#1e293b,stroke:#6366f1,color:#fff
sequenceDiagram
participant U as 👤 Usuário
participant N as Next.js
participant C as Clerk
participant B as Vercel Blob
participant P as Python Service
participant I as Inngest
participant A as AssemblyAI
participant O as OpenAI
participant D as Convex
U->>N: Upload áudio ou YouTube URL
N->>C: Verifica autenticação
C-->>N: ✅ Autorizado
alt Upload de Áudio
N->>B: Salva arquivo
B-->>N: URL do arquivo
N->>I: Evento podcast/uploaded
I->>A: Transcreve áudio
A-->>I: Transcrição
else Link do YouTube
N->>P: Extrai transcrição
P-->>N: Transcrição + metadata
N->>I: Evento podcast/uploaded (com transcript)
Note over I: Pula AssemblyAI
end
par Geração Paralela
I->>O: Gera Resumo
I->>O: Gera Posts Sociais
I->>O: Gera Títulos
I->>O: Gera Hashtags
end
O-->>I: Conteúdo gerado
I->>D: Salva resultados
D-->>U: 🔄 Atualização real-time
flowchart TD
A[Usuário faz Upload do Áudio ou Cola Link YouTube] --> B{Tipo de Input}
B -->|Áudio| C[Arquivo salvo no Vercel Blob]
B -->|YouTube| D[Python Service extrai transcrição]
C --> E[Evento Inngest Disparado]
D --> E
E --> F[Status: Processando]
F -->|Áudio| G[Transcrição AssemblyAI]
F -->|YouTube| H[Usa transcrição já extraída]
G --> I[Geração de Conteúdo IA Paralela]
H --> I
I --> J[Resultados Salvos no Convex]
J --> K[Status: Completo]
K --> L[Usuário Visualiza Dashboard]
L --> M[Atualizações Real-time via Convex]
Notas de Performance:
- Transcrição (Áudio): ~30-60 segundos via AssemblyAI
- Transcrição (YouTube): ~2-5 segundos (extração direta)
- Geração de Conteúdo IA (paralela): ~60 segundos
- Tempo Total de Processamento: ~90-120 segundos (áudio) ou ~60-70 segundos (YouTube)
flowchart TD
A[Transcrição AssemblyAI Completa] --> B{Fan-out para Jobs Paralelos}
B --> C[Gerar Resumo]
B --> D[Gerar Posts Sociais]
B --> E[Gerar Títulos]
B --> F[Gerar Hashtags]
B --> G[Gerar Timestamps YouTube]
B --> H[Gerar Momentos-Chave]
C --> I[Juntar Todos Resultados]
D --> I
E --> I
F --> I
G --> I
H --> I
I --> J[Salvar no Convex Database]
J --> K[UI Atualiza em Real-time]
Por Que Isso Importa:
- Sequencial: 6 jobs × 50s cada = ~300 segundos (5 minutos)
- Paralelo: Todos jobs rodam simultaneamente = ~60 segundos
- Resultado: 5x mais rápido
flowchart LR
A[Upload Cliente] --> B[Next.js API Route]
B --> C[Clerk Auth Check]
C --> D[Vercel Blob Storage]
D --> E[Evento Inngest]
E --> F[Transcrição AssemblyAI]
E --> G[Geração Conteúdo OpenAI]
F --> H[Convex Database]
G --> H
H --> I[Subscription Real-time]
I --> J[Atualização Dashboard]
Antes de começar, certifique-se de ter:
- Node.js 18+ e pnpm instalados
- Contas criadas para todos os serviços (veja seção de Configuração abaixo)
- Git para controle de versão
- Um editor de código (VS Code recomendado)
- Clone o repositório
git clone https://github.com/cienciadosdados/podcast.git
cd podcast- Instale as dependências
pnpm install- Configure as variáveis de ambiente
cp .env.example .env.localPreencha todas as chaves necessárias no .env.local (veja seção Variáveis de Ambiente abaixo).
- Inicie os serviços de desenvolvimento (3 terminais)
Terminal 1 - Serviço Python (YouTube):
cd python-service
python -m venv venv
venv\Scripts\activate # Windows
# source venv/bin/activate # Linux/Mac
pip install flask youtube-transcript-api requests flask-cors
python app.pyTerminal 2 - Next.js + Convex:
pnpm devTerminal 3 - Inngest Dev Server:
npx inngest-cli@latest dev- Abra seu navegador
Navegue para http://localhost:3000
URLs dos serviços:
- App: http://localhost:3000
- Python Service: http://localhost:5000
- Inngest Dashboard: http://localhost:8288
Crie um arquivo .env.local na raiz do projeto com as seguintes variáveis:
# Convex
CONVEX_DEPLOYMENT=dev:ai-podcast-saas-inngest-coderabbit-clerk
NEXT_PUBLIC_CONVEX_URL=https://your-project.convex.cloud
# Clerk
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_...
CLERK_SECRET_KEY=sk_test_...
CLERK_JWT_ISSUER_DOMAIN=your-domain.clerk.accounts.dev
# Vercel Blob
BLOB_READ_WRITE_TOKEN=vercel_blob_...
# Assembly AI
ASSEMBLYAI_API_KEY=...
# OpenAI
OPENAI_API_KEY=sk-proj-...
# Inngest
INNGEST_EVENT_KEY=...
INNGEST_SIGNING_KEY=signkey-prod-...
# YouTube Service (opcional - para desenvolvimento local)
YOUTUBE_SERVICE_URL=http://localhost:5000Notas de Segurança:
⚠️ NUNCA faça commit do.env.localno controle de versão- ✅ Use
.env.examplecomo template (seguro para commit) - 🔑 Variáveis com prefixo
NEXT_PUBLIC_são expostas ao browser - 🔒 Outras variáveis são apenas server-side
- Acesse Clerk Dashboard
- Crie uma nova aplicação
- Copie suas chaves publishable e secret para
.env.local - Habilite Billing:
- Vá em "Billing" → "Subscriptions"
- Crie três planos:
free,pro,ultra - Defina preços: Free ($0), Pro ($29/mês), Ultra ($69/mês)
- Configure Features (use estes identificadores):
summary(Free, Pro, Ultra)social_posts(Pro, Ultra)titles(Pro, Ultra)hashtags(Pro, Ultra)youtube_timestamps(Ultra only)key_moments(Ultra only)speaker_diarization(Ultra only)
- Acesse Convex Dashboard
- Crie um novo projeto
- Copie a URL de deployment para
.env.local - O schema será auto-deployed quando rodar
pnpm convex dev
- Acesse Vercel Dashboard
- Crie um novo projeto (ou use existente)
- Vá em "Storage" → "Create Database" → "Blob"
- Copie o
BLOB_READ_WRITE_TOKENpara.env.local
- Acesse Inngest Dashboard
- Crie um novo app
- Copie Event Key e Signing Key para
.env.local - IMPORTANTE: Use o domínio de Settings → Domains do Vercel (não URLs de deployment)
- Em desenvolvimento, Inngest auto-descobre suas funções
- Acesse AssemblyAI Dashboard
- Crie uma conta (tier gratuito disponível)
- Copie sua API key para
.env.local - Preço:
$0.00025/segundo ($0.65 por hora de áudio)
- Acesse OpenAI Platform
- Crie uma API key
- Adicione créditos à sua conta (pay-as-you-go)
- Copie sua API key para
.env.local - Modelo Usado: GPT-5-mini (~$0.05 por episódio de podcast)
O serviço Python é necessário apenas para desenvolvimento local da feature de YouTube.
- Instale Python 3.8+
- Navegue para
python-service/ - Crie um ambiente virtual e instale dependências:
python -m venv venv
venv\Scripts\activate # Windows
pip install flask youtube-transcript-api requests flask-cors- Execute:
python app.py - O serviço estará disponível em
http://localhost:5000
Nota: Para produção, o serviço Python precisa ser hospedado separadamente (Railway, Render, etc.)
Antes de fazer upload do primeiro podcast, verifique:
- Todas variáveis de ambiente configuradas no
.env.local - Serviço Python rodando (
python app.pyna pastapython-service/) - Next.js + Convex rodando (
pnpm dev) - Inngest Dev Server rodando (
npx inngest-cli@latest dev) - Aplicação Clerk configurada com planos de billing
- Você consegue acessar o app em
http://localhost:3000 - Teste upload com arquivo pequeno (menos de 10MB) ou link do YouTube
Toda a aplicação gira em torno de uma única tabela projects no Convex. Esta estrutura denormalizada permite atualizações atômicas e reatividade em tempo real.
Campos Principais:
| Campo | Tipo | Descrição |
|---|---|---|
userId |
string | Clerk user ID (vincula projeto ao usuário) |
inputUrl |
string | URL Vercel Blob do arquivo uploaded |
status |
enum | uploaded → processing → completed ou failed |
jobStatus |
object | Status granular para transcription e contentGeneration |
transcript |
object | Transcrição completa com segmentos, speakers, capítulos |
summary |
object | Resumo gerado por IA com bullets, insights, TLDR |
socialPosts |
object | Posts específicos por plataforma (Twitter, LinkedIn, etc.) |
titles |
object | Sugestões de títulos (YouTube, podcast, SEO) |
hashtags |
object | Recomendações de hashtags por plataforma |
youtubeTimestamps |
array | Marcadores de capítulo para descrições YouTube |
keyMoments |
array | Oportunidades de clips virais com timestamps |
Decisões de Design:
- Estrutura denormalizada - Todos dados em um documento para atualizações atômicas
- Campos opcionais - Permitem população progressiva conforme jobs Inngest completam
- Indexes - Otimizam queries por usuário, status e data de criação
- Reatividade real-time - Subscriptions Convex disparam atualizações de UI automaticamente
Indexes:
by_user- Lista todos projetos de um usuárioby_status- Filtra por status de processamentoby_user_and_status- Projetos ativos/completos do usuárioby_created_at- Ordena por mais recente
- Push seu código para GitHub
git add .
git commit -m "Initial commit"
git push origin main- Importe para Vercel
- Acesse Vercel Dashboard
- Clique "Import Project"
- Selecione seu repositório GitHub
- Vercel auto-detecta Next.js
- Adicione variáveis de ambiente
No dashboard Vercel → Settings → Environment Variables, adicione todas variáveis do seu .env.local
- Deploy
Vercel faz deploy automaticamente a cada push para main
- Configure domínio customizado (opcional)
Settings → Domains → Adicione seu domínio
npx vercel --prodSiga os prompts para fazer deploy.
Após fazer deploy em produção:
- Todas variáveis de ambiente configuradas no dashboard Vercel
- Ambiente de produção do Inngest configurado (separado do dev)
- Instância de produção do Clerk conectada
- Atualizar
NEXT_PUBLIC_APP_URLpara sua URL de produção - Testar upload em produção com arquivo pequeno
- Monitorar dashboard Inngest para erros de workflow
- Verificar logs Vercel para erros de runtime
Fique de olho nestes dashboards:
- Inngest Dashboard - Logs de execução, tentativas de retry, falhas
- Convex Dashboard - Queries de banco, métricas de performance, conexões real-time
- Vercel Analytics - Tráfego, page views, performance de edge functions
- Clerk Dashboard - Signups de usuários, assinaturas ativas, eventos de billing
Problema: Não consegue conectar ao banco Convex
Solução:
# Certifique-se que o Convex dev server está rodando em terminal separado
pnpm convex devProblema: Upload retorna erro 400 ou 500
Solução:
- Verifique se Vercel Blob está habilitado nas configurações do projeto
- Confirme que
BLOB_READ_WRITE_TOKENestá correto - Verifique console do browser para erros de CORS
Problema: Arquivo faz upload mas processamento nunca inicia
Solução:
- Verifique
INNGEST_EVENT_KEYeINNGEST_SIGNING_KEYno.env.local - Confirme que Inngest dev server está conectado (veja logs no terminal)
- Certifique-se que rota
/api/inngestestá acessível - IMPORTANTE: Use o domínio de Settings → Domains do Vercel (não URLs de deployment)
Problema: Usuário faz upload mas não vê no dashboard
Solução:
- Verifique se Clerk
userIdcorresponde aouserIddo projeto no banco - Confirme que Convex provider envolve seu app em
app/layout.tsx - Verifique console do browser para erros de conexão Convex
Problema: Dashboard não atualiza automaticamente durante processamento
Solução:
- Certifique-se que
ConvexProviderenvolve seu app - Confirme que está usando
useQuery(nãofetchQuery) para dados reativos - Verifique dashboard Convex para problemas de conexão
Problema: Preso em redirect infinito após sign in
Solução:
- Verifique se
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEYestá correto - Confira URLs de redirect corretas no dashboard Clerk
- Limpe cookies do browser e tente novamente
Problema: Usuários não conseguem fazer upgrade ou limites não são aplicados
Solução:
- Configure planos no dashboard Clerk com identificadores corretos:
free,pro,ultra - Certifique-se que identificadores de features correspondem ao
tier-config.ts - Verifique configuração de webhook Clerk para eventos de subscription
Problema: Projeto travado em status "processing"
Solução:
- Verifique dashboard Inngest para logs de erro
- Confirme que
OPENAI_API_KEYé válida e tem créditos - Verifique página de status da API OpenAI para outages
Problema: Step de transcrição falha imediatamente
Solução:
- Verifique se
ASSEMBLYAI_API_KEYé válida - Confirme que formato do arquivo é suportado (MP3, MP4, WAV, etc.)
- Certifique-se que URL do arquivo é publicamente acessível
- Verifique dashboard AssemblyAI para limites de quota
Problema: Usuários free veem features Pro/Ultra
Solução:
- Verifique se configuração de planos Clerk corresponde ao
tier-config.ts - Confira lógica de detecção de plano em
lib/tier-utils.ts - Certifique-se que função
hasé chamada corretamente nas API routes
Quer evoluir este projeto? Aqui estão algumas features avançadas que você pode construir:
- 📄 Exportar para PDF/Google Doc - Gerar relatórios PDF bonitos com todo conteúdo
- 📅 Agendamento de Redes Sociais - Integração com Buffer ou Hootsuite para auto-posting
- 🌍 Suporte Multi-idioma - Transcrever e traduzir para 10+ idiomas
- 🎨 Presets de Tom de IA - Permitir usuários definir voz da marca para geração IA
- 📦 Processamento em Lote - Upload de 10 episódios, processar todos durante a noite
- 🎥 Geração de Video Clips - Criar automaticamente video clips dos momentos-chave
- 📊 Dashboard de Analytics - Rastrear qual conteúdo performa melhor em cada plataforma
- 🧠 Fine-tuning - Treinar GPT no estilo específico do podcast do usuário
- 💬 Prompts Customizados - Permitir usuários escreverem seus próprios templates por plataforma
- 😊 Análise de Sentimento - Tagar automaticamente momentos como engraçados, insightful, controversos
- A/B Testing - Gerar múltiplas variações de título e rastrear qual performa melhor
- 🔍 Recomendações de Conteúdo - "Baseado neste episódio, você deveria falar sobre..."
- ☁️ Cloudflare R2 - Migrar do Vercel Blob para storage mais barato a longo prazo
- ⚡ Redis Caching - Cache de projetos e transcrições frequentemente acessados
- 🪝 Notificações Webhook - Alertar usuários via email/SMS quando processamento completa
- 🔧 Worker Service Separado - Mover processamento pesado para infraestrutura dedicada
- 📊 Analytics de Uso - Rastrear custos por usuário para otimização de pricing
- 👥 Planos de Time - Acesso multi-usuário com permissões baseadas em roles
- 🏷️ Opção White-label - Permitir agências rebrandar o app para seus clientes
- 🔌 Acesso API - Tier enterprise com REST API para automação
- 💳 Sistema de Créditos - Modelo pay-per-use ao invés de assinaturas
- 🎁 Programa de Referral - Recompensar usuários por trazer novos clientes
Este projeto é licenciado sob a Creative Commons Attribution-NonCommercial 4.0 International License (CC BY-NC 4.0).
- ✅ Usar este código para aprendizado pessoal e educação
- ✅ Modificar e adaptar o código para seus próprios projetos
- ✅ Compartilhar o código com outros (com atribuição)
- ✅ Usar em seu portfólio (showcase não-comercial)
- ✅ Fork, clone e experimentar com o codebase
- ❌ Usar este código para propósitos comerciais (venda, SaaS, trabalho para clientes)
- ❌ Vender esta aplicação ou derivados dela
- ❌ Remover atribuição ao autor original
- ❌ Relicenciar o código sob termos diferentes
Interessado em usar este projeto comercialmente? Entre em contato:
- Licença Startup - Para empresas em estágio inicial
- Licença Enterprise - Para empresas estabelecidas
- Licença White-label - Direitos completos de customização para agências
Contato: Abra uma issue no GitHub ou entre em contato via cienciadosdados.com
Texto completo da licença: LICENSE.md
# Desenvolvimento
pnpm dev # Inicia Next.js dev server + Convex watch
pnpm build # Build para produção
pnpm start # Inicia servidor de produção
pnpm lint # Roda Biome linter
pnpm format # Formata código com Biome
# Convex
pnpm convex dev # Inicia banco Convex de desenvolvimento
pnpm convex deploy # Deploy Convex para produção
# Deployment
npx vercel # Deploy para Vercel (preview)
npx vercel --prod # Deploy para produçãoFeature Gating por Plano
Features são habilitadas baseado no tier de assinatura Clerk do usuário:
- Free: Apenas Summary (3 projetos lifetime)
- Pro: + Social posts, titles, hashtags (30 projetos/mês)
- Ultra: + YouTube timestamps, key moments, full transcript (ilimitado)
Processamento Paralelo de IA
Em vez de rodar tarefas de geração IA sequencialmente (lento), Inngest roda 6 jobs em paralelo usando Promise.allSettled. Isso reduz tempo de processamento de ~5 minutos para ~60 segundos.
Atualizações Real-time
Subscriptions Convex (useQuery) re-renderizam componentes automaticamente quando dados do banco mudam. Sem polling, sem refetch manual. Conforme Inngest atualiza status do projeto, UI atualiza instantaneamente.
Execução Durável
Inngest provê lógica de retry automático. Se OpenAI der timeout ou AssemblyAI falhar, o step faz retry com backoff exponencial. Seus usuários nunca perdem trabalho.
Construído com ferramentas incríveis de:
- Clerk - Autenticação & Billing
- Inngest - Orquestração de Workflows
- Convex - Banco Real-time
- Vercel - Deploy & Storage
- AssemblyAI - Inteligência de Áudio
- OpenAI - Geração de Conteúdo IA
- Encontrou um bug? Abra uma issue no GitHub
- Quer contribuir? PRs são bem-vindos (veja LICENSE para termos)