POV é um party game de percepção: os jogadores tentam descobrir em que ponto de uma escala entre dois extremos opostos cai a dica dada por um deles.
O estado de cada sala vive no Convex. convex/schema.ts define as tabelas rooms (o alvo secreto da rodada fica em round.target), players e guesses (um palpite por jogador por rodada). A query que alimenta a tela, getRoomView em convex/rooms.ts, só devolve o alvo real para quem é o Dono do POV ou depois que a rodada entra em fase de revelação; para os outros jogadores o campo chega como null até lá.
A sincronização é em tempo real: o cliente usa convex-svelte com queries e mutations reativas (src/lib/online/room.svelte.ts), manda um heartbeat a cada 8 segundos para saber quem está conectado, e envia o palpite de cada jogador ao Convex a cada 125ms enquanto ele arrasta o ponteiro (updateGuess em convex/round.ts). Quando todos os jogadores que não são o Dono travam o palpite, lockGuess dispara a revelação sozinho.
O medidor (src/lib/meter/Meter.svelte, geometria em src/lib/meter/geometry.ts) não é um slider contínuo: o ponteiro se move em 24 posições fixas (STEPS), encaixa sempre na mais próxima (snap) e a pontuação da rodada sai da distância entre essas posições (scoreFor, 0/2/3/4 pontos). Cada troca de posição dispara um clique sintetizado em Web Audio e uma vibração (src/lib/audio/clicks.ts), para que o ponteiro se comporte como uma peça mecânica em vez de um controle de formulário.
npm install
npm run test
npm run checknpm run dev sozinho não sobe o jogo. O cliente Convex é inicializado incondicionalmente na raiz do app, com setupConvex(import.meta.env.VITE_CONVEX_URL) em src/App.svelte, e a própria convex-svelte lança um erro se essa URL não for uma string. Confirmei isso rodando npm run dev num clone limpo, sem .env.local: a página carrega em branco, sem nenhum elemento na árvore de acessibilidade. É preciso npx convex dev com um projeto Convex configurado (o comando gera o .env.local com VITE_CONVEX_URL) antes de a aplicação conseguir montar.
npm run test (vitest): 7 arquivos, 29 testes, todos passando.
npm run check (svelte-check): 264 arquivos, 0 erros, 0 avisos.
Não configurei um deployment Convex próprio para levar o npm run dev do zero até o fim, porque isso criaria um projeto novo. Sem esse passo, o que ficou confirmado é a suíte de testes e a checagem de tipos passando limpas, e que a versão publicada em produção é jogável: testei uma rodada local até a revelação pelo link acima.
AGPL-3.0 (LICENSE). Mantém o código aberto e impede que um terceiro pegue o servidor e feche o jogo como serviço próprio.
