Português (Brasil) · English
Revisão de partidas de xadrez com Stockfish 17.1, 100% no seu navegador.
Sem conta, sem servidor, sem mensalidade — a análise inteira acontece na sua máquina.
▶ Abrir o Plyscope — abre direto no navegador, sem instalar nada
Como rodar · Benchmark · Como classifica · Licença GPLv3
Capturas da interface em inglês — o app é bilíngue, e a troca é imediata pelos botões PT/EN.
O Plyscope pega o PGN de uma partida sua, roda o Stockfish 17.1 dentro do seu próprio navegador, avalia todas as posições e devolve o que o Game Review do chess.com devolve: precisão dos dois jogadores, um selo para cada lance (Brilhante, Excelente, Melhor, Ótimo, Bom, Forçado, Impreciso, Erro, Capivarada), gráfico de vantagem, momentos decisivos e a seta do lance que você deveria ter jogado.
A diferença é onde isso acontece: na sua máquina. Nenhuma posição, nome de usuário ou avaliação é enviada para lugar nenhum.
Analisar a própria partida é a coisa que mais faz alguém melhorar no xadrez — e é justamente a que está atrás do paywall. No chess.com, o Game Review completo é recurso de assinatura; sem ela você tem uma revisão por dia. As alternativas gratuitas quase sempre mandam a sua partida para o servidor de alguém.
O motor que faz esse trabalho é livre (GPL) e roda em WebAssembly há anos. Não existe motivo técnico para cobrar por isso, e não existe motivo nenhum para a sua partida sair do seu computador. Este repositório é a demonstração disso: um index.html, uma pasta engine/, e acabou.
Marcar um lance como Brilhante (!!) é a parte difícil: é preciso separar sacrifício correto de peça pendurada. Todo mundo tenta, quase ninguém acerta.
Para não julgar o próprio trabalho no olho, o detector foi calibrado contra o Brilliant Move Benchmark — os 100 lances que o Game Review do chess.com marcou como brilhantes em 100 partidas reais. O gabarito é o chess.com; a pergunta é quantos daqueles 100 cada ferramenta também encontra.
| Ferramenta | Brilhantes encontrados |
|---|---|
| Chess.com (gabarito) | 100 / 100 |
| Plyscope | 93 / 100 |
| Chessigma | 93 / 100 |
| Chessiro | 90 / 100 |
| WintrChess | 45 / 100 |
| Chessitup | 41 / 100 |
| Chesskit | 23 / 100 |
Achar brilhante é fácil se você distribuir confete. Por isso a segunda medição, a que importa tanto quanto: em 8 partidas completas — 416 lances comuns — o Plyscope marcou 4 lances extras além dos do gabarito. É um detector conservador.
Um lance só recebe o selo depois de passar por quatro perguntas:
- Foi escolha? Lance único e legal não tem mérito.
- A oferta é real? O adversário precisa ter uma captura legal que ganhe material de fato — troca calculada na casa, não "peça sem defesa". Cravada ou xeque que impede a tomada não conta.
- Vale o que ofereceu? Valem as três formas que o chess.com premia: peça largada em casa atacada, captura que convida a recaptura, e o lance que simplesmente ignora uma ameaça em outro canto do tabuleiro.
- Continua de pé? Depois do sacrifício a posição precisa seguir boa e a partida precisa estar em jogo. Sacrificar já perdido, ou com a vitória no bolso, não é brilhante — a exceção é oferecer uma peça inteira ou mais.
Antes do veredito, todo candidato a sacrifício é reanalisado com mais profundidade, porque é exatamente ali que a análise rasa erra: o lance parece um erro até o motor enxergar a continuação.
Entrada
- Cola o PGN, arrasta um arquivo
.pgnou escolhe pelo seletor. - Busca as últimas partidas públicas pelo seu usuário do Chess.com ou do Lichess (APIs públicas, direto do navegador, sem login).
- PGN com várias partidas vira uma lista para você escolher.
Análise
- Stockfish 17.1 lite em WebAssembly, rodando local — multi-thread quando a página permite, single-thread quando não (o app decide sozinho e diz no painel Motor).
- Três profundidades: rápida (12), padrão (16), profunda (20).
- Segunda passada automática: lances suspeitos e sacrifícios voltam para o motor com 6 níveis a mais.
Treino
- Aprenda com seus erros: depois de analisar, o app monta uma fila com os seus Erros e Capivaradas, devolve o tabuleiro à posição de antes de cada um e pede o melhor lance.
- Acertou, ele reproduz a continuação para mostrar por que era melhor. Errou, diz quanto aquilo custou e oferece nova tentativa, dica ou a resposta.
- Fecha com um resumo e a opção de refazer só os que passaram batido. Roda sem tocar no motor: usa a análise que já está feita.
Relatório
- Precisão dos dois jogadores pelas fórmulas públicas do Lichess.
- Contagem por tipo de lance e momentos decisivos da partida.
- Gráfico de vantagem clicável — clique no vale e vá direto para a Capivarada.
Tabuleiro
- Abre do seu lado: se o usuário que você digitou na busca online é um dos jogadores do PGN e jogou de pretas, o tabuleiro já vem girado. Girou à mão, a sua escolha manda.
- As peças deslizam entre as casas ao navegar lance a lance, inclusive no roque, na captura e no en passant. Pulos longos continuam instantâneos, e quem pede
prefers-reduced-motionnão vê animação nenhuma. - Barra de avaliação, seta do melhor lance e selo do lance jogado sobre a casa.
- Três melhores linhas do motor, com cada lance clicável.
- Exploração livre: clique na peça, clique no destino, o motor avalia na hora. Voltar à partida desfaz.
- Reprodução automática com velocidade ajustável (0,6 s a 3,5 s).
- Sons sintetizados no próprio navegador — lance, captura, xeque, roque, promoção, brilhante, erro e fim de partida — com botão de mudo. Nenhum arquivo de áudio.
- Atalhos:
←→navegam,Home/Endvão ao início e ao fim,Fgira,espaçoreproduz,Mmuda. - Tabuleiro por teclado: o
Tabpousa numa casa e as setas viram um cursor de casa;Enterseleciona a peça e joga,Esccancela. Com o tabuleiro em foco as setas são dele; fora dele continuam passando os lances. Explorar variações e o treino se completam sem tocar no mouse. - Leitor de tela: o tabuleiro é
role="grid"e cada casa se anuncia como "e4, peão branco"; uma região viva diz o lance e o selo ao navegar ("Lance 12, Brancas: Nf3, Melhor") e o veredito de cada exercício do treino.
Interface
- Escura grafite, layout de aplicativo: o tabuleiro fica sempre visível, sem rolagem.
- Bilíngue: português do Brasil e inglês, com os botões
PT/ENno topo. A troca é imediata e não perde a análise que estiver na tela — relatório, selos, gráfico e análises salvas são reetiquetados na hora, sem recarregar a página. O idioma inicial vem do navegador (navigator.language) e a escolha fica guardada. - Números no formato de cada língua (
96,2%×96.2%,1,2 s×1.2s), datas idem, e os nomes das aberturas nas duas línguas — a notação de xadrez (SAN/FEN/PGN/ECO) nunca é traduzida. - O selo Capivarada só existe em português: em inglês ele é Blunder, porque no meio de uma escala técnica (Inaccuracy, Mistake…) a piada não diria nada a quem lê em inglês.
Dê dois cliques em Abrir Plyscope.bat.
Ele liga um servidor local minúsculo (PowerShell, já vem no Windows) e abre http://localhost:8123/index.html no seu navegador. Deixe a janela preta aberta enquanto usa; feche para encerrar.
Dê dois cliques em Abrir Plyscope.command — o Finder abre no Terminal, o servidor sobe e o navegador abre sozinho.
Pelo terminal dá no mesmo:
./plyscope.shNa primeira vez o macOS pode reclamar que o arquivo veio da internet: clique com o botão direito → Abrir → Abrir. Se o .command não tiver permissão de execução, chmod +x "Abrir Plyscope.command" plyscope.sh resolve.
./plyscope.shO script usa o Python 3 (que praticamente toda distro já tem) e cai para o Node.js se não achar Python. Aceita porta fixa e modo silencioso: ./plyscope.sh 8200 --sem-navegador.
O projeto é estático: index.html + engine/. Sobe em Vercel, GitHub Pages, Cloudflare Pages ou Netlify sem build nenhum — o passo a passo está em docs/HOSPEDAR.md. O vercel.json já serve o .wasm com o tipo certo, cache de um ano e os cabeçalhos do modo multi-thread.
Serve, mas em 1 thread: os servidores genéricos não mandam os cabeçalhos Cross-Origin-Opener-Policy e Cross-Origin-Embedder-Policy de que o motor multi-thread precisa.
python3 -m http.server 8123 # depois abra http://localhost:8123
# ou
npx serve .O Plyscope traz dois builds do mesmo Stockfish 17.1 lite e escolhe sozinho na hora de abrir:
| Página | Motor | Threads |
|---|---|---|
servida com COOP: same-origin + COEP: require-corp |
engine/stockfish-lite.js |
hardwareConcurrency − 1, no máximo 8 |
| qualquer outra | engine/stockfish-lite-single.js |
1 |
Esses dois cabeçalhos deixam a página cross-origin isolated, que é a condição do navegador para liberar o SharedArrayBuffer — e sem SharedArrayBuffer não existe WebAssembly com threads. Os atalhos do Windows, do macOS e do Linux já os mandam, e a Vercel também. O painel Motor mostra em que modo você está.
Se o multi-thread não subir (navegador antigo, memória curta), o app volta sozinho para o single-thread, sem aviso e sem quebrar nada.
E a busca no Chess.com e no Lichess? Continua funcionando com os cabeçalhos ligados. O COEP: require-corp só barra requisições em modo no-cors; o app busca as partidas com fetch(..., { mode: "cors" }), e as duas APIs respondem com Access-Control-Allow-Origin, o que basta. Foi por isso que o require-corp foi preferido ao COEP: credentialless: credentialless resolveria o mesmo problema, mas o Safari não o implementa — quem usa Safari ficaria sem multi-thread à toa.
Por que os 7 MB do motor multi-thread estão no repositório. Foi avaliado baixar sob demanda com um script, e não compensa: não há passo de build aqui (a Vercel publica o repositório como está, e o .bat do Windows não roda instalador nenhum), então um download sob demanda significaria ou um passo manual antes do primeiro uso, ou o site publicado sem o arquivo — nos dois casos o multi-thread simplesmente não aconteceria. O repositório já carregava 7 MB do build de 1 thread; passar para 14 MB de binário que quase nunca muda é barato perto de trocar "dois cliques e funciona" por "rode o script antes". Os dois .wasm estão marcados como binários no .gitattributes, então o Git não tenta versionar diferenças deles.
Clicar duas vezes no index.html abre a página em file://, e aí o app carrega mas não analisa. Dois motivos, os dois do navegador e não do app:
- WebAssembly: em
file://a origem é opaca (null), e o navegador recusa instanciar o módulo.wasmdo Stockfish — costuma reclamar de MIME type ou de CORS. - Web Worker: o motor roda numa thread separada, e criar um Worker a partir de
file://também é bloqueado por política de mesma origem.
Um servidor estático local resolve os dois. Ele serve os arquivos por http://localhost e continua sendo tudo local: nada trafega para fora da sua máquina — dá para desligar a internet depois de abrir a página e a análise continua funcionando.
A primeira análise carrega o motor do disco (≈ 7 MB de
.wasm) e demora alguns segundos a mais. As seguintes são instantâneas.
plyscope/
├─ index.html o app inteiro: interface, tabuleiro, chess.js e a análise
├─ Abrir Plyscope.bat atalho do Windows
├─ Abrir Plyscope.command atalho do macOS (duplo clique no Finder)
├─ plyscope.sh atalho do macOS e do Linux, pelo terminal
├─ servidor.ps1 servidor estático em PowerShell, porta 8123
├─ engine/
│ ├─ stockfish-lite-single.js Stockfish 17.1 lite, 1 thread (nmrugg/stockfish.js)
│ ├─ stockfish-lite-single.wasm ~7 MB
│ ├─ stockfish-lite.js o mesmo build, multi-thread
│ └─ stockfish-lite.wasm ~7 MB
├─ src/ fontes — o index.html é gerado a partir daqui
│ ├─ shell.html HTML + CSS (tokens, layout)
│ ├─ app.js análise, classificação, tabuleiro, som
│ ├─ i18n.js dicionário pt-BR/en e troca de idioma
│ ├─ build.py junta tudo num index.html só
│ ├─ vendor/chess.esm.js chess.js (regras, PGN, FEN)
│ ├─ data/openings.js base ECO compactada (3607 posições, ~78 KB)
│ └─ assets/pieces.svg sprite das peças
├─ tools/
│ ├─ servidor.py servidor estático em Python 3 (macOS/Linux)
│ ├─ servidor.js o mesmo em Node.js, para quem não tem Python 3
│ ├─ test.js (dev) teste ponta a ponta em jsdom, com Stockfish de verdade
│ ├─ gerar-aberturas.js (dev) regera src/data/openings.js a partir da base ECO
│ ├─ calibrar.js (dev) mede o detector de Brilhante contra o benchmark
│ └─ tune.js (dev) busca em grade dos limiares
├─ docs/
│ ├─ MANUAL.md manual do usuário final
│ ├─ BENCHMARK.md como a calibração foi feita e medida
│ ├─ HOSPEDAR.md publicar a sua cópia e o CSP explicado
│ └─ exemplos/opera-1858.pgn partida para testar em 10 segundos
├─ brand/
│ ├─ logo.svg mark.svg icon.svg favicon.svg
│ └─ BRAND.md nome, paleta, uso do logo, tom de voz
└─ LICENSE GPLv3
Para reconstruir o app depois de mexer em src/:
python3 src/build.pyPara testar antes de publicar (roda o Stockfish de verdade, ~35 s):
cd tools && npm install && node test.js ../docs/exemplos/opera-1858.pgnO build.py injeta o sprite, o chess.js, a base de aberturas, o dicionário de idiomas e o app.js nos marcadores do shell.html (<!--__PIECES__-->, /*__CHESSJS__*/, /*__OPENINGS__*/, /*__I18N__*/, /*__APP__*/). Não remova esses marcadores.
A base de aberturas é gerada, não editada à mão. Para atualizá-la:
cd /tmp && npm pack chess-openings && tar xzf chess-openings-*.tgz
node tools/gerar-aberturas.js /tmp/package/dist/chess/openings/eco.js
python3 src/build.pyO critério não é centipeão. Perder 1,0 de avaliação numa posição equilibrada joga a partida fora; perder 1,0 quando você já está +8 não muda nada. Contar centipeão trata os dois casos como o mesmo erro — e é por isso que ferramentas que fazem isso enchem a sua partida ganha de "erros".
O Plyscope usa chance de vitória (win%), a mesma ideia do Lichess e do chess.com. A avaliação do motor vira probabilidade de vitória por uma curva sigmoide, e o que se mede é quanta chance de vitória o lance jogou fora:
| Selo | Critério |
|---|---|
| Brilhante (!!) | Sacrifício correto — passou pelas quatro perguntas lá de cima. |
| Excelente (!) | Achou o único lance que segurava a posição. |
| Melhor (★) | Igual à primeira escolha do motor. |
| Ótimo / Bom (✓) | Perdeu pouquíssima chance de vitória. |
| Forçado (=) | Só existia esse lance legal. |
| Impreciso (?!) | Perdeu de 5% a 10% de chance de vitória. |
| Erro (?) | Perdeu de 10% a 20%. |
| Capivarada (??) | Perdeu mais de 20%. |
Em inglês os selos são Brilliant, Great, Best, Excellent, Good, Forced, Inaccuracy, Mistake e Blunder — a Capivarada é o nome do último só em português.
Precisão sai das fórmulas públicas do Lichess: a perda de chance de vitória vira precisão do lance, e a precisão da partida é a média entre a média ponderada pela volatilidade da posição e a média harmônica. Os números ficam próximos dos do chess.com, mas não idênticos — a fórmula deles é fechada.
Este app é uma casca em volta de trabalho de outras pessoas:
- Stockfish — o motor. GPLv3. Build WebAssembly de nmrugg/stockfish.js (
stockfish-17.1-lite-single). Licença completa emengine/LICENSE-stockfish-GPLv3.txt. - chess.js — regras, geração de lances, PGN e FEN. Licença BSD.
- lichess-org/chess-openings — a base ECO (código, nome e linha de cada abertura) que identifica a abertura da partida. CC0 1.0 — domínio público. Chegou aqui pelo pacote npm chess-openings de Guido Flohr (WTFPL), que redistribui essa mesma classificação; só os dados foram aproveitados, compactados por
tools/gerar-aberturas.jsemsrc/data/openings.js. Os nomes ficam guardados em inglês, como na origem, e o português sai na hora da busca pelo tradutor mecânico que acompanha a base — guardar os dois nomes custaria ~36 KB, e assim as duas línguas saem por ~4 KB. - Peças — sprite do cm-chessboard, desenhadas por Cburnett (Wikimedia Commons), CC BY-SA 3.0. Se você redistribuir as peças, mantenha a atribuição e a mesma licença.
- Lichess — pelas fórmulas de precisão e de chance de vitória, publicadas e explicadas.
- Chess.com — pelo Game Review, que é o alvo de comparação, e pelo Brilliant Move Benchmark ter um gabarito para medir.
- Poppins (SIL OFL) — o logotipo foi desenhado a partir dela e convertido em curvas.
O Plyscope é gratuito, open source e roda no seu navegador — sem conta, sem servidor, sem mensalidade, sem rastreamento. Se ele te ajudou a entender uma partida sua, considera me pagar um café. Ajuda a manter o projeto vivo.
Chave PIX (aleatória):
ac344236-c335-4f89-aee2-e671101d4619
Ou use o copia-e-cola:
00020101021126580014br.gov.bcb.pix0136ac344236-c335-4f89-aee2-e671101d46195204000053039865802BR5915Jhony Sganzerla6008BRASILIA62070503***6304EEE4
Beneficiário: Jhony Sganzerla · Valor: você escolhe 💛
Prefere apoiar de forma recorrente? Use o botão Sponsor no topo do repositório ou acesse github.com/sponsors/Jhonysganzerla.
Bem-vindo. O caminho curto: edite src/, rode python3 src/build.py, rode as
cinco suítes de tools/ e comite o build junto com a fonte.
CONTRIBUTING.md— como rodar, construir e testar, as três regras de ouro que quebram o site quando esquecidas, o padrão das mensagens de commit e o que não entra (nada que precise de servidor).CHANGELOG.md— o que mudou em cada versão.SECURITY.md— como relatar uma falha em privado, o que está no escopo e o prazo de resposta.
GPLv3. Não por preferência ideológica: o Stockfish vai dentro deste repositório, e o Stockfish é GPLv3. Distribuir o motor junto com o app torna o conjunto uma obra derivada — a GPLv3 é a única licença possível para essa distribuição, e é a certa.
Na prática: use, estude, modifique e redistribua à vontade; se distribuir uma versão modificada, ela também precisa ser GPLv3 e vir com o código.
Nome e logo. A GPLv3 cobre o código, não a marca. Faça fork à vontade;
só não use o nome Plyscope nem o logo de um jeito que sugira que a sua versão
é esta. O brand/logo.svg está aqui porque o README o usa.
O chess.js é BSD (compatível) e as peças são CC BY-SA 3.0, que exige atribuição — as duas coisas estão preservadas nos créditos acima. A base de aberturas é CC0 (domínio público), então não impõe condição nenhuma; ainda assim está creditada.
Feito para quem quer entender a própria partida sem pedir licença — nem pagar por isso.



