Skip to content
JhonysganzerlaPublic

About

Revisao de partidas de xadrez com Stockfish 17.1, 100% no navegador.

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

Português (Brasil) · English

Plyscope

Cada lance sob a lupa.

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

Plyscope: tabuleiro com o selo de cada lance, a seta do melhor lance e o gráfico de vantagem

Capturas da interface em inglês — o app é bilíngue, e a troca é imediata pelos botões PT/EN.


O que é

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.

Por que existe

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.

O detector de Brilhante

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:

  1. Foi escolha? Lance único e legal não tem mérito.
  2. 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.
  3. 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.
  4. 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.

Painel Relatório: abertura, precisão dos dois jogadores, gráfico de vantagem e a contagem por tipo de lance

Recursos

Entrada

  • Cola o PGN, arrasta um arquivo .pgn ou 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-motion nã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 / End vão ao início e ao fim, F gira, espaço reproduz, M muda.
  • Tabuleiro por teclado: o Tab pousa numa casa e as setas viram um cursor de casa; Enter seleciona a peça e joga, Esc cancela. 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/EN no 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.

Aprenda com seus erros: o tabuleiro de volta à posição antes do erro, pedindo o melhor lance

Como rodar

Windows — o caminho curto

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.

macOS

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.sh

Na 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.

Linux

./plyscope.sh

O 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.

Na web

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.

Qualquer outro servidor estático

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 .

Um thread ou vários

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.

Por que não dá para abrir o index.html direto

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 .wasm do 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.

Estrutura

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.py

Para testar antes de publicar (roda o Stockfish de verdade, ~35 s):

cd tools && npm install && node test.js ../docs/exemplos/opera-1858.pgn

O 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.py

Como a classificação funciona

O 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.

Créditos

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 em engine/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.js em src/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.

☕ Apoie o projeto

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.

PIX (Brasil)

QR Code PIX

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 💛

GitHub Sponsors

Prefere apoiar de forma recorrente? Use o botão Sponsor no topo do repositório ou acesse github.com/sponsors/Jhonysganzerla.

Contribuir

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.

Licença

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.

About

Revisao de partidas de xadrez com Stockfish 17.1, 100% no navegador.

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages