Revivendo projetos que você nunca conseguiria terminar só com ferramentas de assistência à programação
(blog.matthewbrunelle.com)- Projetos pessoais antigos, parados há muito tempo, estavam mais focados em concluir a implementação do que em aprender algo novo, então eram ótimos para testar ferramentas de assistência à programação
- Reimplementei um shim que expõe o YouTube Music pela OpenSubsonic API, permitindo que diferentes clientes Subsonic se conectem do mesmo jeito
- Primeiro fixei uma estrutura mínima e as convenções de implementação, depois trabalhei em ciclos curtos, rodando juntos a geração de stubs a partir da especificação OpenAPI e os testes de conexão com clientes reais
- A implementação inicial, que só seguia a especificação, quebrou imediatamente em conexões reais; então fui repetindo a checagem dos logs de requisição e a adição de testes unitários até chegar a um nível em que busca e reprodução funcionavam
- Se não for um projeto stretch para aprendizado, mas sim um projeto que você simplesmente gostaria que existisse, as ferramentas de assistência à programação podem ajudar muito a transformar trabalho adiado em um serviço realmente utilizável
Contexto do projeto e abordagem
- Um projeto pessoal antigo, iniciado há muito tempo e nunca concluído, era adequado para testar uma ferramenta de assistência à programação com IA
- O projeto revivido foi um shim que conecta o YouTube Music à OpenSubsonic API
- O OpenSubsonic era usado como um contrato de API que permite separar cliente e servidor no streaming de música
- Como servidor foi usado Navidrome, como cliente desktop Feishin e no Android Symfonium
- O shim expõe o YouTube Music no formato da OpenSubsonic API para que qualquer cliente possa se conectar
- Para consultar metadados, usei
ytmusicapi, e para streaming, invoqueiyt-dlpprogramaticamente - O streaming básico foi relativamente fácil de conectar, mas ainda restava uma longa cauda de trabalho para implementar todos os endpoints conforme a especificação
- Para consultar metadados, usei
- Como este projeto era mais sobre implementar uma especificação clara do que resolver um problema novo ou original, ele combinava bem com ferramentas de assistência à programação
- O experimento foi feito reimplementando tudo do zero com Claude Code e Opus 4.6
Configuração inicial
- O ponto de partida foi um projeto mínimo com estrutura previamente limitada
- Criei um projeto com
uve adicioneifastapi,pydantic,ytmusicapieyt-dlpcomo dependências - Troquei o
main.pypor um arquivo principal de exemplo do FastAPI e coloquei a especificação OpenAPI do OpenSubsonic na pasta - No README, deixei um resumo curto sobre o papel do servidor, as bibliotecas usadas, a URL da documentação e a localização de
openapi.json - Adicionei um arquivo TODO vazio e gerei
CLAUDE.mdcom/init
- Criei um projeto com
- Em
CLAUDE.md, registrei separadamente as convenções de implementação para reduzir instruções repetidas- Exigi type annotations e docstrings para argumentos e valores de retorno dos métodos
- A modelagem de dados foi alinhada às convenções do Pydantic V2
- As docstrings deviam usar seções args e returns no estilo Google
- Os testes seguiram o estilo moderno de pytest, com funções de nível mais alto,
asserte fixtures
- Esse ponto de partida foi reunido em um repositório git
Fluxo de implementação do MVP
- O trabalho foi conduzido em modo de planejamento e ciclos curtos de iteração
- Eu passava a próxima tarefa por prompt e verificava o que faltava ou quais problemas havia no plano inicial
- Quando algo saía do rumo, eu fornecia links de recursos relacionados ou, se houvesse várias opções, pedia ao mecanismo de busca para encontrar a abordagem mais idiomática
- Depois de cada tarefa, eu usava
"Accept and clear context"para limpar o contexto e repetir o processo
- A primeira implementação focou em gerar stubs apenas para os novos endpoints JSON da especificação OpenAPI
- Havia endpoints XML antigos e novos endpoints JSON, mas o escopo foi reduzido para tratar apenas os novos
- Após implementar, incluí uma etapa de validação para conferir novamente se todos os métodos estavam corretos
- Mesmo com a especificação, houve erros na primeira tentativa, e a segunda revisão corrigiu a maioria deles
- Depois de mudanças grandes, eu executava
/initnovamente para atualizar oCLAUDE.mdde acordo com o novo estado - A etapa seguinte foi definir e conectar o mínimo de funcionalidade para busca e streaming
- O objetivo era o mínimo necessário para conectar um cliente Subsonic, buscar músicas e reproduzi-las
- Para busca usei
ytmusicapi, e para streaming,yt-dlp
Problemas revelados na conexão real e ajustes
- Embora a implementação parecesse convincente à primeira vista, ela desmoronava assim que era conectada de fato ao Feishin
- Repeti correções testando diretamente com o cliente e repassando ao Claude Code os logs de requisição do servidor
- Também havia diferenças de detalhe que não apareciam apenas pela especificação; por exemplo, era preciso remover o sufixo
.viewdo endpoint
- Sempre que surgia um erro, eu criava novos testes unitários para evitar regressões
- Depois de poucas iterações, o áudio realmente começou a tocar no Feishin
- O problema central era que os endpoints stub não retornavam nada
- A maioria dos endpoints precisou passar a retornar respostas com a estrutura correta, mesmo quando estivessem vazias
- Mesmo assim, esse nível de MVP não era muito diferente do POC antigo, e a usabilidade real ainda dependia da longa cauda de trabalho posterior
A longa cauda de trabalho e a expansão para todas as funções
- Segundo a documentação do OpenSubsonic, a API tinha cerca de 80 endpoints distribuídos em 15 categorias
- O escopo necessário para o MVP era relativamente pequeno
getLicense,getUser,getGenresegetMusicDirectoriesretornavam coleções vazias, mas válidasgetSongfoi tratado como um pass-through que devolvia o ID dos query parameters e preenchia valores padrãosearch3foi implementado com uma chamada simples aoytmusicapistreamextraía a URL do formato"bestaudio"com uma chamada aoyt-dlpenvolvida emasyncio.to_threadgetCoverArtextraía a URL da imagem de capa comyt-dlp
- Para dar suporte a todas as funções do cliente Subsonic, foi necessário trabalho adicional
- Adicionei um cache em memória simples às chamadas do
ytmusicapipara evitar limites de uso - Usei
sqlitepara armazenar metadados musicais e implementei todos os endpoints da categoria de navegação getTopSongstambém foi implementado consultando a lista de top songs
- Adicionei um cache em memória simples às chamadas do
- Durante o streaming, as músicas eram salvas em disco para evitar redownloads
- Se o cliente encerrasse a conexão com o endpoint de stream antes de o download terminar, era necessário tratamento adicional para limpar arquivos incompletos
- Essas tarefas eram coisas que originalmente também poderiam ter sido feitas manualmente, mas que eu nunca havia terminado; e como não havia plano de implantação, partes difíceis como autenticação ainda foram deixadas de lado
- No fim, em algumas noites curtas, foi possível criar um serviço funcional ao qual clientes Subsonic conseguiam se conectar, e o projeto recebeu o nome
Sub-standard
Onde isso faz sentido
- Em vez de simplesmente empurrar ferramentas de assistência à programação a qualquer custo, também havia a preocupação com a perda de capacidade por dependência
- Os projetos pessoais se dividiam em dois grandes grupos
- Projetos stretch voltados a aprender e evoluir
- Projetos que você simplesmente gostaria que existissem
- Este projeto pertencia ao segundo grupo, e as ferramentas de assistência à programação serviram bem para materializar um desejo que nunca tinha sido concluído
- Acabei realmente tendo um projeto que, de outra forma, eu nunca teria tocado, e a sensação era mais parecida com reduzir uma pilha de livros não lidos
- O critério importante não era fazer ou não projetos do segundo grupo, mas continuar também com os projetos de aprendizado do primeiro grupo
1 comentários
Comentários no Hacker News
O tipo de projeto abandonado que eu mais tinha era videogame
Eu tenho dezenas de pastas de projetos interrompidos, e agora passei a encarar isso de novo como experimento
Na semana passada peguei um deles de volta com o Claude, e encaixou muito bem, além de me colocar de volta na direção certa
Como eu já tinha dito que era um projeto abandonado desde o começo, ele me empurrou a terminar primeiro o loop de gameplay V0 e depois expandir a partir do que ficasse divertido, o que me impediu de desistir
Eu dava ideias de game design e ele devolvia código funcionando, entregava implementações a partir de artigos sobre algoritmos procedural, ajudava a fazer brainstorming de itens, criava assets gráficos e até ajudava a construir o lore
A combinação Claude Code + Godot é muito divertida, fazia tempo que usar o computador não era tão prazeroso
Não estou criticando, mas achei bem interessante e um pouco desconfortável
Eu tinha dezenas de pastas de experimentos, e várias delas agora estão virando projetos de verdade
Alguns agora até rodam, enquanto outros ainda continuam complexos demais para um agente dar conta
Ainda assim, fazer apps pessoais está ficando cada vez mais fácil
Acho que em breve vamos chegar no nível de dizer “Alexa, tira uma foto da comida da geladeira, junta as informações nutricionais, sincroniza com meu app de exercícios, compara com ingredientes compatíveis com as metas do app de saúde e me manda por e-mail ingredientes melhores dentro do meu orçamento, região e restrições alimentares” e ter um app pronto em 15 minutos
Por exemplo, já saíram alguns arquivos tres incorretos, e deixar o LLM gerar IDs também pareceu bem instável
É uma forma de colocar uma narrativa ao vivo por cima disso
Os modelos locais ainda são lentos e fracos, mas mesmo assim foi bem interessante ver que tipo de resultado sai
Isso é realmente excelente
Agora existe uma quantidade enorme de software pessoal
Ontem eu fiz um editor de texto nativo totalmente integrado ao MediaWiki, com autocompletar de links e ajuda de entrada para sintaxe
Esse tipo de software quase não tem valor para outras pessoas, então não existe motivo para alguém além de mim construí-lo, e eu mesmo antes não fazia porque levava tempo demais
Mas quando eu terceirizo a programação para um agente, o gargalo deixa de ser a implementação e vira a minha atenção, e funciona muito bem ir encaixando esses projetos pessoais nos espaços vazios da cabeça
Parece uma época muito boa
Graças à AI consegui passar pelo burnout pós-COVID e por uma pilha de projetos pela metade
Hoje também consertei uma ferramenta de RDP relacionada a terminal e voltei a mexer num issue que abri no OpenRA 10 anos atrás
O motor ficou 10 vezes mais rápido e o pathfinding agora em geral funciona direito
Tenho mais ou menos 120 ferramentas pessoais, e é exatamente isso: o gargalo saiu da implementação e foi para o context switching
Então agora deixo um arquivo markdown em cada raiz de projeto, e sempre que paro anoto o estado atual e os próximos passos
Assim, quando volto, não pago 20 minutos de custo para recuperar “onde eu estava mesmo?”
Como ninguém mais vai usar, também não existe pressão para tratar edge cases nem documentar; basta resolver exatamente o meu problema e seguir para a próxima coisa
Pela explosão de produtividade que ela descreve, parece que também precisou de bastante tempo para acumular tantas necessidades pequenas
É engraçado pensar no quão nichado isso é
Eu já sabia programar, só não tinha tempo, e a AI foi um divisor de águas completo para finalmente colocar projetos open source no mundo
Antes eu não tinha motivação suficiente, mas agora estou fazendo com entusiasmo apps GUI locais para Linux
É um app GUI para Linux para administrar remotamente um Samba 4 Active Directory Domain Controller
É um app GTK3 de bandeja do sistema para gerenciamento de tickets Kerberos em ambientes GTK que usam Linux Mint / Cinnamon e GtkStatusIcon
Porque os dois são exatamente o tipo de app que eu precisava de verdade e estava procurando
Com assistentes de programação, agora dá para tentar mudanças estruturais profundas, inclusive no design de módulos, em muito menos tempo do que antes
Claro que isso não vem sem custo, e alguns modelos frequentemente produzem código que não atende aos padrões de manutenibilidade
Economizar tempo na escrita não significa eliminar o tempo gasto com correções repetidas, limpeza e reforço de system prompt ou arquivos de instruções
Não concordo muito com a preocupação de que usar demais essas ferramentas vá causar deskilling
Sou millennial e faço móveis com ferramentas manuais e técnicas antigas de encaixe em madeira
Nunca aprendi isso com ninguém; só fui pegando por materiais online, e mesmo assim consegui aprender o que queria
Também não tenho medo de perder essa habilidade depois, porque se precisar posso reaprender
Os livros, os vídeos, as ferramentas e a madeira não vão desaparecer
Usar AI não cria um buraco negro no cérebro só porque você passa a digitar código à mão com menos frequência
Não é como Alzheimer, em que a informação se perde para sempre; no máximo precisa de um tempo para reaquecer e logo volta
Muita gente saiu de programação para gestão e anos depois voltou; enferrujou um pouco, mas retomou
Especialmente em projeto pessoal, nem precisa gastar tokens de Opus
Dá para usar algo como MiniMax com uma assinatura barata, rodar em yolo mode num contêiner e só fornecer contexto, prompts, busca na web e um sistema de tickets como beads
Como não é algo urgente, basta seguir a sequência brainstorm → plan → implementation → testing, e garantir meios de teste reais, não só mocks ou unit tests, para economizar tempo e dinheiro e ainda assim conseguir terminar
Há 12 anos eu tentei fazer um app simples que mostrasse, pelo comprimento de barras, quanto do meu dia/semana/mês ainda restava, e também representasse o clima com barras para temperatura máxima e mínima, cobertura de nuvens etc.
Até consegui alguma coisa com texto e ASCII, mas falhei em criar uma interface boa o bastante para eu querer usar todo dia, e nunca consegui fazer uma GUI gráfica
Então descrevi para o Claude Code a interface gráfica que eu queria e deixei ele tocar, e saiu exatamente o app que eu queria, além de ele encontrar um bug no parser de datas que eu nem conhecia
Agora esse app fica sempre visível num canto da tela
A próxima ideia é criar um app de iPhone que desligue automaticamente o alarme de manhã quando meus filhos não tiverem aula
Eu não entendo nada de apps para iPhone e não tenho tempo para aprender, então antes isso parecia inviável
Para apps pessoais, o Claude Code é realmente excelente, e como a qualidade do código não é tão importante, dá perfeitamente para usar o resultado como está
O gerenciador de clipboard que eu usava havia anos no Mac ficou esquisito depois de uma atualização do sistema, e as alternativas da App Store não tinham os recursos que eu queria
Então vi o texto do Simon Willison sobre vibe coding com SwiftUI e fiz o meu próprio com Claude Code
Precisou de algumas iterações, mas agora ele faz, na barra de menu do Mac, tudo o que eu queria e até mais
Em especial, quando pedi ao CC ideias de recursos extras, ele sugeriu uma longa lista de opções que eu nem tinha imaginado, e foi bem impressionante simplesmente mandar implementar as que escolhi
Anteontem, eu quis algo parecido com o novo componente de edição markdown do LibreOffice, mas menor e mais leve, um editor markdown dedicado
Então montei um esboço com GPT 5.5 e implementei com CC, e em apenas duas sessões de vibe coding já saiu um app nativo leve para Mac quase completo, com abrir/criar arquivos, edição estilo processador de texto e salvamento em canonical markdown
Só falta markdown table, e pretendo pedir isso hoje
https://simonwillison.net/2026/Mar/27/vibe-coding-swiftui/
https://news.ycombinator.com/item?id=47298885
Eu gosto de fazer coisas, mas às vezes só quero obter rápido o resultado pronto
Quando quero uma ferramenta pessoal para um objetivo específico sem perder um fim de semana inteiro nisso, a ajuda de um LLM é excelente, e a qualidade do código não importa tanto
No iPhone, isso pode ser resolvido com o app padrão Shortcuts
Dá para criar um shortcut que desligue todos os alarmes, ler sinais como o calendário para ligar e desligar alarmes em datas ou horários específicos, e executar isso num agendamento recorrente
Eu tendo a achar que side projects só valem a pena de verdade quando existe vontade de fazê-los
Se o processo e a experiência vêm primeiro, isso é lazer; se o resultado vem primeiro, eu chamo de trabalho
Se você faz muitos side projects só pelo resultado, no fim está trabalhando no seu tempo livre, e eu questiono se isso é liberdade de fato
A sociedade moderna já exige resultados demais da gente, então quero preservar os side projects pelo bem da minha sanidade
Dito isso, se houver um propósito em que você acredita por um bem maior, isso pode ser uma exceção, porque esse tipo de propósito pode enriquecer o próprio processo
Às vezes preciso de um software que torne outro hobby mais divertido, mas isso não significa que eu queira tirar tempo do hobby X para construir esse software eu mesmo
Além disso, esse tipo de tarefa às vezes nem é o tipo de programação que eu gosto de fazer por diversão
Para mim, esse é o sweet spot da programação assistida por LLM, e de fato já fiz vários apps auxiliares para aproveitar melhor outros hobbies
Continua sendo tempo de hobby, mas não precisa ser um hobby de programação
Mas se havia uma coceira para resolver ou uma ambição para realizar, e o que faltava era tempo ou motivação, não vejo por que isso deveria ser tratado como trabalho no tempo livre
Projetos que antes consumiam fins de semana ou férias inteiras agora podem ter um esqueleto montado em 15 minutos, e isso parece muito mais o oposto de trabalho
Programo há mais de 30 anos, mas sempre me contentei com apps de linha de comando, e só recentemente comecei a aprender Qt para finalmente colocar uma UI decente de desktop
A curva de aprendizado foi muito íngreme, mas agora já passei em boa parte por ela
Só que, quando postei screenshots do app no LinkedIn dizendo que era open source e gratuito, recebi centenas de comentários de gente do LinkedIn que nem sequer vai me contratar
Vieram respostas como “queremos integrar isso ao nosso workflow” ou “você não foi o primeiro a tentar isso”, e isso não me motivou em nada; pelo contrário, pareceu que eu só estava trabalhando para os outros ou me expondo a críticas inúteis
Fiquei tão abalado com isso que larguei de vez por cerca de um mês, até concluir que o que eu gostava mesmo era o processo em si de aprender Qt e ver meus programas antigos ganhando vida
Então agora trato isso como meu project car
Vou mexendo sem parar, refazendo tudo, virando o modelo de dados de cabeça para baixo para ver os prós e contras de outros designs, criando minhas próprias views gráficas e até testando tradução de idiomas
Funcionalmente já está pronto, mas existem umas cinco versões com estruturas internas completamente diferentes, e essa é justamente a graça
Eu uso isso o dia todo no trabalho, e nunca mais mencionei no LinkedIn
No meu repositório pessoal havia três tentativas de app de notas, e todas tinham parado naquele vão entre a ideia e o tempo livre
Mas graças ao Claude Code consegui finalmente terminar, em dois meses, aquele que eu realmente queria
O processo de construir isso foi o melhor hobby que encontrei até hoje, muito melhor do que jogo ou scroll infinito
Quando uma ideia que você carrega há anos finalmente é lançada, aquele app passa a carregar uma parte sua de forma mais profunda, e acho que veremos muito mais solo builders criando coisas assim daqui para frente
Não quero diminuir o mérito de recriar um projeto antigo, mas o mercado provavelmente vai ficar abarrotado de projetos extremamente especializados
Antes as caixas de software vinham com uma lista de especificações; agora talvez precisemos de algo como uma nova linguagem de modelagem para explicar finalidade e escopo de uso
Minha experiência foi quase exatamente igual
Eu tinha um side project de agregação comparativa parado há mais de um ano em 20% concluído, e uma vez por mês eu abria, olhava a lista do que faltava fazer, cansava e fechava a aba
Mas depois de alguns fins de semana trabalhando junto com o Claude, consegui atravessar essa parede de projeto pela metade
O impressionante não foi a velocidade pura, e sim o desaparecimento do custo de reentrada: para fazer qualquer coisa antes eu precisava passar uma hora recarregando meu código antigo na cabeça
O hype exagerado me irrita, mas a maioria das pessoas que zomba dessas ferramentas parece nunca ter experimentado o quanto elas são úteis para esse tipo de tarefa chata
Eu sempre tive mais ideias do que conseguia executar, e várias delas eram bem boas
Com as ferramentas de AI, agora consigo transformar mais delas em algo pelo menos mais ou menos funcional
Ironicamente, o valor dessas implementações está caindo rápido
Algumas semanas atrás fiz uma pequena biblioteca de busca que roda no navegador e não precisa de servidor, com suporte à maior parte das term/matching query e aggregation no estilo Elasticsearch, e ainda adicionei ANN vector search com WebGPU
Era quase um caso de dizer “vamos colocar a feature X” e pronto, e eu já usei isso em sites reais
Não escala, mas para blogs ou sites de documentação é ótimo, e o site da documentação está em https://querylight.tryformation.com/
Funciona exatamente como eu imaginei, e parece que eu conseguiria adicionar mais recursos de cauda longa do Elasticsearch sem muito esforço
Em contrapartida, a reação no GitHub foi bem morna
Hoje em dia todo mundo parece ocupado demais usando AI para fazer suas próprias coisas para acolher muito o esforço alheio, e sinceramente isso até faz sentido
Se você precisa de uma biblioteca de busca, pode simplesmente gerar uma, ou deixar a AI escolher uma adequada para você
Até porque isso nem foi um trabalho gigantesco de construir desde o início
O valor econômico desse tipo de projeto está despencando rápido
Mesmo assim eu continuo porque gosto de construir, e também acho importante aprender a lidar com a curva de aprendizado dessas ferramentas
Ainda haverá muito trabalho a fazer, mas as pessoas vão esperar resultados aceitáveis pagando menos, e para atender essa expectativa vai ser preciso dominar as ferramentas
No fim, quando o que é possível se amplia, o padrão da ambição sobe junto, e é engano achar que, se a AI fizer o trabalho, então as pessoas já não precisarão esperar tanto dos humanos
Eu mesmo tenho trabalhado horas bem longas nos últimos meses
Durante anos eu tive várias ideias de produto por semana, mas todas ficavam acumuladas no Apple Notes
Só que no último mês transformei três delas em betas realmente utilizáveis, e agora estou usando as três todos os dias