MovieTQ
Um jogo de filmes multiplayer em tempo real. Quatro modos ativos, cinco idiomas de jogo e um perfil só que acompanha você em todos eles.


Bomb-It · demo
Modos de jogo
Trailer Quiz
Um trecho de trailer é reproduzido para todos na sala no mesmo instante. O primeiro a digitar o título correto vence a rodada.
Bomb-It
Um modo de sobrevivência contra o tempo: nomeie um filme que se encaixe no tema antes que o tempo acabe. Se o tempo esgotar, você perde uma vida.
Daily
Um filme escondido por dia, o mesmo para todos os jogadores do mundo. Cada palpite é avaliado coluna a coluna até alguém acertar.
Pet Feast
Uma arena de snake jogada com o seu pet: cresça comendo, segure a linha e sobreviva mais que todo mundo no tabuleiro.
Mais modos
Novas formas de jogar estão no roadmap, incluindo um modo baseado em votação. O Pet Battle, o duelo de cartas dos pets, está em reformulação e aparece como “em breve” enquanto isso.
Funcionalidades
Salas e acesso
- Lobbies públicos
- Salas privadas com senha
- Filtros de gênero e dificuldade (1–10)
- Cinco idiomas de jogo
- Sessões de convidado com um clique
Social
- Galeria de amigos com presença
- Mensagens diretas
- Chat e emotes na sala
- Classificação global e Calçada da Fama
Progressão
- XP, níveis e conquistas
- Pipoca (moeda do jogo)
- Guarda-roupa — avatares, títulos, fundos, emotes, efeitos
- Um pet que acompanha você em todos os modos
- Um calendário de presente diário
Contas e assinatura
- Login por e-mail, Discord ou Google
- Assinaturas em três níveis
- Pacotes de Pipoca e presentes
- Nenhuma vantagem na pontuação
Classificação e perfis
Recreated from the in-game leaderboard — real cards, live ranking and stats. Click the card to open the profile.






