Neko, um gato perseguindo o mouse com Go e Ebitengine
Todo programador devia escrever ao menos um software inútil de propósito.
Inútil aqui no melhor sentido. Não serve para empresa nenhuma, não vai parar numa reunião de produto e não tem chance de algum gerente pedir integração com webhook. Mesmo assim obriga você a lidar com problemas reais. Tela, input, tempo, sprite, som, janela, sistema operacional. Um brinquedo desses ensina mais sobre software interativo do que muito CRUD com cara de demo corporativa.
Foi daí que saiu o Neko.

O Neko original é aquele gato que corre atrás do ponteiro do mouse. É um programa antigo, do fim dos anos 1980, portado para tudo quanto é plataforma. Essa versão é uma reimplementação em Go. Não tem relação com o código original, exceto pelos sprites e sons. Isso é importante porque o objetivo nunca foi fazer um museu de código. O objetivo era pegar uma ideia boa, simples e honesta, e reescrever do zero.
Por que fazer isso
Porque esse tipo de projeto é um teste muito mais honesto para uma linguagem e para uma biblioteca gráfica.
Se você quer vender uma stack, é fácil montar outro servidor HTTP, outro client de banco e outro CLI que imprime JSON. Isso qualquer ecossistema faz. O que separa as coisas é quando você precisa desenhar uma janela transparente, manter animação fluida, tocar áudio sem engasgo, seguir o cursor e ainda fazer tudo isso sem transformar o projeto numa pilha grotesca de dependências.
O Neko tem exatamente esse tamanho. Pequeno o bastante para ser divertido. Chato o bastante para expor as partes que realmente importam.
A escolha do Go
Muita gente olha para Go e pensa logo em servidor, API, fila, proxy, observabilidade e aquele pacote completo de software sisudo. Isso é verdade, mas incompleto.
Go também funciona muito bem para programas pequenos, diretos e com um binário simples de distribuir. A linguagem não fica no caminho. E isso importa bastante num projeto como esse, onde o comportamento visual é a parte interessante e o código precisa continuar pequeno.
No repositório, o go.mod já está em Go 1.26 e o projeto usa Ebitengine. Foi uma escolha correta. Ebitengine é simples, direto e tem uma API que não tenta parecer mais inteligente que o programador. Para esse tipo de software isso basta.
Como o Neko funciona por dentro
O que mais gosto aqui é que a implementação não fica fingindo sofisticação. Ela faz o necessário.
- Os sprites e sons ficam embutidos no binário com
embed.FS. - A janela é pequena, transparente, sem decoração, flutuante e nem aparece na taskbar.
- O gato escolhe uma das oito direções com base no ângulo entre a posição atual e o cursor.
- Quando está parado, entra numa pequena máquina de estados com animações de acordado, arranhando, se lavando, bocejando e dormindo.
- O áudio recebe até um pequeno aquecimento no início para evitar atraso na primeira reprodução. Esse tipo de detalhe é o tipo de cicatriz que eu gosto de ver em código real.
O código também se preocupa em não deixar o gato escapar pela lateral da tela ou sair viajando de forma errada para outro monitor. Isso parece detalhe bobo até a hora em que não é. Software de desktop vive desses detalhes chatos.
Janela transparente sem firula
Uma das partes mais legais do Neko é que ele usa o Ebitengine para criar exatamente a janela que esse programa pede e nada além disso.
Sem decoração. Sempre flutuante. Transparente. Rodando mesmo sem foco. Fora da barra de tarefas.
Isso dá ao programa aquela sensação correta de “criatura vagando pelo desktop” em vez de parecer um aplicativo preso dentro de uma caixa genérica do sistema operacional. Esse tipo de cuidado muda totalmente o resultado final.
Também existe a opção de mouse passthrough, o que é a escolha certa. Um gato de desktop não tem o direito de atrapalhar clique do usuário.
Como rodar
O jeito mais simples é esse:
export CGO_ENABLED=1
go run main.go
Ou compilando antes:
export CGO_ENABLED=1
go build -o neko main.go
./neko
As opções principais são:
-mousepassthroughpara o gato não interceptar o mouse.-quietpara desligar som.-scalepara mudar o tamanho.-speedpara ajustar a velocidade.
Então, se quiser um gato maior e mais apressado:
neko -scale 3 -speed 4 -mousepassthrough
O código também já deixa espaço para configuração por ambiente com prefixo NEKO e arquivo neko.ini. Isso é útil porque esse tipo de programa costuma acabar indo parar em script de inicialização, sessão gráfica ou alguma automação pessoal.
O que eu acho mais interessante nesse projeto
A maioria dos exemplos de “aplicação gráfica simples” é burocrática até o osso. Janela sem graça, botão sem graça, contador sem graça. Tudo correto e tudo morto.
O Neko vai na direção contrária. Ele é pequeno, mas tem personalidade. Você bate o olho e entende o programa em dois segundos. Melhor ainda: o código acompanha essa clareza.
Esse é o tipo de projeto que eu gosto de ver numa linguagem. Não porque ele seja grande ou importante. Justamente porque não é. Um projeto pequeno deixa muito claro se a base técnica presta ou se está tudo sendo sustentado por abstração demais.