{"id":773,"date":"2026-10-11T18:34:44","date_gmt":"2026-10-11T21:34:44","guid":{"rendered":"https:\/\/yellowkode.com\/blog\/bigarrow-como-um-agente-de-ia-aponta-para-o-botao-certo-na-sua-tela\/"},"modified":"2026-10-11T18:34:44","modified_gmt":"2026-10-11T21:34:44","slug":"bigarrow-como-um-agente-de-ia-aponta-para-o-botao-certo-na-sua-tela","status":"publish","type":"post","link":"https:\/\/yellowkode.com\/blog\/bigarrow-como-um-agente-de-ia-aponta-para-o-botao-certo-na-sua-tela\/","title":{"rendered":"Bigarrow: Como um Agente de IA Aponta para o Bot\u00e3o Certo na Sua Tela"},"content":{"rendered":"<p>Toda vez que um agente de IA precisa de voc\u00ea para apertar um bot\u00e3o, acontece a mesma cena: ele escreve <em>please click Allow in the dialog<\/em> dentro de um terminal que voc\u00ea fechou faz meia hora. Fica travado esperando. Voc\u00ea s\u00f3 descobre quando volta pra mesa.<\/p>\n<p>O <strong>bigarrow<\/strong> resolve esse problema de um jeito deliberadamente burro: deixa o agente desenhar uma seta gigante por cima de qualquer janela, com uma plaquinha de texto, apontando pro bot\u00e3o que precisa ser clicado.<\/p>\n<h2>O fato<\/h2>\n<p>Franz Enzenhofer publicou em 8 de outubro de 2026 o <code>bigarrow<\/code>, uma ferramenta de linha de comando para macOS, mais um Skill para Claude Code e Codex. \u00c9 MIT, e um agente usa a ferramenta para desenhar uma seta grande com uma plaquinha de texto sobre qualquer app, para que um humano saiba exatamente qual bot\u00e3o clicar. Ela nunca clica nem digita por conta pr\u00f3pria.<\/p>\n<p>O reposit\u00f3rio passou de 600 estrelas na primeira semana. Instala com <code>brew install franzenzenhofer\/tap\/bigarrow<\/code>, e um comando a mais ensina o skill ao Claude Code e ao Codex.<\/p>\n<h2>Como funciona por baixo<\/h2>\n<p>A primeira coisa estranha do bigarrow: ele desenha por cima de tudo, mas o desenho em si n\u00e3o precisa de nenhuma permiss\u00e3o do macOS. Isso \u00e9 raro em ferramentas que mexem com a tela. Vale entender por qu\u00ea.<\/p>\n<h3>A janela transparente que fica em cima, mas nunca em foco<\/h3>\n<p>No macOS, estar <em>na frente<\/em> e estar <em>em foco<\/em> s\u00e3o coisas diferentes. Uma janela em foco \u00e9 a que recebe seus toques de teclado. Uma janela na frente \u00e9 a que o olho enxerga primeiro na pilha de janelas.<\/p>\n<p>O bigarrow cria uma janela transparente, do tamanho da tela, posicionada num n\u00edvel que o macOS chama de <em>screen saver level<\/em>. Esse n\u00edvel fica acima de janelas normais, de di\u00e1logos modais e at\u00e9 de apps em tela cheia, mas \u00e9 marcado como n\u00e3o-ativ\u00e1vel. O sistema nunca vai mandar eventos de teclado pra ele.<\/p>\n<p>A analogia que carrega a mec\u00e2nica: pense num pl\u00e1stico transparente que voc\u00ea cola na tela do laptop, desenha uma seta de caneta e deixa l\u00e1. O pl\u00e1stico est\u00e1 na frente de tudo, mas se voc\u00ea digitar no teclado, o texto vai pro Word que est\u00e1 por baixo, n\u00e3o pro pl\u00e1stico. Onde a analogia quebra: o pl\u00e1stico bloquearia o clique no bot\u00e3o por baixo. A janela do bigarrow deixa o clique passar.<\/p>\n<h3>Click-through, exceto onde n\u00e3o \u00e9<\/h3>\n<p>A seta tem duas partes visuais: a <em>haste<\/em> (o tra\u00e7o) e a <em>plaquinha<\/em> (o texto). Em todo o resto da janela, o clique atravessa como se nada estivesse ali. Dentro da haste e da plaquinha, o clique \u00e9 capturado, mas s\u00f3 pra uma coisa: remover a seta. \u00c9 o jeito de o humano dizer <em>ok, entendi, sai da frente<\/em>.<\/p>\n<p>Esse detalhe de arquitetura importa porque elimina uma classe inteira de bugs: a seta n\u00e3o compete com a interface. Voc\u00ea clica no bot\u00e3o que ela aponta, o clique vai pro app por baixo, nenhum foco troca de lugar.<\/p>\n<h3>Como ela encontra o alvo<\/h3>\n<p>O comando aceita v\u00e1rias formas de dizer <em>onde apontar<\/em>:<\/p>\n<ul>\n<li><code>--at X,Y<\/code>: coordenada global na tela<\/li>\n<li><code>--rect X,Y,W,H<\/code>: um ret\u00e2ngulo<\/li>\n<li><code>--mouse<\/code>: onde o cursor est\u00e1<\/li>\n<li><code>--window App:t\u00edtulo<\/code>: uma janela espec\u00edfica<\/li>\n<li><code>--element Label --app App<\/code>: um controle pelo r\u00f3tulo acess\u00edvel<\/li>\n<\/ul>\n<p>A op\u00e7\u00e3o <code>--element<\/code> \u00e9 a mais interessante, porque usa a API de Accessibility do macOS, a mesma que o VoiceOver usa. Cada controle de interface no sistema exp\u00f5e um r\u00f3tulo, um papel (bot\u00e3o, campo de texto, radiobutton) e uma posi\u00e7\u00e3o. O bigarrow pergunta ao macOS <em>onde est\u00e1 o controle chamado Allow dentro do System Settings?<\/em> e recebe coordenadas de volta.<\/p>\n<p>\u00c9 aqui que entra a diferen\u00e7a de permiss\u00f5es. Desenhar n\u00e3o precisa de nada. Mas para descobrir onde est\u00e1 o bot\u00e3o Allow, o bigarrow precisa que o app que o invocou (Terminal, iTerm2, Ghostty, VS Code, Claude) tenha permiss\u00e3o de Accessibility. O macOS concede essa permiss\u00e3o ao processo pai, nunca ao bigarrow em si. Se faltar, o comando sai com c\u00f3digo 4 e diz qual painel de ajustes abrir.<\/p>\n<h3>Por que isso \u00e9 um Skill, e n\u00e3o um MCP<\/h3>\n<p>O bigarrow se instala como Agent Skill, um formato que a Anthropic publicou como padr\u00e3o aberto. Skills s\u00e3o pastas de expertise que o agente carrega sob demanda. Cada skill tem um SKILL.md com YAML frontmatter contendo nome e descri\u00e7\u00e3o, mais um corpo em markdown com instru\u00e7\u00f5es, opcionalmente ao lado de arquivos de refer\u00eancia e scripts execut\u00e1veis. O agente s\u00f3 v\u00ea o nome e a descri\u00e7\u00e3o (cerca de 100 tokens) at\u00e9 uma solicita\u00e7\u00e3o combinar, a\u00ed l\u00ea o corpo, e toca em arquivos adicionais s\u00f3 quando as instru\u00e7\u00f5es apontam para eles.<\/p>\n<p>Essa carga em camadas \u00e9 o que o bigarrow explora com cuidado: o README afirma que a descri\u00e7\u00e3o do skill custa 182 tokens o tempo todo, as instru\u00e7\u00f5es principais (1.528 tokens) s\u00f3 carregam quando o agente decide apontar, e as refer\u00eancias de par\u00e2metros (mais 1.118) s\u00f3 quando ele precisa escolher um visual espec\u00edfico.<\/p>\n<p>Em pr\u00e1tica, o skill ensina ao agente <em>quando<\/em> apontar (permiss\u00f5es, 2FA, pagamentos, trechos pra colar), <em>como<\/em> escrever uma frase inteira na plaquinha, e <em>quando<\/em> parar depois que voc\u00ea agir. O bin\u00e1rio faz o desenho, o skill faz o julgamento.<\/p>\n<h3>O que termina uma seta<\/h3>\n<p>Toda seta expira sozinha. \u00c9 uma das decis\u00f5es de design mais importantes:<\/p>\n<ul>\n<li>Limite de tempo: <code>point<\/code> dura 8 segundos, <code>start<\/code> dura 300 segundos por padr\u00e3o<\/li>\n<li>O processo do agente morreu: uma seta termina quando o processo do agente que a desenhou sai (CLAUDE_PID, ou BIGARROW_OWNER_PID)<\/li>\n<li>O humano respondeu: <code>bigarrow stop --hook<\/code> funciona como UserPromptSubmit hook do Claude Code e limpa a seta daquela sess\u00e3o<\/li>\n<li>Clique na seta: dim visual sob o cursor avisa que vai sumir<\/li>\n<\/ul>\n<p>Nada de setas \u00f3rf\u00e3s flutuando pela tela porque o agente travou.<\/p>\n<h2>O que isso significa na pr\u00e1tica<\/h2>\n<p>Um comando real, direto do README:<\/p>\n<pre><code>bigarrow point --element \"Allow\" --app \"System Settings\" \\\n --text \"Franz, click Allow: Ghostty may control your Mac\"<\/code><\/pre>\n<p>Isso: traz System Settings pra frente, acha o bot\u00e3o Allow pela API de Accessibility, desenha uma seta apontando pra ele, com uma plaquinha dizendo exatamente o que o clique faz. Oito segundos depois, some.<\/p>\n<p>Um detalhe que mostra o cuidado do design: quando voc\u00ea usa &#8211;app com nome de app seguido de dois pontos e t\u00edtulo de janela ou aba, a ferramenta primeiro traz essa aba do Chrome ou Safari pra frente, porque apontar pra uma janela escondida atr\u00e1s do seu terminal \u00e9 in\u00fatil.<\/p>\n<p>Outro truque: <code>{{value}}<\/code> dentro do texto vira um bot\u00e3o de copiar. Comando t\u00edpico pra pedir um PIN:<\/p>\n<pre><code>bigarrow start --element \"PIN code\" --role textfield \\\n --app \"Google Chrome:Acme sign-in\" \\\n --text \"Franz, copy &amp; paste the PIN {{482913}} here\"<\/code><\/pre>\n<p>Essa combina\u00e7\u00e3o, agente que acha o campo + plaquinha com bot\u00e3o de copiar, \u00e9 a parte que de fato ensina um padr\u00e3o novo: quando o agente precisa de um input humano, ele n\u00e3o s\u00f3 pede, ele prepara o terreno pro humano agir em um clique.<\/p>\n<p>No StartAtende, meu agente de suporte no WhatsApp, essa mesma l\u00f3gica aparece em outro meio: o agente faz quase tudo, mas em certos pontos (confirma\u00e7\u00e3o de pagamento, decis\u00e3o sobre reembolso) ele precisa que um humano decida. A diferen\u00e7a \u00e9 que no WhatsApp o canal \u00e9 texto, ent\u00e3o o custo cognitivo de &#8220;ir at\u00e9 o lugar certo e fazer a coisa certa&#8221; vira uma frase. Numa interface gr\u00e1fica desktop, esse mesmo pedido vira <em>procurar visualmente um bot\u00e3o num menu que voc\u00ea nem sabe que existe<\/em>. A seta corta isso.<\/p>\n<h2>Onde quebra<\/h2>\n<p>A ferramenta \u00e9 macOS only, e nem toda vers\u00e3o. Precisa de macOS 14 ou mais, Swift 6, Xcode 16 pra compilar.<\/p>\n<p>A detec\u00e7\u00e3o por <code>--element<\/code> depende de Accessibility estar habilitado pro app pai. Se voc\u00ea rodar o Claude Code no Terminal e nunca tiver dado essa permiss\u00e3o, o comando falha com c\u00f3digo 4.<\/p>\n<p>P\u00e1ginas web dentro do Chrome s\u00e3o um caso espec\u00edfico: segundo o README, em Chrome, &#8211;element s\u00f3 funciona com ajuda, exigindo &#8211;force-renderer-accessibility ou VoiceOver ligado, porque o Chrome ignora a requisi\u00e7\u00e3o padr\u00e3o de accessibility. Em Electron apps a detec\u00e7\u00e3o funciona normal. A barra do pr\u00f3prio Chrome (bot\u00f5es de navega\u00e7\u00e3o, abas) sempre funciona.<\/p>\n<p>No macOS 26, t\u00edtulos de janela ficaram ocultos para apps externos, ent\u00e3o <code>--window App:t\u00edtulo<\/code> precisa de permiss\u00e3o de Screen Recording nessa vers\u00e3o. Mais um lugar onde a Apple apertou e a ferramenta teve que se adaptar.<\/p>\n<p>Um limite menos \u00f3bvio: a seta aponta pro que a \u00e1rvore de accessibility declara. Se um app tem a \u00e1rvore mal configurada (controles sem r\u00f3tulo, elementos custom desenhados em canvas), o agente n\u00e3o acha. O fallback \u00e9 apontar por coordenada fixa, o que quebra quando o layout muda.<\/p>\n<p>Nos livros que escrevi, entre eles a s\u00e9rie IA na Pr\u00e1tica, uma coisa que sempre tento deixar clara \u00e9 essa: ferramentas que dependem da \u00e1rvore de accessibility herdam toda a d\u00edvida t\u00e9cnica de UI de quem construiu o app alvo. O bigarrow \u00e9 t\u00e3o bom quanto o r\u00f3tulo do bot\u00e3o que ele tenta achar.<\/p>\n<p>Custo de CPU segundo o pr\u00f3prio projeto: 1,4% num runner de CI. Pequeno, mas n\u00e3o zero, porque a anima\u00e7\u00e3o de pulsar \u00e9 constante enquanto a seta existe.<\/p>\n<h2>O que n\u00e3o d\u00e1 pra afirmar ainda<\/h2>\n<p>N\u00e3o testei pessoalmente. As afirma\u00e7\u00f5es sobre comportamento (nunca rouba foco, nunca clica, nunca captura tela) v\u00eam do README e dos 104 testes automatizados que o projeto declara ter. O autor mostra transcri\u00e7\u00f5es e v\u00eddeos, mas eu n\u00e3o validei em m\u00e1quina minha.<\/p>\n<p>Tamb\u00e9m n\u00e3o d\u00e1 pra afirmar como isso envelhece. O macOS tem hist\u00f3rico de apertar APIs de accessibility a cada vers\u00e3o, e parte da promessa do bigarrow depende dessas APIs continuarem como est\u00e3o. J\u00e1 teve um reaperto na transi\u00e7\u00e3o pra macOS 26 (t\u00edtulos de janela), nada impede outro.<\/p>\n<p>Sobre seguran\u00e7a: o pr\u00f3prio FAQ reconhece que um agente que j\u00e1 roda shell no seu computador pode fazer coisas muito piores que uma seta, ent\u00e3o o vetor de ataque adicional \u00e9 pequeno. Ainda assim, nunca vi uma an\u00e1lise independente dessa superf\u00edcie. Vale ter em mente antes de instalar.<\/p>\n<h2>Como testar isso voc\u00ea mesmo<\/h2>\n<p>Caminho m\u00ednimo, uns 10 minutos:<\/p>\n<ol>\n<li>Instale com <code>brew install franzenzenhofer\/tap\/bigarrow<\/code><\/li>\n<li>Rode <code>bigarrow doctor<\/code> pra ver o que falta de permiss\u00e3o<\/li>\n<li>D\u00ea Accessibility pro Terminal (ou pro app onde roda seu agente) no painel que o doctor indicar<\/li>\n<li>Teste direto, sem agente: <code>bigarrow point --mouse --text \"aqui\"<\/code>. A seta aparece onde seu cursor est\u00e1<\/li>\n<li>Teste com alvo real: abra o Finder e rode <code>bigarrow point --element \"Search\" --app Finder --text \"campo de busca\"<\/code><\/li>\n<li>Se tudo funcionar, instale o skill com <code>bigarrow install-skill<\/code> e pe\u00e7a ao Claude Code: <em>me ensina a ativar o modo escuro usando o bigarrow<\/em><\/li>\n<\/ol>\n<p>Esse \u00faltimo passo \u00e9 o teste real. O agente precisa decidir sozinho que a tarefa pede apontar, escolher os elementos certos, montar os comandos com texto que fa\u00e7a sentido. Se o skill foi bem escrito, ele faz. Se n\u00e3o, voc\u00ea aprende r\u00e1pido onde o padr\u00e3o de Skills tem limite.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Entenda como o bigarrow permite que agentes como Claude Code desenhem setas na tela do Mac para pedir cliques humanos, sem roubar foco.<\/p>\n","protected":false},"author":2,"featured_media":772,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-773","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/posts\/773","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/comments?post=773"}],"version-history":[{"count":0,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/posts\/773\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/media\/772"}],"wp:attachment":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/media?parent=773"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/categories?post=773"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/tags?post=773"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}