AutoDJ

Suas músicas tocando sozinhas, com mixagem de DJ.

Um tocador que faz a fila andar sem ninguém olhando e mixa a virada entre uma faixa e outra como um DJ faria. Toca arquivos seus, Spotify e YouTube na mesma fila — tudo dentro do navegador.

Escrito inteiro com Claude Code em 5 dias: 46 mil linhas de Go, 24 mil delas de teste, e 10 mil linhas de documentação. Aponte seu agente para o llms.txt e ele clona, sobe e roda — sem você explicar nada.

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áquinaNa 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.

5dias, do zero ao ar
153commits · 34 versões
46klinhas de Go
24kdessas, de teste automatizado
10klinhas de documentação
100%do domínio coberto por testes

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.

Quer inspecionar você mesmo? Todo o histórico dessas decisões está aberto: CLAUDE.md, known-issues.md e pendencias.md — este último lista o que não está pronto, e por quê.

Como se parece

Capturas do app rodando, não maquete.

Player do AutoDJ com dois decks, fila e transporte
Dois decks em ping-pong: enquanto A toca, B já carregou. A virada não espera rede.
Biblioteca com BPM e selo SEM-VOZ por faixa
Biblioteca com BPM medido e o selo SEM-VOZ nas faixas já preparadas.

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.

CamadaTecnologiaPor quê
InterfaceNext.js 15 + React 19O playout mora aqui; export estático, sem Node em produção
ÁudioWeb Audio + <audio> + SDKsO navegador já resolve decode, buffer e seek
ServidorGo 1.26, arquitetura hexagonalUm binário, sem runtime — e o domínio isolado deixou trocar CPU por GPU sem tocar em nada
DadosSQLite (Go puro)Sem daemon; um arquivo por estação
Análiseffmpeg · ffprobe · aubioFerramentas maduras, uma passada só por faixa
SeparaçãoDemucs v4Local 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.