← Todos os projetos

FloatTube

Um mini player do YouTube para Mac que fica parado enquanto os desktops deslizam.

Papel
Designer & engenheiro — app macOS, extensão do Chrome, ícone & landing page
Empresa
FloatTube · own product
Período
2026
Plataformas
macOS · Chrome
FloatTube — o player flutuante sobre o Chrome, com a aba mostrando que o vídeo saiu dela
FloatTube — controles nativos em Liquid Glass

O contexto

A solução parecia uma flag de janela. Não é: mesmo uma janela marcada para aparecer em todos os desktops continua pertencendo aos Spaces do usuário, então o WindowServer a desliza junto em cada transição e a devolve ao lugar no fim — o tranco que se vê no Chrome. O único jeito de manter a janela realmente parada é tirá-la dos Spaces do usuário, algo que uma extensão não consegue e uma janela comum não faz.

Decisões que foram minhas

  1. 01Um Space privado acima dos desktops

    A janela do player mora num Space criado pela API privada do SkyLight, num nível absoluto acima dos desktops do usuário e abaixo da tela de bloqueio. Conferir os Spaces da janela no próprio WindowServer mostrou que a flag de todos os desktops a recolocava em cada Space que entrava — o fantasma que chegava deslizando com o desktop novo — então o app remove essa flag enquanto o player está fixado. Se os símbolos sumirem, ele detecta e volta a uma janela flutuante comum.

  2. 02Controles nativos em Liquid Glass sobre o player do YouTube

    O player incorporado do YouTube, redesenhado, espalha controles pelo vídeo inteiro, o que brigava com arrastar a janela. Escondi esses controles — API do player sem controles, mais CSS injetado no iframe de outra origem por um WKUserScript — e desenhei controles nativos com NSGlassEffectView, comandando o vídeo pela IFrame API. A janela arrasta de qualquer ponto, redimensiona por bordas largas ou pinça e anima entre dois tamanhos; durante anúncios, os cliques passam direto para o Pular continuar funcionando.

  3. 03Troca de aba por um WebSocket local

    Uma extensão Manifest V3 pausa a aba quando você sai dela e manda para o app, por 127.0.0.1, o id do vídeo, o segundo, a velocidade e o volume; ao voltar, o segundo exato retorna à aba. O app recusa qualquer conexão cujo Origin não seja uma extensão do navegador, e o service worker só mantém o socket vivo enquanto há vídeo no player.

Onde isso chegou

Código aberto no GitHub com build universal para Apple Silicon e Intel, a extensão do Chrome, ícone Liquid Glass no formato do Icon Composer e uma landing page na Vercel com a demonstração lado a lado da troca de Space.

Telas

FloatTube — o player flutuante sobre o Chrome, com a aba mostrando que o vídeo saiu dela
FloatTube — controles nativos em Liquid Glass
No meio da troca de Space: o picture-in-picture do Chrome desliza junto, o FloatTube fica parado

Próximo case

Don't Idle→

Um app nativo de macOS que mantém o Mac — e o seu status — sempre ativo.