Skip to content

Repository files navigation

Referee Lights

release visitors license

Português · English · Español

Plataforma completa de luzes de arbitragem para competições de Powerlifting seguindo as regras da IPF. Funciona online ou em rede local sem internet. Cinco interfaces web compartilham o mesmo estado em tempo real via Socket.IO e podem ser abertas em diferentes dispositivos:

  • / – painel administrativo que cria/recupera sessões, gera QR Codes, controla o timer e acompanha o estado da plataforma
  • /display – display em tela cheia com as três luzes, cronômetro, intervalo e badges de cooldown
  • /timer – painel de controle autônomo para timer/intervalo com badges de cooldown
  • /legend – painel complementar para transmissão/mesa técnica com layout personalizável
  • /ref/<judge> – consoles individuais (left, center, right) com votos e cartões IPF

O painel administrativo continua acessível em /admin para compatibilidade com links antigos.

Cada sessão possui roomId e PIN. O painel gera automaticamente os QR Codes dos árbitros e links de exibição/legenda, além de permitir a rotação dos tokens quando necessário.

Screenshots

Painel administrativo Display principal Display com timer Visual de intervalo – etapa 1 Visual de intervalo – etapa 2 Tela chroma key

Rodar no Windows (sem instalação)

  1. Baixe o arquivo referee-lights-windows.zip na página de Releases
  2. Clique com o botão direito → Extrair tudo...
  3. Abra a pasta extraída e dê duplo-clique em Iniciar.cmd
  4. O navegador abrirá automaticamente com a plataforma
  5. Compartilhe os QR Codes com os árbitros (mesma rede Wi-Fi)

Para encerrar, pressione qualquer tecla na janela do Iniciar.

Executando localmente

1. Server (Fastify + Socket.IO)

cd server
cp .env.example .env
npm install
npm run dev

O servidor sobe em http://localhost:3333.

2. Frontend (Next.js)

cd ../frontend
cp .env.example .env.local
npm install
npm run dev

Aponte o navegador para http://localhost:3000 nas rotas desejadas.

Ajuste NEXT_PUBLIC_WS_URL e NEXT_PUBLIC_API_URL no .env.local para o endereço público do servidor quando estiver em rede.

Variáveis de ambiente

Server (.env)

Variável Descrição Padrão
PORT Porta do servidor 3333
CORS_ORIGIN Origens permitidas —
LOG_LEVEL Nível de log (debug, info, warn, error) info

Painel / (Admin)

  • Criar nova sessão – gera roomId, PIN administrativo, tokens dos árbitros e links diretos de display/legenda
  • Entrar em sessão existente – retoma uma plataforma informando roomId + PIN
  • QR Codes – exibe os códigos de cada árbitro, com botão para gerar novos links (pede confirmação antes de revogar os tokens atuais)
  • Ready / Release / Clear – controla o fluxo padrão das luzes e o timer de 60 s
  • Timer – start/stop/reset e ajuste rápido de minutos
  • Intervalo – programa tempo de troca, alterna entre aviso vermelho e painel principal

Alertas visuais e sonoros

  • O contador do intervalo emite toques curtos nos últimos 10 s e um sinal longo quando o tempo de troca atinge zero. Após 1 s, a mensagem TROCA DE PEDIDAS ENCERRADA substitui o display vermelho.
  • O cronômetro principal também sinaliza os últimos 10 s com bipes curtos e dispara três beeps rápidos no segundo final.
  • Por regras dos navegadores, os sons só tocam depois que o operador interage com a página (clique/tecla).

Fluxo sugerido

  1. Acesse /, crie uma nova sessão e copie o roomId/PIN.
  2. Abra o display em /display?roomId=ABCD&pin=1234 e coloque em tela cheia.
  3. Compartilhe os QR Codes com os árbitros (cada um abre o console apropriado).
  4. Se precisar rotacionar a equipe, abra o modal de QR Codes e confirme "Gerar novos links".
  5. Use o botão "Legenda" para abrir a tela complementar (/legend?roomId=ABCD&pin=1234).
  6. Fluxo padrão: Ready → árbitros votam → Release → decisão exibida → Clear.

Personalização rápida

  • Ajuste o tempo padrão editando INITIAL_TIMER em server/src/state.ts.
  • Para alterar tokens/tempo de expiração, veja server/src/rooms.ts e RoomManager.
  • Aparência do painel admin em frontend/src/pages/admin.tsx.
  • Ajustes de escala do display/cronômetro em frontend/src/pages/display.tsx e frontend/src/components/TimerDisplay.tsx.
  • Alertas sonoros em frontend/src/components/IntervalFull.tsx.

Atalhos externos (F1/F10)

O Key Relay é embutido no servidor e controlado pelo painel admin (toggle "Ativar Key Relay", protegido pelo PIN da sala). Quando a decisão é revelada, o servidor envia a tecla configurada para a janela em foco na máquina onde ele roda:

  • F1 com pelo menos dois votos brancos (válido);
  • F10 com pelo menos dois votos vermelhos (inválido).

As teclas podem ser trocadas no modal (F1–F12 ou uma letra/dígito, com até três modificadores). Funciona no Windows (SendKeys), no macOS (System Events — exige permissão de Acessibilidade) e no Linux (xdotool). Disponível só quando o servidor roda com KEY_RELAY_AVAILABLE=true (padrão no pacote Windows).

Deploy

  • Server: Docker (server/Dockerfile) ou qualquer plataforma Node 20+. Basta npm run build e npm start.
  • Frontend: Vercel ou semelhante. Configure NEXT_PUBLIC_WS_URL e NEXT_PUBLIC_API_URL apontando para o domínio do servidor.
  • Docker: monte um volume em /app/data para persistir os dados.