Um desenvolvedor. Toda a stack.
Frontend, backend, banco de dados, pagamentos, segurança e deploy — tudo construído e publicado sozinho.
Construído com
- React
- TypeScript
- Vite
- Tailwind CSS
- react-youtube
- Node.js
- Express
- WebSocket
- Supabase
- PostgreSQL
- Stripe
- JWT
- bcrypt
- node-cron
- Cloudflare
- Render
Engenharia
Salas com autoridade no servidor
A lógica do jogo roda no servidor, não no navegador. Uma sala avança pelos próprios estados no servidor e empurra cada mudança para todo mundo de uma vez — assim ninguém consegue trapacear alterando a tela e todos assistem ao mesmo ponto do trailer.
Cada sala é mantida em memória e avançada por uma máquina de estados LOBBY → STARTING → IN_ROUND → BETWEEN_ROUNDS → FINISHED sob um relógio do servidor, com isolamento por partida para que uma sala com problema não trave as demais. Os clientes são apenas para renderização: eles se alinham à transmissão em vez de decidir qualquer coisa, impedindo que um cliente adulterado altere o resultado; e a resposta da rodada não faz parte do payload até a revelação.
Empurrado, não consultado
O seu navegador não fica perguntando ao servidor se aconteceu alguma coisa. Cada jogador mantém um canal aberto e é o servidor que fala por ele, então uma rodada nova, o palpite de um rival, uma linha de chat ou um tomate atirado em você chegam no instante em que acontecem. Se esse canal não puder ser aberto, o jogo volta discretamente a consultar em intervalos e a partida continua.
O estado ao vivo é entregue por push do servidor com Server-Sent Events — um GET autenticado em streaming por cliente, carregando um retrato completo do estado público a cada mudança, tanto no Trailer Quiz quanto no Bomb-It. O stream também serve de batimento de presença, então um socket fechado envelhece aquele jogador em vez de deixar um fantasma na sala. O Trailer Quiz mantém uma consulta em intervalos do mesmo estado como fallback automático para um navegador que não consiga segurar o stream, e os dois caminhos compartilham um único serializador, de modo que nunca podem discordar.
Pipeline de middleware segregado
Toda requisição passa por uma sequência organizada de validações antes de qualquer handler rodar, isolando as responsabilidades e barrando um acesso inválido logo no primeiro portão em vez de lá dentro da lógica do jogo.
Cada requisição percorre uma única cadeia de middleware ordenada que cobre transporte e cookies, verificações de origem cruzada e CSRF, limites de requisição por rota, validação de schemas com sanitização contra prototype-pollution e XSS, e autenticação — tudo isso antes de um handler de rota ver a requisição. Cada responsabilidade é isolada e testável de forma independente, a ordenação é estrutural e fixada por testes em vez de deixada à convenção, e o que falha em um portão é rejeitado naquele portão.
Catálogo de filmes pré-carregado
Os trailers em vídeo não ficam salvos no servidor — o que é carregado em memória na inicialização são as informações dos filmes e os links do YouTube. Durante o jogo, o vídeo roda direto do YouTube no navegador do jogador, de forma que o servidor não gasta banda de vídeo e o jogo nunca trava esperando dados externos. A dificuldade apenas define a profundidade da busca na lista de filmes ordenados por fama.
Metadados de cerca de 58.000 filmes (títulos, infos e ids de trailers do YouTube) são lidos de um JSONL para a memória na inicialização e ordenados por fama, sem armazenamento de vídeo no servidor. A seleção por gênero filtra a base e a dificuldade delimita a busca (do top 100 no nível 1 até a base inteira no nível 10) antes de um sorteio aleatório sem repetição. O trailer é reproduzido via player do YouTube no cliente, eliminando chamadas a serviços externos em partida.
Cinco idiomas, um catálogo
Uma sala pode ser jogada em cinco idiomas, e o filme é validado pelo título oficial no idioma escolhido. Em vez de manter cinco cópias do catálogo em memória ao mesmo tempo, o jogo monta o índice de um idioma na primeira vez que alguém joga nele. Os acentos são opcionais nos dois sentidos, então “criança” e “crianca” são a mesma resposta.
As linhas do catálogo carregam um mapa opcional com o título oficial de cada filme nos outros idiomas, e o idioma da sala define em qual conjunto de títulos a rodada é jogada e validada. Os pools por idioma e seus índices exatos e de apelidos são montados sob demanda no primeiro uso porque a RAM é a restrição limitante — cerca de +11 MB para os dados e +14 MB por idioma ativo. A validação normaliza acentos em NFD nos dois sentidos, então um acento nunca decide uma resposta correta.
Um desafio diário sem nada para espiar
Todo jogador do mundo recebe o mesmo filme por dia, e ele é escolhido pela própria data em vez de sorteado — assim o dia é reproduzível e respostas recentes são puladas. Nada sobre a resposta chega ao navegador antes de você acertar: as cores de cada linha de comparação são calculadas no servidor a partir do palpite enviado.
A resposta do dia é derivada da própria data em vez de sorteada, pulando o que foi usado recentemente — então todo jogador do mundo recebe o mesmo filme e o dia é reproduzível sem guardar em lugar nenhum um calendário que alguém pudesse ler adiantado. A linha do desafio guarda um retrato do título, ano, direção e gêneros do filme, então um dia anterior continua sendo revelado corretamente mesmo depois de o pool mudar. As linhas de comparação são recalculadas no servidor a cada leitura: o cliente nunca as fornece, e os atributos da resposta ficam fora do payload até a vitória. Os contadores compartilhados são operações atômicas no banco, então a posição de acerto que o jogador vê é o valor que o incremento devolveu, e não uma corrida de leitura e escrita.
Uma simulação, três consumidores
A arena de snake pareceria travada se cada tecla precisasse atravessar a rede e voltar — e ela não faz isso. As partidas sozinho e contra bots rodam inteiras no navegador; em uma sala multiplayer, a sua cobra vira no instante em que você aperta a tecla, enquanto o servidor segue como juiz dos demais. As partidas contra bots são reexecutadas no servidor depois, com o mesmo código, de forma que um jogo que parece local continua sendo pontuado com honestidade.
Um único módulo de arena determinístico é avançado por três consumidores — o tick do servidor, a previsão da própria cobra no cliente e a reexecução da partida contra bots no servidor —, de modo que eles não podem divergir. O multiplayer trafega por um WebSocket autorizado uma única vez no momento da conexão e que não carrega credencial nenhuma a cada mensagem, e cada tick é serializado uma vez por sala em vez de uma vez por cliente. O cliente prevê a própria cobra desfazendo e reaplicando as entradas ainda não confirmadas e interpola as demais; uma fila de entradas por cobra, cuja legalidade é conferida contra a cauda da fila, garante que nenhuma tecla seja descartada em silêncio. Nada que o cliente relata vale para a pontuação: a partida contra bots roda local pela sensação e depois o servidor a reexecuta pelo mesmo módulo antes de contar.
Trailers resilientes
Se um trailer estiver fora do ar ou bloqueado para a região de alguém, o jogo não trava. O reporte de um jogador (ou a troca feita pelo host) substitui o vídeo por um reserva na hora e reinicia o tempo, garantindo que ninguém perca pontos por vídeos quebrados.
Um reporte ou uma troca do host é validado contra a rodada ativa que ele afirma ser, antes de qualquer coisa mudar — então a troca não pode ser acionada de fora daquela rodada. Um trailer reserva é extraído do catálogo em memória, a sala atualiza para ele, o tempo reinicia e os palpites já feitos são limpos para não acumular no novo vídeo.
Identidade ao longo da cadeia de proxies
A API fica atrás de mais de um salto, e cada um deles se apresentaria como o autor da chamada. A identidade de quem chamou é carregada através desses saltos em uma forma que a borda atesta e a aplicação verifica, de modo que ela não pode simplesmente ser afirmada por quem está chamando — limites e banimentos agem sobre o requisitante real, e a garantia se sustenta sem que a aplicação precise confiar em um valor encaminhado pelo que ele diz ser.
Autorização imposta no servidor
O servidor é o único guardião das regras. Ele trata todas as requisições como não confiáveis: valida cada informação, verifica as origens e pode cancelar uma sessão na mesma hora. Silenciamentos, banimentos e logs de auditoria rodam no topo do sistema.
A autorização é imposta inteiramente no servidor, em vez de delegada à camada de dados, então toda consulta que a aplicação emite é tratada como uma fronteira de segurança e nenhuma afirmação do cliente sobre quem ele é vale por si. As sessões trafegam em cookies que os scripts da própria página não conseguem ler, e cada requisição reconfere se a sessão continua válida — então revogar uma vale já na requisição seguinte, e não quando ela fosse expirar.
Manutenção agendada
Tarefas em segundo plano mantêm o servidor limpo e organizado por conta própria — por exemplo, limpando dados de sessões de convidados expiradas para não acumular lixo no banco.
Rotinas agendadas no servidor executam a manutenção fora do fluxo de requisições — expirando sessões de convidados depois que a janela delas passa e mantendo o estado em memória enxuto — sem intervenção manual e sem efeito na latência das requisições.
Painel administrativo com permissões por papel
Por trás do jogo, há um console de operações interno onde a equipe de confiança administra o serviço no ar: acompanhar atividade e custo, moderar jogadores, resolver denúncias de jogadores e de trailers, agendar tarefas em segundo plano e acionar chaves globais quando algo precisa parar. O console se remodela conforme o cargo — um moderador recebe uma visão focada em denúncias e auditoria, e não o conjunto completo de controles — e cada ação fica registrada.
Um console restrito por papel cuja superfície é decidida no servidor a partir do cargo, de modo que a visão de um moderador se resolve em um subconjunto real, e não em ferramentas administrativas escondidas em uma marcação que o cliente poderia ler. Chaves globais de execução permitem degradar o serviço deliberadamente — fechar novos cadastros, pausar a criação de partidas, tirar um subsistema do ar — e são aplicadas na camada de requisição, não apenas na interface. Ações operacionais adiadas entram em fila fora do fluxo de requisição, as evidências de moderação são reunidas ao lado de cada caso para que a decisão seja tomada em um lugar só, e cada ação operacional é gravada em um log de auditoria exportável.
Social
MovieTQ is a social game too — identity, friends, rivalry, and live in-room expression. The two panels below are real and interactive — try them.
You
YouProfiles & cosmetics
Every player is a recognizable identity — a portrait, a level, an equipped title, a background and a bio that follow them across every screen.
Friends & DMs
Send and accept requests, see who’s online, and chat one-to-one in lightweight popups — friends become collectible player cards, not address-book rows.
Global leaderboard
Ranked by level with the top three highlighted gold/silver/bronze; your own row stays pinned even when you're off the visible page. Tap a row to open the profile.
Store & inventory
Earn Popcorn from matches and level-ups, then spend it on cosmetics. Rarity drives both price and prestige; equip anything you own straight from the inventory.
Achievements
Proof-of-play with progress bars and rarity badges. Unlocks grant titles, cosmetics and Popcorn — and surface as the trophy strip on your profile.
Safety & staff
Calm, visible safety tools live next to the person they affect, with separate staff controls and an official Mod Team roster so players know who represents the game.
Tem um projeto dos sonhos?
Fale-me sobre sua ideia e eu lhe enviarei um orçamento.
