1 pontos por GN⁺ 4 일 전 | 1 comentários | Compartilhar no WhatsApp
  • 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, invoquei yt-dlp programaticamente
    • 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
  • 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 uv e adicionei fastapi, pydantic, ytmusicapi e yt-dlp como dependências
    • Troquei o main.py por 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.md com /init
  • 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, assert e 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 /init novamente para atualizar o CLAUDE.md de 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 .view do 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, getGenres e getMusicDirectories retornavam coleções vazias, mas válidas
    • getSong foi tratado como um pass-through que devolvia o ID dos query parameters e preenchia valores padrão
    • search3 foi implementado com uma chamada simples ao ytmusicapi
    • stream extraía a URL do formato "bestaudio" com uma chamada ao yt-dlp envolvida em asyncio.to_thread
    • getCoverArt extraía a URL da imagem de capa com yt-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 ytmusicapi para evitar limites de uso
    • Usei sqlite para armazenar metadados musicais e implementei todos os endpoints da categoria de navegação
    • getTopSongs também foi implementado consultando a lista de top songs
  • 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

 
GN⁺ 4 일 전
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

    • Foi a primeira vez que vi alguém se referindo a um LLM como he em vez de it
      Não estou criticando, mas achei bem interessante e um pouco desconfortável
    • Comigo foi o oposto completo
      Eu tinha dezenas de pastas de experimentos, e várias delas agora estão virando projetos de verdade
    • Uma coisa divertida hoje em dia é retomar projetos que começaram há alguns meses ou um ano com agent driven development, emperraram e pararam, e agora empurrá-los mais longe com o Claude mais recente ou com o codex
      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
    • O Godot não parece ser uma ferramenta projetada para funcionar bem com LLMs
      Por exemplo, já saíram alguns arquivos tres incorretos, e deixar o LLM gerar IDs também pareceu bem instável
    • No lado procedural, também estou experimentando colocar o LLM como parte do loop procedural
      É 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

    • Algumas semanas atrás finalmente terminei um mod de Quake 2 que comecei em 1998
      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
    • É impressionante mesmo
      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
    • Fico pensando quanto tempo essa pessoa viveu sem AI
      Pela explosão de produtividade que ela descreve, parece que também precisou de bastante tempo para acumular tantas necessidades pequenas
    • Também fiz um app para planejar uma Scavenger Hunt de Páscoa
      É 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

    • Sambervise: https://github.com/edward-murrell/sambervise
      É um app GUI para Linux para administrar remotamente um Samba 4 Active Directory Domain Controller
    • Krbtray: https://github.com/edward-murrell/krbtray
      É um app GTK3 de bandeja do sistema para gerenciamento de tickets Kerberos em ambientes GTK que usam Linux Mint / Cinnamon e GtkStatusIcon
    • Isso realmente dá vontade de apostar em programação com AI
      Porque os dois são exatamente o tipo de app que eu precisava de verdade e estava procurando
    • Outra mudança importante é que o custo de grandes refatorações caiu bastante
      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á

    • Claude Code é realmente ótimo para apps pessoais
      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
    • É bem isso mesmo
      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
    • Talvez nem precise fazer o app você mesmo
      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

    • Eu tenho muitos hobbies, e programação é só um deles
      À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
    • Se você programa só pela programação em si, até faz sentido
      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
    • Eu simpatizo com esse ponto de vista e acho uma postura bem saudável
      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

    • Mas quem vai comprar isso é outra questão
      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