Aura Farm Royale Versão 67

Inspiration

Todo mundo fala que tem aura — mas é puro achismo: sem placar, sem juiz, sem rematch. Queríamos transformar isso em algo mensurável: um duelo onde a webcam e o servidor decidem quem realmente farma mais. O meme 67 virou ponto de partida; de lá nasceu um 1v1 com cinco challenges de brainrot, onde aura deixa de ser opinião e vira score.


What it does

Aura Farm Royale Versão 67 é um jogo 1v1 em tempo real pela webcam. Dois jogadores entram na mesma room, confirmam prontidão no lobby e disputam um match de 5 rounds — um meme por round:

Challenge O que fazer
67 Balançar as mãos em antifase
scooba Mão perto do rosto + flick
dab Entrar na pose do dab
mogar Postura dominante (queixo alto, ombros para trás)
farmar-aura Ficar parado — quanto menos se mexe, mais aura ganha

O backend lê landmarks (MediaPipe) e conta a aura de forma autoritativa. Maior total aura vence. Sem conta: entra com nome opcional, room_id e joga.


How we built it

Stack

  • Frontend: Next.js / React + bun
  • Backend: FastAPI + Python 3.11
  • Deploy: Railway
  • Wire: WebSocket em /ws/room (protocol 2)

Arquitetura

Player A (webcam)  ── frame ~30/s ──►  FastAPI (detectores)  ◄── frame ~30/s  ── Player B (webcam)
       ▲                                      │                                      ▲
       └──────── score / aura_event ──────────┴──────── score / aura_event ─────────┘
  • Frontend captura Hand Landmarker (67) e Pose Landmarker (demais challenges).
  • Backend roda detectores por challenge → aura_event (imediato) + score (~5×/s).
  • Aura = server-truth · Glow = local-truth (espetáculo no cliente).
  • Core em reducer puro (sem clock, sem I/O) → scoring determinístico e testável.
  • Match state machine: lobby → 5 rounds (relógio do servidor) → round_result → match_result.
  • Reconexão via player_token preserva aura; match não pausa se um player cair.
  • Leaderboard fail-soft em Postgres (opcional).

Processo

Contrato primeiro (CONTRACT.md) · TDD nos detectores · mock backend no front para iterar UI sem depender do servidor.


Challenges we ran into

  • Pivot de produto — sair do contador single-player 67 para 1v1 exigiu protocol 2, nova máquina de estados e aura comparável entre players.
  • Dois tipos de detector — motion (por rep) vs pose (por tempo segurado), com abstração única sem forçar “rep” onde não existe.
  • Auto-calibração do 67 — swing grande de perto e pequeno de longe precisam contar igual, sem threshold manual.
  • Latência vs espetáculo — pulse zero-latency no front só no 67; todo o resto segue eventos do servidor.
  • Pose Landmarker — sensível a iluminação e jitter; calibração com pessoas reais ainda em andamento.
  • Demo ao vivo — Wi‑Fi, wss://, permissão de câmera e fallback se a rede falhar.

Accomplishments that we're proud of

  • Produto 1v1 completo: room, lobby, match de 5 rounds, placar dual ao vivo, tela de vencedor.
  • Cinco detectores reais (67 + scooba + dab + mogar + farmar-aura), não stubs.
  • 80+ testes backend (pytest, ruff, mypy strict) + testes de copy, wire e detecção no front.
  • Contrato locked (protocol 2) + ADRs (1v1 é o produto, aura server-truth, framework de detectores).
  • Reducer determinístico — replay prova s2 == s; um só lugar lê o relógio (rooms.py).
  • Rebrand + microcopy pt-BR com tom brainrot sem quebrar o glossário do domínio.
  • Leaderboard com persistência opcional em Postgres, fail-soft.

What we learned

  • Contrato antes de código evita retrabalho quando dois devs integram front e back em paralelo.
  • Server-truth é o caminho certo para 1v1: cliente bonito, servidor árbitro.
  • Separar score (aura) de espetáculo (glow) evita confusão de produto e de implementação.
  • Pure core + adapter fino facilita testar gestos difíceis sem mockar WebSocket.
  • Memes precisam de acceptance bar com gente real — geometria pura no teste não garante diversão ao vivo.
  • Hackathon de 2 dias: integrar cedo (tracer bullet com dois browsers) vale mais que polish isolado.

What's next for AURA FARM ROYALE

Vamos melhorar os desafios, ter rankings, contas, etc

Tagline: Todo mundo fala que tem aura. A gente construiu o juiz: duelo 1v1 na webcam, 5 memes, placar no servidor. Quem farma mais, vence.

Share this project:

Updates