3 pontos por woojinim64 2026-04-22 | 4 comentários | Compartilhar no WhatsApp

Olá! Estou publicando o DualClip, um mini projeto que fiz agora que comecei a usar macOS pela primeira vez.

É a primeira vez que escrevo um post assim, então estou um pouco nervoso. Mesmo que as frases fiquem meio estranhas, peço que releve 🙇


O que é isso

É só um pequeno app de barra de menu que oferece 3 "slots" de área de transferência.

Slot A → a área de transferência padrão, como sempre (⌘C / ⌘V)
Slot B → ⌥⌘C / ⌥⌘V
Slot C → ⌃⌘C / ⌃⌘V

Não é um sistema de "histórico" como Paste ou Maccy, e sim um sistema de "slots".
Você pode deixar coisas como um e-mail usado com frequência ou nomes de variáveis fixados no B, e continuar usando ⌘C/⌘V normalmente no dia a dia.


Por que eu fiz isso

Ao refatorar ou trabalhar com tradução, basta apertar ⌘C mais uma vez para aquilo que você tinha copiado antes simplesmente desaparecer.
Quando isso vai se acumulando ao longo do dia, acaba gerando um estresse inesperado.
Também testei apps de histórico, mas para mim eles tinham alguns pontos frustrantes.

  • aquele passo extra de abrir o pop-up e escolher é lento
  • para achar "não o item de agora, mas o anterior", no fim você precisa procurar com os olhos
  • eu só queria apertar ⌥⌘V e aquilo colar imediatamente

Então, em vez de encher de funções, deixei só um conceito simples em uma linha: "fixar em um slot e puxar com atalho".


A parte mais divertida de fazer (Atomic Paste)

Isso foi mais complicado do que eu imaginava, porque no macOS o ⌘V sempre lê apenas o system pasteboard.
Então, para colar o Slot B, eu precisava sobrescrever temporariamente o system clipboard; mas aí o que eu tinha copiado originalmente com ⌘C acabava se perdendo.
Fiquei pensando bastante em como resolver isso.
No fim, fiz funcionar nesta sequência:

  1. primeiro faço backup do system clipboard atual (deep copy de todos os tipos)
  2. sobrescrevo com o conteúdo do Slot B
  3. simulo ⌘V com CGEvent
  4. depois de 150ms, restauro de novo o original salvo no backup

Como todo esse ciclo termina em menos de 150ms, quem usa nem percebe que "o que estava copiado com ⌘C sumiu por um instante".
Eu chamo isso sozinho de "Atomic Paste"...(dei esse nome e fiquei orgulhoso sozinho 😅).
A parte de acertar o timing para pausar o polling por um momento e ignorar o changeCount levou bastante tempo.
Passei um bom tempo perdido pensando: "por que o Slot A está sendo trocado pelo conteúdo do Slot B...?"

Outros detalhes menores:

  • suporte completo a texto/imagem/arquivo/RTF (NSPasteboardItem com deep copy)
  • não funciona de jeito nenhum em campos de senha (IsSecureEventInputEnabled check)
  • ao encerrar, a memória dos slots recebe zero-fill (memset_s)
  • todos os atalhos podem ser alterados (graças a sindresorhus/KeyboardShortcuts)

Sobre privacidade

Como apps de área de transferência lidam com dados sensíveis, nessa parte eu tomei bastante cuidado.

  • nada é gravado em disco. Tudo fica só na RAM.
  • simplesmente não existe código de rede. Não há verificação de atualizações nem telemetria.
  • é open source sob MIT, então você mesmo pode inspecionar tudo.

Se quiser testar

Provavelmente o mais prático é usar Homebrew.
brew install RAKKUNN/tap/dualclip

Ou então você pode baixar o zip em GitHub Releases e colocá-lo em /Applications.
Como o build tem notarização da Apple, não aparece aviso na primeira execução.

GitHub: https://github.com/RAKKUNN/DualClip
Requisitos: macOS 13+ (Apple Silicon), permissão de acessibilidade


Como é o primeiro app de macOS que fiz, com certeza ainda deve haver várias partes meio cruas.
Se puderem me dar feedback como "isso seria melhor assim" ou "há um erro acontecendo em tal lugar", eu realmente vou agradecer e aprender bastante.
Sintam-se à vontade para deixar um comentário!
Tenham todos um ótimo dia!!

4 comentários

 
vwjdalsgkv 2026-04-23

O Ditto, um programa de gerenciamento de área de transferência para Windows, também funciona de forma semelhante ao que você implementou.
Acho que pode ser uma boa referência para definir a direção de melhorias~

 
woojinim64 2026-04-23

Obrigado pela informação!🙇🙇
Vou dar uma olhada e considerar aproveitar só as partes que fizerem sentido!

 
greekr4 2026-04-23

Acho que seria bom criar também uma função de armazenamento, como no Clipy.

 
woojinim64 2026-04-23

Você tem necessidade de histórico e snippets?
Mas o histórico não combina com a direção do DualClip.
Estou me esforçando para torná-lo o mais leve e prático possível.
Obrigado pelo feedback.