1What's in the packageO que vem no pacote
Zabum! is a complete trivia game: spin the prize globe, pick a category, beat the critter opponents, collect stickers and keep your daily streak. It is 100% static, so there is nothing to run on your server.
O Zabum! é um jogo de perguntas completo: gire o globo da sorte, escolha a categoria, vença a bicharada, junte figurinhas e mantenha a sequência diária. É 100% estático, então não há nada para rodar no seu servidor.
zabum-static-1.0/ ├─ game/ ← upload THIS to your website │ ├─ index.html │ ├─ zabum.config.js ← ads & leaderboard settings (edit me) │ ├─ api/ranking.php ← optional leaderboard (PHP) │ ├─ audio/ ← music, effects, narrator voice │ ├─ icons/ assets/ sw.js manifest.webmanifest ├─ documentation/ ← this guide (index.html) └─ source/ ← full source code (only if you want to rebuild)
audio/voice/ to remove her.A Lara fala nos três idiomas. Apague audio/voice/ para tirá-la.2Install in 2 minutesInstalar em 2 minutos
Any web host works: shared hosting, a VPS, Netlify, GitHub Pages, S3… You only need to put the files online.
Qualquer hospedagem serve: compartilhada, VPS, Netlify, GitHub Pages, S3… Basta colocar os arquivos no ar.
- Unzip the packageDescompacte o pacoteEverything you need is inside the
game/folder.Tudo o que você precisa está na pastagame/. - Upload the contents of
game/Envie o conteúdo degame/Use FTP or your host's File Manager (cPanel, hPanel…). Put it inpublic_html/for the main address, or in a sub-folder such aspublic_html/zabum/. On Netlify, just drag thegamefolder in.Use FTP ou o Gerenciador de Arquivos da hospedagem (cPanel, hPanel…). Coloque empublic_html/para o endereço principal, ou numa subpasta comopublic_html/zabum/. Na Netlify, é só arrastar a pastagame. - Open the address in your browserAbra o endereço no navegadorExample:
https://yoursite.com/orhttps://yoursite.com/zabum/. The game asks the player to choose a language and you are playing.Exemplo:https://seusite.com/ouhttps://seusite.com/zabum/. O jogo pede o idioma e já dá para jogar.
game/Envie SOMENTE o conteúdo de game/
Do not upload the source/ folder: it is the developer source code and shows a blank page with errors such as main.tsx 404. source/ is only for editing the game on your own computer (see "Make it yours").
Não envie a pasta source/: ela é o código-fonte para desenvolvedores e mostra uma página em branco com erros como main.tsx 404. A source/ serve só para editar o jogo no seu computador (veja "Personalizar").- Use HTTPS. "Add to home screen" and some audio features need it.
- Use HTTPS. "Adicionar à tela inicial" e alguns recursos de áudio precisam dele.
- Do not open
index.htmlby double-clicking it (file://): browsers block it. To test on your own computer, run a tiny server, for examplenpx serve game. - Não abra o
index.htmlcom duplo clique (file://): os navegadores bloqueiam. Para testar no seu computador, rode um servidor simples, por exemplonpx serve game. - After the first visit the game also works offline (it is a PWA).
- Depois da primeira visita o jogo também funciona offline (é um PWA).
3LanguagesIdiomas
On the first visit the player picks English, Português or Español and can change it any time in Settings (the gear icon). The interface, the questions and the narrator all follow the chosen language. Nothing to configure.
Na primeira visita o jogador escolhe English, Português ou Español e pode trocar quando quiser em Configurações (a engrenagem). A interface, as perguntas e a voz seguem o idioma escolhido. Não há nada para configurar.
4Ads (optional)Anúncios (opcional)
Ads are off by default. To earn with the game, open zabum.config.js in any text editor. No rebuild needed.
Os anúncios vêm desligados. Para ganhar com o jogo, abra o zabum.config.js em qualquer editor de texto. Sem recompilar nada.
window.ZABUM_CONFIG = { ads: { provider: 'adsense', // 'none' | 'adsense' | 'custom' adsenseClient: 'ca-pub-XXXXXXXXXXXXXXXX', bannerSlot: '1234567890', // optional banner ad unit testMode: true, // Google TEST ads; set false to go live }, };
What the player seesO que o jogador vê
| WhereOnde | AdAnúncio |
|---|---|
| After a match (every 3rd match, never the first, at least 2 min apart) | Interstitial |
| Depois de uma partida (a cada 3, nunca a 1ª, mínimo 2 min entre dois) | Intervalo |
| Result screen & sticker album | Optional rewarded video → 1 bonus sticker pack (max. 3 per day) |
| Resultado e álbum de figurinhas | Vídeo com recompensa opcional → +1 pacotinho (máx. 3 por dia) |
| Home & album | Small banner (only if bannerSlot is set) |
| Início e álbum | Banner pequeno (só se bannerSlot estiver preenchido) |
Ads never appear while a question is on screen.
Os anúncios nunca aparecem enquanto há uma pergunta na tela.
Before going live: interstitial and rewarded ads use Google AdSense for Games, which Google has to approve for your site. Until then the game simply shows no ads. If an ad blocker is on, or no ad is available, the game never waits more than ~2.5 seconds.
Antes de publicar: os anúncios de intervalo e de recompensa usam o Google AdSense para Jogos, que o Google precisa aprovar para o seu site. Até lá o jogo simplesmente não mostra anúncio. Com bloqueador de anúncios, ou sem anúncio disponível, o jogo nunca espera mais que ~2,5 segundos.
Privacy law (GDPR / LGPD / CCPA): the game itself stores data only in the player's browser (no cookies, no tracking, no accounts). If you turn ads on, you are responsible for the consent banner your region requires (for example Google's consent tool).
Leis de privacidade (LGPD / GDPR / CCPA): o jogo só guarda dados no navegador do jogador (sem cookies, sem rastreamento, sem conta). Ao ligar anúncios, você é responsável pelo aviso de consentimento que a sua região exige (por exemplo, a ferramenta de consentimento do Google).
Using another ad network (custom)Usar outra rede de anúncios (custom)
Set provider: 'custom' and define your own adapter in the same file:
Use provider: 'custom' e defina o seu adaptador no mesmo arquivo:
window.ZABUM_CONFIG = { ads: { provider: 'custom' } };
window.ZABUM_AD_PROVIDER = {
name: 'my-network',
interstitial() { /* show the ad */ return Promise.resolve(); }, // resolve when it is over
rewarded() { /* show the video */ return Promise.resolve(true); }, // true only if watched to the end
banner(el, slot) { /* draw inside el */ return () => {}; }, // optional; return a cleanup function
};5Leaderboard (optional)Ranking (opcional)
A one-file PHP leaderboard is included. It is OFF by default: until you turn it on, the game shows a Hall of fame with each player's best matches on their own device. No database: scores live in a JSON file. If your host has PHP (almost all shared hosts do), turning it on takes one minute.
Um ranking em PHP, de um arquivo só, já vem incluído. Ele vem DESLIGADO: enquanto você não ligar, o jogo mostra um Hall da fama com as melhores partidas de cada jogador no próprio aparelho. Sem banco de dados: os pontos ficam num arquivo JSON. Se a sua hospedagem tem PHP (quase todas têm), ligar leva um minuto.
- Turn it onLigueOpen
zabum.config.jsin a text editor and changeenabled: falsetoenabled: trueinsideranking. Save and upload the file. That is the only switch.Abra ozabum.config.jsnum editor de texto e troqueenabled: falseporenabled: truedentro deranking. Salve e envie o arquivo. Esse é o único interruptor. - Upload the
api/folderEnvie a pastaapi/It is already insidegame/, next toindex.html. Nothing else to do if you uploaded everything in step 2.Ela já está dentro degame/, ao lado doindex.html. Se você enviou tudo no passo 2, não há mais nada a fazer. - Make the folder writableDê permissão de escrita à pastaPermission
755(or775/777if your host requires it) so PHP can createranking-data.php.Permissão755(ou775/777se a hospedagem exigir) para o PHP poder criar oranking-data.php. - Check itConfiraOpen
https://yoursite.com/api/ranking.php. You should see{"ok":true,"writable":true,…}.Abrahttps://seusite.com/api/ranking.php. Deve aparecer{"ok":true,"writable":true,…}.
That's all. Players choose a nickname and a critter on their first match, and every finished match adds points to the Today / Week / Month / All time boards.
Pronto. O jogador escolhe apelido e bichinho na primeira partida, e cada partida terminada soma pontos nos placares Hoje / Semana / Mês / Sempre.
api/ folder? The game automatically falls back to the Hall of fame with the best matches played on that device. Nothing breaks.Ligou, mas não tem PHP, ou a pasta api/ não foi enviada? O jogo volta sozinho para o Hall da fama com as melhores partidas daquele aparelho. Nada quebra.Settings (top of ranking.php)Ajustes (no topo do ranking.php)
| SettingAjuste | What it doesPara quê | |
|---|---|---|
$TIMEZONE | When the "day" turns over (e.g. America/New_York, Europe/London). Default UTC. | Quando o "dia" vira (ex.: America/Sao_Paulo). Padrão UTC. |
$MAX_POINTS | Largest score accepted for one match. | Maior pontuação aceita por partida. |
$MIN_SECONDS | Minimum time between two matches of the same player. | Tempo mínimo entre duas partidas do mesmo jogador. |
$MAX_PER_IP_HOUR | Matches accepted per IP address per hour. | Partidas aceitas por IP por hora. |
- Backup: copy
api/ranking-data.php. Reset: delete it. It starts with a PHP guard line, so it can never be downloaded. - Backup: copie o
api/ranking-data.php. Zerar: apague o arquivo. Ele começa com uma linha de proteção em PHP, então nunca pode ser baixado. - Turn it off: in
zabum.config.jssetenabled: false. If you will never use it, you can also delete theapi/folder. - Desligar: no
zabum.config.jsuseenabled: false. Se nunca for usar, pode também apagar a pastaapi/. - Privacy: it stores nickname, avatar, points and a hashed IP (only for the spam limit).
- Privacidade: guarda apelido, avatar, pontos e um hash do IP (só para o limite contra spam).
6Make it yoursPersonalizar
Without any tools (edit files)Sem ferramentas (editando arquivos)
| I want to…Quero… | Do thisFaça isto | ||
|---|---|---|---|
| Change the page title / description | Edit index.html (<title> and <meta name="description">) and manifest.webmanifest. | Mudar o título / descrição | Edite o index.html (<title> e <meta name="description">) e o manifest.webmanifest. |
| Change the app icon | Replace the PNGs in icons/ (192, 512, maskable-512, apple-touch) keeping the same names. | Trocar o ícone do app | Troque os PNG em icons/ (192, 512, maskable-512, apple-touch) mantendo os nomes. |
| Replace music / sounds | Replace the MP3 files in audio/music and audio/sfx (same file names). | Trocar música / sons | Troque os MP3 em audio/music e audio/sfx (mesmos nomes). |
| Remove the narrator | Delete the audio/voice/ folder. The game works the same without it. | Tirar a apresentadora | Apague a pasta audio/voice/. O jogo funciona igual sem ela. |
With the source codeCom o código-fonte
Needs Node.js 20.19+ (or 22). Open a terminal inside the source/ folder:
Precisa do Node.js 20.19+ (ou 22). Abra um terminal dentro da pasta source/:
npm install npm run dev # development server (http://localhost:5195) npm run build:static # builds the site into dist-static/ (the same as game/) npm test # unit tests
The questions are in src/game/bank/en.json, pt.json and es.json. Colors and mascots are in src/game/categories.ts and src/styles/. Interface texts are in src/i18n/. The technical section at the end of this page explains the formats in detail.
As perguntas ficam em src/game/bank/en.json, pt.json e es.json. Cores e bichos estão em src/game/categories.ts e src/styles/. Os textos da interface estão em src/i18n/. A seção técnica no fim desta página explica os formatos em detalhe.
7What is saved, and whereO que é salvo, e onde
Progress (level, stickers, crowns, missions, daily streak, settings and the on-device Hall of fame) is stored in the player's own browser (localStorage). Clearing the browser data resets it. There are no accounts and no cookies. The only server-side data is the optional leaderboard file described above.
O progresso (nível, figurinhas, coroas, missões, sequência diária, configurações e o Hall da fama do aparelho) fica no próprio navegador do jogador (localStorage). Limpar os dados do navegador zera tudo. Não há contas nem cookies. O único dado no servidor é o arquivo do ranking opcional descrito acima.
8Troubleshooting & FAQProblemas comuns e perguntas frequentes
Most questions are answered here in under a minute. Tap a question to open it.
A maioria das dúvidas é resolvida aqui em menos de um minuto. Toque numa pergunta para abri-la.
- Do a hard refresh (Ctrl/Cmd + Shift + R) and try again in a private/incognito window.
- Faça a atualização forçada (Ctrl/Cmd + Shift + R) e teste de novo numa janela anônima.
- Open the game from its real https:// address, never by double-clicking the file.
- Abra o jogo pelo endereço https:// de verdade, nunca com duplo clique no arquivo.
- Press F12 → Console and note any red error message.
- Aperte F12 → Console e anote qualquer mensagem de erro em vermelho.
- Test on another browser or phone. If only one device fails, the problem is on that device.
- Teste em outro navegador ou celular. Se só um aparelho falha, o problema está nele.
- Look for your case in the questions below.
- Procure o seu caso nas perguntas abaixo.
📋 Report a problem: what to send me📋 Relatar um problema: o que me enviar
Copy this, fill it in and send it. Do not post your purchase code, passwords or FTP details in public comments.
Copie, preencha e envie. Não publique o código de compra, senhas ou dados de FTP em comentários públicos.
Game version: (e.g. 1.0) Page address: https:// Hosting: (e.g. Hostinger shared, cPanel, Netlify, VPS) Device and system: (e.g. iPhone 13 / iOS 17, Windows 11) Browser and version: (e.g. Chrome 120, Safari) What I expected: What happened instead: Steps to repeat it: Red error in the console (F12): (copy the text) Screenshot or screen recording: (attach) Did I edit any file? Which ones:
Versão do jogo: (ex.: 1.0) Endereço da página: https:// Hospedagem: (ex.: Hostinger compartilhada, cPanel, Netlify, VPS) Aparelho e sistema: (ex.: iPhone 13 / iOS 17, Windows 11) Navegador e versão: (ex.: Chrome 120, Safari) O que eu esperava: O que aconteceu: Passos para repetir: Erro em vermelho no console (F12): (copie o texto) Print ou gravação de tela: (anexe) Editei algum arquivo? Quais:
Installing & hostingInstalação e hospedagem
The console shows 404 for main.tsx, manifest.webmanifest, zabum.config.js or iconsO console mostra 404 para main.tsx, manifest.webmanifest, zabum.config.js ou ícones
This is the classic sign that the source/ folder was uploaded instead of game/. Delete what you uploaded and upload the contents of game/ (its index.html must be right next to the audio/, icons/ and assets/ folders). The source/ folder is not meant to run on a web server.
Esse é o sinal clássico de que a pasta source/ foi enviada no lugar da game/. Apague o que enviou e envie o conteúdo de game/ (o index.html dela precisa ficar ao lado das pastas audio/, icons/ e assets/). A pasta source/ não foi feita para rodar num servidor web.
The page is blank or nothing loadsA página está em branco ou nada carrega
Make sure you uploaded the contents of game/ (not the zip, not an extra parent folder) and that index.html sits at the address you open. Do not open the file by double-click (file://). Open the browser console (F12) to see any red error.
Confirme que você enviou o conteúdo de game/ (não o zip, nem uma pasta extra por cima) e que o index.html está no endereço que você abre. Não abra o arquivo com duplo clique (file://). Abra o console do navegador (F12) para ver algum erro em vermelho.
Do I need a database, Node.js or a special server?Preciso de banco de dados, Node.js ou servidor especial?
No. The game is plain static files: any web host works. PHP is only needed for the optional leaderboard, and even that uses a JSON file, not a database.
Não. O jogo são arquivos estáticos comuns: qualquer hospedagem serve. O PHP só é preciso para o ranking opcional, e mesmo ele usa um arquivo JSON, não um banco de dados.
I see "404", "Index of /" or a list of filesAparece "404", "Index of /" ou uma lista de arquivos
The address you opened has no index.html directly inside it. Usually the files ended up one folder deeper (for example public_html/game/index.html). Move the contents of game/ up, or open the address with that folder in it. Also note that Linux hosts are case-sensitive: Index.html is not index.html, and Audio/ is not audio/. Keep the original names.
O endereço que você abriu não tem um index.html diretamente dentro dele. Em geral os arquivos ficaram uma pasta mais fundo (por exemplo public_html/game/index.html). Mova o conteúdo de game/ para cima, ou abra o endereço com essa pasta. Lembre também que hospedagens Linux diferenciam maiúsculas de minúsculas: Index.html não é index.html, e Audio/ não é audio/. Mantenha os nomes originais.
Some images or sounds are missing, or the console shows 404sFaltam imagens ou sons, ou o console mostra erros 404
The upload was probably incomplete or corrupted. Check that: (1) your FTP program is in Binary or Auto mode, never ASCII (ASCII breaks MP3/PNG files); (2) the upload did not stop halfway; the audio/ folder has many files, so it is common for a transfer to time out. A reliable alternative is to upload the zip of game/ through your host's File Manager and use "Extract" there, then move the contents to the right place.
O envio provavelmente ficou incompleto ou corrompido. Confira: (1) seu programa de FTP está em modo Binário ou Auto, nunca ASCII (o ASCII estraga MP3/PNG); (2) o envio não parou no meio; a pasta audio/ tem muitos arquivos, então é comum a transferência dar timeout. Uma alternativa segura é enviar o zip de game/ pelo Gerenciador de Arquivos da hospedagem e usar "Extrair" lá, depois mover o conteúdo para o lugar certo.
The browser says "Not secure"O navegador diz "Não seguro"
Turn on the free SSL certificate in your host panel (look for "SSL", "Let's Encrypt" or "Force HTTPS") and open the site with https://. Without HTTPS, "Add to home screen" and some audio features do not work.
Ative o certificado SSL gratuito no painel da hospedagem (procure "SSL", "Let's Encrypt" ou "Forçar HTTPS") e abra o site com https://. Sem HTTPS, "Adicionar à tela inicial" e alguns recursos de áudio não funcionam.
I use Cloudflare or a CDN and my changes do not appearUso Cloudflare ou CDN e as mudanças não aparecem
Purge the cache in the CDN panel ("Purge everything" on Cloudflare), then hard refresh the browser. While you are testing you can turn on Cloudflare's "Development Mode".
Limpe o cache no painel da CDN ("Purge everything" na Cloudflare) e depois atualize o navegador à força. Durante os testes você pode ligar o "Development Mode" da Cloudflare.
Can I put it in a sub-folder or on a sub-domain?Posso colocar numa subpasta ou subdomínio?
Yes. All paths are relative, so it works at the root, in a sub-folder (/zabum/) or on a sub-domain.
Pode. Todos os caminhos são relativos, então funciona na raiz, numa subpasta (/zabum/) ou num subdomínio.
Can I embed it in a WordPress page or another website?Posso incorporar numa página do WordPress ou em outro site?
The simplest way is to upload the game to its own folder and link to it. To show it inside a page, use an iframe, ideally on the same domain (progress is saved per address, see below):
<iframe src="https://yoursite.com/zabum/" allow="autoplay; fullscreen" style="width:100%;height:90vh;border:0"></iframe>
O jeito mais simples é enviar o jogo para uma pasta própria e linkar para ela. Para mostrar dentro de uma página, use um iframe, de preferência no mesmo domínio (o progresso é salvo por endereço, veja abaixo):
<iframe src="https://seusite.com/zabum/" allow="autoplay; fullscreen" style="width:100%;height:90vh;border:0"></iframe>
Can players install it like an app?Os jogadores podem instalar como um aplicativo?
Yes, it is a PWA, over HTTPS. iPhone: Safari → Share → "Add to Home Screen". Android: Chrome menu → "Install app" / "Add to Home screen". Desktop Chrome/Edge: install icon in the address bar.
Pode, é um PWA, em HTTPS. iPhone: Safari → Compartilhar → "Adicionar à Tela de Início". Android: menu do Chrome → "Instalar app" / "Adicionar à tela inicial". Chrome/Edge no computador: ícone de instalar na barra de endereço.
Can I publish it on Google Play, the App Store or game portals?Posso publicar na Google Play, App Store ou em portais de jogos?
This item is a web game. Wrapping it for the stores (Capacitor, Cordova, Trusted Web Activity…) or submitting it to game portals is possible in principle, but it is not included and not covered by support: each store and portal has its own rules, SDKs, signing and review. Check the license terms and the store rules before you plan it.
Este item é um jogo web. Empacotar para as lojas (Capacitor, Cordova, Trusted Web Activity…) ou enviar a portais de jogos é possível em princípio, mas não está incluído nem coberto pelo suporte: cada loja e portal tem regras, SDKs, assinatura e revisão próprios. Leia a licença e as regras da loja antes de planejar.
Which browsers and devices are supported?Quais navegadores e aparelhos são compatíveis?
Recent versions of Chrome and Edge (107+), Firefox (104+) and Safari (16+, so iPhone/iPad with iOS 16 or newer). Internet Explorer is not supported. Update the browser first when something looks broken on an old device.
Versões recentes do Chrome e Edge (107+), Firefox (104+) e Safari (16+, ou seja, iPhone/iPad com iOS 16 ou mais novo). O Internet Explorer não é compatível. Se algo estiver quebrado num aparelho antigo, atualize o navegador primeiro.
Playing & soundJogando e som
There is no soundNão tem som
Browsers only allow sound after the first tap or click, so tap anywhere once. On iPhone, also check the silent switch and the volume. Check Settings (gear) that Music and Effects are on.
Os navegadores só liberam som depois do primeiro toque ou clique, então toque em qualquer lugar uma vez. No iPhone, confira também a chave de silêncio e o volume. Veja em Configurações (engrenagem) se Música e Efeitos estão ligados.
The sound stops after switching apps (iPhone)O som para depois de trocar de aplicativo (iPhone)
iOS pauses web audio when you leave the page. The game restores it when you come back; if it does not, tap the screen once. Also check that the phone is not in silent or Low Power mode.
O iOS pausa o áudio da página quando você sai dela. O jogo o restaura ao voltar; se não voltar, toque na tela uma vez. Confira também se o celular não está no modo silencioso ou de economia de bateria.
The narrator speaks the wrong languageA apresentadora fala no idioma errado
The voice follows the language chosen in Settings (English, Português or Español). Change it there. If it still does not change, hard refresh.
A voz segue o idioma escolhido em Configurações (English, Português ou Español). Troque lá. Se ainda não mudar, faça a atualização forçada.
The game is slow or stutters on an old phoneO jogo fica lento ou trava num celular antigo
Update the browser, close other tabs and apps, and turn off battery-saver / Low Power mode (it limits animations). The game uses no heavy 3D, but very old devices can still struggle. If it is only slow on your site and not on the demo, check your host's speed and that the files are served with compression (gzip/brotli).
Atualize o navegador, feche outras abas e aplicativos e desligue a economia de bateria (ela limita animações). O jogo não usa 3D pesado, mas aparelhos muito antigos ainda podem sofrer. Se só está lento no seu site e não na demonstração, confira a velocidade da hospedagem e se os arquivos são servidos com compressão (gzip/brotli).
A player's progress disappeared or is different on another deviceO progresso de um jogador sumiu ou é diferente em outro aparelho
Progress is saved in each browser, per address. It is separate on every device and browser, and also between http and https, www and non-www, and sub-domains. It is lost when the player clears site data or uses a private window. There are no accounts to sync it. Tip: pick your final address before launch and redirect the others to it, so players do not "lose" progress when the address changes.
O progresso fica salvo em cada navegador, por endereço. É separado em cada aparelho e navegador, e também entre http e https, www e sem www, e subdomínios. Some quando o jogador limpa os dados do site ou usa janela anônima. Não há contas para sincronizar. Dica: escolha o endereço final antes do lançamento e redirecione os outros para ele, para o jogador não "perder" o progresso quando o endereço mudar.
How do I reset my own progress for testing?Como zerar o meu progresso para testar?
Clear the site data in your browser (Settings → Privacy → Site data), or use a private window.
Limpe os dados do site no navegador (Configurações → Privacidade → Dados do site), ou use uma janela anônima.
I replaced something but still see the old versionTroquei um arquivo e ainda vejo a versão antiga
The game keeps a cache for offline play. Hard refresh (Ctrl/Cmd + Shift + R). Pages and settings are always re-fetched, but audio files are kept until the cache version changes: if you replaced audio, open sw.js and change const CACHE = 'zabum-v5' to a new name (for example 'zabum-v6') and upload it.
O jogo guarda um cache para funcionar offline. Faça a atualização forçada (Ctrl/Cmd + Shift + R). As páginas e as configurações são sempre buscadas de novo, mas os áudios ficam guardados até a versão do cache mudar: se trocou áudios, abra o sw.js, mude const CACHE = 'zabum-v5' para outro nome (por exemplo 'zabum-v6') e envie o arquivo.
Questions & contentPerguntas e conteúdo
How many questions are there? Will players see repeats?Quantas perguntas existem? O jogador vai ver repetidas?
About 1,000 per language (English, Portuguese and Spanish), in 7 categories and 3 difficulty levels, in 3 formats: multiple choice, true/false and "estimate the number". Every match draws a fresh selection. A very regular player will eventually meet repeats; add your own questions to extend it.
Cerca de 1.000 por idioma (inglês, português e espanhol), em 7 categorias e 3 níveis de dificuldade, em 3 formatos: múltipla escolha, verdadeiro/falso e "estime o número". Cada partida sorteia uma seleção nova. Um jogador muito assíduo acaba vendo repetidas; adicione as suas para ampliar.
I found a wrong answer or a typo in a questionAchei uma resposta errada ou um erro de digitação numa pergunta
Please tell us the language and the exact question text (and, if you can, the correct answer and a source) using the report above, so it can be fixed in the next version. To fix it yourself, edit the entry in source/src/game/bank/en.json (or pt.json, es.json) and rebuild (see the next question).
Avise o idioma e o texto exato da pergunta (e, se puder, a resposta certa e uma fonte) usando o relato acima, para corrigirmos na próxima versão. Para corrigir você mesmo, edite a entrada em source/src/game/bank/pt.json (ou en.json, es.json) e recompile (veja a pergunta seguinte).
How do I add my own questions?Como adiciono perguntas minhas?
The questions are part of the build, so you need the source/ folder and Node.js (see "With the source code" above). Open src/game/bank/en.json (and the same entry in pt.json/es.json if you want it in every language), add an object to the list, then run npm run build:static and upload the new dist-static/ contents. New questions need no audio: only the narrator's own lines have recordings.
{
"id": "en-my0001", // unique in the file
"category": "terra", // planeta, terra, telas, musica, ciencia, historia, esporte
"difficulty": 1, // 1 easy, 2 medium, 3 hard
"text": "Your question?",
"fact": "Fun fact shown after the answer.",
"kind": "choice",
"correct": "Right answer",
"wrong": ["Wrong 1", "Wrong 2", "Wrong 3"]
}For a true/false question use "kind": "truefalse", "correct": "Verdadeiro" (or "Falso") and "wrong": ["Falso"]: keep these two Portuguese words in every language, the game translates them on screen. A bad JSON (a missing comma) breaks the build, so ask your AI assistant to validate it if you are unsure.
As perguntas fazem parte da compilação, então você precisa da pasta source/ e do Node.js (veja "Com o código-fonte" acima). Abra src/game/bank/pt.json (e a mesma entrada em en.json/es.json se quiser em todos os idiomas), adicione um objeto à lista, rode npm run build:static e envie o novo conteúdo de dist-static/. Perguntas novas não precisam de áudio: só as falas da apresentadora têm gravação.
Para verdadeiro/falso use "kind": "truefalse", "correct": "Verdadeiro" (ou "Falso") e "wrong": ["Falso"]: mantenha essas duas palavras em português em todos os idiomas, o jogo as traduz na tela. Um JSON com erro (falta de vírgula) quebra a compilação; peça à sua IA para validar se tiver dúvida.
Can I change the number of rounds or the time per question?Posso mudar o número de rodadas ou o tempo por pergunta?
Yes, in the source: open src/game/engine.ts and edit ROUND_CHOICES (the match sizes the player can pick, now 5, 10 and 15; the last round is always the double-points "Zabum" round) and QUESTION_MS (time per question in milliseconds, now 15000). Then run npm run build:static and upload.
Pode, no código-fonte: abra src/game/engine.ts e edite ROUND_CHOICES (os tamanhos de partida que o jogador escolhe, hoje 5, 10 e 15; a última rodada é sempre a "Zabum", que vale o dobro) e QUESTION_MS (tempo por pergunta em milissegundos, hoje 15000). Depois rode npm run build:static e envie.
Can I rename the game, change the colors or the logo?Posso trocar o nome do jogo, as cores ou o logo?
Yes. The page title and icons are plain files (see "Make it yours"). The name shown in the interface lives in the texts under src/i18n/, and colors in src/styles/ and src/game/categories.ts. A good shortcut is the "For AI assistants" section at the end of this page: copy the prompt and ask your AI to do it. Note that some narrator recordings pronounce the game's name; delete audio/voice/ or re-record them if you rename it.
Pode. O título da página e os ícones são arquivos simples (veja "Personalizar"). O nome mostrado na interface está nos textos em src/i18n/, e as cores em src/styles/ e src/game/categories.ts. Um bom atalho é a seção "Para assistentes de IA" no fim desta página: copie o prompt e peça à sua IA. Atenção: algumas falas gravadas da apresentadora pronunciam o nome do jogo; apague audio/voice/ ou regrave se você trocar o nome.
Can I add another language?Posso adicionar outro idioma?
Yes, with the source code: it needs a new interface file in src/i18n/ and a new question bank in src/game/bank/ (about 1,000 questions to match the others, or fewer). The narrator would have no recordings in the new language, so the game stays silent for her lines. This is a bigger job: your AI assistant can do it, or see Need custom work?
Pode, com o código-fonte: precisa de um novo arquivo de interface em src/i18n/ e de um novo banco de perguntas em src/game/bank/ (cerca de 1.000 perguntas para ficar igual aos outros, ou menos). A apresentadora não teria gravações no novo idioma, então o jogo fica sem as falas dela. É um trabalho maior: sua IA pode fazer, ou veja Quer algo sob medida?
Ads & earningsAnúncios e ganhos
Ads do not showOs anúncios não aparecem
Check: provider is 'adsense'; the publisher ID looks like ca-pub-1234567890123456; your site is approved by AdSense for Games (interstitial/rewarded); you are not using an ad blocker; the site is on HTTPS. Interstitials only appear after a match (every 3rd, never the first). Keep testMode: true while testing.
Confira: provider é 'adsense'; o ID de editor parece ca-pub-1234567890123456; o site foi aprovado no AdSense para Jogos (intervalo/recompensa); você não está com bloqueador de anúncios; o site está em HTTPS. O intervalo só aparece depois de uma partida (a cada 3, nunca a 1ª). Deixe testMode: true enquanto testa.
AdSense says my site is not ready, or rejected itO AdSense disse que meu site não está pronto, ou recusou
Approval is decided by Google, not by this item, and support cannot speed it up. Sites are usually reviewed more favourably with their own domain, a privacy policy, a contact page, and some real content and traffic. Games (interstitial and rewarded ads) also need the separate AdSense for Games approval. While you wait, leave provider: 'none', or use another network through the custom adapter (see Ads).
A aprovação é decidida pelo Google, não por este item, e o suporte não consegue acelerá-la. Os sites costumam ser avaliados melhor com domínio próprio, política de privacidade, página de contato e algum conteúdo e tráfego reais. Jogos (anúncios de intervalo e com recompensa) também precisam da aprovação separada do AdSense para Jogos. Enquanto espera, deixe provider: 'none', ou use outra rede pelo adaptador custom (veja Anúncios).
Ads show but I earn nothingOs anúncios aparecem mas não ganho nada
With testMode: true Google serves test ads that pay nothing. After your site is approved and everything works, set testMode: false and upload the file. Earnings also depend on traffic, visitors' countries and ad blockers, and new accounts take a few days to show numbers. Nobody can promise a figure.
Com testMode: true o Google mostra anúncios de teste, que não pagam. Depois que o site for aprovado e tudo estiver funcionando, coloque testMode: false e envie o arquivo. Os ganhos dependem também do tráfego, do país dos visitantes e de bloqueadores, e contas novas levam alguns dias para mostrar números. Ninguém pode prometer um valor.
AdSense asks for an ads.txt fileO AdSense pede um arquivo ads.txt
Create a text file named ads.txt in the root of the domain (even if the game is in a sub-folder) with the line AdSense shows you. It looks like this (use your own ID, without ca-):
google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0
Crie um arquivo de texto chamado ads.txt na raiz do domínio (mesmo que o jogo esteja numa subpasta) com a linha que o AdSense mostra. Ela é assim (use o seu ID, sem o ca-):
google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0
Do I need a privacy policy or a cookie/consent banner?Preciso de política de privacidade ou de aviso de cookies/consentimento?
If you show ads, ad networks normally require a privacy policy page on your site, and visitors from the EU/UK and some other regions must be asked for consent. The game itself includes neither. In AdSense you can switch on Google's free consent message (look for "Privacy & messaging"). For your policy, the facts are: progress is stored on the player's device; the optional leaderboard stores a nickname, an avatar, points and a hashed IP address; the ad network sets its own cookies. If your audience includes children, check your ad network's rules for child-directed content. This is general information, not legal advice: ask a professional for your country.
Se você mostra anúncios, as redes normalmente exigem uma página de política de privacidade no seu site, e visitantes da UE/Reino Unido e de algumas outras regiões precisam ser consultados sobre consentimento. O jogo em si não inclui nenhum dos dois. No AdSense você pode ativar a mensagem de consentimento gratuita do Google (procure "Privacidade e mensagens"). Para a sua política, os fatos são: o progresso fica no aparelho do jogador; o ranking opcional guarda apelido, avatar, pontos e um hash do IP; a rede de anúncios usa os próprios cookies. Se o seu público inclui crianças, confira as regras da rede de anúncios para conteúdo infantil. Isto é informação geral, não aconselhamento jurídico: consulte um profissional do seu país.
Ads appear too often, or I want to change whenOs anúncios aparecem demais, ou quero mudar quando aparecem
In the source, src/ads/policy.ts has INTERSTITIAL_EVERY (now every 3rd match) and the minimum gap between ads. Change and run npm run build:static. Fewer, well-placed ads usually keep players longer, which earns more over time.
No código-fonte, o src/ads/policy.ts tem INTERSTITIAL_EVERY (hoje a cada 3ª partida) e o intervalo mínimo entre anúncios. Altere e rode npm run build:static. Menos anúncios, bem colocados, costumam manter o jogador por mais tempo, o que rende mais ao longo do tempo.
Leaderboard (PHP)Ranking (PHP)
I do not want a leaderboard at allNão quero ranking nenhum
Do nothing: it is off by default and the game works fully with its on-device "Hall of fame". No PHP is needed. You may delete the api/ folder if you like.
Não faça nada: ele vem desligado e o jogo funciona por inteiro com o "Hall da fama" do aparelho. Não precisa de PHP. Pode apagar a pasta api/ se quiser.
After the 1st match the game asked for a nickname (or did not)Depois da 1ª partida o jogo pediu um apelido (ou não pediu)
With the leaderboard on, the game asks for a nickname and a critter before the player's first match (and only then). With it off it never asks. If a browser already had a nickname saved from an earlier test on the same address (for example localhost shared by several projects), it will not ask again: clear the site data to test the first-time flow.
Com o ranking ligado, o jogo pede apelido e bichinho antes da primeira partida do jogador (e só ali). Com ele desligado, nunca pede. Se o navegador já tinha um apelido salvo de um teste anterior no mesmo endereço (por exemplo localhost, que é compartilhado por vários projetos), ele não pede de novo: limpe os dados do site para testar a primeira vez.
It says "Hall of fame" instead of "Leaderboard"Aparece "Hall da fama" em vez de "Ranking"
First: the leaderboard is off by default. In zabum.config.js make sure ranking has enabled: true, save, upload, and hard refresh. If it is already on, the game could not reach the PHP file. Open /api/ranking.php in the browser: it must show {"ok":true,…}. If it shows PHP code or a 404, PHP is not running there or the api/ folder is missing. If "writable":false, fix the folder permission (see Leaderboard). Also check that ranking.url is './api/ranking.php'.
Primeiro: o ranking vem desligado. No zabum.config.js confira se ranking tem enabled: true, salve, envie e faça a atualização forçada. Se já estiver ligado, o jogo não conseguiu falar com o arquivo PHP. Abra /api/ranking.php no navegador: precisa mostrar {"ok":true,…}. Se mostrar código PHP ou erro 404, o PHP não está rodando ali ou a pasta api/ não foi enviada. Se aparecer "writable":false, ajuste a permissão da pasta (veja Ranking). Confira também se ranking.url é './api/ranking.php'.
Opening ranking.php shows a 500 error or a blank pageAbrir o ranking.php dá erro 500 ou página em branco
Most likely the PHP version is too old. The file needs PHP 7.4 or newer. In your host panel look for "PHP version" / "Select PHP Version" and choose 7.4, 8.0 or later. If it persists, read your host's error_log and send me the last line.
O mais provável é a versão do PHP ser antiga. O arquivo precisa do PHP 7.4 ou mais novo. No painel da hospedagem procure "Versão do PHP" / "Selecionar versão do PHP" e escolha 7.4, 8.0 ou mais. Se continuar, leia o error_log da hospedagem e me envie a última linha.
The scores disappeared after I updated the gameOs pontos sumiram depois que atualizei o jogo
The scores live in api/ranking-data.php. If you delete the api/ folder or overwrite that file when updating, they are gone. Before every update, download a copy of that file. Then upload the new files over the old ones, without deleting the folder first.
Os pontos ficam em api/ranking-data.php. Se você apagar a pasta api/ ou sobrescrever esse arquivo ao atualizar, eles se perdem. Antes de cada atualização, baixe uma cópia desse arquivo. Depois envie os arquivos novos por cima dos antigos, sem apagar a pasta antes.
How do I remove a player (cheater or bad nickname)?Como removo um jogador (trapaceiro ou apelido inadequado)?
Nicknames are not filtered automatically. Download api/ranking-data.php, open it in a plain text editor (not Word), keep the first line (<?php … ?>) and, inside "players", delete the whole entry whose "n" is that nickname (from its long id to the closing }, mind the commas). Upload it back. To start from zero, delete the file; it is recreated on the next match. Always keep a backup.
Os apelidos não são filtrados automaticamente. Baixe o api/ranking-data.php, abra num editor de texto simples (não no Word), mantenha a primeira linha (<?php … ?>) e, dentro de "players", apague a entrada inteira cujo "n" é aquele apelido (do id longo até o } que fecha, cuidando das vírgulas). Envie de volta. Para começar do zero, apague o arquivo; ele é recriado na próxima partida. Mantenha sempre um backup.
When do the Today / Week / Month boards reset?Quando os placares Hoje / Semana / Mês zeram?
At midnight in the time zone set by $TIMEZONE in ranking.php. The week starts on Monday. "All time" never resets.
À meia-noite no fuso definido em $TIMEZONE no ranking.php. A semana começa na segunda-feira. "Sempre" nunca zera.
Honest players get "too many matches" or are not countedJogadores honestos são barrados por "muitas partidas" ou não pontuam
If many players share one IP (a school, a company, or a proxy in front of your site) they share the per-hour limit. Raise $MAX_PER_IP_HOUR at the top of ranking.php. Matches closer together than $MIN_SECONDS are ignored on purpose. Behind Cloudflare the real visitor IP is read automatically.
Se muitos jogadores compartilham um IP (escola, empresa ou um proxy na frente do seu site), eles dividem o limite por hora. Aumente $MAX_PER_IP_HOUR no topo do ranking.php. Partidas mais próximas que $MIN_SECONDS são ignoradas de propósito. Atrás da Cloudflare o IP real do visitante é lido automaticamente.
Is the leaderboard cheat-proof? Can I have live multiplayer?O ranking é à prova de fraude? Dá para ter multiplayer ao vivo?
No: matches run in the browser, so it is meant for casual leaderboards (see the note in Leaderboard). A cheat-proof leaderboard and live multiplayer need a game server, which is a different, custom job: see Need custom work?
Não: as partidas rodam no navegador, então serve para rankings casuais (veja o aviso em Ranking). Ranking à prova de fraude e multiplayer ao vivo exigem um servidor de jogo, que é outro trabalho, sob medida: veja Quer algo sob medida?
Updates, license & supportAtualizações, licença e suporte
How do I update to a new version without losing my settings?Como atualizo para uma nova versão sem perder as minhas configurações?
1) Download your own zabum.config.js, api/ranking-data.php and ads.txt as a backup. 2) Upload the new game/ contents over the old ones. 3) Put your zabum.config.js back (or copy your values into the new one). 4) Hard refresh. Every release carries a new cache name, so players get the new version on their next visit. If you changed the source code, compare your edits with the new source/ before replacing it.
1) Baixe o seu zabum.config.js, o api/ranking-data.php e o ads.txt como backup. 2) Envie o conteúdo novo de game/ por cima do antigo. 3) Devolva o seu zabum.config.js (ou copie seus valores para o novo). 4) Atualização forçada. Cada versão traz um nome de cache novo, então os jogadores recebem a versão nova na próxima visita. Se você alterou o código-fonte, compare suas alterações com o novo source/ antes de substituir.
Which license do I need? Can I charge players or resell it?Qual licença eu preciso? Posso cobrar dos jogadores ou revender?
Envato licenses are per project. The Regular License is for a single end product that end users are not charged for; the Extended License is for a single end product that users can be charged for (for example paid access or subscriptions). You may not resell, share or redistribute the files themselves, and each website or project needs its own license. Read the exact terms at codecanyon.net/licenses; if in doubt, ask Envato before you buy.
As licenças da Envato são por projeto. A Regular License é para um único produto final pelo qual os usuários não pagam; a Extended License é para um único produto final pelo qual os usuários podem ser cobrados (por exemplo acesso pago ou assinaturas). Você não pode revender, compartilhar nem redistribuir os arquivos em si, e cada site ou projeto precisa da própria licença. Leia os termos exatos em codecanyon.net/licenses; na dúvida, pergunte à Envato antes de comprar.
What does support include, and what does it not?O que o suporte inclui, e o que não inclui?
Included: questions about how the item works and how to install it, and fixes for bugs in the delivered game. Not included: custom changes and new features, problems caused by edits you made, your hosting, domain or DNS settings, third-party services (such as the AdSense approval), and store publishing. Item support runs for the period shown on the item page and can be extended there. Requests are answered in the order received, on business days. If you need more, see Need custom work?
Incluído: dúvidas sobre como o item funciona e como instalá-lo, e correção de erros do jogo entregue. Não incluído: alterações sob medida e funções novas, problemas causados por edições suas, as configurações da sua hospedagem, domínio ou DNS, serviços de terceiros (como a aprovação do AdSense) e publicação em lojas. O suporte do item vale pelo período mostrado na página do item e pode ser estendido lá. Os pedidos são respondidos na ordem de chegada, em dias úteis. Se precisar de mais, veja Quer algo sob medida?
It broke after I edited a fileQuebrou depois que editei um arquivo
Put the original file back from the package and check that it works again, then repeat your change in small steps. Editors like Word add invisible characters: use a code/text editor (VS Code, Notepad++). A missing quote or comma in zabum.config.js is the most common cause: the console (F12) shows a "SyntaxError" with the line. Your AI assistant can find it quickly if you paste the file and the error.
Devolva o arquivo original do pacote e confira se voltou a funcionar, depois refaça a sua alteração em pequenos passos. Editores como o Word colocam caracteres invisíveis: use um editor de código/texto (VS Code, Notepad++). Uma aspa ou vírgula faltando no zabum.config.js é a causa mais comum: o console (F12) mostra um "SyntaxError" com a linha. Sua IA acha rápido se você colar o arquivo e o erro.
Where do I ask for a refund, or suggest a feature?Onde peço reembolso, ou sugiro uma novidade?
Refunds are handled by Envato under its refund policy (your Downloads page on CodeCanyon). Feature ideas are welcome in the item comments and may appear in future updates; for a feature you need now, see Need custom work?
Reembolsos são tratados pela Envato conforme a política de reembolso dela (na sua página de Downloads na CodeCanyon). Ideias de novidades são bem-vindas nos comentários do item e podem entrar em atualizações futuras; para uma função de que você precisa agora, veja Quer algo sob medida?
9Support & creditsSuporte e créditos
Support covers installation questions and bugs in the delivered game, through the item page where you bought it. Custom changes are not included, but the section below helps you (or your AI assistant) make them.
O suporte cobre dúvidas de instalação e erros do jogo entregue, pela página do item onde você comprou. Alterações sob medida não estão incluídas, mas a seção abaixo ajuda você (ou a sua IA) a fazê-las.
License: your use of this item is governed by the Envato license you purchased.
Licença: o uso deste item segue a licença Envato que você comprou.
CreditsCréditos
- Fonts Fredoka and Nunito (SIL Open Font License) via
@fontsource. - Fontes Fredoka e Nunito (SIL Open Font License) via
@fontsource. - React, Vite and canvas-confetti (MIT).
- React, Vite e canvas-confetti (MIT).
- Mascots, artwork and interface are original to this item.
- Bichos, ilustrações e interface são originais deste item.
- Music, sound effects and the narrator's voice were generated with ElevenLabs. Questions were created with AI assistance and reviewed.
- Música, efeitos sonoros e a voz da apresentadora foram gerados com o ElevenLabs. As perguntas foram criadas com auxílio de IA e revisadas.
★For AI assistantsPara assistentes de IA
Using ChatGPT, Claude, Gemini or Copilot to install or customize the game? Copy the prompt below and paste it into your assistant. The technical brief after it contains everything it needs to know.
Vai usar o ChatGPT, Claude, Gemini ou Copilot para instalar ou personalizar o jogo? Copie o prompt abaixo e cole no seu assistente. O resumo técnico logo depois traz tudo o que ele precisa saber.
You are helping me install and customize "Zabum!", an HTML5 quiz game I bought (a static website: no backend). Answer in the same language I write in. Be concrete, give exact file paths and complete file contents when I must edit something, and never invent features that are not described below.
PROJECT BRIEF
- Product: Zabum! — solo quiz game (React 19 + TypeScript + Vite 7), delivered as a static build plus source. About 1,000 questions each in English (en), Portuguese (pt) and Spanish (es). No online multiplayer in this package.
- Deliverable layout: game/ (upload to the web host), documentation/index.html, source/ (optional, to rebuild).
- game/ contains: index.html, zabum.config.js (buyer settings), sw.js (service worker, cache name 'zabum-v5'), manifest.webmanifest, assets/ (hashed JS/CSS; question banks are the en-*.js, pt-*.js, es-*.js chunks), audio/{music,sfx,q,voice/{pt,en,es}}, icons/, api/ranking.php (optional PHP leaderboard).
- Install: upload the CONTENTS of game/ to any web host (root or sub-folder; HTTPS recommended). Do not open via file://.
- Settings live only in game/zabum.config.js (loaded by a classic script before the app; edit without rebuilding):
window.ZABUM_CONFIG = { ads: { provider: 'none'|'adsense'|'custom', adsenseClient: 'ca-pub-…', bannerSlot: '…', testMode: true }, ranking: { enabled: false, url: './api/ranking.php' } }
- provider 'custom' expects window.ZABUM_AD_PROVIDER = { name, interstitial(): Promise<void>, rewarded(): Promise<boolean>, banner?(el, slot): () => void }.
- ranking.enabled (default false) turns the online leaderboard on; false/missing = only the on-device Hall of fame (no request to api/ is made). ranking.url '' also disables it.
- Leaderboard (api/ranking.php, PHP 7.4+, no database): GET (no params) = health {ok,writable,php,timezone}; GET ?period=day|week|month|all&pid=… = {period,endsAt,now,total,rows[{rank,nick,avatar,points,matches,you}],you}; POST JSON {pid,nick,avatar,points} = {ok,gain}. Data file api/ranking-data.php (JSON behind a PHP guard line). Settings at the top: $TIMEZONE, $MAX_POINTS, $MIN_SECONDS, $MAX_PER_IP_HOUR, $TOP. If it is enabled but the file is unreachable the game falls back to an on-device "Hall of fame".
- Browser storage keys: zabum.settings.v1, zabum.profile.v1, zabum.daily.v1, zabum.hall.v1, zabum.me, zabum.pid, zabum.rank.last, zabum.tutorial.done.
SOURCE (source/, Node 20.19+ or 22)
- Commands: npm install · npm run dev (port 5195) · npm run build:static (output dist-static/, same as game/) · npm test · npm run typecheck.
- Key files: src/App.tsx (screens/state), src/main.tsx, src/static.ts (STATIC flag, build mode "static"), src/ui/* (screens), src/game/engine.ts (scoring; 15 s per question; rounds 5/10/15), src/game/categories.ts (7 categories: planeta, ciencia, historia, esporte, telas, musica, terra; colors, mascots), src/game/bank/{en,pt,es}.json (questions), src/game/questions.media.ts (sound/shadow questions), src/i18n/{en,es}.ts (UI translations; the Portuguese text itself is the key), src/ads/* (ad providers and frequency policy), src/net/phpRanking.ts (leaderboard client), src/game/hall.ts (on-device hall of fame), src/styles/*.css, public/ (copied as-is into the build: audio/, icons/, zabum.config.js, api/ranking.php, sw.js, manifest.webmanifest).
- Question format (JSON array): { id, category, difficulty (1-3), text, fact?, kind: "choice"|"truefalse"|"estimate", correct, wrong: string[], src? }.
- choice: correct + 3 wrong answers.
- truefalse: correct is "Verdadeiro" or "Falso" and wrong is the other one (the UI translates these two words).
- estimate: correct is the number as a string, wrong is [], plus "estimate": { answer, min, max, tol, step, unit }.
- Add a question = append an object to src/game/bank/<lang>.json with a unique id, then rebuild.
- Changing text: UI strings via t('Portuguese text') in src/ui/*; add the English/Spanish translation to src/i18n/en.ts and es.ts.
- Title/branding: index.html (<title>, meta description), public/manifest.webmanifest, public/icons/*; the "Zabum!" logo text is in src/ui/Home.tsx.
- Caching: the service worker serves index and zabum.config.js network-first, but hashed assets and audio cache-first. After replacing audio or other unhashed files, change CACHE in public/sw.js (e.g. 'zabum-v5').
- Remove narrator: delete audio/voice/ (game works without it).
RULES FOR YOU
1. Do not suggest adding multiplayer, accounts or a backend; this is a static game.
2. Prefer editing game/zabum.config.js for ads/leaderboard changes. Only touch source/ when I want to rebuild.
3. For anything involving ads, remind me that AdSense for Games needs Google approval and that I am responsible for the cookie/consent notice in my region.
4. If I need something this static package cannot do (Node/VPS servers, online multiplayer, a cheat-proof leaderboard, big custom features) and I cannot do it myself, tell me the author takes freelance work: willian@polargames.com.br · https://polargames.com.br
5. Before suggesting a fix, ask me for: where it is hosted (shared/VPS/Netlify…), the exact URL, and any red errors from the browser console (F12).
MY REQUEST:
[describe here what you want to do]Technical brief (human-readable)Resumo técnico (para humanos)
The prompt above is the technical brief. In short: the game is a static React/Vite app. Buyer settings are in zabum.config.js; questions are JSON files in src/game/bank/; the optional leaderboard is a single PHP file with a JSON store; rebuild with npm run build:static. There is no server-side code to maintain.
O prompt acima é o resumo técnico. Em poucas palavras: o jogo é um app React/Vite estático. As configurações do comprador ficam no zabum.config.js; as perguntas são arquivos JSON em src/game/bank/; o ranking opcional é um único arquivo PHP com armazenamento em JSON; recompile com npm run build:static. Não há código de servidor para manter.
✉Need something custom? I'm availableQuer algo sob medida? Estou disponível
I'm Willian, from Polar Games. I build browser games for a living and I take freelance work. If you want to go beyond this package, I can help with:
Eu sou o Willian, da Polar Games. Eu crio jogos para navegador e aceito trabalhos freelance. Se você quer ir além deste pacote, posso ajudar com:
Want a quote? Send me a short description of what you need and your website (if you have one) to willian@polargames.com.br, or visit polargames.com.br.
Quer um orçamento? Me mande uma breve descrição do que precisa e o seu site (se tiver) para willian@polargames.com.br, ou visite polargames.com.br.
Custom work is a separate paid service and is not part of the support that comes with the item.
O trabalho sob medida é um serviço pago à parte e não faz parte do suporte que acompanha o item.