Eu codifiquei meu aplicativo de apresentação macOS dos sonhos

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.

Um post-it em um quadro no FOO Camp. Lê-se: O estado dos LLMs, edição de fevereiro de 2026 - tudo mudou desde novembro! Simon Willison - o cartão está repleto de nomes de novos modelos: Qwen 3.5, DeepSeek 3.2, Sonnet 4.6, Kimi K2.5, GLM5, Opus 4.5/4.6, Gemini 3.1 Pro, Codex 5.3. O cartão ao lado diz Por que os Cientistas Sociais acham que precisam da genética? Bill January (nem tudo por causa da IA)

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.

Captura de tela de uma janela do aplicativo macOS intitulada "Presente" mostrando resultados de pesquisa de imagens do Google para "kakapo". Uma visualização na web mostra uma pesquisa de imagens do Google com fotos em miniatura de papagaios kākāpō com legendas. Uma barra lateral à esquerda mostra uma lista numerada de URLs, principalmente de simonwillison.net e static.simonwillison.net, com o item 4 (https://www.google.com/search?...) destacado em azul.

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:

Aplicativo de navegador da web para celular com botões grandes, Slide 4/31 na parte superior, botões Anterior, Próximo e Iniciar, uma barra fina com um ícone de rolagem para cima/para baixo e botões + e - de tamanho de texto e o URL do slide atual na parte inferior.

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.



Source link

Postagens Similares

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *