Em movimento
O que acontece na virada: as duas faixas se sobrepõem, uma cede lugar à outra — e ninguém precisa estar na frente do computador.
Por que existe
Tocador comum toca uma faixa e depois a outra, com um corte no meio. Software de DJ mixa de verdade, mas exige alguém na frente dele. O AutoDJ fica no meio: mixa como DJ e não precisa de ninguém olhando — e faz isso no navegador, sem instalar nada.
🎚️ Mixagem de verdade
Na virada, as duas músicas soam juntas pelo tempo que você escolher (3, 5 ou 7 s). Crossfade, não corte seco.
🎤 SEM-VOZ por IA
Prepara a versão sem vocal com Demucs e toca ela no lugar da original — na sua CPU de graça, ou numa GPU alugada por ~US$ 0,001 a faixa.
🔀 Três fontes, uma fila
Arquivos locais, Spotify e YouTube na mesma programação. O deck troca de motor sozinho, sem você escolher nada.
🤖 Piloto automático
Mantém a fila cheia e o som rolando. Desligue quando quiser assumir o controle.
📉 Sobrevive à queda
As próximas faixas ficam guardadas no seu computador. Sem internet, o som continua tocando.
🎛️ Sabe onde cortar
Uma passada de ffmpeg mede silêncio, volume (LUFS) e onde a voz entra — o deck usa isso para aparar e nivelar.
Como a voz sai da música
O AutoDJ aluga uma GPU por segundo, manda o áudio, recebe a versão sem vocal e derruba a placa. Uma faixa de 3 minutos leva ~10 s e custa cerca de US$ 0,001.
➖ Soma, não subtração
O instrumental é a soma de bateria, baixo e outros. Subtrair o vocal do original seria mais óbvio e está errado: devolveria, com fase invertida, o resíduo que o modelo não separou — e o defeito vira artefato audível.
⏱️ O pod é serviço, não tarefa
Ele sobe uma vez, carrega o modelo e atende várias faixas. Num pod por música, cada uma pagaria os ~3 min de instalação — mais caro que a separação em si.
🛑 Quem liga é quem desliga
A auto-terminação da nuvem não é confiável: em teste, o pod terminou o trabalho e foi reiniciado, refazendo tudo. Então o AutoDJ vigia, insiste e só sossega quando a API confirma que a placa sumiu.
🔒 Só o seu AutoDJ entra
A porta do pod é pública na internet. Cada placa sobe com um token aleatório de 32 bytes; sem ele, a resposta é 401 — senão qualquer um usaria a GPU que você paga.
Onde o modelo fica
O modelo é o htdemucs (Demucs v4, 4 trilhas). Onde ele mora depende de onde a separação roda — e os dois caminhos não se misturam.
| Na sua máquina | Na GPU alugada | |
|---|---|---|
| Binário | ~/.autodj/bin/demucs — o demucs.cpp compilado |
pip install demucs dentro do pod (PyTorch oficial) |
| Pesos | ~/.autodj/models/htdemucs.bin · ~80 MB |
baixados pelo próprio Demucs no primeiro uso |
| Origem | Retrobear/demucs.cpp no Hugging Face | Hugging Face, via a biblioteca demucs |
| Persistência | fica no disco; baixa uma vez | efêmero — morre junto com o pod |
⚠️ Na nuvem o modelo nunca toca o seu disco, e é baixado de novo a cada pod. Isso é parte dos ~3 minutos de subida — e a razão de o pod ser serviço e não tarefa: pagar esse download uma vez por lote, não uma vez por música.
Prefere não gastar? Rode na sua máquina.
scripts/build-demucs.sh compila o demucs.cpp e baixa os pesos
(80 MB). Fica de graça, ao custo de ~6 min por música em vez de ~10 s.
Feito na era do vibe coding
O AutoDJ inteiro — servidor, interface, testes e documentação — foi escrito com Claude Code, o agente de linha de comando da Anthropic, entre 24 e 28 de julho de 2026. Cinco dias.
Só que velocidade não é a parte interessante. Vibe coding costuma render código que parece pronto e desmonta na primeira semana. O que impediu isso aqui foram quatro disciplinas, todas escritas dentro do repositório — o agente lê antes de encostar em qualquer coisa:
📖 Um manual, não um prompt
CLAUDE.md tem 2.085 linhas de decisões, invariantes e
o porquê de cada uma. Não é "seja um bom engenheiro": é "o iframe do YouTube
nunca pode ser reparentado, e aqui está o que acontece se for".
🚧 Portões que barram o build
O domínio precisa de 100% de cobertura por testes ou o CI reprova — e adapters/app, no mínimo 90%. Versão nova sem entrada no changelog e o build aborta. Regra que só existe no texto vira sugestão; no portão, vira fato.
🔎 Bugs indexados por sintoma
docs/known-issues.md guarda 37 defeitos com causa-raiz
provada, organizados por como o problema aparece — "some do deck", "trava em
00:00". É o arquivo que evita descobrir a mesma coisa duas vezes.
📏 Medir em vez de achar
Um recurso inteiro foi aposentado por medição: o corte de centro tirava 2 dB de voz numa música real, contra 32 dB do modelo de IA. Dois decibéis não é "tirar a voz" — é não fazer nada audível.
Como se parece
Capturas do app rodando, não maquete.
O que roda por baixo
O servidor não toca áudio: ele mantém a agenda e decide a próxima faixa. Quem produz som é a sua aba.
| Camada | Tecnologia | Por quê |
|---|---|---|
| Interface | Next.js 15 + React 19 | O playout mora aqui; export estático, sem Node em produção |
| Áudio | Web Audio + <audio> + SDKs | O navegador já resolve decode, buffer e seek |
| Servidor | Go 1.26, arquitetura hexagonal | Um binário, sem runtime — e o domínio isolado deixou trocar CPU por GPU sem tocar em nada |
| Dados | SQLite (Go puro) | Sem daemon; um arquivo por estação |
| Análise | ffmpeg · ffprobe · aubio | Ferramentas maduras, uma passada só por faixa |
| Separação | Demucs v4 | Local ou GPU alugada — dois adapters, uma porta |
Rodar em 3 comandos
git clone https://github.com/andrebassi/autodj.git && cd autodj
nix develop # go, node, ffmpeg, aubio — tudo de uma vez
task serve # abre em http://localhost:8099
Usando um agente? Aponte para
autodj-site.andrebassi.com.br/llms.txt. Ele traz o
mapa do repositório, os comandos exatos e — o que economiza a tarde — as armadilhas:
abrir em localhost e nunca em 127.0.0.1 (senão o YouTube
recusa o embed), GOWORK=off obrigatório, e quais binários precisam
existir para a análise não falhar em silêncio.
Você traz suas credenciais. Nada de chave embutida: Spotify e YouTube só ligam com id/segredo seus, e a separação na nuvem gasta da sua conta. Rodar sem credencial nenhuma funciona — só com as suas músicas locais.