Eu codifiquei meu aplicativo de apresentação macOS dos sonhos
Eu codifiquei meu aplicativo de apresentação macOS dos sonhos
25 de fevereiro de 2026
Dei uma palestra neste fim de semana no Social Science FOO Camp em Mountain View. O evento foi um formato clássico de não conferência, onde qualquer pessoa poderia apresentar uma palestra sem a necessidade de propô-la com antecedência. Consegui uma vaga para uma palestra intitulada “O Estado dos LLMs, edição de fevereiro de 2026”, com subtítulo “Tudo mudou desde novembro!”. Eu codifiquei um aplicativo macOS personalizado para a apresentação na noite anterior.

Escrevi sobre os últimos doze meses de desenvolvimento em LLMs em dezembro de 2023, dezembro de 2024 e dezembro de 2025. Também apresentei Os últimos seis meses em LLMs, ilustrados por pelicanos em bicicletas na Feira Mundial de Engenheiros de IA em junho de 2025. Esta foi a primeira vez que reduzi o tempo coberto para apenas três meses, o que ilustra claramente o quanto o espaço continua acelerando e pareceu apropriado dado o ponto de inflexão de novembro de 2025.
(Ilustrei ainda mais essa aceleração vestindo um suéter Gemini 3 na palestra, que recebi há algumas semanas e já está desatualizado graças ao Gemini 3.1.)
Sempre gosto de ter pelo menos um truque em qualquer palestra que dou, com base no princípio do momento ESTRELA que aprendi em Stanford – inclua algo que eles sempre lembrarão para tentar ajudar sua palestra a se destacar.
Para esta palestra eu tive dois truques. Eu construí a primeira parte da palestra sobre a análise de dados assistida por agente de codificação da temporada de reprodução de Kākāpō (o que significa que pude mostrar minha caneca), em seguida, fiz um rápido tour por alguns novos pelicanos andando de bicicleta antes de terminar com a revelação de que toda a apresentação foi apresentada usando um novo aplicativo macOS que eu tinha codificado em aproximadamente 45 minutos na noite anterior à palestra.
Presente.app
O aplicativo é chamado Presente-literalmente o primeiro nome que pensei. Ele foi desenvolvido usando Swift e SwiftUI e pesa 355 KB ou 76 KB compactados. Os aplicativos Swift são minúsculos!
Pode ter sido rápido de construir, mas o conjunto combinado de recursos é algo que eu queria anos.
Normalmente uso o Keynote para apresentações, mas às vezes gosto de misturar as coisas apresentando uma sequência de páginas da web. Faço isso carregando uma janela do navegador com uma guia para cada página e, em seguida, clicando nessas guias enquanto falo.
Isso funciona muito bem, mas tem uma desvantagem muito assustadora: se o navegador travar, perco todo o meu baralho!
Sempre tenho os URLs em um arquivo de notas, então posso clicar novamente e iniciá-los manualmente se precisar, mas não é algo que eu gostaria de resolver no meio de uma palestra.
Este foi meu prompt inicial:
Crie um aplicativo SwiftUI para fazer apresentações onde cada slide é um URL. O aplicativo começa como uma janela com um webview à direita e uma UI à esquerda para adicionar, remover e reordenar a sequência de URLs. Em seguida, você clica em Reproduzir em um menu e o aplicativo entra em tela inteira e as teclas esquerda e direita alternam entre URLs
Isso produziu um plano. Você pode ver a transcrição que implementou esse plano aqui.
No Present, uma palestra é uma sequência ordenada de URLs, com uma UI de barra lateral para adicionar, remover e reordenar esses URLs. Essa é toda a experiência de edição.

