Sistema de karaokê social em tempo real. Crie salas, adicione músicas do YouTube, cante sozinho ou em dupla, e dispute o ranking com seus amigos!
O Karaokêando é uma aplicação web que transforma qualquer TV em um karaokê de festa. O host projeta a tela da TV, e os convidados usam seus celulares para adicionar músicas, escolher parceiros de dueto e acompanhar o ranking.
- Host cria uma sala e projeta a TV (
/room/XXXXX/tv) - Convidados entram pelo celular escaneando QR code ou digitando o código
- Pelo celular: buscam músicas, adicionam à fila, escolhem cantar solo ou em dupla
- A TV exibe o vídeo com som, fila e ranking em tempo real
- Ao finalizar, o sistema gera uma pontuação e atualiza o ranking
karaokeando/
├── backend/ # API Node.js + TypeScript
│ ├── src/
│ │ ├── server.ts # Servidor Fastify + WebSocket
│ │ └── lib/ # Módulos (auth, songs, etc.)
│ └── prisma/ # Schema e migrations
│
├── frontend/ # React + Vite + TypeScript
│ ├── src/
│ │ ├── pages/ # Home, RoomTV, RoomMobile, Dashboard
│ │ ├── components/ # ScoreOverlay, etc.
│ │ ├── score/ # Sistema de pontuação
│ │ └── api.ts # Cliente API + WebSocket
│ └── public/ # Assets estáticos
│
└── docker-compose.yml # PostgreSQL local
- Node.js 20+
- npm 10+
- Docker (para PostgreSQL) ou PostgreSQL 16+
cd karaokeando/backend
npm install
npm run devServidor rodando em http://localhost:8787
cd karaokeando/frontend
npm install
npm run devAplicação em http://localhost:3000
- Salas em tempo real - Código de 5 caracteres, WebSocket para sync instantâneo
- Busca de músicas - Integração com YouTube via yt-dlp
- Fila compartilhada - Todos veem a mesma fila em tempo real
- Solo ou Dueto - Escolha cantar sozinho ou com um parceiro da sala
- Ranking individual - Pontuação acumulada por participante
- Ranking de duplas - Ranking separado para duetos
- Biblioteca de músicas - Músicas adicionadas ficam salvas no banco
- Mais tocadas - Lista das músicas mais populares (persistido)
- Dashboard admin - Painel com salas ativas e top músicas
- Identificação persistente - ID único por dispositivo, nome salvo
- PostgreSQL - Persistência robusta com Prisma ORM
- Sistema de autenticação - JWT para hosts e acesso TV
- Sistema de usuários completo - Cadastro, login, perfil
- Histórico de sessões - Ver festas anteriores
- Favoritos pessoais - Cada usuário salva suas músicas
- Conquistas/Badges - Gamificação
- Temas visuais - Personalização da sala
| Tecnologia | Uso |
|---|---|
| Node.js | Runtime |
| TypeScript | Tipagem |
| Fastify | Framework HTTP |
| @fastify/websocket | Comunicação real-time |
| yt-dlp | Busca no YouTube |
| Prisma | ORM |
| PostgreSQL 16 | Banco de dados |
| JWT | Autenticação |
| Tecnologia | Uso |
|---|---|
| React 18 | UI Library |
| TypeScript | Tipagem |
| Vite | Build tool |
| React Router | Navegação |
Dados persistidos no PostgreSQL via Prisma:
backend/prisma/
├── schema.prisma # Schema do banco
└── migrations/ # Histórico de migrations
Entidades implementadas:
User- Usuários cadastrados (email, nome, senha)Room- Salas de karaokê (código, hostId, tvToken)RoomVisit- Histórico de visitas às salasSong- Biblioteca de músicas (videoId, título, playCount)
Dados em memória (efêmeros por sessão):
- Fila de músicas da sala
- Ranking da sessão (solo e duplas)
- Conexões WebSocket
Criar arquivo .env na raiz do backend:
# Servidor
PORT=8787
# Banco de dados
DATABASE_URL=postgresql://karaokeando:karaokeando@localhost:5433/karaokeando
# Autenticação
JWT_SECRET=sua-chave-secreta-aqui
# Admin
ADMIN_KEY=chave-do-dashboard
# (Em breve) Banco de dados
DATABASE_URL=postgresql://user:password@localhost:5432/karaokeando
# (Em breve) Autenticação
JWT_SECRET=sua-chave-secreta| Rota | Descrição |
|---|---|
/ |
Home - Criar ou entrar em sala |
/room/:code |
Modo Mobile - Controle pelo celular |
/room/:code/tv |
Modo TV - Exibição principal |
/dashboard |
Painel administrativo |
- Fork o projeto
- Crie uma branch (
git checkout -b feature/nova-funcionalidade) - Commit suas mudanças (
git commit -m 'Adiciona nova funcionalidade') - Push para a branch (
git push origin feature/nova-funcionalidade) - Abra um Pull Request
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
Feito com 🎤 e ❤️