Quando você seleciona a opção “Play” no menu (ou pressiona Cmd+Shift+P) o aplicativo muda para o modo de tela inteira. As teclas de seta para a esquerda e para a direita navegam para frente e para trás e você pode aumentar e diminuir o tamanho da fonte ou rolar a página, se necessário. Clique em Escape quando terminar.
Fundamentalmente, o Present salva seus URLs automaticamente sempre que você faz uma alteração. Se o aplicativo travar, você poderá reiniciá-lo e restaurar o estado de apresentação.
Você também pode salvar apresentações como .txt arquivo (literalmente uma sequência de URLs delimitada por nova linha) e carregá-los novamente mais tarde.
Controlado remotamente através do meu telefone
Colocar o aplicativo inicial em funcionamento demorou tão pouco tempo que decidi ser mais ambicioso.
É legal ter um controle remoto para uma apresentação…
Então eu perguntei:
Adicione um servidor web que escuta em 0.0.0.0:9123 – o servidor web exibe uma única página compatível com dispositivos móveis com botões esquerdo e direito proeminentes – clicar nesses botões muda o slide para a esquerda e para a direita – há também um botão para iniciar o modo de apresentação ou parar dependendo do modo em que está.
Tenho Tailscale no meu laptop e no meu telefone, o que significa que não preciso me preocupar com redes Wi-Fi bloqueando o acesso entre os dois dispositivos. Meu telefone pode acessar http://100.122.231.116:9123/ diretamente de qualquer lugar do mundo e controlar a apresentação em execução no meu laptop.
Foram necessárias mais algumas solicitações iterativas para chegar à interface final, que ficou assim:

Há um indicador de slide na parte superior, botões anterior e próximo, um grande botão “Iniciar” e botões para ajustar o tamanho da fonte.
O recurso mais complexo é aquela barra fina próxima ao botão Iniciar. Essa é uma barra de rolagem habilitada para toque – você pode deslizar o dedo para cima e para baixo para rolar a página da web atualmente visível para cima e para baixo na tela.
Isso é muito desajeitado, mas funciona bem o suficiente para resolver o problema de carregamento de uma página com o conteúdo mais interessante abaixo da dobra.
Aprendendo com o código
Eu já havia enviado o código para o GitHub (com um grande aviso “Este aplicativo foi codificado por vibe (…) Não faço promessas além de que funcionou na minha máquina!”) quando percebi que provavelmente deveria dar uma olhada no código.
Usei isso como uma oportunidade para documentar um padrão recente que tenho usado: pedir ao modelo para apresentar um passo a passo linear de toda a base de código. Aqui está o padrão de orientações lineares resultante em meu guia Agentic Engineering Patterns, incluindo o prompt que usei.
O documento passo a passo resultante é genuinamente útil. Acontece que Claude Code decidiu implementar o servidor web para o recurso de controle remoto usando programação de soquete sem biblioteca! Aqui está o analisador HTTP mínimo usado para roteamento:
private func route(_ raw: String) -> String {
let firstLine = raw.components(separatedBy: "\r\n").first ?? ""
let parts = firstLine.split(separator: " ")
let path = parts.count >= 2 ? String(parts(1)) : "/"
switch path {
case "/next":
state?.goToNext()
return jsonResponse("ok")
case "/prev":
state?.goToPrevious()
return jsonResponse("ok")
Usar solicitações GET para mudanças de estado como essa abre algumas vulnerabilidades divertidas de CSRF. Para esta aplicação específica, eu realmente não me importo.
Expandindo nossos horizontes
Histórias de codificação Vibe como essa custam dez centavos hoje em dia. Acho que vale a pena compartilhar este por alguns motivos:
- Swift, uma linguagem que não conheço, foi absolutamente a escolha certa aqui. Eu queria um aplicativo de tela inteira que incorporasse conteúdo da web e pudesse ser controlado pela rede. Swift tinha tudo que eu precisava.
- Quando finalmente olhei para o código, ele era simples, direto e fazia exatamente o que eu precisava e nem um centímetro a mais.
- Isso resolveu um problema real para mim. Sempre quis uma boa maneira de apresentar uma apresentação como uma sequência de páginas e agora tenho exatamente isso.
Isso não significa que os desenvolvedores nativos de Mac estejam obsoletos. Eu ainda usei muito do meu conhecimento técnico acumulado (e o fato de já ter instalado o Xcode e similares) para obter esse resultado, e alguém que soubesse o que estava fazendo poderia ter criado uma solução muito melhor no mesmo período de tempo.
É uma bela ilustração de como nós, com experiência em engenharia de software, podemos expandir nossos horizontes em direções divertidas e interessantes. Não tenho mais medo do Swift! Da próxima vez que precisar de um aplicativo macOS pequeno e pessoal, sei que isso será possível com nosso conjunto de ferramentas existente.
